@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,525 @@
|
|
|
1
|
+
import t from 'tap'
|
|
2
|
+
import postcssSelectorParser from 'postcss-selector-parser'
|
|
3
|
+
import type { ParserState } from '../../src/types.ts'
|
|
4
|
+
import { spec } from '../../src/pseudo/spec.ts'
|
|
5
|
+
import {
|
|
6
|
+
getSimpleGraph,
|
|
7
|
+
getMultiWorkspaceGraph,
|
|
8
|
+
getAliasedGraph,
|
|
9
|
+
getSemverRichGraph,
|
|
10
|
+
} from '../fixtures/graph.ts'
|
|
11
|
+
|
|
12
|
+
t.test('selects edges by spec.bareSpec value', async t => {
|
|
13
|
+
const getState = (query: string, graph = getSimpleGraph()) => {
|
|
14
|
+
const ast = postcssSelectorParser().astSync(query)
|
|
15
|
+
const current = ast.first.first
|
|
16
|
+
const state: ParserState = {
|
|
17
|
+
comment: '',
|
|
18
|
+
current,
|
|
19
|
+
initial: {
|
|
20
|
+
edges: new Set(graph.edges.values()),
|
|
21
|
+
nodes: new Set(graph.nodes.values()),
|
|
22
|
+
},
|
|
23
|
+
partial: {
|
|
24
|
+
edges: new Set(graph.edges.values()),
|
|
25
|
+
nodes: new Set(graph.nodes.values()),
|
|
26
|
+
},
|
|
27
|
+
collect: {
|
|
28
|
+
edges: new Set(),
|
|
29
|
+
nodes: new Set(),
|
|
30
|
+
},
|
|
31
|
+
cancellable: async () => {},
|
|
32
|
+
walk: async i => i,
|
|
33
|
+
retries: 0,
|
|
34
|
+
securityArchive: undefined,
|
|
35
|
+
importers: new Set(graph.importers),
|
|
36
|
+
signal: new AbortController().signal,
|
|
37
|
+
scopeIDs: [],
|
|
38
|
+
specificity: { idCounter: 0, commonCounter: 0 },
|
|
39
|
+
}
|
|
40
|
+
return state
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
await t.test('matches ^1.0.0 specs in simple graph', async t => {
|
|
44
|
+
const res = await spec(getState(':spec(^1.0.0)'))
|
|
45
|
+
// In getSimpleGraph, edges 'a', 'b', 'c', 'd', 'e' (2x), 'f' all have ^1.0.0 spec
|
|
46
|
+
t.strictSame(
|
|
47
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
48
|
+
['a', 'b', 'c', 'd', 'e', 'e', 'f'].sort(),
|
|
49
|
+
'should select all edges with ^1.0.0 bareSpec',
|
|
50
|
+
)
|
|
51
|
+
t.matchSnapshot({
|
|
52
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
53
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
await t.test('matches quoted ^1.0.0 specs', async t => {
|
|
58
|
+
const res = await spec(getState(':spec("^1.0.0")'))
|
|
59
|
+
// Same result as unquoted version - two 'e' edges exist
|
|
60
|
+
t.strictSame(
|
|
61
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
62
|
+
['a', 'b', 'c', 'd', 'e', 'e', 'f'].sort(),
|
|
63
|
+
'should select all edges with ^1.0.0 bareSpec when quoted',
|
|
64
|
+
)
|
|
65
|
+
t.matchSnapshot({
|
|
66
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
67
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
await t.test('matches file: protocol specs', async t => {
|
|
72
|
+
const res = await spec(getState(':spec("file:./y")'))
|
|
73
|
+
// In getSimpleGraph, @x/y has file:./y bareSpec (normalized from file:y)
|
|
74
|
+
t.strictSame(
|
|
75
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
76
|
+
['@x/y'].sort(),
|
|
77
|
+
'should select edge with file:./y bareSpec',
|
|
78
|
+
)
|
|
79
|
+
t.matchSnapshot({
|
|
80
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
81
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
await t.test('matches workspace: protocol specs', async t => {
|
|
86
|
+
const workspaceGraph = getMultiWorkspaceGraph()
|
|
87
|
+
const res = await spec(
|
|
88
|
+
getState(':spec("workspace:*")', workspaceGraph),
|
|
89
|
+
)
|
|
90
|
+
// In getMultiWorkspaceGraph, 'a' has workspace:* spec
|
|
91
|
+
t.strictSame(
|
|
92
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
93
|
+
['a'].sort(),
|
|
94
|
+
'should select edge with workspace:* bareSpec',
|
|
95
|
+
)
|
|
96
|
+
t.matchSnapshot({
|
|
97
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
98
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
await t.test('matches complex semver ranges', async t => {
|
|
103
|
+
const semverGraph = getSemverRichGraph()
|
|
104
|
+
const res = await spec(
|
|
105
|
+
getState(':spec("3 || 4 || 5")', semverGraph),
|
|
106
|
+
)
|
|
107
|
+
// In getSemverRichGraph, 'c' has '3 || 4 || 5' spec
|
|
108
|
+
t.strictSame(
|
|
109
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
110
|
+
['c'].sort(),
|
|
111
|
+
'should select edge with complex semver range bareSpec',
|
|
112
|
+
)
|
|
113
|
+
t.matchSnapshot({
|
|
114
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
115
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
await t.test('matches tilde semver ranges', async t => {
|
|
120
|
+
const semverGraph = getSemverRichGraph()
|
|
121
|
+
const res = await spec(getState(':spec(~2.2.0)', semverGraph))
|
|
122
|
+
// In getSemverRichGraph, 'b' has '~2.2.0' spec
|
|
123
|
+
t.strictSame(
|
|
124
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
125
|
+
['b'].sort(),
|
|
126
|
+
'should select edge with tilde semver range bareSpec',
|
|
127
|
+
)
|
|
128
|
+
t.matchSnapshot({
|
|
129
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
130
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
await t.test('matches range semver specs', async t => {
|
|
135
|
+
const semverGraph = getSemverRichGraph()
|
|
136
|
+
const res = await spec(
|
|
137
|
+
getState(':spec("1.2 - 2.3.4")', semverGraph),
|
|
138
|
+
)
|
|
139
|
+
// In getSemverRichGraph, 'd' has '1.2 - 2.3.4' spec
|
|
140
|
+
t.strictSame(
|
|
141
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
142
|
+
['d'].sort(),
|
|
143
|
+
'should select edge with range semver bareSpec',
|
|
144
|
+
)
|
|
145
|
+
t.matchSnapshot({
|
|
146
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
147
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
await t.test('matches npm: protocol specs', async t => {
|
|
152
|
+
const aliasedGraph = getAliasedGraph()
|
|
153
|
+
const res = await spec(
|
|
154
|
+
getState(':spec("npm:foo@^1.0.0")', aliasedGraph),
|
|
155
|
+
)
|
|
156
|
+
// In getAliasedGraph, 'b' has 'npm:foo@^1.0.0' spec
|
|
157
|
+
t.strictSame(
|
|
158
|
+
[...res.partial.edges].map(e => e.name).sort(),
|
|
159
|
+
['b'].sort(),
|
|
160
|
+
'should select edge with npm: protocol bareSpec',
|
|
161
|
+
)
|
|
162
|
+
t.matchSnapshot({
|
|
163
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
164
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
await t.test('returns empty when no matches found', async t => {
|
|
169
|
+
const res = await spec(getState(':spec("nonexistent-spec")'))
|
|
170
|
+
t.strictSame(
|
|
171
|
+
[...res.partial.edges],
|
|
172
|
+
[],
|
|
173
|
+
'should return no edges when spec does not match any edge',
|
|
174
|
+
)
|
|
175
|
+
t.strictSame(
|
|
176
|
+
[...res.partial.nodes],
|
|
177
|
+
[],
|
|
178
|
+
'should return no nodes when no edges match',
|
|
179
|
+
)
|
|
180
|
+
t.matchSnapshot({
|
|
181
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
182
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
await t.test('handles wildcard matching with *', async t => {
|
|
187
|
+
const workspaceGraph = getMultiWorkspaceGraph()
|
|
188
|
+
const res = await spec(getState(':spec("*")', workspaceGraph))
|
|
189
|
+
// workspace:* would have bareSpec of "*" if parsed differently, but it's "workspace:*"
|
|
190
|
+
// Let's test with actual "*" spec if one exists, otherwise expect empty
|
|
191
|
+
t.matchSnapshot({
|
|
192
|
+
nodes: [...res.partial.nodes].map(n => n.name).sort(),
|
|
193
|
+
edges: [...res.partial.edges].map(e => e.name).sort(),
|
|
194
|
+
})
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
await t.test('handles empty partial state', async t => {
|
|
198
|
+
const state = getState(':spec("^1.0.0")')
|
|
199
|
+
state.partial.nodes.clear()
|
|
200
|
+
state.partial.edges.clear()
|
|
201
|
+
|
|
202
|
+
const res = await spec(state)
|
|
203
|
+
t.strictSame(
|
|
204
|
+
[...res.partial.edges],
|
|
205
|
+
[],
|
|
206
|
+
'should return empty array of edges when starting with empty partial state',
|
|
207
|
+
)
|
|
208
|
+
t.strictSame(
|
|
209
|
+
[...res.partial.nodes],
|
|
210
|
+
[],
|
|
211
|
+
'should return empty array of nodes when starting with empty partial state',
|
|
212
|
+
)
|
|
213
|
+
t.matchSnapshot({
|
|
214
|
+
nodes: [...res.partial.nodes].map(n => n.name),
|
|
215
|
+
edges: [...res.partial.edges].map(e => e.name),
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
|
|
219
|
+
await t.test('correctly removes unlinked nodes', async t => {
|
|
220
|
+
// Test that removeUnlinkedNodes is working correctly
|
|
221
|
+
const res = await spec(getState(':spec("file:./y")'))
|
|
222
|
+
// Only @x/y edge should remain, and only its linked nodes should remain
|
|
223
|
+
const edgeNames = [...res.partial.edges].map(e => e.name)
|
|
224
|
+
const nodeNames = [...res.partial.nodes].map(n => n.name)
|
|
225
|
+
|
|
226
|
+
t.strictSame(
|
|
227
|
+
edgeNames.sort(),
|
|
228
|
+
['@x/y'],
|
|
229
|
+
'should only have @x/y edge',
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
// Check that we have proper node cleanup - only nodes with incoming edges should remain
|
|
233
|
+
// After filtering to just @x/y edge, only the target node @x/y should remain
|
|
234
|
+
// The main importer is removed because it only has outgoing edges, no incoming ones
|
|
235
|
+
t.notOk(
|
|
236
|
+
nodeNames.includes('my-project'),
|
|
237
|
+
'main importer should be removed (no incoming edges)',
|
|
238
|
+
)
|
|
239
|
+
t.ok(nodeNames.includes('@x/y'), 'should include target node')
|
|
240
|
+
|
|
241
|
+
t.matchSnapshot({
|
|
242
|
+
nodes: nodeNames.sort(),
|
|
243
|
+
edges: edgeNames.sort(),
|
|
244
|
+
})
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
await t.test('handles parsing errors gracefully', async t => {
|
|
248
|
+
// Test what happens with valid syntax
|
|
249
|
+
try {
|
|
250
|
+
// This should work fine with quoted values
|
|
251
|
+
const res = await spec(getState(':spec("^1.0.0")'))
|
|
252
|
+
t.ok(res, 'should handle quoted spec values correctly')
|
|
253
|
+
} catch (_err) {
|
|
254
|
+
t.fail('should not throw error for valid quoted spec values')
|
|
255
|
+
}
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
await t.test('handles simple unquoted values', async t => {
|
|
259
|
+
// Test unquoted simple single-token values for coverage
|
|
260
|
+
try {
|
|
261
|
+
// Use "*" as a simple unquoted value that should parse as a tag node
|
|
262
|
+
const res = await spec(getState(':spec(*)'))
|
|
263
|
+
t.ok(res, 'should handle simple unquoted spec values')
|
|
264
|
+
// This should return empty since no edges have "*" as bareSpec
|
|
265
|
+
t.strictSame(
|
|
266
|
+
[...res.partial.edges],
|
|
267
|
+
[],
|
|
268
|
+
'should return no edges for * spec',
|
|
269
|
+
)
|
|
270
|
+
} catch (err) {
|
|
271
|
+
// If parsing fails for unquoted values, that's acceptable
|
|
272
|
+
// The main functionality works with quoted values
|
|
273
|
+
t.ok(err, 'unquoted complex values may not parse correctly')
|
|
274
|
+
}
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
await t.test(
|
|
278
|
+
'handles CSS ID syntax in unquoted values',
|
|
279
|
+
async t => {
|
|
280
|
+
// Test parsing of unquoted values that contain # (CSS ID syntax)
|
|
281
|
+
// This covers the 'id' case in the switch statement (lines 78-80)
|
|
282
|
+
try {
|
|
283
|
+
const res = await spec(getState(':spec(test#1.0.0)'))
|
|
284
|
+
t.ok(res, 'should handle unquoted values with CSS ID syntax')
|
|
285
|
+
// Should return empty since no edges have "test#1.0.0" as bareSpec
|
|
286
|
+
t.strictSame(
|
|
287
|
+
[...res.partial.edges],
|
|
288
|
+
[],
|
|
289
|
+
'should return no edges for test#1.0.0 spec',
|
|
290
|
+
)
|
|
291
|
+
} catch (err) {
|
|
292
|
+
// CSS ID syntax might not be valid in this context
|
|
293
|
+
t.ok(
|
|
294
|
+
err,
|
|
295
|
+
'CSS ID syntax in unquoted values may not parse correctly',
|
|
296
|
+
)
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
await t.test('error handling - empty nodes array', async t => {
|
|
302
|
+
// Test error when parseInternals is called with empty nodes array (lines 30-31)
|
|
303
|
+
const { parseInternals } =
|
|
304
|
+
await import('../../src/pseudo/spec.ts')
|
|
305
|
+
|
|
306
|
+
t.throws(
|
|
307
|
+
() => parseInternals([]),
|
|
308
|
+
{ message: 'No nodes provided to parseInternals' },
|
|
309
|
+
'should throw error when nodes array is empty',
|
|
310
|
+
)
|
|
311
|
+
})
|
|
312
|
+
|
|
313
|
+
await t.test('error handling - node with no children', async t => {
|
|
314
|
+
// Test error when first node has no child nodes (lines 36-37)
|
|
315
|
+
const { parseInternals } =
|
|
316
|
+
await import('../../src/pseudo/spec.ts')
|
|
317
|
+
|
|
318
|
+
// Create a mock node that looks like a PostcssNode but has no child nodes
|
|
319
|
+
const mockNode = {
|
|
320
|
+
type: 'selector',
|
|
321
|
+
nodes: [],
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
t.throws(
|
|
325
|
+
() => parseInternals([mockNode as any]),
|
|
326
|
+
{ message: 'First node has no child nodes' },
|
|
327
|
+
'should throw error when first node has no child nodes',
|
|
328
|
+
)
|
|
329
|
+
})
|
|
330
|
+
|
|
331
|
+
await t.test(
|
|
332
|
+
'error handling - single node parsing failures',
|
|
333
|
+
async t => {
|
|
334
|
+
// Test the else branch in the catch block (lines 50-53)
|
|
335
|
+
// This tests when asStringNode throws an error that's not "Mismatching query node"
|
|
336
|
+
// or when the node is not a tag node
|
|
337
|
+
const { parseInternals } =
|
|
338
|
+
await import('../../src/pseudo/spec.ts')
|
|
339
|
+
|
|
340
|
+
// Create a mock node that will cause asStringNode to fail in an unexpected way
|
|
341
|
+
const mockChildNode = {
|
|
342
|
+
type: 'unknown', // Not a recognized type
|
|
343
|
+
value: 'test',
|
|
344
|
+
// Missing required properties for asStringNode
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const mockParentNode = {
|
|
348
|
+
type: 'selector',
|
|
349
|
+
nodes: [mockChildNode],
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
t.throws(
|
|
353
|
+
() => parseInternals([mockParentNode as any]),
|
|
354
|
+
'should throw error when single node parsing fails unexpectedly',
|
|
355
|
+
)
|
|
356
|
+
},
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
await t.test(
|
|
360
|
+
'handles quoted strings in multi-node parsing',
|
|
361
|
+
async t => {
|
|
362
|
+
// Test to cover the case 'string' branch (lines 82-83)
|
|
363
|
+
// Create a scenario with mixed node types including string nodes
|
|
364
|
+
const { parseInternals } =
|
|
365
|
+
await import('../../src/pseudo/spec.ts')
|
|
366
|
+
|
|
367
|
+
// Create a scenario with multiple nodes including a string node
|
|
368
|
+
const stringNode = {
|
|
369
|
+
type: 'string',
|
|
370
|
+
value: '"part"',
|
|
371
|
+
// Add required properties for string node
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const tagNode = {
|
|
375
|
+
type: 'tag',
|
|
376
|
+
value: 'prefix',
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const mockParentNode = {
|
|
380
|
+
type: 'selector',
|
|
381
|
+
nodes: [tagNode, stringNode],
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
try {
|
|
385
|
+
const result = parseInternals([mockParentNode as any])
|
|
386
|
+
t.ok(
|
|
387
|
+
result.specValue,
|
|
388
|
+
'should handle mixed node types including strings',
|
|
389
|
+
)
|
|
390
|
+
// The result should be the concatenation of tag + unquoted string
|
|
391
|
+
t.equal(
|
|
392
|
+
result.specValue,
|
|
393
|
+
'prefixpart',
|
|
394
|
+
'should correctly parse mixed nodes with string',
|
|
395
|
+
)
|
|
396
|
+
} catch (err) {
|
|
397
|
+
// If this specific combination doesn't work, that's acceptable
|
|
398
|
+
t.ok(
|
|
399
|
+
err,
|
|
400
|
+
'mixed node parsing may not work for all combinations',
|
|
401
|
+
)
|
|
402
|
+
}
|
|
403
|
+
},
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
await t.test(
|
|
407
|
+
'handles unknown node types in multi-node parsing',
|
|
408
|
+
async t => {
|
|
409
|
+
// Test to cover the default case branch (line 86)
|
|
410
|
+
// Create a scenario with unknown node types
|
|
411
|
+
const { parseInternals } =
|
|
412
|
+
await import('../../src/pseudo/spec.ts')
|
|
413
|
+
|
|
414
|
+
const unknownNode = {
|
|
415
|
+
type: 'unknown',
|
|
416
|
+
value: 'unknown-value',
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
const tagNode = {
|
|
420
|
+
type: 'tag',
|
|
421
|
+
value: 'prefix',
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const mockParentNode = {
|
|
425
|
+
type: 'selector',
|
|
426
|
+
nodes: [tagNode, unknownNode],
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
try {
|
|
430
|
+
const result = parseInternals([mockParentNode as any])
|
|
431
|
+
t.ok(
|
|
432
|
+
result.specValue,
|
|
433
|
+
'should handle unknown node types in default case',
|
|
434
|
+
)
|
|
435
|
+
// Should use the value property or string conversion
|
|
436
|
+
t.equal(
|
|
437
|
+
result.specValue,
|
|
438
|
+
'prefixunknown-value',
|
|
439
|
+
'should handle unknown node via default case',
|
|
440
|
+
)
|
|
441
|
+
} catch (err) {
|
|
442
|
+
// If unknown node types cause failures, that's acceptable
|
|
443
|
+
t.ok(err, 'unknown node types may cause parsing failures')
|
|
444
|
+
}
|
|
445
|
+
},
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
await t.test(
|
|
449
|
+
'error handling - non-tag single node with parsing error',
|
|
450
|
+
async t => {
|
|
451
|
+
// Try to trigger the else branch more specifically (lines 50-53)
|
|
452
|
+
// by creating a single node that's not a tag and causes asStringNode to fail
|
|
453
|
+
const { parseInternals } =
|
|
454
|
+
await import('../../src/pseudo/spec.ts')
|
|
455
|
+
|
|
456
|
+
// Create a node that looks like it might be a string but will fail asStringNode
|
|
457
|
+
const problematicNode = {
|
|
458
|
+
type: 'class', // This will cause "Mismatching query node" but isTagNode will be false
|
|
459
|
+
value: 'test-class',
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const mockParentNode = {
|
|
463
|
+
type: 'selector',
|
|
464
|
+
nodes: [problematicNode],
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
t.throws(
|
|
468
|
+
() => parseInternals([mockParentNode as any]),
|
|
469
|
+
/Mismatching query node/,
|
|
470
|
+
'should throw original error when single node is not a tag and asStringNode fails',
|
|
471
|
+
)
|
|
472
|
+
},
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
await t.test(
|
|
476
|
+
'error handling - spec selector parse failures',
|
|
477
|
+
async t => {
|
|
478
|
+
// Test error propagation from spec function when parseInternals fails (lines 110-113)
|
|
479
|
+
const state = getState(':spec("test")')
|
|
480
|
+
|
|
481
|
+
// Mock the current node to have no child nodes to trigger parseInternals error
|
|
482
|
+
const mockCurrentNode = {
|
|
483
|
+
type: 'pseudo',
|
|
484
|
+
nodes: [],
|
|
485
|
+
}
|
|
486
|
+
state.current = mockCurrentNode as any
|
|
487
|
+
|
|
488
|
+
await t.rejects(
|
|
489
|
+
spec(state),
|
|
490
|
+
/Failed to parse :spec selector/,
|
|
491
|
+
'should throw error with proper message when parsing fails',
|
|
492
|
+
)
|
|
493
|
+
},
|
|
494
|
+
)
|
|
495
|
+
|
|
496
|
+
await t.test(
|
|
497
|
+
'handles complex unquoted values with mixed node types',
|
|
498
|
+
async t => {
|
|
499
|
+
// Test parsing of complex unquoted values that result in mixed node types
|
|
500
|
+
// This should cover string nodes in multi-node parsing (lines 82-83)
|
|
501
|
+
// and potentially the default case (line 86)
|
|
502
|
+
|
|
503
|
+
// Create a complex unquoted selector that might generate mixed node types
|
|
504
|
+
try {
|
|
505
|
+
const res = await spec(getState(':spec(version1.0.0-alpha)'))
|
|
506
|
+
t.ok(
|
|
507
|
+
res,
|
|
508
|
+
'should handle complex unquoted values with mixed types',
|
|
509
|
+
)
|
|
510
|
+
// Should return empty since no edges have this exact bareSpec
|
|
511
|
+
t.strictSame(
|
|
512
|
+
[...res.partial.edges],
|
|
513
|
+
[],
|
|
514
|
+
'should return no edges for complex unquoted spec',
|
|
515
|
+
)
|
|
516
|
+
} catch (err) {
|
|
517
|
+
// Complex unquoted values might not parse correctly in all cases
|
|
518
|
+
t.ok(
|
|
519
|
+
err,
|
|
520
|
+
'complex unquoted values may fail to parse in some cases',
|
|
521
|
+
)
|
|
522
|
+
}
|
|
523
|
+
},
|
|
524
|
+
)
|
|
525
|
+
})
|