@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,134 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause'
|
|
2
|
+
import { asError } from '@vltpkg/types'
|
|
3
|
+
import {
|
|
4
|
+
asPostcssNodeWithChildren,
|
|
5
|
+
asStringNode,
|
|
6
|
+
asTagNode,
|
|
7
|
+
isStringNode,
|
|
8
|
+
isTagNode,
|
|
9
|
+
} from '@vltpkg/dss-parser'
|
|
10
|
+
import {
|
|
11
|
+
assertSecurityArchive,
|
|
12
|
+
removeDanglingEdges,
|
|
13
|
+
removeNode,
|
|
14
|
+
removeQuotes,
|
|
15
|
+
} from './helpers.ts'
|
|
16
|
+
import type { ParserState } from '../types.ts'
|
|
17
|
+
import type { PostcssNode } from '@vltpkg/dss-parser'
|
|
18
|
+
|
|
19
|
+
export type LicenseKinds =
|
|
20
|
+
| 'unlicensed'
|
|
21
|
+
| 'misc'
|
|
22
|
+
| 'restricted'
|
|
23
|
+
| 'ambiguous'
|
|
24
|
+
| 'copyleft'
|
|
25
|
+
| 'unknown'
|
|
26
|
+
| 'none'
|
|
27
|
+
| 'exception'
|
|
28
|
+
| undefined
|
|
29
|
+
|
|
30
|
+
export type LicenseAlertTypes =
|
|
31
|
+
| 'explicitlyUnlicensedItem'
|
|
32
|
+
| 'miscLicenseIssues'
|
|
33
|
+
| 'nonpermissiveLicense'
|
|
34
|
+
| 'ambiguousClassifier'
|
|
35
|
+
| 'copyleftLicense'
|
|
36
|
+
| 'unidentifiedLicense'
|
|
37
|
+
| 'noLicenseFound'
|
|
38
|
+
| 'licenseException'
|
|
39
|
+
| undefined
|
|
40
|
+
|
|
41
|
+
const kindsMap = new Map<LicenseKinds, LicenseAlertTypes>([
|
|
42
|
+
['unlicensed', 'explicitlyUnlicensedItem'],
|
|
43
|
+
['misc', 'miscLicenseIssues'],
|
|
44
|
+
['restricted', 'nonpermissiveLicense'],
|
|
45
|
+
['ambiguous', 'ambiguousClassifier'],
|
|
46
|
+
['copyleft', 'copyleftLicense'],
|
|
47
|
+
['unknown', 'unidentifiedLicense'],
|
|
48
|
+
['none', 'noLicenseFound'],
|
|
49
|
+
['exception', 'licenseException'],
|
|
50
|
+
[undefined, undefined],
|
|
51
|
+
])
|
|
52
|
+
const kinds = new Set(kindsMap.keys())
|
|
53
|
+
|
|
54
|
+
export const isLicenseKind = (
|
|
55
|
+
value?: string,
|
|
56
|
+
): value is LicenseKinds => kinds.has(value as LicenseKinds)
|
|
57
|
+
|
|
58
|
+
export const asLicenseKind = (value?: string): LicenseKinds => {
|
|
59
|
+
if (!isLicenseKind(value)) {
|
|
60
|
+
throw error('Expected a valid license kind', {
|
|
61
|
+
found: value,
|
|
62
|
+
validOptions: Array.from(kinds),
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
return value
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const parseInternals = (
|
|
69
|
+
nodes: PostcssNode[],
|
|
70
|
+
): { kind: LicenseKinds } => {
|
|
71
|
+
let kind: LicenseKinds
|
|
72
|
+
|
|
73
|
+
if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
|
|
74
|
+
kind = asLicenseKind(
|
|
75
|
+
removeQuotes(
|
|
76
|
+
asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
77
|
+
.value,
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
} else if (
|
|
81
|
+
isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
82
|
+
) {
|
|
83
|
+
kind = asLicenseKind(
|
|
84
|
+
asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return { kind }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const license = async (state: ParserState) => {
|
|
92
|
+
assertSecurityArchive(state, 'license')
|
|
93
|
+
|
|
94
|
+
let internals
|
|
95
|
+
try {
|
|
96
|
+
internals = parseInternals(
|
|
97
|
+
asPostcssNodeWithChildren(state.current).nodes,
|
|
98
|
+
)
|
|
99
|
+
} catch (err) {
|
|
100
|
+
if (asError(err).message === 'Expected a query node') {
|
|
101
|
+
// No parameters provided - pseudo state form: match ANY license defined (not 'none')
|
|
102
|
+
for (const node of state.partial.nodes) {
|
|
103
|
+
const report = state.securityArchive.get(node.id)
|
|
104
|
+
// Exclude if no report or if it has 'noLicenseFound' alert
|
|
105
|
+
const exclude =
|
|
106
|
+
!report?.alerts ||
|
|
107
|
+
report.alerts.some(alert => alert.type === 'noLicenseFound')
|
|
108
|
+
if (exclude) {
|
|
109
|
+
removeNode(state, node)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
removeDanglingEdges(state)
|
|
113
|
+
return state
|
|
114
|
+
} else {
|
|
115
|
+
throw error('Failed to parse :license selector', { cause: err })
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const { kind } = internals
|
|
120
|
+
const alertName = kindsMap.get(kind)
|
|
121
|
+
for (const node of state.partial.nodes) {
|
|
122
|
+
const report = state.securityArchive.get(node.id)
|
|
123
|
+
const exclude = !report?.alerts.some(
|
|
124
|
+
alert => alert.type === alertName,
|
|
125
|
+
)
|
|
126
|
+
if (exclude) {
|
|
127
|
+
removeNode(state, node)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
removeDanglingEdges(state)
|
|
132
|
+
|
|
133
|
+
return state
|
|
134
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { splitDepID } from '@vltpkg/dep-id/browser'
|
|
2
|
+
import type { ParserState } from '../types.ts'
|
|
3
|
+
import { removeNode } from './helpers.ts'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* :link Pseudo-Selector, matches only nodes that are file links.
|
|
7
|
+
*
|
|
8
|
+
* It filters out any node that is not of type 'file' or nodes of 'file'
|
|
9
|
+
* type that ends with 'tar.gz' since these are local tarballs.
|
|
10
|
+
*/
|
|
11
|
+
export const link = async (state: ParserState) => {
|
|
12
|
+
for (const node of state.partial.nodes) {
|
|
13
|
+
const [type, path] = splitDepID(node.id)
|
|
14
|
+
if (type !== 'file' || path.endsWith('tar.gz') || path === '.') {
|
|
15
|
+
removeNode(state, node)
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
for (const edge of state.partial.edges) {
|
|
20
|
+
if (
|
|
21
|
+
!edge.spec.file ||
|
|
22
|
+
edge.spec.file.endsWith('tar.gz') ||
|
|
23
|
+
edge.spec.file === '.'
|
|
24
|
+
) {
|
|
25
|
+
state.partial.edges.delete(edge)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return state
|
|
30
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause'
|
|
2
|
+
import { asPostcssNodeWithChildren } from '@vltpkg/dss-parser'
|
|
3
|
+
import {
|
|
4
|
+
assertSecurityArchive,
|
|
5
|
+
removeDanglingEdges,
|
|
6
|
+
removeNode,
|
|
7
|
+
} from './helpers.ts'
|
|
8
|
+
import type { ParserState } from '../types.ts'
|
|
9
|
+
|
|
10
|
+
const malwareAlertTypes = new Set(['malware', 'gptMalware'])
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* :malware Pseudo-Selector, matches nodes with any malware-related alert.
|
|
14
|
+
*
|
|
15
|
+
* This is a binary selector — no parameters. A node matches if it has
|
|
16
|
+
* at least one alert whose type is `malware` or `gptMalware`.
|
|
17
|
+
*/
|
|
18
|
+
export const malware = async (state: ParserState) => {
|
|
19
|
+
assertSecurityArchive(state, 'malware')
|
|
20
|
+
|
|
21
|
+
const currentNode = asPostcssNodeWithChildren(state.current)
|
|
22
|
+
if (currentNode.nodes.length > 0) {
|
|
23
|
+
throw error(
|
|
24
|
+
':malware selector does not accept parameters. Use :vuln(<severity>) for severity-based filtering.',
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
for (const node of state.partial.nodes) {
|
|
29
|
+
const report = state.securityArchive.get(node.id)
|
|
30
|
+
const hasMalware = report?.alerts.some(alert =>
|
|
31
|
+
malwareAlertTypes.has(alert.type),
|
|
32
|
+
)
|
|
33
|
+
if (!hasMalware) {
|
|
34
|
+
removeNode(state, node)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
removeDanglingEdges(state)
|
|
39
|
+
|
|
40
|
+
return state
|
|
41
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* :missing Pseudo-Selector, matches only edges that are not linked to any node.
|
|
5
|
+
* It filters out any edges that have a 'to' property, keeping only dangling edges
|
|
6
|
+
* and clears all nodes from the result.
|
|
7
|
+
*/
|
|
8
|
+
export const missing = async (state: ParserState) => {
|
|
9
|
+
for (const edge of state.partial.edges) {
|
|
10
|
+
if (edge.to) {
|
|
11
|
+
state.partial.edges.delete(edge)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
state.partial.nodes.clear()
|
|
15
|
+
return state
|
|
16
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts'
|
|
2
|
+
import { removeEdge, removeUnlinkedNodes } from './helpers.ts'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* :optional Pseudo-Selector will only match optional dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export const optional = async (state: ParserState) => {
|
|
8
|
+
// filter edges that aren't marked as optional
|
|
9
|
+
for (const edge of state.partial.edges) {
|
|
10
|
+
if (!edge.optional) {
|
|
11
|
+
removeEdge(state, edge)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
removeUnlinkedNodes(state)
|
|
16
|
+
|
|
17
|
+
return state
|
|
18
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
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 { asError } from '@vltpkg/types'
|
|
5
|
+
import {
|
|
6
|
+
compare,
|
|
7
|
+
gt,
|
|
8
|
+
major,
|
|
9
|
+
minor,
|
|
10
|
+
patch,
|
|
11
|
+
satisfies,
|
|
12
|
+
} from '@vltpkg/semver'
|
|
13
|
+
import {
|
|
14
|
+
asPostcssNodeWithChildren,
|
|
15
|
+
asStringNode,
|
|
16
|
+
asTagNode,
|
|
17
|
+
isStringNode,
|
|
18
|
+
isTagNode,
|
|
19
|
+
} from '@vltpkg/dss-parser'
|
|
20
|
+
import { removeNode, removeQuotes } from './helpers.ts'
|
|
21
|
+
import type { NodeLike, Packument } from '@vltpkg/types'
|
|
22
|
+
import type { ParserState } from '../types.ts'
|
|
23
|
+
import type { PostcssNode } from '@vltpkg/dss-parser'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The possible values accepted by the :outdated() pseudo selector.
|
|
27
|
+
*/
|
|
28
|
+
export type OutdatedKinds =
|
|
29
|
+
'any' | 'major' | 'minor' | 'patch' | 'in-range' | 'out-of-range'
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Result of the internal parsing of the :outdated() pseudo selector.
|
|
33
|
+
*/
|
|
34
|
+
export type OutdatedInternals = {
|
|
35
|
+
kind: OutdatedKinds
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Extracts a semver type from a version string.
|
|
40
|
+
*/
|
|
41
|
+
export type SemverTypeExtraction = (
|
|
42
|
+
version: string,
|
|
43
|
+
) => number | undefined
|
|
44
|
+
|
|
45
|
+
const kinds = new Set<OutdatedKinds>([
|
|
46
|
+
'any',
|
|
47
|
+
'major',
|
|
48
|
+
'minor',
|
|
49
|
+
'patch',
|
|
50
|
+
'in-range',
|
|
51
|
+
'out-of-range',
|
|
52
|
+
])
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks if a string is a valid {@link OutdatedKinds}.
|
|
56
|
+
*/
|
|
57
|
+
export const isOutdatedKind = (
|
|
58
|
+
value: string,
|
|
59
|
+
): value is OutdatedKinds => kinds.has(value as OutdatedKinds)
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Asserts that a string is a valid {@link OutdatedKinds}.
|
|
63
|
+
*/
|
|
64
|
+
export const asOutdatedKind = (value: string): OutdatedKinds => {
|
|
65
|
+
if (!isOutdatedKind(value)) {
|
|
66
|
+
throw error('Expected a valid outdated kind', {
|
|
67
|
+
found: value,
|
|
68
|
+
validOptions: Array.from(kinds),
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
return value
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Fetches the available versions of a package from the npm registry.
|
|
76
|
+
*/
|
|
77
|
+
export const retrieveRemoteVersions = async (
|
|
78
|
+
node: NodeLike,
|
|
79
|
+
signal?: AbortSignal,
|
|
80
|
+
): Promise<string[]> => {
|
|
81
|
+
const spec = hydrate(node.id, String(node.name), node.options)
|
|
82
|
+
if (!spec.registry || !node.name) {
|
|
83
|
+
return []
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const url = new URL(spec.registry)
|
|
87
|
+
url.pathname = `/${node.name}`
|
|
88
|
+
|
|
89
|
+
const response = await fetch(String(url), {
|
|
90
|
+
headers: {
|
|
91
|
+
Accept: 'application/vnd.npm.install-v1+json',
|
|
92
|
+
},
|
|
93
|
+
signal,
|
|
94
|
+
})
|
|
95
|
+
// on missing valid auth or API, it should abort the retry logic
|
|
96
|
+
if (response.status === 404) {
|
|
97
|
+
throw new AbortError('Missing API')
|
|
98
|
+
}
|
|
99
|
+
if (!response.ok) {
|
|
100
|
+
throw error('Failed to fetch packument', {
|
|
101
|
+
name: node.name,
|
|
102
|
+
spec,
|
|
103
|
+
response,
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
const packument = (await response.json()) as Packument
|
|
107
|
+
return Object.keys(packument.versions).sort(compare)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Retrieves what kind of check the :outdated selector should perform.
|
|
112
|
+
*/
|
|
113
|
+
export const parseInternals = (
|
|
114
|
+
nodes: PostcssNode[],
|
|
115
|
+
): OutdatedInternals => {
|
|
116
|
+
let kind: OutdatedKinds = 'any'
|
|
117
|
+
|
|
118
|
+
if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
|
|
119
|
+
kind = asOutdatedKind(
|
|
120
|
+
removeQuotes(
|
|
121
|
+
asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
122
|
+
.value,
|
|
123
|
+
),
|
|
124
|
+
)
|
|
125
|
+
} else if (
|
|
126
|
+
isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
127
|
+
) {
|
|
128
|
+
kind = asOutdatedKind(
|
|
129
|
+
asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return { kind }
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Filter nodes by queueing up for removal those that are not outdated.
|
|
138
|
+
*/
|
|
139
|
+
export const queueNode = async (
|
|
140
|
+
state: ParserState,
|
|
141
|
+
node: NodeLike,
|
|
142
|
+
kind: OutdatedKinds,
|
|
143
|
+
): Promise<NodeLike | undefined> => {
|
|
144
|
+
if (!node.name || !node.version) {
|
|
145
|
+
return node
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const nodeVersion: string = node.version
|
|
149
|
+
let versions: string[]
|
|
150
|
+
try {
|
|
151
|
+
versions = await pRetry(
|
|
152
|
+
() => retrieveRemoteVersions(node, state.signal),
|
|
153
|
+
{
|
|
154
|
+
retries: state.retries,
|
|
155
|
+
signal: state.signal,
|
|
156
|
+
},
|
|
157
|
+
)
|
|
158
|
+
} catch (err) {
|
|
159
|
+
// eslint-disable-next-line no-console
|
|
160
|
+
console.warn(
|
|
161
|
+
error('Could not retrieve registry versions', {
|
|
162
|
+
name: node.name,
|
|
163
|
+
cause: err,
|
|
164
|
+
}),
|
|
165
|
+
)
|
|
166
|
+
versions = []
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const greaterVersions = versions.filter((version: string) =>
|
|
170
|
+
gt(version, nodeVersion),
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
// if there are no greater versions, then the node is not outdated
|
|
174
|
+
if (!greaterVersions.length) {
|
|
175
|
+
return node
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const checkKind = new Map<OutdatedKinds, SemverTypeExtraction>([
|
|
179
|
+
['major', major],
|
|
180
|
+
['minor', minor],
|
|
181
|
+
['patch', patch],
|
|
182
|
+
])
|
|
183
|
+
|
|
184
|
+
switch (kind) {
|
|
185
|
+
case 'any':
|
|
186
|
+
return
|
|
187
|
+
case 'major':
|
|
188
|
+
case 'minor':
|
|
189
|
+
case 'patch': {
|
|
190
|
+
return (
|
|
191
|
+
greaterVersions.some((version: string) => {
|
|
192
|
+
const va = checkKind.get(kind)?.(version)
|
|
193
|
+
const vb = checkKind.get(kind)?.(nodeVersion)
|
|
194
|
+
/* c8 ignore next - impossible but typescript doesn't know */
|
|
195
|
+
if (va === undefined || vb === undefined) return false
|
|
196
|
+
return va > vb
|
|
197
|
+
})
|
|
198
|
+
) ?
|
|
199
|
+
undefined
|
|
200
|
+
: node
|
|
201
|
+
}
|
|
202
|
+
// the node should be part of the result as long as it has at least
|
|
203
|
+
// one parent node that has a spec definition that satisfies one
|
|
204
|
+
// of the available remove versions
|
|
205
|
+
case 'in-range': {
|
|
206
|
+
for (const edge of node.edgesIn) {
|
|
207
|
+
// if the edge is not part of the partial results, skip it
|
|
208
|
+
/* c8 ignore next */
|
|
209
|
+
if (!state.partial.edges.has(edge)) continue
|
|
210
|
+
|
|
211
|
+
if (
|
|
212
|
+
greaterVersions.some(
|
|
213
|
+
version =>
|
|
214
|
+
edge.spec.final.range &&
|
|
215
|
+
satisfies(version, edge.spec.final.range),
|
|
216
|
+
)
|
|
217
|
+
) {
|
|
218
|
+
return
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return node
|
|
222
|
+
}
|
|
223
|
+
// the node is part of the result as long as none of its parents has
|
|
224
|
+
// a spec definition that satisfies one of the available remote versions
|
|
225
|
+
case 'out-of-range': {
|
|
226
|
+
for (const edge of node.edgesIn) {
|
|
227
|
+
// if the edge is not part of the partial results, skip it
|
|
228
|
+
/* c8 ignore next */
|
|
229
|
+
if (!state.partial.edges.has(edge)) continue
|
|
230
|
+
|
|
231
|
+
if (
|
|
232
|
+
greaterVersions.some(
|
|
233
|
+
version =>
|
|
234
|
+
edge.spec.final.range &&
|
|
235
|
+
satisfies(version, edge.spec.final.range),
|
|
236
|
+
)
|
|
237
|
+
) {
|
|
238
|
+
return node
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Filters out nodes that are not outdated.
|
|
248
|
+
*
|
|
249
|
+
* The :outdated() pseudo selector supports one `type` argument,
|
|
250
|
+
* possible values are the following:
|
|
251
|
+
*
|
|
252
|
+
* - `any`: Selects all nodes that have a greater version available.
|
|
253
|
+
* - `major`: Selects all nodes that have a greater major version available.
|
|
254
|
+
* - `minor`: Selects all nodes that have a greater minor version available.
|
|
255
|
+
* - `patch`: Selects all nodes that have a greater patch version available.
|
|
256
|
+
* - `in-range`: Selects all nodes that have a parent node with a spec definition
|
|
257
|
+
* that satisfies one of the available remote versions.
|
|
258
|
+
* - `out-of-range`: Selects all nodes that have a parent node with a spec definition
|
|
259
|
+
* that does not satisfy any of the available remote versions.
|
|
260
|
+
*/
|
|
261
|
+
export const outdated = async (state: ParserState) => {
|
|
262
|
+
let internals
|
|
263
|
+
try {
|
|
264
|
+
internals = parseInternals(
|
|
265
|
+
asPostcssNodeWithChildren(state.current).nodes,
|
|
266
|
+
)
|
|
267
|
+
} catch (err) {
|
|
268
|
+
if (asError(err).message === 'Expected a query node') {
|
|
269
|
+
internals = { kind: 'any' } satisfies OutdatedInternals
|
|
270
|
+
} else {
|
|
271
|
+
throw error('Failed to parse :outdated selector', {
|
|
272
|
+
cause: err,
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const { kind } = internals
|
|
278
|
+
const queue = []
|
|
279
|
+
|
|
280
|
+
for (const node of state.partial.nodes) {
|
|
281
|
+
// filter out nodes that are always ignored by the outdated selector
|
|
282
|
+
if (
|
|
283
|
+
node.mainImporter ||
|
|
284
|
+
node.manifest?.private ||
|
|
285
|
+
splitDepID(node.id)[0] !== 'registry'
|
|
286
|
+
) {
|
|
287
|
+
removeNode(state, node)
|
|
288
|
+
continue
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// fetchs outdated info and performs checks to define
|
|
292
|
+
// whether or not a node should be filtered out
|
|
293
|
+
queue.push(queueNode(state, node, kind))
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// nodes queued for removal are then finally removed
|
|
297
|
+
const removeNodeQueue = await Promise.all(queue)
|
|
298
|
+
for (const node of removeNodeQueue) {
|
|
299
|
+
if (node) {
|
|
300
|
+
removeNode(state, node)
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return state
|
|
305
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts'
|
|
2
|
+
import { removeEdge, removeUnlinkedNodes } from './helpers.ts'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* :overridden Pseudo-Selector, matches only edges that have a truthy overridden property in their spec.
|
|
6
|
+
* It filters out any edges that don't have edge.spec.overridden set to a truthy value
|
|
7
|
+
* and removes any unlinked nodes from the result.
|
|
8
|
+
*/
|
|
9
|
+
export const overridden = async (state: ParserState) => {
|
|
10
|
+
// filter edges that don't have a truthy overridden property
|
|
11
|
+
for (const edge of state.partial.edges) {
|
|
12
|
+
if (!edge.spec.overridden) {
|
|
13
|
+
removeEdge(state, edge)
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
removeUnlinkedNodes(state)
|
|
18
|
+
|
|
19
|
+
return state
|
|
20
|
+
}
|