@vltpkg/query 1.0.0-rc.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{esm/attribute.d.ts → attribute.d.ts} +0 -1
- package/dist/{esm/attribute.js → attribute.js} +0 -1
- package/dist/{esm/combinator.d.ts → combinator.d.ts} +0 -1
- package/dist/{esm/combinator.js → combinator.js} +0 -1
- package/dist/{esm/id.d.ts → id.d.ts} +0 -1
- package/dist/{esm/id.js → id.js} +0 -1
- package/dist/{esm/index.d.ts → index.d.ts} +3 -3
- package/dist/{esm/index.js → index.js} +14 -8
- package/dist/{esm/parser.d.ts → parser.d.ts} +0 -1
- package/dist/{esm/parser.js → parser.js} +2 -2
- package/dist/{esm/pseudo → pseudo}/abandoned.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/abandoned.js +0 -1
- package/dist/{esm/pseudo → pseudo}/attr.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/attr.js +0 -1
- package/dist/{esm/pseudo → pseudo}/built.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/built.js +0 -1
- package/dist/{esm/pseudo → pseudo}/confused.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/confused.js +0 -1
- package/dist/{esm/pseudo → pseudo}/cve.d.ts +6 -3
- package/dist/pseudo/cve.js +61 -0
- package/dist/{esm/pseudo → pseudo}/cwe.d.ts +6 -3
- package/dist/pseudo/cwe.js +61 -0
- package/dist/{esm/pseudo → pseudo}/debug.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/debug.js +0 -1
- package/dist/{esm/pseudo → pseudo}/deprecated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/deprecated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/dev.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/dev.js +0 -1
- package/dist/pseudo/diff.d.ts +26 -0
- package/dist/pseudo/diff.js +75 -0
- package/dist/pseudo/dist.d.ts +22 -0
- package/dist/pseudo/dist.js +110 -0
- package/dist/{esm/pseudo → pseudo}/dynamic.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/dynamic.js +0 -1
- package/dist/{esm/pseudo → pseudo}/empty.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/empty.js +0 -1
- package/dist/{esm/pseudo → pseudo}/entropic.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/entropic.js +0 -1
- package/dist/{esm/pseudo → pseudo}/env.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/env.js +0 -1
- package/dist/{esm/pseudo → pseudo}/eval.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/eval.js +0 -1
- package/dist/{esm/pseudo → pseudo}/fs.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/fs.js +0 -1
- package/dist/{esm/pseudo → pseudo}/helpers.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/helpers.js +1 -2
- package/dist/{esm/pseudo → pseudo}/host.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/host.js +0 -1
- package/dist/pseudo/hostname.d.ts +11 -0
- package/dist/pseudo/hostname.js +140 -0
- package/dist/{esm/pseudo → pseudo}/license.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/license.js +0 -1
- package/dist/{esm/pseudo → pseudo}/link.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/link.js +0 -1
- package/dist/pseudo/malware.d.ts +10 -0
- package/dist/pseudo/malware.js +26 -0
- package/dist/{esm/pseudo → pseudo}/minified.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/minified.js +0 -1
- package/dist/{esm/pseudo → pseudo}/missing.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/missing.js +0 -1
- package/dist/{esm/pseudo → pseudo}/native.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/native.js +0 -1
- package/dist/{esm/pseudo → pseudo}/network.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/network.js +0 -1
- package/dist/{esm/pseudo → pseudo}/obfuscated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/obfuscated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/optional.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/optional.js +0 -1
- package/dist/{esm/pseudo → pseudo}/outdated.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/outdated.js +0 -1
- package/dist/{esm/pseudo → pseudo}/overridden.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/overridden.js +0 -1
- package/dist/{esm/pseudo → pseudo}/path.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/path.js +1 -4
- package/dist/{esm/pseudo → pseudo}/peer.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/peer.js +0 -1
- package/dist/{esm/pseudo → pseudo}/prerelease.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/prerelease.js +0 -1
- package/dist/{esm/pseudo → pseudo}/private.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/private.js +0 -1
- package/dist/{esm/pseudo → pseudo}/prod.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/prod.js +0 -1
- package/dist/{esm/pseudo → pseudo}/published.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/published.js +0 -1
- package/dist/pseudo/registry.d.ts +10 -0
- package/dist/pseudo/registry.js +24 -0
- package/dist/{esm/pseudo → pseudo}/root.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/root.js +0 -1
- package/dist/{esm/pseudo → pseudo}/scanned.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/scanned.js +0 -1
- package/dist/{esm/pseudo → pseudo}/score.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/score.js +0 -1
- package/dist/{esm/pseudo → pseudo}/scripts.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/scripts.js +1 -2
- package/dist/{esm/pseudo → pseudo}/semver.d.ts +3 -2
- package/dist/{esm/pseudo → pseudo}/semver.js +43 -7
- package/dist/{esm/pseudo → pseudo}/severity.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/severity.js +0 -1
- package/dist/{esm/pseudo → pseudo}/shell.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/shell.js +0 -1
- package/dist/{esm/pseudo → pseudo}/shrinkwrap.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/shrinkwrap.js +0 -1
- package/dist/{esm/pseudo → pseudo}/spec.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/spec.js +0 -1
- package/dist/{esm/pseudo → pseudo}/squat.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/squat.js +0 -1
- package/dist/{esm/pseudo → pseudo}/suspicious.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/suspicious.js +0 -1
- package/dist/{esm/pseudo → pseudo}/tracker.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/tracker.js +0 -1
- package/dist/{esm/pseudo → pseudo}/trivial.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/trivial.js +0 -1
- package/dist/{esm/pseudo → pseudo}/type.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/type.js +0 -1
- package/dist/{esm/pseudo → pseudo}/undesirable.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/undesirable.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unknown.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unknown.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unmaintained.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unmaintained.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unpopular.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unpopular.js +0 -1
- package/dist/{esm/pseudo → pseudo}/unstable.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/unstable.js +0 -1
- package/dist/pseudo/vuln.d.ts +22 -0
- package/dist/pseudo/vuln.js +220 -0
- package/dist/{esm/pseudo → pseudo}/workspace.d.ts +0 -1
- package/dist/{esm/pseudo → pseudo}/workspace.js +0 -1
- package/dist/{esm/pseudo.d.ts → pseudo.d.ts} +0 -1
- package/dist/{esm/pseudo.js → pseudo.js} +16 -1
- package/dist/{esm/types.d.ts → types.d.ts} +10 -3
- package/dist/types.js +1 -0
- package/package.json +46 -47
- package/skills/dss-query/REFERENCE.md +123 -0
- package/skills/dss-query/SKILL.md +190 -0
- package/skills/dss-query/evals/README.md +79 -0
- package/skills/dss-query/evals/evals.json +89 -0
- package/skills/dss-query/evals/grade.mjs +480 -0
- package/src/attribute.ts +186 -0
- package/src/combinator.ts +132 -0
- package/src/id.ts +46 -0
- package/src/index.ts +620 -0
- package/src/parser.ts +122 -0
- package/src/pseudo/abandoned.ts +9 -0
- package/src/pseudo/attr.ts +92 -0
- package/src/pseudo/built.ts +19 -0
- package/src/pseudo/confused.ts +29 -0
- package/src/pseudo/cve.ts +93 -0
- package/src/pseudo/cwe.ts +97 -0
- package/src/pseudo/debug.ts +9 -0
- package/src/pseudo/deprecated.ts +9 -0
- package/src/pseudo/dev.ts +18 -0
- package/src/pseudo/diff.ts +90 -0
- package/src/pseudo/dist.ts +144 -0
- package/src/pseudo/dynamic.ts +9 -0
- package/src/pseudo/empty.ts +15 -0
- package/src/pseudo/entropic.ts +9 -0
- package/src/pseudo/env.ts +6 -0
- package/src/pseudo/eval.ts +9 -0
- package/src/pseudo/fs.ts +9 -0
- package/src/pseudo/helpers.ts +106 -0
- package/src/pseudo/host.ts +111 -0
- package/src/pseudo/hostname.ts +156 -0
- package/src/pseudo/license.ts +134 -0
- package/src/pseudo/link.ts +30 -0
- package/src/pseudo/malware.ts +41 -0
- package/src/pseudo/minified.ts +9 -0
- package/src/pseudo/missing.ts +16 -0
- package/src/pseudo/native.ts +9 -0
- package/src/pseudo/network.ts +9 -0
- package/src/pseudo/obfuscated.ts +9 -0
- package/src/pseudo/optional.ts +18 -0
- package/src/pseudo/outdated.ts +305 -0
- package/src/pseudo/overridden.ts +20 -0
- package/src/pseudo/path.ts +146 -0
- package/src/pseudo/peer.ts +18 -0
- package/src/pseudo/prerelease.ts +47 -0
- package/src/pseudo/private.ts +19 -0
- package/src/pseudo/prod.ts +18 -0
- package/src/pseudo/published.ts +248 -0
- package/src/pseudo/registry.ts +29 -0
- package/src/pseudo/root.ts +19 -0
- package/src/pseudo/scanned.ts +20 -0
- package/src/pseudo/score.ts +186 -0
- package/src/pseudo/scripts.ts +54 -0
- package/src/pseudo/semver.ts +320 -0
- package/src/pseudo/severity.ts +231 -0
- package/src/pseudo/shell.ts +9 -0
- package/src/pseudo/shrinkwrap.ts +9 -0
- package/src/pseudo/spec.ts +131 -0
- package/src/pseudo/squat.ts +225 -0
- package/src/pseudo/suspicious.ts +9 -0
- package/src/pseudo/tracker.ts +9 -0
- package/src/pseudo/trivial.ts +9 -0
- package/src/pseudo/type.ts +26 -0
- package/src/pseudo/undesirable.ts +9 -0
- package/src/pseudo/unknown.ts +9 -0
- package/src/pseudo/unmaintained.ts +9 -0
- package/src/pseudo/unpopular.ts +9 -0
- package/src/pseudo/unstable.ts +9 -0
- package/src/pseudo/vuln.ts +273 -0
- package/src/pseudo/workspace.ts +22 -0
- package/src/pseudo.ts +413 -0
- package/src/types.ts +165 -0
- package/tap-snapshots/test/attribute.ts.test.cjs +304 -0
- package/tap-snapshots/test/combinator.ts.test.cjs +333 -0
- package/tap-snapshots/test/id.ts.test.cjs +118 -0
- package/tap-snapshots/test/parser.ts.test.cjs +344 -0
- package/tap-snapshots/test/pseudo/abandoned.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/attr.ts.test.cjs +161 -0
- package/tap-snapshots/test/pseudo/built.ts.test.cjs +70 -0
- package/tap-snapshots/test/pseudo/confused.ts.test.cjs +32 -0
- package/tap-snapshots/test/pseudo/cve.ts.test.cjs +49 -0
- package/tap-snapshots/test/pseudo/cwe.ts.test.cjs +49 -0
- package/tap-snapshots/test/pseudo/debug.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/deprecated.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/dist.ts.test.cjs +30 -0
- package/tap-snapshots/test/pseudo/dynamic.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/empty.ts.test.cjs +50 -0
- package/tap-snapshots/test/pseudo/entropic.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/env.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/eval.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/fs.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/helpers.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/hostname.ts.test.cjs +148 -0
- package/tap-snapshots/test/pseudo/license.ts.test.cjs +41 -0
- package/tap-snapshots/test/pseudo/link.ts.test.cjs +36 -0
- package/tap-snapshots/test/pseudo/malware.ts.test.cjs +22 -0
- package/tap-snapshots/test/pseudo/minified.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/missing.ts.test.cjs +30 -0
- package/tap-snapshots/test/pseudo/native.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/network.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/obfuscated.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/outdated.ts.test.cjs +130 -0
- package/tap-snapshots/test/pseudo/overridden.ts.test.cjs +75 -0
- package/tap-snapshots/test/pseudo/prerelease.ts.test.cjs +101 -0
- package/tap-snapshots/test/pseudo/private.ts.test.cjs +38 -0
- package/tap-snapshots/test/pseudo/published.ts.test.cjs +171 -0
- package/tap-snapshots/test/pseudo/registry.ts.test.cjs +68 -0
- package/tap-snapshots/test/pseudo/root.ts.test.cjs +24 -0
- package/tap-snapshots/test/pseudo/scanned.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/score.ts.test.cjs +239 -0
- package/tap-snapshots/test/pseudo/scripts.ts.test.cjs +61 -0
- package/tap-snapshots/test/pseudo/semver.ts.test.cjs +575 -0
- package/tap-snapshots/test/pseudo/severity.ts.test.cjs +95 -0
- package/tap-snapshots/test/pseudo/shell.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/shrinkwrap.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/spec.ts.test.cjs +148 -0
- package/tap-snapshots/test/pseudo/squat.ts.test.cjs +129 -0
- package/tap-snapshots/test/pseudo/suspicious.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/tracker.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/trivial.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/type.ts.test.cjs +51 -0
- package/tap-snapshots/test/pseudo/undesirable.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/unknown.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/unmaintained.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/unpopular.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/unstable.ts.test.cjs +18 -0
- package/tap-snapshots/test/pseudo/vuln.ts.test.cjs +208 -0
- package/tap-snapshots/test/pseudo/vulnerable.ts.test.cjs +20 -0
- package/tap-snapshots/test/pseudo/workspace.ts.test.cjs +19 -0
- package/tap-snapshots/test/pseudo.ts.test.cjs +1247 -0
- package/test/attribute.ts +266 -0
- package/test/combinator.ts +168 -0
- package/test/fixtures/graph.ts +999 -0
- package/test/fixtures/selector.ts +103 -0
- package/test/fixtures/types.ts +7 -0
- package/test/id.ts +102 -0
- package/test/index.ts +1000 -0
- package/test/parser.ts +117 -0
- package/test/pseudo/abandoned.ts +98 -0
- package/test/pseudo/attr.ts +298 -0
- package/test/pseudo/built.ts +214 -0
- package/test/pseudo/confused.ts +160 -0
- package/test/pseudo/cve.ts +249 -0
- package/test/pseudo/cwe.ts +255 -0
- package/test/pseudo/debug.ts +98 -0
- package/test/pseudo/deprecated.ts +98 -0
- package/test/pseudo/dev.ts +61 -0
- package/test/pseudo/diff.ts +417 -0
- package/test/pseudo/dist.ts +215 -0
- package/test/pseudo/dynamic.ts +98 -0
- package/test/pseudo/empty.ts +108 -0
- package/test/pseudo/entropic.ts +101 -0
- package/test/pseudo/env.ts +98 -0
- package/test/pseudo/eval.ts +98 -0
- package/test/pseudo/fs.ts +98 -0
- package/test/pseudo/helpers.ts +370 -0
- package/test/pseudo/host-context.ts +276 -0
- package/test/pseudo/hostname.ts +314 -0
- package/test/pseudo/license.ts +265 -0
- package/test/pseudo/link.ts +94 -0
- package/test/pseudo/malware.ts +184 -0
- package/test/pseudo/minified.ts +98 -0
- package/test/pseudo/missing.ts +111 -0
- package/test/pseudo/native.ts +98 -0
- package/test/pseudo/network.ts +98 -0
- package/test/pseudo/obfuscated.ts +98 -0
- package/test/pseudo/optional.ts +73 -0
- package/test/pseudo/outdated.ts +331 -0
- package/test/pseudo/overridden.ts +317 -0
- package/test/pseudo/path.ts +680 -0
- package/test/pseudo/peer.ts +101 -0
- package/test/pseudo/prerelease.ts +279 -0
- package/test/pseudo/private.ts +108 -0
- package/test/pseudo/prod.ts +61 -0
- package/test/pseudo/published.ts +557 -0
- package/test/pseudo/registry.ts +122 -0
- package/test/pseudo/root.ts +66 -0
- package/test/pseudo/scanned.ts +78 -0
- package/test/pseudo/score.ts +591 -0
- package/test/pseudo/scripts.ts +294 -0
- package/test/pseudo/semver.ts +822 -0
- package/test/pseudo/severity.ts +310 -0
- package/test/pseudo/shell.ts +98 -0
- package/test/pseudo/shrinkwrap.ts +98 -0
- package/test/pseudo/spec.ts +525 -0
- package/test/pseudo/squat.ts +565 -0
- package/test/pseudo/suspicious.ts +98 -0
- package/test/pseudo/tracker.ts +98 -0
- package/test/pseudo/trivial.ts +98 -0
- package/test/pseudo/type.ts +105 -0
- package/test/pseudo/undesirable.ts +98 -0
- package/test/pseudo/unknown.ts +98 -0
- package/test/pseudo/unmaintained.ts +98 -0
- package/test/pseudo/unpopular.ts +98 -0
- package/test/pseudo/unstable.ts +98 -0
- package/test/pseudo/vuln.ts +625 -0
- package/test/pseudo/vulnerable.ts +137 -0
- package/test/pseudo/workspace.ts +111 -0
- package/test/pseudo.ts +558 -0
- package/tsconfig.json +3 -0
- package/tsconfig.publish.json +19 -0
- package/tsconfig.publish.tsbuildinfo +1 -0
- package/typedoc.mjs +2 -0
- package/dist/esm/attribute.d.ts.map +0 -1
- package/dist/esm/attribute.js.map +0 -1
- package/dist/esm/combinator.d.ts.map +0 -1
- package/dist/esm/combinator.js.map +0 -1
- package/dist/esm/id.d.ts.map +0 -1
- package/dist/esm/id.js.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/parser.d.ts.map +0 -1
- package/dist/esm/parser.js.map +0 -1
- package/dist/esm/pseudo/abandoned.d.ts.map +0 -1
- package/dist/esm/pseudo/abandoned.js.map +0 -1
- package/dist/esm/pseudo/attr.d.ts.map +0 -1
- package/dist/esm/pseudo/attr.js.map +0 -1
- package/dist/esm/pseudo/built.d.ts.map +0 -1
- package/dist/esm/pseudo/built.js.map +0 -1
- package/dist/esm/pseudo/confused.d.ts.map +0 -1
- package/dist/esm/pseudo/confused.js.map +0 -1
- package/dist/esm/pseudo/cve.d.ts.map +0 -1
- package/dist/esm/pseudo/cve.js +0 -44
- package/dist/esm/pseudo/cve.js.map +0 -1
- package/dist/esm/pseudo/cwe.d.ts.map +0 -1
- package/dist/esm/pseudo/cwe.js +0 -43
- package/dist/esm/pseudo/cwe.js.map +0 -1
- package/dist/esm/pseudo/debug.d.ts.map +0 -1
- package/dist/esm/pseudo/debug.js.map +0 -1
- package/dist/esm/pseudo/deprecated.d.ts.map +0 -1
- package/dist/esm/pseudo/deprecated.js.map +0 -1
- package/dist/esm/pseudo/dev.d.ts.map +0 -1
- package/dist/esm/pseudo/dev.js.map +0 -1
- package/dist/esm/pseudo/dynamic.d.ts.map +0 -1
- package/dist/esm/pseudo/dynamic.js.map +0 -1
- package/dist/esm/pseudo/empty.d.ts.map +0 -1
- package/dist/esm/pseudo/empty.js.map +0 -1
- package/dist/esm/pseudo/entropic.d.ts.map +0 -1
- package/dist/esm/pseudo/entropic.js.map +0 -1
- package/dist/esm/pseudo/env.d.ts.map +0 -1
- package/dist/esm/pseudo/env.js.map +0 -1
- package/dist/esm/pseudo/eval.d.ts.map +0 -1
- package/dist/esm/pseudo/eval.js.map +0 -1
- package/dist/esm/pseudo/fs.d.ts.map +0 -1
- package/dist/esm/pseudo/fs.js.map +0 -1
- package/dist/esm/pseudo/helpers.d.ts.map +0 -1
- package/dist/esm/pseudo/helpers.js.map +0 -1
- package/dist/esm/pseudo/host.d.ts.map +0 -1
- package/dist/esm/pseudo/host.js.map +0 -1
- package/dist/esm/pseudo/license.d.ts.map +0 -1
- package/dist/esm/pseudo/license.js.map +0 -1
- package/dist/esm/pseudo/link.d.ts.map +0 -1
- package/dist/esm/pseudo/link.js.map +0 -1
- package/dist/esm/pseudo/malware.d.ts +0 -24
- package/dist/esm/pseudo/malware.d.ts.map +0 -1
- package/dist/esm/pseudo/malware.js +0 -187
- package/dist/esm/pseudo/malware.js.map +0 -1
- package/dist/esm/pseudo/minified.d.ts.map +0 -1
- package/dist/esm/pseudo/minified.js.map +0 -1
- package/dist/esm/pseudo/missing.d.ts.map +0 -1
- package/dist/esm/pseudo/missing.js.map +0 -1
- package/dist/esm/pseudo/native.d.ts.map +0 -1
- package/dist/esm/pseudo/native.js.map +0 -1
- package/dist/esm/pseudo/network.d.ts.map +0 -1
- package/dist/esm/pseudo/network.js.map +0 -1
- package/dist/esm/pseudo/obfuscated.d.ts.map +0 -1
- package/dist/esm/pseudo/obfuscated.js.map +0 -1
- package/dist/esm/pseudo/optional.d.ts.map +0 -1
- package/dist/esm/pseudo/optional.js.map +0 -1
- package/dist/esm/pseudo/outdated.d.ts.map +0 -1
- package/dist/esm/pseudo/outdated.js.map +0 -1
- package/dist/esm/pseudo/overridden.d.ts.map +0 -1
- package/dist/esm/pseudo/overridden.js.map +0 -1
- package/dist/esm/pseudo/path.d.ts.map +0 -1
- package/dist/esm/pseudo/path.js.map +0 -1
- package/dist/esm/pseudo/peer.d.ts.map +0 -1
- package/dist/esm/pseudo/peer.js.map +0 -1
- package/dist/esm/pseudo/prerelease.d.ts.map +0 -1
- package/dist/esm/pseudo/prerelease.js.map +0 -1
- package/dist/esm/pseudo/private.d.ts.map +0 -1
- package/dist/esm/pseudo/private.js.map +0 -1
- package/dist/esm/pseudo/prod.d.ts.map +0 -1
- package/dist/esm/pseudo/prod.js.map +0 -1
- package/dist/esm/pseudo/published.d.ts.map +0 -1
- package/dist/esm/pseudo/published.js.map +0 -1
- package/dist/esm/pseudo/root.d.ts.map +0 -1
- package/dist/esm/pseudo/root.js.map +0 -1
- package/dist/esm/pseudo/scanned.d.ts.map +0 -1
- package/dist/esm/pseudo/scanned.js.map +0 -1
- package/dist/esm/pseudo/score.d.ts.map +0 -1
- package/dist/esm/pseudo/score.js.map +0 -1
- package/dist/esm/pseudo/scripts.d.ts.map +0 -1
- package/dist/esm/pseudo/scripts.js.map +0 -1
- package/dist/esm/pseudo/semver.d.ts.map +0 -1
- package/dist/esm/pseudo/semver.js.map +0 -1
- package/dist/esm/pseudo/severity.d.ts.map +0 -1
- package/dist/esm/pseudo/severity.js.map +0 -1
- package/dist/esm/pseudo/shell.d.ts.map +0 -1
- package/dist/esm/pseudo/shell.js.map +0 -1
- package/dist/esm/pseudo/shrinkwrap.d.ts.map +0 -1
- package/dist/esm/pseudo/shrinkwrap.js.map +0 -1
- package/dist/esm/pseudo/spec.d.ts.map +0 -1
- package/dist/esm/pseudo/spec.js.map +0 -1
- package/dist/esm/pseudo/squat.d.ts.map +0 -1
- package/dist/esm/pseudo/squat.js.map +0 -1
- package/dist/esm/pseudo/suspicious.d.ts.map +0 -1
- package/dist/esm/pseudo/suspicious.js.map +0 -1
- package/dist/esm/pseudo/tracker.d.ts.map +0 -1
- package/dist/esm/pseudo/tracker.js.map +0 -1
- package/dist/esm/pseudo/trivial.d.ts.map +0 -1
- package/dist/esm/pseudo/trivial.js.map +0 -1
- package/dist/esm/pseudo/type.d.ts.map +0 -1
- package/dist/esm/pseudo/type.js.map +0 -1
- package/dist/esm/pseudo/undesirable.d.ts.map +0 -1
- package/dist/esm/pseudo/undesirable.js.map +0 -1
- package/dist/esm/pseudo/unknown.d.ts.map +0 -1
- package/dist/esm/pseudo/unknown.js.map +0 -1
- package/dist/esm/pseudo/unmaintained.d.ts.map +0 -1
- package/dist/esm/pseudo/unmaintained.js.map +0 -1
- package/dist/esm/pseudo/unpopular.d.ts.map +0 -1
- package/dist/esm/pseudo/unpopular.js.map +0 -1
- package/dist/esm/pseudo/unstable.d.ts.map +0 -1
- package/dist/esm/pseudo/unstable.js.map +0 -1
- package/dist/esm/pseudo/workspace.d.ts.map +0 -1
- package/dist/esm/pseudo/workspace.js.map +0 -1
- package/dist/esm/pseudo.d.ts.map +0 -1
- package/dist/esm/pseudo.js.map +0 -1
- package/dist/esm/types.d.ts.map +0 -1
- package/dist/esm/types.js +0 -2
- package/dist/esm/types.js.map +0 -1
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import pRetry, { AbortError } from 'p-retry'
|
|
2
|
+
import { hydrate, splitDepID } from '@vltpkg/dep-id/browser'
|
|
3
|
+
import { error } from '@vltpkg/error-cause'
|
|
4
|
+
import {
|
|
5
|
+
asPostcssNodeWithChildren,
|
|
6
|
+
asTagNode,
|
|
7
|
+
asStringNode,
|
|
8
|
+
isTagNode,
|
|
9
|
+
} from '@vltpkg/dss-parser'
|
|
10
|
+
import {
|
|
11
|
+
removeDanglingEdges,
|
|
12
|
+
removeNode,
|
|
13
|
+
removeQuotes,
|
|
14
|
+
} from './helpers.ts'
|
|
15
|
+
import type { NodeLike, Packument } from '@vltpkg/types'
|
|
16
|
+
import type { ParserState } from '../types.ts'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Fetches the dist-tags of a package from the registry.
|
|
20
|
+
*/
|
|
21
|
+
export const retrieveDistTags = async (
|
|
22
|
+
node: NodeLike,
|
|
23
|
+
signal?: AbortSignal,
|
|
24
|
+
): Promise<Record<string, string>> => {
|
|
25
|
+
const spec = hydrate(node.id, String(node.name), node.options)
|
|
26
|
+
if (!spec.registry || !node.name) {
|
|
27
|
+
return {}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const url = new URL(spec.registry)
|
|
31
|
+
url.pathname = `/${node.name}`
|
|
32
|
+
|
|
33
|
+
const response = await fetch(String(url), {
|
|
34
|
+
headers: {
|
|
35
|
+
Accept: 'application/vnd.npm.install-v1+json',
|
|
36
|
+
},
|
|
37
|
+
signal,
|
|
38
|
+
})
|
|
39
|
+
if (response.status === 404) {
|
|
40
|
+
throw new AbortError('Missing API')
|
|
41
|
+
}
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw error('Failed to fetch packument', {
|
|
44
|
+
name: node.name,
|
|
45
|
+
spec,
|
|
46
|
+
response,
|
|
47
|
+
})
|
|
48
|
+
}
|
|
49
|
+
const packument = (await response.json()) as Packument
|
|
50
|
+
return packument['dist-tags']
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Checks whether a node's installed version matches the version
|
|
55
|
+
* associated with the given dist-tag. Returns the node if it should
|
|
56
|
+
* be removed (does NOT match), or undefined if it matches.
|
|
57
|
+
*/
|
|
58
|
+
export const queueNode = async (
|
|
59
|
+
state: ParserState,
|
|
60
|
+
node: NodeLike,
|
|
61
|
+
tagName: string,
|
|
62
|
+
): Promise<NodeLike | undefined> => {
|
|
63
|
+
if (!node.name || !node.version) {
|
|
64
|
+
return node
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let distTags: Record<string, string>
|
|
68
|
+
try {
|
|
69
|
+
distTags = await pRetry(
|
|
70
|
+
() => retrieveDistTags(node, state.signal),
|
|
71
|
+
{
|
|
72
|
+
retries: state.retries,
|
|
73
|
+
signal: state.signal,
|
|
74
|
+
},
|
|
75
|
+
)
|
|
76
|
+
} catch (err) {
|
|
77
|
+
// eslint-disable-next-line no-console
|
|
78
|
+
console.warn(
|
|
79
|
+
error('Could not retrieve dist-tags', {
|
|
80
|
+
name: node.name,
|
|
81
|
+
cause: err,
|
|
82
|
+
}),
|
|
83
|
+
)
|
|
84
|
+
return node
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const tagVersion = distTags[tagName]
|
|
88
|
+
if (tagVersion !== node.version) {
|
|
89
|
+
return node
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return undefined
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* :dist(tag) Pseudo-Selector, matches only nodes whose installed
|
|
97
|
+
* version corresponds to the given dist-tag in the registry.
|
|
98
|
+
*
|
|
99
|
+
* Examples:
|
|
100
|
+
* - :dist(latest) — matches packages at the `latest` dist-tag version
|
|
101
|
+
* - :dist(nightly) — matches packages at the `nightly` dist-tag version
|
|
102
|
+
* - :not(:dist(nightly)) — excludes nightly-tagged versions
|
|
103
|
+
*/
|
|
104
|
+
export const dist = async (state: ParserState) => {
|
|
105
|
+
const top = asPostcssNodeWithChildren(state.current)
|
|
106
|
+
const selector = asPostcssNodeWithChildren(top.nodes[0])
|
|
107
|
+
const firstChild = selector.nodes[0]
|
|
108
|
+
|
|
109
|
+
let tagName: string
|
|
110
|
+
try {
|
|
111
|
+
tagName = removeQuotes(asStringNode(firstChild).value)
|
|
112
|
+
} catch {
|
|
113
|
+
if (isTagNode(firstChild)) {
|
|
114
|
+
tagName = asTagNode(firstChild).value
|
|
115
|
+
/* c8 ignore start */
|
|
116
|
+
} else {
|
|
117
|
+
throw error('Failed to parse :dist selector', {
|
|
118
|
+
found: firstChild,
|
|
119
|
+
})
|
|
120
|
+
}
|
|
121
|
+
/* c8 ignore stop */
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const queue = []
|
|
125
|
+
|
|
126
|
+
for (const node of state.partial.nodes) {
|
|
127
|
+
if (splitDepID(node.id)[0] !== 'registry') {
|
|
128
|
+
removeNode(state, node)
|
|
129
|
+
continue
|
|
130
|
+
}
|
|
131
|
+
queue.push(queueNode(state, node, tagName))
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const removeNodeQueue = await Promise.all(queue)
|
|
135
|
+
for (const node of removeNodeQueue) {
|
|
136
|
+
if (node) {
|
|
137
|
+
removeNode(state, node)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
removeDanglingEdges(state)
|
|
142
|
+
|
|
143
|
+
return state
|
|
144
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts'
|
|
2
|
+
import { removeNode } from './helpers.ts'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* :empty Pseudo-Selector, matches only nodes that have no children.
|
|
6
|
+
* It filters out any node that has edges out, i.e., has dependencies.
|
|
7
|
+
*/
|
|
8
|
+
export const empty = async (state: ParserState) => {
|
|
9
|
+
for (const node of state.partial.nodes) {
|
|
10
|
+
if (node.edgesOut.size > 0) {
|
|
11
|
+
removeNode(state, node)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return state
|
|
15
|
+
}
|
package/src/pseudo/fs.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause'
|
|
2
|
+
import type { EdgeLike, NodeLike } from '@vltpkg/types'
|
|
3
|
+
import type { ParserState } from '../types.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Removes a node and its incoming edges from the results.
|
|
7
|
+
*/
|
|
8
|
+
export const removeNode = (state: ParserState, node: NodeLike) => {
|
|
9
|
+
for (const edge of node.edgesIn) {
|
|
10
|
+
state.partial.edges.delete(edge)
|
|
11
|
+
}
|
|
12
|
+
state.partial.nodes.delete(node)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Removes an edge and its outgoing node from the results.
|
|
17
|
+
*/
|
|
18
|
+
export const removeEdge = (state: ParserState, edge: EdgeLike) => {
|
|
19
|
+
state.partial.edges.delete(edge)
|
|
20
|
+
if (edge.to?.edgesIn.size === 1) {
|
|
21
|
+
state.partial.nodes.delete(edge.to)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Removes any edges that have no destination node from the results.
|
|
27
|
+
*/
|
|
28
|
+
export const removeDanglingEdges = (state: ParserState) => {
|
|
29
|
+
for (const edge of state.partial.edges) {
|
|
30
|
+
if (!edge.to || !state.partial.nodes.has(edge.to)) {
|
|
31
|
+
state.partial.edges.delete(edge)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Removes any nodes that have no incoming edges from the results.
|
|
38
|
+
*/
|
|
39
|
+
export const removeUnlinkedNodes = (state: ParserState) => {
|
|
40
|
+
nodeLoop: for (const node of state.partial.nodes) {
|
|
41
|
+
for (const edge of state.partial.edges) {
|
|
42
|
+
if (edge.to === node) {
|
|
43
|
+
continue nodeLoop
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
state.partial.nodes.delete(node)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Removes quotes from a string value.
|
|
52
|
+
*/
|
|
53
|
+
export const removeQuotes = (value: string) =>
|
|
54
|
+
value.replace(/^"(.*?)"$/, '$1')
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Asserts that the security archive is present.
|
|
58
|
+
*/
|
|
59
|
+
export const assertSecurityArchive: (
|
|
60
|
+
state: ParserState,
|
|
61
|
+
name: string,
|
|
62
|
+
) => asserts state is ParserState & {
|
|
63
|
+
securityArchive: NonNullable<ParserState['securityArchive']>
|
|
64
|
+
} = (state, name) => {
|
|
65
|
+
if (!state.securityArchive) {
|
|
66
|
+
throw error(
|
|
67
|
+
`Missing security archive while trying to parse the :${name} selector`,
|
|
68
|
+
{ found: state },
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Clears all nodes and edges from the results.
|
|
75
|
+
*/
|
|
76
|
+
export const clear = (state: ParserState): ParserState => {
|
|
77
|
+
state.partial.nodes.clear()
|
|
78
|
+
state.partial.edges.clear()
|
|
79
|
+
return state
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Reusable security selector alert filter.
|
|
84
|
+
*/
|
|
85
|
+
export const createSecuritySelectorFilter = (
|
|
86
|
+
name: string,
|
|
87
|
+
type: string,
|
|
88
|
+
) => {
|
|
89
|
+
return async (state: ParserState) => {
|
|
90
|
+
assertSecurityArchive(state, name)
|
|
91
|
+
|
|
92
|
+
for (const node of state.partial.nodes) {
|
|
93
|
+
const report = state.securityArchive.get(node.id)
|
|
94
|
+
const exclude = !report?.alerts.some(
|
|
95
|
+
alert => alert.type === type,
|
|
96
|
+
)
|
|
97
|
+
if (exclude) {
|
|
98
|
+
removeNode(state, node)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
removeDanglingEdges(state)
|
|
103
|
+
|
|
104
|
+
return state
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause'
|
|
2
|
+
import {
|
|
3
|
+
asPostcssNodeWithChildren,
|
|
4
|
+
asStringNode,
|
|
5
|
+
asTagNode,
|
|
6
|
+
isStringNode,
|
|
7
|
+
isTagNode,
|
|
8
|
+
} from '@vltpkg/dss-parser'
|
|
9
|
+
import { removeQuotes } from './helpers.ts'
|
|
10
|
+
import type { ParserState } from '../types.ts'
|
|
11
|
+
import type { PostcssNode } from '@vltpkg/dss-parser'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parses the internal parameters of the :host() pseudo selector.
|
|
15
|
+
* Returns the context key that should be used to look up the host context function.
|
|
16
|
+
*/
|
|
17
|
+
export const parseInternals = (nodes: PostcssNode[]): string => {
|
|
18
|
+
let contextKey = ''
|
|
19
|
+
|
|
20
|
+
if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
|
|
21
|
+
contextKey = removeQuotes(
|
|
22
|
+
asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
23
|
+
.value,
|
|
24
|
+
)
|
|
25
|
+
} else if (
|
|
26
|
+
isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
27
|
+
) {
|
|
28
|
+
const tagNode = asTagNode(
|
|
29
|
+
asPostcssNodeWithChildren(nodes[0]).nodes[0],
|
|
30
|
+
)
|
|
31
|
+
contextKey = tagNode.value
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!contextKey) {
|
|
35
|
+
throw error('Expected a context key parameter for :host selector')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return contextKey
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* :host Pseudo-Selector, switches the current graph context to a new
|
|
43
|
+
* set of graphs loaded from a specific host context.
|
|
44
|
+
*
|
|
45
|
+
* This selector accepts a single parameter that specifies which host context
|
|
46
|
+
* to use. The host context must be defined in the hostContexts map provided
|
|
47
|
+
* to the Query constructor.
|
|
48
|
+
*
|
|
49
|
+
* Example:
|
|
50
|
+
* - :host(local) - Switches to graphs loaded from the local context
|
|
51
|
+
*/
|
|
52
|
+
export const hostContext = async (state: ParserState) => {
|
|
53
|
+
if (!state.hostContexts) {
|
|
54
|
+
throw error('No host contexts available for :host selector')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let contextKey: string
|
|
58
|
+
try {
|
|
59
|
+
contextKey = parseInternals(
|
|
60
|
+
asPostcssNodeWithChildren(state.current).nodes,
|
|
61
|
+
)
|
|
62
|
+
} catch (err) {
|
|
63
|
+
throw error('Failed to parse :host selector', {
|
|
64
|
+
cause: err,
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const contextFunction = state.hostContexts.get(contextKey)
|
|
69
|
+
if (!contextFunction) {
|
|
70
|
+
throw error(`Unknown host context: ${contextKey}`, {
|
|
71
|
+
validOptions: Array.from(state.hostContexts.keys()),
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Get the graphs from the host context function
|
|
76
|
+
const {
|
|
77
|
+
initialEdges,
|
|
78
|
+
initialNodes,
|
|
79
|
+
edges,
|
|
80
|
+
nodes,
|
|
81
|
+
securityArchive,
|
|
82
|
+
} = await contextFunction()
|
|
83
|
+
|
|
84
|
+
// Clear current nodes and edges
|
|
85
|
+
state.securityArchive = securityArchive
|
|
86
|
+
state.initial.nodes.clear()
|
|
87
|
+
state.initial.edges.clear()
|
|
88
|
+
state.partial.nodes.clear()
|
|
89
|
+
state.partial.edges.clear()
|
|
90
|
+
state.importers.clear()
|
|
91
|
+
|
|
92
|
+
// Reset the initial state
|
|
93
|
+
for (const node of initialNodes) {
|
|
94
|
+
state.initial.nodes.add(node)
|
|
95
|
+
}
|
|
96
|
+
for (const edge of initialEdges) {
|
|
97
|
+
state.initial.edges.add(edge)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Populate with nodes and edges from all returned graphs
|
|
101
|
+
for (const node of nodes) {
|
|
102
|
+
state.partial.nodes.add(node)
|
|
103
|
+
// use the current selected nodes by the context function as importers
|
|
104
|
+
state.importers.add(node)
|
|
105
|
+
}
|
|
106
|
+
for (const edge of edges) {
|
|
107
|
+
state.partial.edges.add(edge)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return state
|
|
111
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { splitDepID } from '@vltpkg/dep-id/browser'
|
|
2
|
+
import { getOptions, gitHostWebsites } from '@vltpkg/spec/browser'
|
|
3
|
+
import { asPostcssNodeWithChildren } from '@vltpkg/dss-parser'
|
|
4
|
+
import { error } from '@vltpkg/error-cause'
|
|
5
|
+
import { removeDanglingEdges, removeNode } from './helpers.ts'
|
|
6
|
+
import { parseInternals } from './spec.ts'
|
|
7
|
+
import type { ParserState } from '../types.ts'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Given a named git host (e.g. "github"), resolve its hostname
|
|
11
|
+
* by looking up `gitHostWebsites` (e.g. "github.com"), or
|
|
12
|
+
* falling back to the `git-hosts` template URL.
|
|
13
|
+
*/
|
|
14
|
+
const resolveGitHostname = (
|
|
15
|
+
namedHost: string,
|
|
16
|
+
gitHosts: Record<string, string>,
|
|
17
|
+
): string | undefined => {
|
|
18
|
+
// Check gitHostWebsites first (e.g. github -> github.com)
|
|
19
|
+
const website =
|
|
20
|
+
gitHostWebsites[namedHost as keyof typeof gitHostWebsites]
|
|
21
|
+
if (website) {
|
|
22
|
+
try {
|
|
23
|
+
return new URL(website).hostname
|
|
24
|
+
/* c8 ignore next */
|
|
25
|
+
} catch {}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Fall back to parsing the git-hosts template URL
|
|
29
|
+
const template = gitHosts[namedHost]
|
|
30
|
+
if (template) {
|
|
31
|
+
try {
|
|
32
|
+
// Templates look like 'git+ssh://git@github.com:$1/$2.git'
|
|
33
|
+
// Replace colons after the host with / for URL parsing
|
|
34
|
+
const normalized = template
|
|
35
|
+
.replace(/^git\+/, '')
|
|
36
|
+
.replace(/:(\$)/, '/$1')
|
|
37
|
+
return new URL(normalized).hostname
|
|
38
|
+
/* c8 ignore next */
|
|
39
|
+
} catch {}
|
|
40
|
+
}
|
|
41
|
+
/* c8 ignore next */
|
|
42
|
+
return undefined
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the hostname for a git remote string.
|
|
47
|
+
* Named hosts: "github:user/repo" -> extract "github" and look up.
|
|
48
|
+
* Full URLs: "git+ssh://git@example.com/repo.git" -> parse URL.
|
|
49
|
+
*/
|
|
50
|
+
const getGitHostname = (
|
|
51
|
+
gitRemote: string,
|
|
52
|
+
gitHosts: Record<string, string>,
|
|
53
|
+
): string | undefined => {
|
|
54
|
+
// Check if it's a named git host like "github:user/repo"
|
|
55
|
+
const colonIdx = gitRemote.indexOf(':')
|
|
56
|
+
if (colonIdx > 0) {
|
|
57
|
+
const possibleHost = gitRemote.slice(0, colonIdx)
|
|
58
|
+
// If this is a known named git host, resolve it
|
|
59
|
+
if (possibleHost in gitHosts) {
|
|
60
|
+
return resolveGitHostname(possibleHost, gitHosts)
|
|
61
|
+
}
|
|
62
|
+
// Could be a protocol URL like git+ssh://...
|
|
63
|
+
try {
|
|
64
|
+
const normalized = gitRemote
|
|
65
|
+
.replace(/^git\+/, '')
|
|
66
|
+
.replace(/^ssh:\/\/([^@]+@)?([^:/]+)[:/]/, 'ssh://$1$2/')
|
|
67
|
+
return new URL(normalized).hostname
|
|
68
|
+
/* c8 ignore next */
|
|
69
|
+
} catch {}
|
|
70
|
+
}
|
|
71
|
+
/* c8 ignore start - git remotes always contain a colon */
|
|
72
|
+
|
|
73
|
+
// Try parsing as a plain URL
|
|
74
|
+
try {
|
|
75
|
+
return new URL(gitRemote).hostname
|
|
76
|
+
} catch {}
|
|
77
|
+
|
|
78
|
+
return undefined
|
|
79
|
+
/* c8 ignore stop */
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* :hostname(str) Pseudo-Selector, matches only nodes whose
|
|
84
|
+
* upstream hostname matches the provided domain string.
|
|
85
|
+
*
|
|
86
|
+
* Examples:
|
|
87
|
+
* - :hostname("registry.npmjs.org") — default npm registry deps
|
|
88
|
+
* - :hostname("github.com") — github git deps
|
|
89
|
+
* - :hostname("example.com") — custom registry deps
|
|
90
|
+
*/
|
|
91
|
+
export const hostname = async (state: ParserState) => {
|
|
92
|
+
let internals
|
|
93
|
+
try {
|
|
94
|
+
internals = parseInternals(
|
|
95
|
+
asPostcssNodeWithChildren(state.current).nodes,
|
|
96
|
+
)
|
|
97
|
+
} catch (err) {
|
|
98
|
+
throw error('Failed to parse :hostname selector', {
|
|
99
|
+
cause: err,
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const targetHostname = internals.specValue
|
|
104
|
+
|
|
105
|
+
for (const node of state.partial.nodes) {
|
|
106
|
+
const tuple = splitDepID(node.id)
|
|
107
|
+
const type = tuple[0]
|
|
108
|
+
let nodeHostname: string | undefined
|
|
109
|
+
|
|
110
|
+
switch (type) {
|
|
111
|
+
case 'registry': {
|
|
112
|
+
const registryName = tuple[1]
|
|
113
|
+
const options = getOptions(node.options)
|
|
114
|
+
// Look up the registry URL from registries map. There is no
|
|
115
|
+
// default registry, so a node with an empty registry field and
|
|
116
|
+
// no configured registry has no hostname, and never matches.
|
|
117
|
+
const registryUrl =
|
|
118
|
+
options.registries[registryName] ?? options.registry
|
|
119
|
+
if (registryUrl) {
|
|
120
|
+
try {
|
|
121
|
+
nodeHostname = new URL(registryUrl).hostname
|
|
122
|
+
/* c8 ignore next */
|
|
123
|
+
} catch {}
|
|
124
|
+
}
|
|
125
|
+
break
|
|
126
|
+
}
|
|
127
|
+
case 'git': {
|
|
128
|
+
const gitRemote = tuple[1]
|
|
129
|
+
const options = getOptions(node.options)
|
|
130
|
+
nodeHostname = getGitHostname(gitRemote, options['git-hosts'])
|
|
131
|
+
break
|
|
132
|
+
}
|
|
133
|
+
case 'remote': {
|
|
134
|
+
const url = tuple[1]
|
|
135
|
+
try {
|
|
136
|
+
nodeHostname = new URL(url).hostname
|
|
137
|
+
/* c8 ignore next */
|
|
138
|
+
} catch {}
|
|
139
|
+
break
|
|
140
|
+
}
|
|
141
|
+
// file and workspace deps are local — no hostname
|
|
142
|
+
default: {
|
|
143
|
+
nodeHostname = undefined
|
|
144
|
+
break
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (nodeHostname !== targetHostname) {
|
|
149
|
+
removeNode(state, node)
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
removeDanglingEdges(state)
|
|
154
|
+
|
|
155
|
+
return state
|
|
156
|
+
}
|