Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions data/packages_url_resources.json

This file was deleted.

5 changes: 0 additions & 5 deletions pages/docs/guidelines/publishing-packages.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,3 @@ Whenever you publish a ReScript package to npm, please follow the following guid

Our package index will pick up the newest npm packages two times a day, so it might take some time until your newly published package shows up.

### Via rescript-lang.org

We also maintain a hand-curated index of different resources that are not necessarily released on npm, such as plain URLs to independent files / repositories, or GitHub gists.

You can submit your own resource by editing rescript-lang.org's [resource json file](https://github.com/rescript-lang/rescript-lang.org/blob/master/data/packages_url_resources.json) file and submit a PR.
90 changes: 18 additions & 72 deletions src/Packages.res
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ type urlResource = {
official: bool,
}

external unsafeToUrlResource: JSON.t => array<urlResource> = "%identity"

type npmPackage = {
name: string,
version: string,
Expand All @@ -31,13 +29,12 @@ type npmPackage = {
let packageAllowList: array<string> = []

module Resource = {
type t = Npm(npmPackage) | Url(urlResource) | Outdated(npmPackage)
type t = Npm(npmPackage) | Outdated(npmPackage)

let getId = (res: t) => {
switch res {
| Npm({name})
| Outdated({name})
| Url({name}) => name
| Outdated({name}) => name
}
}

Expand All @@ -56,7 +53,6 @@ module Resource = {
} else {
false
}
| Url(_) => false
}
}

Expand All @@ -78,8 +74,7 @@ module Resource = {
let isOfficial = (res: t) => {
switch res {
| Npm(pkg) | Outdated(pkg) =>
pkg.name === "rescript" || pkg.name->String.startsWith("@rescript/") || pkg.name === "gentype"
| Url(urlRes) => urlRes.official
pkg.name === "rescript" || pkg.name->String.startsWith("@rescript/")
}
}

Expand All @@ -103,41 +98,21 @@ module Resource = {
->Array.toSorted((a, b) => Float.compare(a["item"].searchScore, b["item"].searchScore))
}

let applyUrlResourceSearch = (urls: array<urlResource>, pattern: string): array<
Fuse.match<urlResource>,
> => {
let fuseOpts = Fuse.Options.t(
~shouldSort=true,
~includeScore=true,
~threshold=0.2,
~ignoreLocation=true,
~minMatchCharLength=1,
~keys=["name", "keywords"],
(),
)

let fuser = Fuse.make(urls, fuseOpts)

fuser->Fuse.search(pattern)
}

let applySearch = (resources: array<t>, pattern: string): array<t> => {
let (allNpms, allUrls, allOutDated) = Array.reduce(resources, ([], [], []), (acc, next) => {
let (npms, resources, outdated) = acc
let (allNpms, allOutDated) = Array.reduce(resources, ([], []), (acc, next) => {
let (npms, outdated) = acc

switch next {
| Npm(pkg) => Array.push(npms, pkg)->ignore
| Url(res) => Array.push(resources, res)->ignore
| Outdated(pkg) => Array.push(outdated, pkg)->ignore
}
(npms, resources, outdated)
(npms, outdated)
})

let filteredNpm = applyNpmSearch(allNpms, pattern)->Array.map(m => Npm(m["item"]))
let filteredUrls = applyUrlResourceSearch(allUrls, pattern)->Array.map(m => Url(m["item"]))
let filteredOutdated = applyNpmSearch(allOutDated, pattern)->Array.map(m => Outdated(m["item"]))

Belt.Array.concatMany([filteredNpm, filteredUrls, filteredOutdated])
Belt.Array.concatMany([filteredNpm, filteredOutdated])
}
}

Expand All @@ -146,10 +121,6 @@ module Card = {
let make = (~value: Resource.t, ~onKeywordSelect: option<string => unit>=?) => {
let icon = switch value {
| Npm(_) | Outdated(_) => <Icon.Npm className="w-8 opacity-50" />
| Url(_) =>
<span>
<Icon.Hyperlink className="w-8 opacity-50" />
</span>
}
let linkBox = switch value {
| Npm(pkg) | Outdated(pkg) =>
Expand All @@ -173,18 +144,15 @@ module Card = {
<a className="hover:text-fire" href={pkg.npmHref}> {React.string("NPM")} </a>
{repoEl}
</div>
| Url(_) => React.null
}

let titleHref = switch value {
| Npm(pkg) | Outdated(pkg) => pkg.repositoryHref->Null.toOption->Option.getOr(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)
| Outdated({name, description, keywords}) => (name, description, keywords)
}

<div className="bg-gray-5-tr py-6 rounded-lg p-4">
Expand Down Expand Up @@ -246,7 +214,6 @@ module Filter = {
includeOfficial: bool,
includeCommunity: bool,
includeNpm: bool,
includeUrlResource: bool,
includeOutdated: bool,
}
}
Expand Down Expand Up @@ -293,24 +260,15 @@ module InfoSidebar = {
}}>
{React.string("Community")}
</Toggle>
<Toggle
enabled={filter.includeNpm}
toggle={() => {
setFilter(prev => {
{...prev, Filter.includeNpm: !filter.includeNpm}
})
}}>
{React.string("NPM package")}
</Toggle>
<Toggle
enabled={filter.includeUrlResource}
toggle={() => {
setFilter(prev => {
{...prev, Filter.includeUrlResource: !filter.includeUrlResource}
})
}}>
{React.string("URL resources")}
</Toggle>
// <Toggle
// enabled={filter.includeNpm}
// toggle={() => {
// setFilter(prev => {
// {...prev, Filter.includeNpm: !filter.includeNpm}
// })
// }}>
// {React.string("NPM package")}
// </Toggle>
<Toggle
enabled={filter.includeOutdated}
toggle={() => {
Expand Down Expand Up @@ -341,7 +299,6 @@ module InfoSidebar = {

type props = {
packages: array<npmPackage>,
urlResources: array<urlResource>,
unmaintained: array<npmPackage>,
}

Expand All @@ -359,15 +316,13 @@ let default = (props: props) => {
includeOfficial: true,
includeCommunity: true,
includeNpm: true,
includeUrlResource: true,
includeOutdated: false,
})

let allResources = {
let npms = props.packages->Array.map(pkg => Resource.Npm(pkg))
let urls = props.urlResources->Array.map(res => Resource.Url(res))
let outdated = props.unmaintained->Array.map(pkg => Resource.Outdated(pkg))
Belt.Array.concatMany([npms, urls, outdated])
Belt.Array.concatMany([npms, outdated])
}

let resources = switch state {
Expand Down Expand Up @@ -397,7 +352,6 @@ let default = (props: props) => {
let (official, community) = acc
let isResourceIncluded = switch next {
| Npm(_) => filter.includeNpm
| Url(_) => filter.includeUrlResource
| Outdated(_) => filter.includeOutdated && filter.includeNpm
}
if !isResourceIncluded {
Expand Down Expand Up @@ -614,18 +568,10 @@ let getStaticProps: Next.GetStaticProps.t<props, unit> = async _ctx => {
}
})

let index_data_dir = Node.Path.join2(Node.Process.cwd(), "./data")
let urlResources =
Node.Path.join2(index_data_dir, "packages_url_resources.json")
->Node.Fs.readFileSync
->JSON.parseOrThrow
->unsafeToUrlResource

{
"props": {
packages: pkges,
unmaintained,
urlResources,
},
}
}
1 change: 0 additions & 1 deletion src/Packages.resi
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ type npmPackage = {

type props = {
packages: array<npmPackage>,
urlResources: array<urlResource>,
unmaintained: array<npmPackage>,
}

Expand Down
13 changes: 13 additions & 0 deletions src/components/Navigation.res
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ module MobileNav = {
{React.string("Community")}
</Link>
</li>
<li className=base>
<Link href="/packages" className={linkOrActiveLink(~target="/packages", ~route)}>
{React.string("Packages")}
</Link>
</li>
<li className=base>
<a href=Constants.xHref rel="noopener noreferrer" className=extLink>
{React.string("X")}
Expand Down Expand Up @@ -115,16 +120,24 @@ let make = (~fixed=true, ~isOverlayOpen: bool, ~setOverlayOpen: (bool => bool) =
className={"hidden xs:block " ++ linkOrActiveLink(~target="/try", ~route)}>
{React.string("Playground")}
</Link>

<Link
href="/blog"
className={"hidden xs:block " ++ linkOrActiveLinkSubroute(~target="/blog", ~route)}>
{React.string("Blog")}
</Link>

<Link
href="/community/overview"
className={"hidden xs:block " ++ linkOrActiveLink(~target="/community", ~route)}>
{React.string("Community")}
</Link>

<Link
href="/packages"
className={"hidden xs:block " ++ linkOrActiveLink(~target="/packages", ~route)}>
{React.string("Packages")}
</Link>
</div>
<div className="md:flex flex items-center text-gray-60">
<Search />
Expand Down
Loading