import { sample, sampleOne } from '@mary/array-fns'; import { createMemo, Match, Switch } from 'solid-js'; import * as v from 'valibot'; import PackageResult from './components/package-result'; import PackageSearchInput from './components/package-search-input'; import { CentralExclamationTriangleSolid } from './icons/central'; import { LucideArrowDown, LucideCircleAlert, LucideHandHeart, LucideLoader, LucideScissorsLineDashed, } from './icons/lucide'; import { TangledDolly } from './icons/tangled'; import { formatPackageSpecifier, PACKAGE_SPECIFIER_RE, parsePackageSpecifier, type Registry, } from './lib/package-name'; import { createQuery } from './lib/query'; import { createDerivedSignal } from './lib/signals'; import { useSearchParams } from './lib/use-search-params'; import { fetchPackageManifest } from './npm/packument'; import Button from './primitives/button'; import Tooltip from './primitives/tooltip'; import { RECOMMENDATIONS } from './recommendations'; const isSafari = (() => { const ua = navigator.userAgent; return /AppleWebKit/.test(ua) && !/Chrome|Chromium/.test(ua); })(); function App() { const [params, setParams] = useSearchParams({ q: v.pipe(v.string(), v.regex(PACKAGE_SPECIFIER_RE)), }); const parsed = createMemo(() => { const q = params().q; return q ? parsePackageSpecifier(q) : null; }); const identity = createMemo<{ registry: Registry; name: string } | undefined>( () => { const p = parsed(); return p ? { registry: p.registry, name: p.name } : undefined; }, undefined, { equals: (a, b) => a?.registry === b?.registry && a?.name === b?.name }, ); const range = createMemo(() => parsed()?.range ?? 'latest'); const [query, setQuery] = createDerivedSignal(() => params().q ?? ''); const [manifest, { refetch }] = createQuery(identity, (id) => fetchPackageManifest(id.registry, id.name), { keepPreviousData: false, }); const recs = sample(RECOMMENDATIONS, 6) .flatMap((v) => (Array.isArray(v) ? sampleOne(v) : v)) // oxlint-disable-next-line unicorn/no-array-sort .sort(); return (

teardown

{(triggerProps) => ( )} {(triggerProps) => ( )}
setParams({ q: specifier })} /> {isSafari && (
Not compatible with Safari. Sorry, not sure why it doesn't work there. It seems to be Rolldown and WASI related.
)} {(m) => ( { setParams({ q: formatPackageSpecifier({ registry: m.registry, name: m.name, range: version }), }); }} /> )}
{manifest.error?.message}
Loading...

Find the cost of adding an npm package to your app's bundle size.
Makes use of Rolldown to bundle packages in your browser.

Example packages

{recs.map((name) => { return (
); })}
); } export default App;