@vltpkg/query 0.0.0-8 → 1.0.0-rc.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/README.md +38 -249
- package/dist/esm/attribute.d.ts +1 -1
- package/dist/esm/attribute.d.ts.map +1 -1
- package/dist/esm/attribute.js +5 -12
- package/dist/esm/attribute.js.map +1 -1
- package/dist/esm/combinator.d.ts.map +1 -1
- package/dist/esm/combinator.js +1 -1
- package/dist/esm/combinator.js.map +1 -1
- package/dist/esm/id.d.ts.map +1 -1
- package/dist/esm/id.js +23 -7
- package/dist/esm/id.js.map +1 -1
- package/dist/esm/index.d.ts +29 -7
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +247 -21
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/parser.d.ts +15 -0
- package/dist/esm/parser.d.ts.map +1 -0
- package/dist/esm/parser.js +93 -0
- package/dist/esm/parser.js.map +1 -0
- package/dist/esm/pseudo/attr.d.ts +2 -1
- package/dist/esm/pseudo/attr.d.ts.map +1 -1
- package/dist/esm/pseudo/attr.js +10 -2
- package/dist/esm/pseudo/attr.js.map +1 -1
- package/dist/esm/pseudo/built.d.ts +8 -0
- package/dist/esm/pseudo/built.d.ts.map +1 -0
- package/dist/esm/pseudo/built.js +16 -0
- package/dist/esm/pseudo/built.js.map +1 -0
- package/dist/esm/pseudo/confused.d.ts +4 -2
- package/dist/esm/pseudo/confused.d.ts.map +1 -1
- package/dist/esm/pseudo/confused.js +15 -2
- package/dist/esm/pseudo/confused.js.map +1 -1
- package/dist/esm/pseudo/cve.d.ts +2 -1
- package/dist/esm/pseudo/cve.d.ts.map +1 -1
- package/dist/esm/pseudo/cve.js +2 -2
- package/dist/esm/pseudo/cve.js.map +1 -1
- package/dist/esm/pseudo/cwe.d.ts +2 -1
- package/dist/esm/pseudo/cwe.d.ts.map +1 -1
- package/dist/esm/pseudo/cwe.js +2 -2
- package/dist/esm/pseudo/cwe.js.map +1 -1
- package/dist/esm/pseudo/dev.d.ts +6 -0
- package/dist/esm/pseudo/dev.d.ts.map +1 -0
- package/dist/esm/pseudo/dev.js +15 -0
- package/dist/esm/pseudo/dev.js.map +1 -0
- package/dist/esm/pseudo/empty.d.ts +7 -0
- package/dist/esm/pseudo/empty.d.ts.map +1 -0
- package/dist/esm/pseudo/empty.js +14 -0
- package/dist/esm/pseudo/empty.js.map +1 -0
- package/dist/esm/pseudo/helpers.d.ts +13 -1
- package/dist/esm/pseudo/helpers.d.ts.map +1 -1
- package/dist/esm/pseudo/helpers.js +27 -0
- package/dist/esm/pseudo/helpers.js.map +1 -1
- package/dist/esm/pseudo/host.d.ts +20 -0
- package/dist/esm/pseudo/host.d.ts.map +1 -0
- package/dist/esm/pseudo/host.js +80 -0
- package/dist/esm/pseudo/host.js.map +1 -0
- package/dist/esm/pseudo/license.d.ts +2 -1
- package/dist/esm/pseudo/license.d.ts.map +1 -1
- package/dist/esm/pseudo/license.js +19 -2
- package/dist/esm/pseudo/license.js.map +1 -1
- package/dist/esm/pseudo/link.d.ts +9 -0
- package/dist/esm/pseudo/link.d.ts.map +1 -0
- package/dist/esm/pseudo/link.js +25 -0
- package/dist/esm/pseudo/link.js.map +1 -0
- package/dist/esm/pseudo/malware.d.ts +13 -1
- package/dist/esm/pseudo/malware.d.ts.map +1 -1
- package/dist/esm/pseudo/malware.js +140 -10
- package/dist/esm/pseudo/malware.js.map +1 -1
- package/dist/esm/pseudo/missing.d.ts +8 -0
- package/dist/esm/pseudo/missing.d.ts.map +1 -0
- package/dist/esm/pseudo/missing.js +15 -0
- package/dist/esm/pseudo/missing.js.map +1 -0
- package/dist/esm/pseudo/optional.d.ts +6 -0
- package/dist/esm/pseudo/optional.d.ts.map +1 -0
- package/dist/esm/pseudo/optional.js +15 -0
- package/dist/esm/pseudo/optional.js.map +1 -0
- package/dist/esm/pseudo/outdated.d.ts +4 -4
- package/dist/esm/pseudo/outdated.d.ts.map +1 -1
- package/dist/esm/pseudo/outdated.js +44 -33
- package/dist/esm/pseudo/outdated.js.map +1 -1
- package/dist/esm/pseudo/overridden.d.ts +8 -0
- package/dist/esm/pseudo/overridden.d.ts.map +1 -0
- package/dist/esm/pseudo/overridden.js +17 -0
- package/dist/esm/pseudo/overridden.js.map +1 -0
- package/dist/esm/pseudo/path.d.ts +19 -0
- package/dist/esm/pseudo/path.d.ts.map +1 -0
- package/dist/esm/pseudo/path.js +113 -0
- package/dist/esm/pseudo/path.js.map +1 -0
- package/dist/esm/pseudo/peer.d.ts +6 -0
- package/dist/esm/pseudo/peer.d.ts.map +1 -0
- package/dist/esm/pseudo/peer.js +15 -0
- package/dist/esm/pseudo/peer.js.map +1 -0
- package/dist/esm/pseudo/prerelease.d.ts +18 -0
- package/dist/esm/pseudo/prerelease.d.ts.map +1 -0
- package/dist/esm/pseudo/prerelease.js +41 -0
- package/dist/esm/pseudo/prerelease.js.map +1 -0
- package/dist/esm/pseudo/private.d.ts +7 -0
- package/dist/esm/pseudo/private.d.ts.map +1 -0
- package/dist/esm/pseudo/private.js +16 -0
- package/dist/esm/pseudo/private.js.map +1 -0
- package/dist/esm/pseudo/prod.d.ts +6 -0
- package/dist/esm/pseudo/prod.d.ts.map +1 -0
- package/dist/esm/pseudo/prod.js +15 -0
- package/dist/esm/pseudo/prod.js.map +1 -0
- package/dist/esm/pseudo/published.d.ts +40 -0
- package/dist/esm/pseudo/published.d.ts.map +1 -0
- package/dist/esm/pseudo/published.js +180 -0
- package/dist/esm/pseudo/published.js.map +1 -0
- package/dist/esm/pseudo/root.d.ts +7 -0
- package/dist/esm/pseudo/root.d.ts.map +1 -0
- package/dist/esm/pseudo/root.js +18 -0
- package/dist/esm/pseudo/root.js.map +1 -0
- package/dist/esm/pseudo/scanned.d.ts +4 -2
- package/dist/esm/pseudo/scanned.d.ts.map +1 -1
- package/dist/esm/pseudo/scanned.js +10 -5
- package/dist/esm/pseudo/scanned.js.map +1 -1
- package/dist/esm/pseudo/score.d.ts +16 -0
- package/dist/esm/pseudo/score.d.ts.map +1 -0
- package/dist/esm/pseudo/score.js +133 -0
- package/dist/esm/pseudo/score.js.map +1 -0
- package/dist/esm/pseudo/scripts.d.ts +7 -4
- package/dist/esm/pseudo/scripts.d.ts.map +1 -1
- package/dist/esm/pseudo/scripts.js +41 -3
- package/dist/esm/pseudo/scripts.js.map +1 -1
- package/dist/esm/pseudo/semver.d.ts +2 -1
- package/dist/esm/pseudo/semver.d.ts.map +1 -1
- package/dist/esm/pseudo/semver.js +11 -24
- package/dist/esm/pseudo/semver.js.map +1 -1
- package/dist/esm/pseudo/severity.d.ts +4 -1
- package/dist/esm/pseudo/severity.d.ts.map +1 -1
- package/dist/esm/pseudo/severity.js +111 -8
- package/dist/esm/pseudo/severity.js.map +1 -1
- package/dist/esm/pseudo/spec.d.ts +17 -0
- package/dist/esm/pseudo/spec.d.ts.map +1 -0
- package/dist/esm/pseudo/spec.js +102 -0
- package/dist/esm/pseudo/spec.js.map +1 -0
- package/dist/esm/pseudo/squat.d.ts +4 -1
- package/dist/esm/pseudo/squat.d.ts.map +1 -1
- package/dist/esm/pseudo/squat.js +127 -9
- package/dist/esm/pseudo/squat.js.map +1 -1
- package/dist/esm/pseudo/type.d.ts +8 -0
- package/dist/esm/pseudo/type.d.ts.map +1 -0
- package/dist/esm/pseudo/type.js +22 -0
- package/dist/esm/pseudo/type.js.map +1 -0
- package/dist/esm/pseudo/workspace.d.ts +6 -0
- package/dist/esm/pseudo/workspace.d.ts.map +1 -0
- package/dist/esm/pseudo/workspace.js +20 -0
- package/dist/esm/pseudo/workspace.js.map +1 -0
- package/dist/esm/pseudo.d.ts.map +1 -1
- package/dist/esm/pseudo.js +81 -105
- package/dist/esm/pseudo.js.map +1 -1
- package/dist/esm/types.d.ts +97 -27
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +1 -106
- package/dist/esm/types.js.map +1 -1
- package/package.json +20 -16
- package/dist/esm/class.d.ts +0 -6
- package/dist/esm/class.d.ts.map +0 -1
- package/dist/esm/class.js +0 -131
- package/dist/esm/class.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../../../src/pseudo/severity.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '../types.ts'\nimport type { ParserState, PostcssNode } from '../types.ts'\nimport {\n assertSecurityArchive,\n removeDanglingEdges,\n removeNode,\n removeQuotes,\n} from './helpers.ts'\n\nexport type SeverityKinds =\n | '0'\n | '1'\n | '2'\n | '3'\n | 'critical'\n | 'high'\n | 'medium'\n | 'low'\n | undefined\n\nexport type SeverityAlertTypes =\n | 'criticalCVE'\n | 'cve'\n | 'potentialVulnerability'\n | 'mildCVE'\n | undefined\n\nconst kindsMap = new Map<SeverityKinds, SeverityAlertTypes>([\n ['critical', 'criticalCVE'],\n ['high', 'cve'],\n ['medium', 'potentialVulnerability'],\n ['low', 'mildCVE'],\n ['0', 'criticalCVE'],\n ['1', 'cve'],\n ['2', 'potentialVulnerability'],\n ['3', 'mildCVE'],\n])\nconst kinds = new Set(kindsMap.keys())\n\nexport const isSeverityKind = (\n value?: string,\n): value is SeverityKinds => kinds.has(value as SeverityKinds)\n\nexport const asSeverityKind = (value?: string): SeverityKinds => {\n if (!isSeverityKind(value)) {\n throw error('Expected a valid severity kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\nexport const parseInternals = (\n nodes: PostcssNode[],\n): { kind: SeverityKinds } => {\n let kind: SeverityKinds\n\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kind = asSeverityKind(\n removeQuotes(\n asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n .value,\n ),\n )\n } else if (\n isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n ) {\n kind = asSeverityKind(\n asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,\n )\n }\n\n return { kind }\n}\n\nexport const severity = async (state: ParserState) => {\n assertSecurityArchive(state, 'severity')\n\n let internals\n try {\n internals = parseInternals(\n asPostcssNodeWithChildren(state.current).nodes,\n )\n } catch (err) {\n throw error('Failed to parse :severity selector', { cause: err })\n }\n\n const { kind } = internals\n const alertName = kindsMap.get(kind)\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n const exclude = !report?.alerts.some(\n alert => alert.type === alertName,\n )\n if (exclude) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
|
|
1
|
+
{"version":3,"file":"severity.js","sourceRoot":"","sources":["../../../src/pseudo/severity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAA;AAwBrB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAoC;IAC1D,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,QAAQ,EAAE,wBAAwB,CAAC;IACpC,CAAC,KAAK,EAAE,SAAS,CAAC;IAClB,CAAC,GAAG,EAAE,aAAa,CAAC;IACpB,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,GAAG,EAAE,wBAAwB,CAAC;IAC/B,CAAC,GAAG,EAAE,SAAS,CAAC;CACjB,CAAC,CAAA;AAEF,2EAA2E;AAC3E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAwB;IAClD,CAAC,UAAU,EAAE,CAAC,CAAC;IACf,CAAC,MAAM,EAAE,CAAC,CAAC;IACX,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,KAAK,EAAE,CAAC,CAAC;IACV,CAAC,GAAG,EAAE,CAAC,CAAC;IACR,CAAC,GAAG,EAAE,CAAC,CAAC;IACR,CAAC,GAAG,EAAE,CAAC,CAAC;IACR,CAAC,GAAG,EAAE,CAAC,CAAC;CACT,CAAC,CAAA;AAEF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAc,EACU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAsB,CAAC,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAiB,EAAE;IAC9D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,CAAC,gCAAgC,EAAE;YAC5C,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SAChC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAoB,EAIpB,EAAE;IACF,IAAI,IAAmB,CAAA;IACvB,IAAI,UAA8B,CAAA;IAElC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,IAAI,YAAY,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,SAAS,GAAG,YAAY,CACtB,YAAY,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvD,KAAK,CACT,CAAA;IACH,CAAC;SAAM,IACL,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC;QACD,SAAS,GAAG,SAAS,CACnB,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7C,CAAC,KAAK,CAAA;IACT,CAAC;IAED,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,IAAI,CAAA;QACjB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,UAAU,GAAG,IAAI,CAAA;QACjB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,GAAG,CAAA;QAChB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,GAAG,CAAA;QAChB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IAAI,GAAG,SAAS,CAAA;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CACT,sDAAsD,EACtD;gBACE,KAAK,EAAE,SAAS;aACjB,CACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IACnD,qBAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAExC,IAAI,SAAS,CAAA;IACb,IAAI,CAAC;QACH,SAAS,GAAG,cAAc,CACxB,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAC/C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjD,+DAA+D;QAC/D,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjD,IAAI,OAAO,GAAG,IAAI,CAAA;QAElB,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,UAAU,EAAE,CAAC;gBACf,wCAAwC;gBACxC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACxC,+DAA+D;gBAC/D,oEAAoE;gBACpE,mDAAmD;gBACnD,iCAAiC;gBACjC,IAAI,CAAC,SAAS;oBAAE,MAAK;gBAErB,kEAAkE;gBAClE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClC,4CAA4C;oBAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;oBAE5B,mEAAmE;oBACnE,MAAM,oBAAoB,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACvD,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,KAAK,SAAS,CAC9C,EAAE,CAAC,CAAC,CAAC,CAAA;oBAEN,8DAA8D;oBAC9D,IAAI,oBAAoB,EAAE,CAAC;wBACzB,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CACxC,oBAAoB,CACrB,CAAA;wBACD,qDAAqD;wBACrD,IAAI,iBAAiB,IAAI,IAAI;4BAAE,SAAQ;wBAEvC,QAAQ,UAAU,EAAE,CAAC;4BACnB,KAAK,GAAG;gCACN,IAAI,iBAAiB,GAAG,SAAS,EAAE,CAAC;oCAClC,OAAO,GAAG,KAAK,CAAA;gCACjB,CAAC;gCACD,MAAK;4BACP,KAAK,GAAG;gCACN,IAAI,iBAAiB,GAAG,SAAS,EAAE,CAAC;oCAClC,OAAO,GAAG,KAAK,CAAA;gCACjB,CAAC;gCACD,MAAK;4BACP,KAAK,IAAI;gCACP,IAAI,iBAAiB,IAAI,SAAS,EAAE,CAAC;oCACnC,OAAO,GAAG,KAAK,CAAA;gCACjB,CAAC;gCACD,MAAK;4BACP,KAAK,IAAI;gCACP,IAAI,iBAAiB,IAAI,SAAS,EAAE,CAAC;oCACnC,OAAO,GAAG,KAAK,CAAA;gCACjB,CAAC;gCACD,MAAK;wBACT,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gCAAgC;gBAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACpC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC3B,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAClC,CAAA;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAE1B,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '@vltpkg/dss-parser'\nimport {\n assertSecurityArchive,\n removeDanglingEdges,\n removeNode,\n removeQuotes,\n} from './helpers.ts'\nimport type { ParserState } from '../types.ts'\nimport type { PostcssNode } from '@vltpkg/dss-parser'\n\nexport type SeverityKinds =\n | '0'\n | '1'\n | '2'\n | '3'\n | 'critical'\n | 'high'\n | 'medium'\n | 'low'\n | undefined\n\nexport type SeverityAlertTypes =\n | 'criticalCVE'\n | 'cve'\n | 'potentialVulnerability'\n | 'mildCVE'\n | undefined\n\nexport type SeverityComparator = '>' | '<' | '>=' | '<=' | undefined\n\nconst kindsMap = new Map<SeverityKinds, SeverityAlertTypes>([\n ['critical', 'criticalCVE'],\n ['high', 'cve'],\n ['medium', 'potentialVulnerability'],\n ['low', 'mildCVE'],\n ['0', 'criticalCVE'],\n ['1', 'cve'],\n ['2', 'potentialVulnerability'],\n ['3', 'mildCVE'],\n])\n\n// Map numerical values to their respective kinds for comparison operations\nconst kindLevelMap = new Map<SeverityKinds, number>([\n ['critical', 0],\n ['high', 1],\n ['medium', 2],\n ['low', 3],\n ['0', 0],\n ['1', 1],\n ['2', 2],\n ['3', 3],\n])\n\nconst kinds = new Set(kindsMap.keys())\n\nexport const isSeverityKind = (\n value?: string,\n): value is SeverityKinds => kinds.has(value as SeverityKinds)\n\nexport const asSeverityKind = (value?: string): SeverityKinds => {\n if (!isSeverityKind(value)) {\n throw error('Expected a valid severity kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\nexport const parseInternals = (\n nodes: PostcssNode[],\n): {\n kind: SeverityKinds\n comparator: SeverityComparator\n} => {\n let kind: SeverityKinds\n let comparator: SeverityComparator\n\n if (nodes.length === 0) {\n throw error('Missing severity kind parameter')\n }\n\n let kindValue = ''\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kindValue = removeQuotes(\n asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n .value,\n )\n } else if (\n isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n ) {\n kindValue = asTagNode(\n asPostcssNodeWithChildren(nodes[0]).nodes[0],\n ).value\n }\n\n // Extract comparator if present\n if (kindValue.startsWith('>=')) {\n comparator = '>='\n kindValue = kindValue.substring(2)\n } else if (kindValue.startsWith('<=')) {\n comparator = '<='\n kindValue = kindValue.substring(2)\n } else if (kindValue.startsWith('>')) {\n comparator = '>'\n kindValue = kindValue.substring(1)\n } else if (kindValue.startsWith('<')) {\n comparator = '<'\n kindValue = kindValue.substring(1)\n }\n\n // Parse kind value\n if (kindValue) {\n if (isSeverityKind(kindValue)) {\n kind = kindValue\n } else {\n throw error(\n 'Expected a valid severity kind or number between 0-3',\n {\n found: kindValue,\n },\n )\n }\n }\n\n return { kind, comparator }\n}\n\nexport const severity = async (state: ParserState) => {\n assertSecurityArchive(state, 'severity')\n\n let internals\n try {\n internals = parseInternals(\n asPostcssNodeWithChildren(state.current).nodes,\n )\n } catch (err) {\n throw error('Failed to parse :severity selector', { cause: err })\n }\n\n const { kind, comparator } = internals\n\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n // Always exclude nodes that don't have security data or alerts\n if (!report?.alerts || report.alerts.length === 0) {\n removeNode(state, node)\n }\n }\n\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n let exclude = true\n\n if (report) {\n if (comparator) {\n // retrieve the value to compare against\n const kindLevel = kindLevelMap.get(kind)\n // the kindLevel value has already been validated at this point\n // and thus can never return an undefined/falsy value but ts doesn't\n // know about that, so we have the extra check here\n /* c8 ignore next - impossible */\n if (!kindLevel) break\n\n // Check each alert to find any that match our comparison criteria\n for (const alert of report.alerts) {\n // Get the numerical value of the alert type\n const alertType = alert.type\n\n // retrieve a key to the current alert level to be compared against\n const currentAlertLevelKey = [...kindsMap.entries()].find(\n ([_, alertValue]) => alertValue === alertType,\n )?.[0]\n\n // perform the comparison based on the user-provided kindLevel\n if (currentAlertLevelKey) {\n const currentAlertLevel = kindLevelMap.get(\n currentAlertLevelKey,\n )\n /* c8 ignore next - impossible but ts doesn't know */\n if (currentAlertLevel == null) continue\n\n switch (comparator) {\n case '>':\n if (currentAlertLevel > kindLevel) {\n exclude = false\n }\n break\n case '<':\n if (currentAlertLevel < kindLevel) {\n exclude = false\n }\n break\n case '>=':\n if (currentAlertLevel >= kindLevel) {\n exclude = false\n }\n break\n case '<=':\n if (currentAlertLevel <= kindLevel) {\n exclude = false\n }\n break\n }\n }\n }\n } else {\n // Original exact match behavior\n const alertName = kindsMap.get(kind)\n exclude = !report.alerts.some(\n alert => alert.type === alertName,\n )\n }\n }\n\n if (exclude) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts';
|
|
2
|
+
import type { PostcssNode } from '@vltpkg/dss-parser';
|
|
3
|
+
export type SpecInternals = {
|
|
4
|
+
specValue: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const parseInternals: (nodes: PostcssNode[]) => SpecInternals;
|
|
7
|
+
/**
|
|
8
|
+
* :spec Pseudo-Selector, matches edges where edge.spec.bareSpec equals the provided value.
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* - :spec("*") matches edges with a package specifier equal to "*"
|
|
12
|
+
* - :spec(^1.0.0) matches edges with a package specifier equal to "^1.0.0"
|
|
13
|
+
* - :spec("catalog:") matches edges with a package specifier equal to "catalog:"
|
|
14
|
+
* - :spec("workspace:dev") matches edges with a package specifier equal to "workspace:dev"
|
|
15
|
+
*/
|
|
16
|
+
export declare const spec: (state: ParserState) => Promise<ParserState>;
|
|
17
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../src/pseudo/spec.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,cAAc,UAClB,WAAW,EAAE,KACnB,aAyEF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,UAAiB,WAAW,yBAwB5C,CAAA"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { error } from '@vltpkg/error-cause';
|
|
2
|
+
import { asError } from '@vltpkg/types';
|
|
3
|
+
import { asPostcssNodeWithChildren, asStringNode, asTagNode, isTagNode, } from '@vltpkg/dss-parser';
|
|
4
|
+
import { removeEdge, removeUnlinkedNodes, removeQuotes, } from "./helpers.js";
|
|
5
|
+
export const parseInternals = (nodes) => {
|
|
6
|
+
// tries to parse the first param as a string node, otherwise defaults
|
|
7
|
+
// to reading all postcss nodes as just strings, since it just means
|
|
8
|
+
// the value was defined as an unquoted string
|
|
9
|
+
let specValue = '';
|
|
10
|
+
if (nodes.length === 0) {
|
|
11
|
+
throw new Error('No nodes provided to parseInternals');
|
|
12
|
+
}
|
|
13
|
+
const firstNode = asPostcssNodeWithChildren(nodes[0]);
|
|
14
|
+
if (firstNode.nodes.length === 0) {
|
|
15
|
+
throw new Error('First node has no child nodes');
|
|
16
|
+
}
|
|
17
|
+
// Try to parse as a quoted string first (single string node)
|
|
18
|
+
if (firstNode.nodes.length === 1) {
|
|
19
|
+
const targetNode = firstNode.nodes[0];
|
|
20
|
+
try {
|
|
21
|
+
specValue = removeQuotes(asStringNode(targetNode).value);
|
|
22
|
+
return { specValue };
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
if (asError(err).message === 'Mismatching query node' &&
|
|
26
|
+
isTagNode(targetNode)
|
|
27
|
+
/* c8 ignore start */
|
|
28
|
+
) {
|
|
29
|
+
// Handle simple unquoted single-token values like "1"
|
|
30
|
+
const tagNode = asTagNode(targetNode);
|
|
31
|
+
specValue = tagNode.value;
|
|
32
|
+
return { specValue };
|
|
33
|
+
/* c8 ignore stop */
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Handle unquoted complex values that get parsed into multiple nodes
|
|
41
|
+
// This happens when unquoted values contain dots, like ^1.0.0 which becomes:
|
|
42
|
+
// - Tag: "^1"
|
|
43
|
+
// - ClassName: "0" (from .0)
|
|
44
|
+
// - ClassName: "0" (from .0)
|
|
45
|
+
// We need to reconstruct the original value by concatenating all nodes
|
|
46
|
+
const parts = [];
|
|
47
|
+
for (const node of firstNode.nodes) {
|
|
48
|
+
switch (node.type) {
|
|
49
|
+
case 'tag':
|
|
50
|
+
parts.push(asTagNode(node).value);
|
|
51
|
+
break;
|
|
52
|
+
case 'class':
|
|
53
|
+
// Class nodes represent .className in CSS, so we need to add the dot back
|
|
54
|
+
parts.push('.' + node.value);
|
|
55
|
+
break;
|
|
56
|
+
case 'id':
|
|
57
|
+
// ID nodes represent #idName in CSS, so we need to add the hash back
|
|
58
|
+
parts.push('#' + node.value);
|
|
59
|
+
break;
|
|
60
|
+
case 'string':
|
|
61
|
+
parts.push(removeQuotes(asStringNode(node).value));
|
|
62
|
+
break;
|
|
63
|
+
default:
|
|
64
|
+
// For other node types, try to get the value property or convert to string
|
|
65
|
+
/* c8 ignore next */
|
|
66
|
+
parts.push(node.value ?? String(node));
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
specValue = parts.join('');
|
|
71
|
+
return { specValue };
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* :spec Pseudo-Selector, matches edges where edge.spec.bareSpec equals the provided value.
|
|
75
|
+
*
|
|
76
|
+
* Examples:
|
|
77
|
+
* - :spec("*") matches edges with a package specifier equal to "*"
|
|
78
|
+
* - :spec(^1.0.0) matches edges with a package specifier equal to "^1.0.0"
|
|
79
|
+
* - :spec("catalog:") matches edges with a package specifier equal to "catalog:"
|
|
80
|
+
* - :spec("workspace:dev") matches edges with a package specifier equal to "workspace:dev"
|
|
81
|
+
*/
|
|
82
|
+
export const spec = async (state) => {
|
|
83
|
+
let internals;
|
|
84
|
+
try {
|
|
85
|
+
internals = parseInternals(asPostcssNodeWithChildren(state.current).nodes);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw error('Failed to parse :spec selector', {
|
|
89
|
+
cause: err,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const { specValue } = internals;
|
|
93
|
+
for (const edge of state.partial.edges) {
|
|
94
|
+
if (edge.spec.bareSpec !== specValue) {
|
|
95
|
+
removeEdge(state, edge);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Clean up unlinked nodes after removing edges
|
|
99
|
+
removeUnlinkedNodes(state);
|
|
100
|
+
return state;
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/pseudo/spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { asError } from '@vltpkg/types'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isTagNode,\n} from '@vltpkg/dss-parser'\nimport {\n removeEdge,\n removeUnlinkedNodes,\n removeQuotes,\n} from './helpers.ts'\nimport type { ParserState } from '../types.ts'\nimport type { PostcssNode } from '@vltpkg/dss-parser'\n\nexport type SpecInternals = {\n specValue: string\n}\n\nexport const parseInternals = (\n nodes: PostcssNode[],\n): SpecInternals => {\n // tries to parse the first param as a string node, otherwise defaults\n // to reading all postcss nodes as just strings, since it just means\n // the value was defined as an unquoted string\n let specValue = ''\n\n if (nodes.length === 0) {\n throw new Error('No nodes provided to parseInternals')\n }\n\n const firstNode = asPostcssNodeWithChildren(nodes[0])\n\n if (firstNode.nodes.length === 0) {\n throw new Error('First node has no child nodes')\n }\n\n // Try to parse as a quoted string first (single string node)\n if (firstNode.nodes.length === 1) {\n const targetNode = firstNode.nodes[0]\n try {\n specValue = removeQuotes(asStringNode(targetNode).value)\n return { specValue }\n } catch (err) {\n if (\n asError(err).message === 'Mismatching query node' &&\n isTagNode(targetNode)\n /* c8 ignore start */\n ) {\n // Handle simple unquoted single-token values like \"1\"\n const tagNode = asTagNode(targetNode)\n specValue = tagNode.value\n return { specValue }\n /* c8 ignore stop */\n } else {\n throw err\n }\n }\n }\n\n // Handle unquoted complex values that get parsed into multiple nodes\n // This happens when unquoted values contain dots, like ^1.0.0 which becomes:\n // - Tag: \"^1\"\n // - ClassName: \"0\" (from .0)\n // - ClassName: \"0\" (from .0)\n // We need to reconstruct the original value by concatenating all nodes\n const parts: string[] = []\n\n for (const node of firstNode.nodes) {\n switch (node.type) {\n case 'tag':\n parts.push(asTagNode(node).value)\n break\n case 'class':\n // Class nodes represent .className in CSS, so we need to add the dot back\n parts.push('.' + node.value)\n break\n case 'id':\n // ID nodes represent #idName in CSS, so we need to add the hash back\n parts.push('#' + node.value)\n break\n case 'string':\n parts.push(removeQuotes(asStringNode(node).value))\n break\n default:\n // For other node types, try to get the value property or convert to string\n /* c8 ignore next */\n parts.push(node.value ?? String(node))\n break\n }\n }\n\n specValue = parts.join('')\n return { specValue }\n}\n\n/**\n * :spec Pseudo-Selector, matches edges where edge.spec.bareSpec equals the provided value.\n *\n * Examples:\n * - :spec(\"*\") matches edges with a package specifier equal to \"*\"\n * - :spec(^1.0.0) matches edges with a package specifier equal to \"^1.0.0\"\n * - :spec(\"catalog:\") matches edges with a package specifier equal to \"catalog:\"\n * - :spec(\"workspace:dev\") matches edges with a package specifier equal to \"workspace:dev\"\n */\nexport const spec = async (state: ParserState) => {\n let internals\n try {\n internals = parseInternals(\n asPostcssNodeWithChildren(state.current).nodes,\n )\n } catch (err) {\n throw error('Failed to parse :spec selector', {\n cause: err,\n })\n }\n\n const { specValue } = internals\n\n for (const edge of state.partial.edges) {\n if (edge.spec.bareSpec !== specValue) {\n removeEdge(state, edge)\n }\n }\n\n // Clean up unlinked nodes after removing edges\n removeUnlinkedNodes(state)\n\n return state\n}\n"]}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import type { ParserState
|
|
1
|
+
import type { ParserState } from '../types.ts';
|
|
2
|
+
import type { PostcssNode } from '@vltpkg/dss-parser';
|
|
2
3
|
export type SquatKinds = '0' | '2' | 'critical' | 'medium' | undefined;
|
|
3
4
|
export type SquatAlertTypes = 'didYouMean' | 'gptDidYouMean' | undefined;
|
|
5
|
+
export type SquatComparator = '>' | '<' | '>=' | '<=' | undefined;
|
|
4
6
|
export declare const isSquatKind: (value?: string) => value is SquatKinds;
|
|
5
7
|
export declare const asSquatKind: (value?: string) => SquatKinds;
|
|
6
8
|
export declare const parseInternals: (nodes: PostcssNode[]) => {
|
|
7
9
|
kind: SquatKinds;
|
|
10
|
+
comparator: SquatComparator;
|
|
8
11
|
};
|
|
9
12
|
export declare const squat: (state: ParserState) => Promise<ParserState & {
|
|
10
13
|
securityArchive: NonNullable<ParserState["securityArchive"]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"squat.d.ts","sourceRoot":"","sources":["../../../src/pseudo/squat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"squat.d.ts","sourceRoot":"","sources":["../../../src/pseudo/squat.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;AAEtE,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,eAAe,GACf,SAAS,CAAA;AAEb,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;AAoBjE,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,KAAK,IAAI,UACtB,CAAA;AAEhC,eAAO,MAAM,WAAW,WAAY,MAAM,KAAG,UAQ5C,CAAA;AAED,eAAO,MAAM,cAAc,UAClB,WAAW,EAAE,KACnB;IACD,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,eAAe,CAAA;CA+C5B,CAAA;AAED,eAAO,MAAM,KAAK,UAAiB,WAAW;;EAmH7C,CAAA"}
|
package/dist/esm/pseudo/squat.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { error } from '@vltpkg/error-cause';
|
|
2
|
-
import {
|
|
2
|
+
import { asError } from '@vltpkg/types';
|
|
3
|
+
import { asPostcssNodeWithChildren, asStringNode, asTagNode, isStringNode, isTagNode, } from '@vltpkg/dss-parser';
|
|
3
4
|
import { assertSecurityArchive, removeDanglingEdges, removeNode, removeQuotes, } from "./helpers.js";
|
|
4
5
|
const kindsMap = new Map([
|
|
5
6
|
['critical', 'didYouMean'],
|
|
@@ -8,6 +9,13 @@ const kindsMap = new Map([
|
|
|
8
9
|
['2', 'gptDidYouMean'],
|
|
9
10
|
[undefined, undefined],
|
|
10
11
|
]);
|
|
12
|
+
// Map numerical values to their respective kinds for comparison operations
|
|
13
|
+
const kindLevelMap = new Map([
|
|
14
|
+
['critical', 0],
|
|
15
|
+
['medium', 2],
|
|
16
|
+
['0', 0],
|
|
17
|
+
['2', 2],
|
|
18
|
+
]);
|
|
11
19
|
const kinds = new Set(kindsMap.keys());
|
|
12
20
|
export const isSquatKind = (value) => kinds.has(value);
|
|
13
21
|
export const asSquatKind = (value) => {
|
|
@@ -21,14 +29,45 @@ export const asSquatKind = (value) => {
|
|
|
21
29
|
};
|
|
22
30
|
export const parseInternals = (nodes) => {
|
|
23
31
|
let kind;
|
|
32
|
+
let comparator;
|
|
33
|
+
let kindValue = '';
|
|
24
34
|
if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
|
|
25
|
-
|
|
26
|
-
.value)
|
|
35
|
+
kindValue = removeQuotes(asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
|
|
36
|
+
.value);
|
|
27
37
|
}
|
|
28
38
|
else if (isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
|
|
29
|
-
|
|
39
|
+
kindValue = asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value;
|
|
40
|
+
}
|
|
41
|
+
// Extract comparator if present
|
|
42
|
+
if (kindValue.startsWith('>=')) {
|
|
43
|
+
comparator = '>=';
|
|
44
|
+
kindValue = kindValue.substring(2);
|
|
45
|
+
}
|
|
46
|
+
else if (kindValue.startsWith('<=')) {
|
|
47
|
+
comparator = '<=';
|
|
48
|
+
kindValue = kindValue.substring(2);
|
|
49
|
+
}
|
|
50
|
+
else if (kindValue.startsWith('>')) {
|
|
51
|
+
comparator = '>';
|
|
52
|
+
kindValue = kindValue.substring(1);
|
|
53
|
+
}
|
|
54
|
+
else if (kindValue.startsWith('<')) {
|
|
55
|
+
comparator = '<';
|
|
56
|
+
kindValue = kindValue.substring(1);
|
|
30
57
|
}
|
|
31
|
-
|
|
58
|
+
// Parse kind value
|
|
59
|
+
if (kindValue) {
|
|
60
|
+
if (isSquatKind(kindValue)) {
|
|
61
|
+
kind = kindValue;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
throw error('Expected a valid squat kind for comparison', {
|
|
65
|
+
found: kindValue,
|
|
66
|
+
validOptions: Array.from(kinds),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { kind, comparator };
|
|
32
71
|
};
|
|
33
72
|
export const squat = async (state) => {
|
|
34
73
|
assertSecurityArchive(state, 'squat');
|
|
@@ -37,13 +76,92 @@ export const squat = async (state) => {
|
|
|
37
76
|
internals = parseInternals(asPostcssNodeWithChildren(state.current).nodes);
|
|
38
77
|
}
|
|
39
78
|
catch (err) {
|
|
40
|
-
|
|
79
|
+
if (asError(err).message === 'Expected a query node') {
|
|
80
|
+
// No parameters provided - pseudo state form: match ANY squat level
|
|
81
|
+
internals = { kind: undefined, comparator: undefined };
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
throw error('Failed to parse :squat selector', { cause: err });
|
|
85
|
+
}
|
|
41
86
|
}
|
|
42
|
-
const { kind } = internals;
|
|
43
|
-
|
|
87
|
+
const { kind, comparator } = internals;
|
|
88
|
+
// First pass: Remove nodes without security data
|
|
44
89
|
for (const node of state.partial.nodes) {
|
|
45
90
|
const report = state.securityArchive.get(node.id);
|
|
46
|
-
|
|
91
|
+
// Always exclude nodes that don't have security data or alerts
|
|
92
|
+
if (!report?.alerts || report.alerts.length === 0) {
|
|
93
|
+
removeNode(state, node);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Second pass: Apply comparison filtering
|
|
97
|
+
for (const node of state.partial.nodes) {
|
|
98
|
+
const report = state.securityArchive.get(node.id);
|
|
99
|
+
// Skip if report is undefined
|
|
100
|
+
// (should never happen since we filtered above)
|
|
101
|
+
/* c8 ignore next - impossible */
|
|
102
|
+
if (!report)
|
|
103
|
+
continue;
|
|
104
|
+
// At this point we know report exists and has alerts
|
|
105
|
+
let exclude = true;
|
|
106
|
+
if (kind === undefined && comparator === undefined) {
|
|
107
|
+
// Pseudo state form: match ANY squat level
|
|
108
|
+
exclude = !report.alerts.some(alert => [...kindsMap.values()].includes(alert.type));
|
|
109
|
+
}
|
|
110
|
+
else if (comparator) {
|
|
111
|
+
// Get the value to compare against
|
|
112
|
+
const kindLevel = kindLevelMap.get(kind);
|
|
113
|
+
/* c8 ignore next - impossible */
|
|
114
|
+
if (kindLevel === undefined)
|
|
115
|
+
break;
|
|
116
|
+
// For each alert, check if it matches the comparison criteria
|
|
117
|
+
let matchesComparison = false;
|
|
118
|
+
for (const alert of report.alerts) {
|
|
119
|
+
// Get the alert type
|
|
120
|
+
const alertType = alert.type;
|
|
121
|
+
// Find the corresponding kind for this alert type
|
|
122
|
+
const alertLevelKey = [...kindsMap.entries()].find(([_, value]) => value === alertType)?.[0];
|
|
123
|
+
if (alertLevelKey) {
|
|
124
|
+
// Get the numeric level for this alert
|
|
125
|
+
const alertLevel = kindLevelMap.get(alertLevelKey);
|
|
126
|
+
/* c8 ignore next - impossible */
|
|
127
|
+
if (alertLevel === undefined)
|
|
128
|
+
continue;
|
|
129
|
+
// Apply the comparison based on the comparator
|
|
130
|
+
switch (comparator) {
|
|
131
|
+
case '>':
|
|
132
|
+
if (alertLevel > kindLevel) {
|
|
133
|
+
matchesComparison = true;
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
case '<':
|
|
137
|
+
if (alertLevel < kindLevel) {
|
|
138
|
+
matchesComparison = true;
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
case '>=':
|
|
142
|
+
if (alertLevel >= kindLevel) {
|
|
143
|
+
matchesComparison = true;
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
case '<=':
|
|
147
|
+
if (alertLevel <= kindLevel) {
|
|
148
|
+
matchesComparison = true;
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
// If we found a match, we can stop checking other alerts
|
|
153
|
+
if (matchesComparison)
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Exclude the node if it doesn't match the comparison
|
|
158
|
+
exclude = !matchesComparison;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Original exact match behavior
|
|
162
|
+
const alertName = kindsMap.get(kind);
|
|
163
|
+
exclude = !report.alerts.some(alert => alert.type === alertName);
|
|
164
|
+
}
|
|
47
165
|
if (exclude) {
|
|
48
166
|
removeNode(state, node);
|
|
49
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"squat.js","sourceRoot":"","sources":["../../../src/pseudo/squat.ts"],"names":[],"mappings":"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","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '../types.ts'\nimport type { ParserState, PostcssNode } from '../types.ts'\nimport {\n assertSecurityArchive,\n removeDanglingEdges,\n removeNode,\n removeQuotes,\n} from './helpers.ts'\n\nexport type SquatKinds = '0' | '2' | 'critical' | 'medium' | undefined\n\nexport type SquatAlertTypes =\n | 'didYouMean'\n | 'gptDidYouMean'\n | undefined\n\nconst kindsMap = new Map<SquatKinds, SquatAlertTypes>([\n ['critical', 'didYouMean'],\n ['medium', 'gptDidYouMean'],\n ['0', 'didYouMean'],\n ['2', 'gptDidYouMean'],\n [undefined, undefined],\n])\nconst kinds = new Set(kindsMap.keys())\n\nexport const isSquatKind = (value?: string): value is SquatKinds =>\n kinds.has(value as SquatKinds)\n\nexport const asSquatKind = (value?: string): SquatKinds => {\n if (!isSquatKind(value)) {\n throw error('Expected a valid squat kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\nexport const parseInternals = (\n nodes: PostcssNode[],\n): { kind: SquatKinds } => {\n let kind: SquatKinds\n\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kind = asSquatKind(\n removeQuotes(\n asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n .value,\n ),\n )\n } else if (\n isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n ) {\n kind = asSquatKind(\n asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,\n )\n }\n\n return { kind }\n}\n\nexport const squat = async (state: ParserState) => {\n assertSecurityArchive(state, 'squat')\n\n let internals\n try {\n internals = parseInternals(\n asPostcssNodeWithChildren(state.current).nodes,\n )\n } catch (err) {\n throw error('Failed to parse :squat selector', { cause: err })\n }\n\n const { kind } = internals\n const alertName = kindsMap.get(kind)\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n const exclude = !report?.alerts.some(\n alert => alert.type === alertName,\n )\n if (exclude) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
|
|
1
|
+
{"version":3,"file":"squat.js","sourceRoot":"","sources":["../../../src/pseudo/squat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EACL,yBAAyB,EACzB,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,UAAU,EACV,YAAY,GACb,MAAM,cAAc,CAAA;AAarB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA8B;IACpD,CAAC,UAAU,EAAE,YAAY,CAAC;IAC1B,CAAC,QAAQ,EAAE,eAAe,CAAC;IAC3B,CAAC,GAAG,EAAE,YAAY,CAAC;IACnB,CAAC,GAAG,EAAE,eAAe,CAAC;IACtB,CAAC,SAAS,EAAE,SAAS,CAAC;CACvB,CAAC,CAAA;AAEF,2EAA2E;AAC3E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAqB;IAC/C,CAAC,UAAU,EAAE,CAAC,CAAC;IACf,CAAC,QAAQ,EAAE,CAAC,CAAC;IACb,CAAC,GAAG,EAAE,CAAC,CAAC;IACR,CAAC,GAAG,EAAE,CAAC,CAAC;CACT,CAAC,CAAA;AAEF,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAuB,EAAE,CACjE,KAAK,CAAC,GAAG,CAAC,KAAmB,CAAC,CAAA;AAEhC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAc,EAAE;IACxD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,6BAA6B,EAAE;YACzC,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SAChC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAoB,EAIpB,EAAE;IACF,IAAI,IAAgB,CAAA;IACpB,IAAI,UAA2B,CAAA;IAE/B,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,IAAI,YAAY,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,SAAS,GAAG,YAAY,CACtB,YAAY,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACvD,KAAK,CACT,CAAA;IACH,CAAC;SAAM,IACL,SAAS,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC;QACD,SAAS,GAAG,SAAS,CACnB,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAC7C,CAAC,KAAK,CAAA;IACT,CAAC;IAED,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,IAAI,CAAA;QACjB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,UAAU,GAAG,IAAI,CAAA;QACjB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,GAAG,CAAA;QAChB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,GAAG,CAAA;QAChB,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACpC,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,GAAG,SAAS,CAAA;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,4CAA4C,EAAE;gBACxD,KAAK,EAAE,SAAS;gBAChB,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aAChC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAChD,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAErC,IAAI,SAAS,CAAA;IACb,IAAI,CAAC;QACH,SAAS,GAAG,cAAc,CACxB,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAC/C,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,uBAAuB,EAAE,CAAC;YACrD,oEAAoE;YACpE,SAAS,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;IAEtC,iDAAiD;IACjD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjD,+DAA+D;QAC/D,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAEjD,8BAA8B;QAC9B,gDAAgD;QAChD,iCAAiC;QACjC,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,qDAAqD;QACrD,IAAI,OAAO,GAAG,IAAI,CAAA;QAElB,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACnD,2CAA2C;YAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACpC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAC7B,KAAK,CAAC,IAAuB,CAC9B,CACF,CAAA;QACH,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,mCAAmC;YACnC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxC,iCAAiC;YACjC,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAK;YAElC,8DAA8D;YAC9D,IAAI,iBAAiB,GAAG,KAAK,CAAA;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,qBAAqB;gBACrB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;gBAE5B,kDAAkD;gBAClD,MAAM,aAAa,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAChD,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACpC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAEN,IAAI,aAAa,EAAE,CAAC;oBAClB,uCAAuC;oBACvC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;oBAClD,iCAAiC;oBACjC,IAAI,UAAU,KAAK,SAAS;wBAAE,SAAQ;oBAEtC,+CAA+C;oBAC/C,QAAQ,UAAU,EAAE,CAAC;wBACnB,KAAK,GAAG;4BACN,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;gCAC3B,iBAAiB,GAAG,IAAI,CAAA;4BAC1B,CAAC;4BACD,MAAK;wBACP,KAAK,GAAG;4BACN,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;gCAC3B,iBAAiB,GAAG,IAAI,CAAA;4BAC1B,CAAC;4BACD,MAAK;wBACP,KAAK,IAAI;4BACP,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gCAC5B,iBAAiB,GAAG,IAAI,CAAA;4BAC1B,CAAC;4BACD,MAAK;wBACP,KAAK,IAAI;4BACP,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gCAC5B,iBAAiB,GAAG,IAAI,CAAA;4BAC1B,CAAC;4BACD,MAAK;oBACT,CAAC;oBAED,yDAAyD;oBACzD,IAAI,iBAAiB;wBAAE,MAAK;gBAC9B,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,OAAO,GAAG,CAAC,iBAAiB,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,gCAAgC;YAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACpC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAE1B,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport { asError } from '@vltpkg/types'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '@vltpkg/dss-parser'\nimport {\n assertSecurityArchive,\n removeDanglingEdges,\n removeNode,\n removeQuotes,\n} from './helpers.ts'\nimport type { ParserState } from '../types.ts'\nimport type { PostcssNode } from '@vltpkg/dss-parser'\n\nexport type SquatKinds = '0' | '2' | 'critical' | 'medium' | undefined\n\nexport type SquatAlertTypes =\n | 'didYouMean'\n | 'gptDidYouMean'\n | undefined\n\nexport type SquatComparator = '>' | '<' | '>=' | '<=' | undefined\n\nconst kindsMap = new Map<SquatKinds, SquatAlertTypes>([\n ['critical', 'didYouMean'],\n ['medium', 'gptDidYouMean'],\n ['0', 'didYouMean'],\n ['2', 'gptDidYouMean'],\n [undefined, undefined],\n])\n\n// Map numerical values to their respective kinds for comparison operations\nconst kindLevelMap = new Map<SquatKinds, number>([\n ['critical', 0],\n ['medium', 2],\n ['0', 0],\n ['2', 2],\n])\n\nconst kinds = new Set(kindsMap.keys())\n\nexport const isSquatKind = (value?: string): value is SquatKinds =>\n kinds.has(value as SquatKinds)\n\nexport const asSquatKind = (value?: string): SquatKinds => {\n if (!isSquatKind(value)) {\n throw error('Expected a valid squat kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\nexport const parseInternals = (\n nodes: PostcssNode[],\n): {\n kind: SquatKinds\n comparator: SquatComparator\n} => {\n let kind: SquatKinds\n let comparator: SquatComparator\n\n let kindValue = ''\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kindValue = removeQuotes(\n asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n .value,\n )\n } else if (\n isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n ) {\n kindValue = asTagNode(\n asPostcssNodeWithChildren(nodes[0]).nodes[0],\n ).value\n }\n\n // Extract comparator if present\n if (kindValue.startsWith('>=')) {\n comparator = '>='\n kindValue = kindValue.substring(2)\n } else if (kindValue.startsWith('<=')) {\n comparator = '<='\n kindValue = kindValue.substring(2)\n } else if (kindValue.startsWith('>')) {\n comparator = '>'\n kindValue = kindValue.substring(1)\n } else if (kindValue.startsWith('<')) {\n comparator = '<'\n kindValue = kindValue.substring(1)\n }\n\n // Parse kind value\n if (kindValue) {\n if (isSquatKind(kindValue)) {\n kind = kindValue\n } else {\n throw error('Expected a valid squat kind for comparison', {\n found: kindValue,\n validOptions: Array.from(kinds),\n })\n }\n }\n\n return { kind, comparator }\n}\n\nexport const squat = async (state: ParserState) => {\n assertSecurityArchive(state, 'squat')\n\n let internals\n try {\n internals = parseInternals(\n asPostcssNodeWithChildren(state.current).nodes,\n )\n } catch (err) {\n if (asError(err).message === 'Expected a query node') {\n // No parameters provided - pseudo state form: match ANY squat level\n internals = { kind: undefined, comparator: undefined }\n } else {\n throw error('Failed to parse :squat selector', { cause: err })\n }\n }\n\n const { kind, comparator } = internals\n\n // First pass: Remove nodes without security data\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n // Always exclude nodes that don't have security data or alerts\n if (!report?.alerts || report.alerts.length === 0) {\n removeNode(state, node)\n }\n }\n\n // Second pass: Apply comparison filtering\n for (const node of state.partial.nodes) {\n const report = state.securityArchive.get(node.id)\n\n // Skip if report is undefined\n // (should never happen since we filtered above)\n /* c8 ignore next - impossible */\n if (!report) continue\n\n // At this point we know report exists and has alerts\n let exclude = true\n\n if (kind === undefined && comparator === undefined) {\n // Pseudo state form: match ANY squat level\n exclude = !report.alerts.some(alert =>\n [...kindsMap.values()].includes(\n alert.type as SquatAlertTypes,\n ),\n )\n } else if (comparator) {\n // Get the value to compare against\n const kindLevel = kindLevelMap.get(kind)\n /* c8 ignore next - impossible */\n if (kindLevel === undefined) break\n\n // For each alert, check if it matches the comparison criteria\n let matchesComparison = false\n for (const alert of report.alerts) {\n // Get the alert type\n const alertType = alert.type\n\n // Find the corresponding kind for this alert type\n const alertLevelKey = [...kindsMap.entries()].find(\n ([_, value]) => value === alertType,\n )?.[0]\n\n if (alertLevelKey) {\n // Get the numeric level for this alert\n const alertLevel = kindLevelMap.get(alertLevelKey)\n /* c8 ignore next - impossible */\n if (alertLevel === undefined) continue\n\n // Apply the comparison based on the comparator\n switch (comparator) {\n case '>':\n if (alertLevel > kindLevel) {\n matchesComparison = true\n }\n break\n case '<':\n if (alertLevel < kindLevel) {\n matchesComparison = true\n }\n break\n case '>=':\n if (alertLevel >= kindLevel) {\n matchesComparison = true\n }\n break\n case '<=':\n if (alertLevel <= kindLevel) {\n matchesComparison = true\n }\n break\n }\n\n // If we found a match, we can stop checking other alerts\n if (matchesComparison) break\n }\n }\n\n // Exclude the node if it doesn't match the comparison\n exclude = !matchesComparison\n } else {\n // Original exact match behavior\n const alertName = kindsMap.get(kind)\n exclude = !report.alerts.some(alert => alert.type === alertName)\n }\n\n if (exclude) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ParserState } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* :type(str) Pseudo-Element will match only nodes that are of
|
|
4
|
+
* the same type as the value used. The type is determined by the
|
|
5
|
+
* first part of the dependency ID.
|
|
6
|
+
*/
|
|
7
|
+
export declare const type: (state: ParserState) => Promise<ParserState>;
|
|
8
|
+
//# sourceMappingURL=type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../src/pseudo/type.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;GAIG;AACH,eAAO,MAAM,IAAI,UAAiB,WAAW,yBAY5C,CAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { splitDepID } from '@vltpkg/dep-id/browser';
|
|
2
|
+
import { asPostcssNodeWithChildren, asTagNode, } from '@vltpkg/dss-parser';
|
|
3
|
+
import { removeDanglingEdges, removeNode } from "./helpers.js";
|
|
4
|
+
/**
|
|
5
|
+
* :type(str) Pseudo-Element will match only nodes that are of
|
|
6
|
+
* the same type as the value used. The type is determined by the
|
|
7
|
+
* first part of the dependency ID.
|
|
8
|
+
*/
|
|
9
|
+
export const type = async (state) => {
|
|
10
|
+
const type = asPostcssNodeWithChildren(state.current);
|
|
11
|
+
const selector = asPostcssNodeWithChildren(type.nodes[0]);
|
|
12
|
+
const name = asTagNode(selector.nodes[0]).value;
|
|
13
|
+
for (const node of state.partial.nodes) {
|
|
14
|
+
const nodeType = splitDepID(node.id)[0];
|
|
15
|
+
if (nodeType !== name) {
|
|
16
|
+
removeNode(state, node);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
removeDanglingEdges(state);
|
|
20
|
+
return state;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../../src/pseudo/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EACL,yBAAyB,EACzB,SAAS,GACV,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAC/C,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACvC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IACD,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport {\n asPostcssNodeWithChildren,\n asTagNode,\n} from '@vltpkg/dss-parser'\nimport { removeDanglingEdges, removeNode } from './helpers.ts'\nimport type { ParserState } from '../types.ts'\n\n/**\n * :type(str) Pseudo-Element will match only nodes that are of\n * the same type as the value used. The type is determined by the\n * first part of the dependency ID.\n */\nexport const type = async (state: ParserState) => {\n const type = asPostcssNodeWithChildren(state.current)\n const selector = asPostcssNodeWithChildren(type.nodes[0])\n const name = asTagNode(selector.nodes[0]).value\n for (const node of state.partial.nodes) {\n const nodeType = splitDepID(node.id)[0]\n if (nodeType !== name) {\n removeNode(state, node)\n }\n }\n removeDanglingEdges(state)\n return state\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/pseudo/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C;;GAEG;AACH,eAAO,MAAM,SAAS,UAAiB,WAAW,yBAejD,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { removeNode } from "./helpers.js";
|
|
2
|
+
/**
|
|
3
|
+
* :workspace Pseudo-Selector will only match workspace dependencies.
|
|
4
|
+
*/
|
|
5
|
+
export const workspace = async (state) => {
|
|
6
|
+
// Filter out the root node and any nodes that are not marked as workspaces
|
|
7
|
+
for (const node of state.partial.nodes) {
|
|
8
|
+
if (!node.importer || node.mainImporter) {
|
|
9
|
+
removeNode(state, node);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// Clears up any edges that are not pointing to workspace nodes
|
|
13
|
+
for (const edge of state.partial.edges) {
|
|
14
|
+
if (edge.to?.importer && !edge.to.mainImporter)
|
|
15
|
+
continue;
|
|
16
|
+
state.partial.edges.delete(edge);
|
|
17
|
+
}
|
|
18
|
+
return state;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../src/pseudo/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IACpD,2EAA2E;IAC3E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY;YAAE,SAAQ;QACxD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import type { ParserState } from '../types.ts'\nimport { removeNode } from './helpers.ts'\n\n/**\n * :workspace Pseudo-Selector will only match workspace dependencies.\n */\nexport const workspace = async (state: ParserState) => {\n // Filter out the root node and any nodes that are not marked as workspaces\n for (const node of state.partial.nodes) {\n if (!node.importer || node.mainImporter) {\n removeNode(state, node)\n }\n }\n\n // Clears up any edges that are not pointing to workspace nodes\n for (const edge of state.partial.edges) {\n if (edge.to?.importer && !edge.to.mainImporter) continue\n state.partial.edges.delete(edge)\n }\n\n return state\n}\n"]}
|
package/dist/esm/pseudo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pseudo.d.ts","sourceRoot":"","sources":["../../src/pseudo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pseudo.d.ts","sourceRoot":"","sources":["../../src/pseudo.ts"],"names":[],"mappings":"AAgEA,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,YAAY,CAAA;AAuSvD;;GAEG;AACH,eAAO,MAAM,MAAM,UAAiB,WAAW,yBAkC9C,CAAA"}
|