From cc31041aad1802af66ac09b9ffd352ca3d32c244 Mon Sep 17 00:00:00 2001 From: Pedro Castro Date: Sun, 5 May 2024 13:21:34 -0300 Subject: [PATCH 001/145] add scroll margin for header anchor --- src/components/Markdown.res | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Markdown.res b/src/components/Markdown.res index a7ca402b6..d23e3877a 100644 --- a/src/components/Markdown.res +++ b/src/components/Markdown.res @@ -136,7 +136,7 @@ module H2 = { @react.component let make = (~id, ~children) => <> // Here we know that children is always a string (## headline) -

+

children @@ -148,7 +148,7 @@ module H2 = { module H3 = { @react.component let make = (~id, ~children) => -

+

children @@ -159,7 +159,7 @@ module H3 = { module H4 = { @react.component let make = (~id, ~children) => -

+

children From 19009b3ff85c1f72dbeab8198e2f1eb95610b3e0 Mon Sep 17 00:00:00 2001 From: Florian Hammerschmidt Date: Wed, 8 May 2024 11:44:19 +0200 Subject: [PATCH 002/145] create rescript-app: require @latest version --- pages/docs/manual/latest/installation.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/docs/manual/latest/installation.mdx b/pages/docs/manual/latest/installation.mdx index 9d879be5c..3f84c7c12 100644 --- a/pages/docs/manual/latest/installation.mdx +++ b/pages/docs/manual/latest/installation.mdx @@ -26,7 +26,7 @@ The fastest and easiest way to spin up a new ReScript project is with the [creat ```sh example -npm create rescript-app +npm create rescript-app@latest ``` ```sh npx create-rescript-app @@ -69,7 +69,7 @@ In the root directory of your project, execute: ```sh -npm create rescript-app +npm create rescript-app@latest ``` ```sh npx create-rescript-app From 650d1b3edf54dec5ee19391bea754d68494e7526 Mon Sep 17 00:00:00 2001 From: Josh Vlk Date: Mon, 13 May 2024 14:58:03 -0400 Subject: [PATCH 003/145] sorting --- src/Packages.res | 72 +++++++++++++++++++++++++++++++++++++++++------ src/Packages.resi | 3 ++ 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/Packages.res b/src/Packages.res index 3b2aa851c..dcffc86e1 100644 --- a/src/Packages.res +++ b/src/Packages.res @@ -23,6 +23,9 @@ type npmPackage = { description: string, repositoryHref: Js.Null.t, npmHref: string, + searchScore: float, + maintenanceScore: float, + score: {"final": float, "detail": {"quality": float, "popularity": float, "maintenance": float}}, } module Resource = { @@ -94,7 +97,20 @@ module Resource = { let fuser = Fuse.make(packages, fuseOpts) - fuser->Fuse.search(pattern) + let t = + fuser + ->Fuse.search(pattern) + ->Js.Array2.map(t => { + if t["item"].name === "reson" || t["item"].name === "rescript-json-schema" { + Js.Console.log(t) + t + } else { + t + } + }) + ->Js.Array2.sortInPlaceWith((a, b) => a["item"].searchScore < b["item"].searchScore ? -1 : 1) + + t } let applyUrlResourceSearch = (urls: array, pattern: string): array< @@ -505,6 +521,11 @@ let default = (props: props) => { type npmData = { "objects": array<{ + "searchScore": float, + "score": { + "final": float, + "detail": {"quality": float, "popularity": float, "maintenance": float}, + }, "package": { "name": string, "keywords": array, @@ -522,14 +543,8 @@ module Response = { @val external fetchNpmPackages: string => promise = "fetch" -let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => { - let response = await fetchNpmPackages( - "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250", - ) - - let data = await response->Response.json - - let pkges = Belt.Array.map(data["objects"], item => { +let parsePkgs = data => + Belt.Array.map(data["objects"], item => { let pkg = item["package"] { name: pkg["name"], @@ -538,9 +553,48 @@ let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => description: Belt.Option.getWithDefault(pkg["description"], ""), repositoryHref: Js.Null.fromOption(pkg["links"]["repository"]), npmHref: pkg["links"]["npm"], + searchScore: item["searchScore"], + maintenanceScore: item["score"]["detail"]["maintenance"], + score: item["score"], } }) +let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => { + let (one, two, three) = await Js.Promise2.all3(( + fetchNpmPackages( + "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1", + ), + fetchNpmPackages( + "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1&from=250", + ), + fetchNpmPackages( + "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1&from=500", + ), + )) + + let (data1, data2, data3) = await Js.Promise2.all3(( + one->Response.json, + two->Response.json, + three->Response.json, + )) + + let unmaintained = [] + + let pkges = + parsePkgs(data1) + ->Js.Array2.concat(parsePkgs(data2)) + ->Js.Array2.concat(parsePkgs(data3)) + ->Js.Array2.filter(pkg => { + if pkg.maintenanceScore < 0.03 { + false + } else { + true + } + }) + + Js.Console.log2("Number of packages", pkges->Js.Array2.length) + Js.Console.log2("Number of unmaintained", unmaintained->Js.Array2.length) + let index_data_dir = Node.Path.join2(Node.Process.cwd(), "./data") let urlResources = Node.Path.join2(index_data_dir, "packages_url_resources.json") diff --git a/src/Packages.resi b/src/Packages.resi index 8334bdf40..a4a7a2dae 100644 --- a/src/Packages.resi +++ b/src/Packages.resi @@ -13,6 +13,9 @@ type npmPackage = { description: string, repositoryHref: Js.Null.t, npmHref: string, + searchScore: float, + maintenanceScore: float, + score: {"final": float, "detail": {"quality": float, "popularity": float, "maintenance": float}}, } type props = {"packages": array, "urlResources": array} From 95f269ab79c501406e25fb700fa6ee9fbf99870e Mon Sep 17 00:00:00 2001 From: Josh Vlk Date: Mon, 13 May 2024 15:14:32 -0400 Subject: [PATCH 004/145] sorting works as expected --- src/Packages.res | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/src/Packages.res b/src/Packages.res index dcffc86e1..1ea6af829 100644 --- a/src/Packages.res +++ b/src/Packages.res @@ -97,20 +97,9 @@ module Resource = { let fuser = Fuse.make(packages, fuseOpts) - let t = - fuser - ->Fuse.search(pattern) - ->Js.Array2.map(t => { - if t["item"].name === "reson" || t["item"].name === "rescript-json-schema" { - Js.Console.log(t) - t - } else { - t - } - }) - ->Js.Array2.sortInPlaceWith((a, b) => a["item"].searchScore < b["item"].searchScore ? -1 : 1) - - t + fuser + ->Fuse.search(pattern) + ->Js.Array2.sortInPlaceWith((a, b) => a["item"].searchScore > b["item"].searchScore ? -1 : 1) } let applyUrlResourceSearch = (urls: array, pattern: string): array< @@ -560,16 +549,12 @@ let parsePkgs = data => }) let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => { + let baseUrl = "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.5&quality=0.9" + let (one, two, three) = await Js.Promise2.all3(( - fetchNpmPackages( - "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1", - ), - fetchNpmPackages( - "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1&from=250", - ), - fetchNpmPackages( - "https://registry.npmjs.org/-/v1/search?text=keywords:rescript&size=250&maintenance=1.0&popularity=0.7&quality=0.1&from=500", - ), + fetchNpmPackages(baseUrl), + fetchNpmPackages(baseUrl ++ "&from=250"), + fetchNpmPackages(baseUrl ++ "&from=500"), )) let (data1, data2, data3) = await Js.Promise2.all3(( @@ -578,23 +563,22 @@ let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => three->Response.json, )) - let unmaintained = [] - let pkges = parsePkgs(data1) ->Js.Array2.concat(parsePkgs(data2)) ->Js.Array2.concat(parsePkgs(data3)) ->Js.Array2.filter(pkg => { - if pkg.maintenanceScore < 0.03 { + if [/* Allow list of names */]->Js.Array2.includes(pkg.name) { + true + } else if pkg.name->Js.String2.includes("reason") { + false + } else if pkg.maintenanceScore < 0.3 { false } else { true } }) - Js.Console.log2("Number of packages", pkges->Js.Array2.length) - Js.Console.log2("Number of unmaintained", unmaintained->Js.Array2.length) - let index_data_dir = Node.Path.join2(Node.Process.cwd(), "./data") let urlResources = Node.Path.join2(index_data_dir, "packages_url_resources.json") From e6a380875de4ede1e7ee924f37325a7036b98037 Mon Sep 17 00:00:00 2001 From: Josh Vlk Date: Mon, 13 May 2024 15:25:07 -0400 Subject: [PATCH 005/145] adjust score --- src/Packages.res | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Packages.res b/src/Packages.res index 1ea6af829..ab0e2d610 100644 --- a/src/Packages.res +++ b/src/Packages.res @@ -572,7 +572,7 @@ let getStaticProps: Next.GetStaticProps.revalidate = async _ctx => true } else if pkg.name->Js.String2.includes("reason") { false - } else if pkg.maintenanceScore < 0.3 { + } else if pkg.maintenanceScore < 0.09 { false } else { true From 9623985e9b804f44de2ca8ca758383f6e3976560 Mon Sep 17 00:00:00 2001 From: Josh Vlk Date: Mon, 13 May 2024 16:13:19 -0400 Subject: [PATCH 006/145] filter out outdated --- src/Packages.res | 60 ++++++++++++++++++++++++++++++++++------------- src/Packages.resi | 6 ++++- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/Packages.res b/src/Packages.res index ab0e2d610..96599a050 100644 --- a/src/Packages.res +++ b/src/Packages.res @@ -29,18 +29,19 @@ type npmPackage = { } module Resource = { - type t = Npm(npmPackage) | Url(urlResource) + type t = Npm(npmPackage) | Url(urlResource) | Outdated(npmPackage) let getId = (res: t) => { switch res { | Npm({name}) + | Outdated({name}) | Url({name}) => name } } let shouldFilter = (res: t) => { switch res { - | Npm(pkg) => + | Npm(pkg) | Outdated(pkg) => if pkg.name->Js.String2.startsWith("@elm-react") { true } else if pkg.name->Js.String2.startsWith("bs-") { @@ -74,7 +75,7 @@ module Resource = { let isOfficial = (res: t) => { switch res { - | Npm(pkg) => + | Npm(pkg) | Outdated(pkg) => pkg.name === "rescript" || pkg.name->Js.String2.startsWith("@rescript/") || pkg.name === "gentype" @@ -121,20 +122,26 @@ module Resource = { } let applySearch = (resources: array, pattern: string): array => { - let (allNpms, allUrls) = Belt.Array.reduce(resources, ([], []), (acc, next) => { - let (npms, resources) = acc + let (allNpms, allUrls, allOutDated) = Belt.Array.reduce(resources, ([], [], []), ( + acc, + next, + ) => { + let (npms, resources, outdated) = acc switch next { | Npm(pkg) => Js.Array2.push(npms, pkg)->ignore | Url(res) => Js.Array2.push(resources, res)->ignore + | Outdated(pkg) => Js.Array2.push(outdated, pkg)->ignore } - (npms, resources) + (npms, resources, outdated) }) let filteredNpm = applyNpmSearch(allNpms, pattern)->Belt.Array.map(m => Npm(m["item"])) let filteredUrls = applyUrlResourceSearch(allUrls, pattern)->Belt.Array.map(m => Url(m["item"])) + let filteredOutdated = + applyNpmSearch(allOutDated, pattern)->Belt.Array.map(m => Outdated(m["item"])) - Belt.Array.concat(filteredNpm, filteredUrls) + Belt.Array.concat(filteredNpm, filteredUrls)->Belt.Array.concat(filteredOutdated) } } @@ -142,14 +149,14 @@ module Card = { @react.component let make = (~value: Resource.t, ~onKeywordSelect: option unit>=?) => { let icon = switch value { - | Npm(_) => + | Npm(_) | Outdated(_) => | Url(_) => } let linkBox = switch value { - | Npm(pkg) => + | Npm(pkg) | Outdated(pkg) => let repositoryHref = Js.Null.toOption(pkg.repositoryHref) let repoEl = switch repositoryHref { | Some(href) => @@ -174,12 +181,14 @@ module Card = { } let titleHref = switch value { - | Npm(pkg) => pkg.repositoryHref->Js.Null.toOption->Belt.Option.getWithDefault(pkg.npmHref) + | Npm(pkg) | Outdated(pkg) => + pkg.repositoryHref->Js.Null.toOption->Belt.Option.getWithDefault(pkg.npmHref) | Url(res) => res.urlHref } let (title, description, keywords) = switch value { | Npm({name, description, keywords}) + | Outdated({name, description, keywords}) | Url({name, description, keywords}) => (name, description, keywords) } @@ -243,6 +252,7 @@ module Filter = { includeCommunity: bool, includeNpm: bool, includeUrlResource: bool, + includeOutdated: bool, } } @@ -268,7 +278,7 @@ module InfoSidebar = {