@vltpkg/query 0.0.0-8 → 0.0.0-9

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.
Files changed (102) hide show
  1. package/README.md +25 -6
  2. package/dist/esm/id.d.ts.map +1 -1
  3. package/dist/esm/id.js +20 -6
  4. package/dist/esm/id.js.map +1 -1
  5. package/dist/esm/index.d.ts +7 -2
  6. package/dist/esm/index.d.ts.map +1 -1
  7. package/dist/esm/index.js +168 -8
  8. package/dist/esm/index.js.map +1 -1
  9. package/dist/esm/parser.d.ts +15 -0
  10. package/dist/esm/parser.d.ts.map +1 -0
  11. package/dist/esm/parser.js +92 -0
  12. package/dist/esm/parser.js.map +1 -0
  13. package/dist/esm/pseudo/attr.d.ts.map +1 -1
  14. package/dist/esm/pseudo/attr.js +10 -2
  15. package/dist/esm/pseudo/attr.js.map +1 -1
  16. package/dist/esm/pseudo/cve.js +1 -1
  17. package/dist/esm/pseudo/cve.js.map +1 -1
  18. package/dist/esm/pseudo/cwe.js +1 -1
  19. package/dist/esm/pseudo/cwe.js.map +1 -1
  20. package/dist/esm/pseudo/dev.d.ts +6 -0
  21. package/dist/esm/pseudo/dev.d.ts.map +1 -0
  22. package/dist/esm/pseudo/dev.js +15 -0
  23. package/dist/esm/pseudo/dev.js.map +1 -0
  24. package/dist/esm/pseudo/empty.d.ts +7 -0
  25. package/dist/esm/pseudo/empty.d.ts.map +1 -0
  26. package/dist/esm/pseudo/empty.js +14 -0
  27. package/dist/esm/pseudo/empty.js.map +1 -0
  28. package/dist/esm/pseudo/helpers.d.ts +9 -1
  29. package/dist/esm/pseudo/helpers.d.ts.map +1 -1
  30. package/dist/esm/pseudo/helpers.js +19 -0
  31. package/dist/esm/pseudo/helpers.js.map +1 -1
  32. package/dist/esm/pseudo/link.d.ts +9 -0
  33. package/dist/esm/pseudo/link.d.ts.map +1 -0
  34. package/dist/esm/pseudo/link.js +25 -0
  35. package/dist/esm/pseudo/link.js.map +1 -0
  36. package/dist/esm/pseudo/malware.d.ts +2 -0
  37. package/dist/esm/pseudo/malware.d.ts.map +1 -1
  38. package/dist/esm/pseudo/malware.js +115 -7
  39. package/dist/esm/pseudo/malware.js.map +1 -1
  40. package/dist/esm/pseudo/missing.d.ts +8 -0
  41. package/dist/esm/pseudo/missing.d.ts.map +1 -0
  42. package/dist/esm/pseudo/missing.js +15 -0
  43. package/dist/esm/pseudo/missing.js.map +1 -0
  44. package/dist/esm/pseudo/optional.d.ts +6 -0
  45. package/dist/esm/pseudo/optional.d.ts.map +1 -0
  46. package/dist/esm/pseudo/optional.js +15 -0
  47. package/dist/esm/pseudo/optional.js.map +1 -0
  48. package/dist/esm/pseudo/outdated.d.ts +1 -1
  49. package/dist/esm/pseudo/outdated.d.ts.map +1 -1
  50. package/dist/esm/pseudo/outdated.js +33 -27
  51. package/dist/esm/pseudo/outdated.js.map +1 -1
  52. package/dist/esm/pseudo/peer.d.ts +6 -0
  53. package/dist/esm/pseudo/peer.d.ts.map +1 -0
  54. package/dist/esm/pseudo/peer.js +15 -0
  55. package/dist/esm/pseudo/peer.js.map +1 -0
  56. package/dist/esm/pseudo/private.d.ts +7 -0
  57. package/dist/esm/pseudo/private.d.ts.map +1 -0
  58. package/dist/esm/pseudo/private.js +16 -0
  59. package/dist/esm/pseudo/private.js.map +1 -0
  60. package/dist/esm/pseudo/prod.d.ts +6 -0
  61. package/dist/esm/pseudo/prod.d.ts.map +1 -0
  62. package/dist/esm/pseudo/prod.js +15 -0
  63. package/dist/esm/pseudo/prod.js.map +1 -0
  64. package/dist/esm/pseudo/published.d.ts +40 -0
  65. package/dist/esm/pseudo/published.d.ts.map +1 -0
  66. package/dist/esm/pseudo/published.js +159 -0
  67. package/dist/esm/pseudo/published.js.map +1 -0
  68. package/dist/esm/pseudo/scanned.d.ts +4 -2
  69. package/dist/esm/pseudo/scanned.d.ts.map +1 -1
  70. package/dist/esm/pseudo/scanned.js +10 -5
  71. package/dist/esm/pseudo/scanned.js.map +1 -1
  72. package/dist/esm/pseudo/score.d.ts +15 -0
  73. package/dist/esm/pseudo/score.d.ts.map +1 -0
  74. package/dist/esm/pseudo/score.js +119 -0
  75. package/dist/esm/pseudo/score.js.map +1 -0
  76. package/dist/esm/pseudo/semver.d.ts.map +1 -1
  77. package/dist/esm/pseudo/semver.js +11 -25
  78. package/dist/esm/pseudo/semver.js.map +1 -1
  79. package/dist/esm/pseudo/severity.d.ts +2 -0
  80. package/dist/esm/pseudo/severity.d.ts.map +1 -1
  81. package/dist/esm/pseudo/severity.js +110 -7
  82. package/dist/esm/pseudo/severity.js.map +1 -1
  83. package/dist/esm/pseudo/squat.d.ts +2 -0
  84. package/dist/esm/pseudo/squat.d.ts.map +1 -1
  85. package/dist/esm/pseudo/squat.js +114 -7
  86. package/dist/esm/pseudo/squat.js.map +1 -1
  87. package/dist/esm/pseudo/workspace.d.ts +6 -0
  88. package/dist/esm/pseudo/workspace.d.ts.map +1 -0
  89. package/dist/esm/pseudo/workspace.js +15 -0
  90. package/dist/esm/pseudo/workspace.js.map +1 -0
  91. package/dist/esm/pseudo.d.ts.map +1 -1
  92. package/dist/esm/pseudo.js +24 -40
  93. package/dist/esm/pseudo.js.map +1 -1
  94. package/dist/esm/types.d.ts +74 -5
  95. package/dist/esm/types.d.ts.map +1 -1
  96. package/dist/esm/types.js +12 -13
  97. package/dist/esm/types.js.map +1 -1
  98. package/package.json +9 -8
  99. package/dist/esm/class.d.ts +0 -6
  100. package/dist/esm/class.d.ts.map +0 -1
  101. package/dist/esm/class.js +0 -131
  102. package/dist/esm/class.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import pRetry, { AbortError } from 'p-retry';
1
2
  import { hydrate, splitDepID } from '@vltpkg/dep-id/browser';
2
3
  import { error } from '@vltpkg/error-cause';
3
4
  import { compare, gt, major, minor, patch, satisfies, } from '@vltpkg/semver';
@@ -30,42 +31,33 @@ export const asOutdatedKind = (value) => {
30
31
  /**
31
32
  * Fetches the available versions of a package from the npm registry.
32
33
  */
33
- export const retrieveRemoteVersions = async (node, specOptions) => {
34
+ export const retrieveRemoteVersions = async (node, specOptions, signal) => {
34
35
  const spec = hydrate(node.id, String(node.name), specOptions);
35
36
  if (!spec.registry || !node.name) {
36
37
  return [];
37
38
  }
38
39
  const url = new URL(spec.registry);
39
40
  url.pathname = `/${node.name}`;
40
- try {
41
- const response = await fetch(String(url), {
42
- headers: {
43
- Accept: 'application/vnd.npm.install-v1+json',
44
- },
45
- });
46
- if (!response.ok) {
47
- // eslint-disable-next-line no-console
48
- console.warn(error('Failed to fetch packument', {
49
- name: String(node.name),
50
- spec,
51
- response,
52
- }));
53
- return [];
54
- }
55
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
56
- const packument = await response.json();
57
- return Object.keys(packument.versions).sort(compare);
41
+ const response = await fetch(String(url), {
42
+ headers: {
43
+ Accept: 'application/vnd.npm.install-v1+json',
44
+ },
45
+ signal,
46
+ });
47
+ // on missing valid auth or API, it should abort the retry logic
48
+ if (response.status === 404) {
49
+ throw new AbortError('Missing API');
58
50
  }
59
- catch (e) {
60
- const err = e;
61
- // eslint-disable-next-line no-console
62
- console.warn(error('Could not retrieve registry versions', {
51
+ if (!response.ok) {
52
+ throw error('Failed to fetch packument', {
63
53
  name: String(node.name),
64
54
  spec,
65
- cause: err,
66
- }));
67
- return [];
55
+ response,
56
+ });
68
57
  }
58
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
59
+ const packument = await response.json();
60
+ return Object.keys(packument.versions).sort(compare);
69
61
  };
70
62
  /**
71
63
  * Retrieves what kind of check the :outdated selector should perform.
@@ -89,7 +81,21 @@ export const queueNode = async (state, node, kind) => {
89
81
  return node;
90
82
  }
91
83
  const nodeVersion = node.version;
92
- const versions = await retrieveRemoteVersions(node, state.specOptions);
84
+ let versions;
85
+ try {
86
+ versions = await pRetry(() => retrieveRemoteVersions(node, state.specOptions, state.signal), {
87
+ retries: state.retries,
88
+ signal: state.signal,
89
+ });
90
+ }
91
+ catch (err) {
92
+ // eslint-disable-next-line no-console
93
+ console.warn(error('Could not retrieve registry versions', {
94
+ name: String(node.name),
95
+ cause: err,
96
+ }));
97
+ versions = [];
98
+ }
93
99
  const greaterVersions = versions.filter((version) => gt(version, nodeVersion));
94
100
  // if there are no greater versions, then the node is not outdated
95
101
  if (!greaterVersions.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../../src/pseudo/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["import { hydrate, splitDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport type { NodeLike } from '@vltpkg/graph'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport {\n compare,\n gt,\n major,\n minor,\n patch,\n satisfies,\n} from '@vltpkg/semver'\nimport type { Packument } from '@vltpkg/types'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '../types.ts'\nimport type { ParserState, PostcssNode } from '../types.ts'\nimport { removeNode, removeQuotes } from './helpers.ts'\n\n/**\n * The possible values accepted by the :outdated() pseudo selector.\n */\nexport type OutdatedKinds =\n | 'any'\n | 'major'\n | 'minor'\n | 'patch'\n | 'in-range'\n | 'out-of-range'\n\n/**\n * Result of the internal parsing of the :outdated() pseudo selector.\n */\nexport type OutdatedInternals = {\n kind: OutdatedKinds\n}\n\n/**\n * Extracts a semver type from a version string.\n */\nexport type SemverTypeExtraction = (\n version: string,\n) => number | undefined\n\nconst kinds = new Set<OutdatedKinds>([\n 'any',\n 'major',\n 'minor',\n 'patch',\n 'in-range',\n 'out-of-range',\n])\n\n/**\n * Checks if a string is a valid {@link OutdatedKinds}.\n */\nexport const isOutdatedKind = (\n value: string,\n): value is OutdatedKinds => kinds.has(value as OutdatedKinds)\n\n/**\n * Asserts that a string is a valid {@link OutdatedKinds}.\n */\nexport const asOutdatedKind = (value: string): OutdatedKinds => {\n if (!isOutdatedKind(value)) {\n throw error('Expected a valid outdated kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\n/**\n * Fetches the available versions of a package from the npm registry.\n */\nexport const retrieveRemoteVersions = async (\n node: NodeLike,\n specOptions: SpecOptions,\n): Promise<string[]> => {\n const spec = hydrate(node.id, String(node.name), specOptions)\n if (!spec.registry || !node.name) {\n return []\n }\n\n const url = new URL(spec.registry)\n url.pathname = `/${node.name}`\n\n try {\n const response = await fetch(String(url), {\n headers: {\n Accept: 'application/vnd.npm.install-v1+json',\n },\n })\n if (!response.ok) {\n // eslint-disable-next-line no-console\n console.warn(\n error('Failed to fetch packument', {\n name: String(node.name),\n spec,\n response,\n }),\n )\n return []\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packument: Packument = await response.json()\n return Object.keys(packument.versions).sort(compare)\n } catch (e) {\n const err = e as Error\n // eslint-disable-next-line no-console\n console.warn(\n error('Could not retrieve registry versions', {\n name: String(node.name),\n spec,\n cause: err,\n }),\n )\n return []\n }\n}\n\n/**\n * Retrieves what kind of check the :outdated selector should perform.\n */\nexport const parseInternals = (\n nodes: PostcssNode[],\n): OutdatedInternals => {\n let kind: OutdatedKinds = 'any'\n\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kind = asOutdatedKind(\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 = asOutdatedKind(\n asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,\n )\n }\n\n return { kind }\n}\n\n/**\n * Filter nodes by queueing up for removal those that are not outdated.\n */\nexport const queueNode = async (\n state: ParserState,\n node: NodeLike,\n kind: OutdatedKinds,\n): Promise<NodeLike | undefined> => {\n if (!node.name || !node.version) {\n return node\n }\n\n const nodeVersion: string = node.version\n const versions = await retrieveRemoteVersions(\n node,\n state.specOptions,\n )\n\n const greaterVersions = versions.filter((version: string) =>\n gt(version, nodeVersion),\n )\n\n // if there are no greater versions, then the node is not outdated\n if (!greaterVersions.length) {\n return node\n }\n\n const checkKind = new Map<OutdatedKinds, SemverTypeExtraction>([\n ['major', major],\n ['minor', minor],\n ['patch', patch],\n ])\n\n switch (kind) {\n case 'any':\n return\n case 'major':\n case 'minor':\n case 'patch': {\n return (\n greaterVersions.some((version: string) => {\n const va = checkKind.get(kind)?.(version)\n const vb = checkKind.get(kind)?.(nodeVersion)\n /* c8 ignore next - impossible but typescript doesn't know */\n if (va === undefined || vb === undefined) return false\n return va > vb\n })\n ) ?\n undefined\n : node\n }\n // the node should be part of the result as long as it has at least\n // one parent node that has a spec definition that satisfies one\n // of the available remove versions\n case 'in-range': {\n for (const edge of node.edgesIn) {\n // if the edge is not part of the partial results, skip it\n /* c8 ignore next */\n if (!state.partial.edges.has(edge)) continue\n\n if (\n greaterVersions.some(\n version =>\n edge.spec.final.range &&\n satisfies(version, edge.spec.final.range),\n )\n ) {\n return\n }\n }\n return node\n }\n // the node is part of the result as long as none of its parents has\n // a spec definition that satisfies one of the available remote versions\n case 'out-of-range': {\n for (const edge of node.edgesIn) {\n // if the edge is not part of the partial results, skip it\n /* c8 ignore next */\n if (!state.partial.edges.has(edge)) continue\n\n if (\n greaterVersions.some(\n version =>\n edge.spec.final.range &&\n satisfies(version, edge.spec.final.range),\n )\n ) {\n return node\n }\n }\n return\n }\n }\n}\n\n/**\n * Filters out nodes that are not outdated.\n *\n * The :outdated() pseudo selector supports one `type` argument,\n * possible values are the following:\n *\n * - `any`: Selects all nodes that have a greater version available.\n * - `major`: Selects all nodes that have a greater major version available.\n * - `minor`: Selects all nodes that have a greater minor version available.\n * - `patch`: Selects all nodes that have a greater patch version available.\n * - `in-range`: Selects all nodes that have a parent node with a spec definition\n * that satisfies one of the available remote versions.\n * - `out-of-range`: Selects all nodes that have a parent node with a spec definition\n * that does not satisfy any of the available remote versions.\n */\nexport const outdated = 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 :outdated selector', {\n cause: err,\n })\n }\n\n const { kind } = internals\n const queue = []\n\n for (const node of state.partial.nodes) {\n // filter out nodes that are always ignored by the outdated selector\n if (\n node.mainImporter ||\n node.manifest?.private ||\n splitDepID(node.id)[0] !== 'registry'\n ) {\n removeNode(state, node)\n continue\n }\n\n // fetchs outdated info and performs checks to define\n // whether or not a node should be filtered out\n queue.push(queueNode(state, node, kind))\n }\n\n // nodes queued for removal are then finally removed\n const removeNodeQueue = await Promise.all(queue)\n for (const node of removeNodeQueue) {\n if (node) {\n removeNode(state, node)\n }\n }\n\n return state\n}\n"]}
1
+ {"version":3,"file":"outdated.js","sourceRoot":"","sources":["../../../src/pseudo/outdated.ts"],"names":[],"mappings":"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","sourcesContent":["import pRetry, { AbortError } from 'p-retry'\nimport { hydrate, splitDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport type { NodeLike } from '@vltpkg/graph'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport {\n compare,\n gt,\n major,\n minor,\n patch,\n satisfies,\n} from '@vltpkg/semver'\nimport type { Packument } from '@vltpkg/types'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '../types.ts'\nimport type { ParserState, PostcssNode } from '../types.ts'\nimport { removeNode, removeQuotes } from './helpers.ts'\n\n/**\n * The possible values accepted by the :outdated() pseudo selector.\n */\nexport type OutdatedKinds =\n | 'any'\n | 'major'\n | 'minor'\n | 'patch'\n | 'in-range'\n | 'out-of-range'\n\n/**\n * Result of the internal parsing of the :outdated() pseudo selector.\n */\nexport type OutdatedInternals = {\n kind: OutdatedKinds\n}\n\n/**\n * Extracts a semver type from a version string.\n */\nexport type SemverTypeExtraction = (\n version: string,\n) => number | undefined\n\nconst kinds = new Set<OutdatedKinds>([\n 'any',\n 'major',\n 'minor',\n 'patch',\n 'in-range',\n 'out-of-range',\n])\n\n/**\n * Checks if a string is a valid {@link OutdatedKinds}.\n */\nexport const isOutdatedKind = (\n value: string,\n): value is OutdatedKinds => kinds.has(value as OutdatedKinds)\n\n/**\n * Asserts that a string is a valid {@link OutdatedKinds}.\n */\nexport const asOutdatedKind = (value: string): OutdatedKinds => {\n if (!isOutdatedKind(value)) {\n throw error('Expected a valid outdated kind', {\n found: value,\n validOptions: Array.from(kinds),\n })\n }\n return value\n}\n\n/**\n * Fetches the available versions of a package from the npm registry.\n */\nexport const retrieveRemoteVersions = async (\n node: NodeLike,\n specOptions: SpecOptions,\n signal?: AbortSignal,\n): Promise<string[]> => {\n const spec = hydrate(node.id, String(node.name), specOptions)\n if (!spec.registry || !node.name) {\n return []\n }\n\n const url = new URL(spec.registry)\n url.pathname = `/${node.name}`\n\n const response = await fetch(String(url), {\n headers: {\n Accept: 'application/vnd.npm.install-v1+json',\n },\n signal,\n })\n // on missing valid auth or API, it should abort the retry logic\n if (response.status === 404) {\n throw new AbortError('Missing API')\n }\n if (!response.ok) {\n throw error('Failed to fetch packument', {\n name: String(node.name),\n spec,\n response,\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packument: Packument = await response.json()\n return Object.keys(packument.versions).sort(compare)\n}\n\n/**\n * Retrieves what kind of check the :outdated selector should perform.\n */\nexport const parseInternals = (\n nodes: PostcssNode[],\n): OutdatedInternals => {\n let kind: OutdatedKinds = 'any'\n\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n kind = asOutdatedKind(\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 = asOutdatedKind(\n asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]).value,\n )\n }\n\n return { kind }\n}\n\n/**\n * Filter nodes by queueing up for removal those that are not outdated.\n */\nexport const queueNode = async (\n state: ParserState,\n node: NodeLike,\n kind: OutdatedKinds,\n): Promise<NodeLike | undefined> => {\n if (!node.name || !node.version) {\n return node\n }\n\n const nodeVersion: string = node.version\n let versions: string[]\n try {\n versions = await pRetry(\n () =>\n retrieveRemoteVersions(node, state.specOptions, state.signal),\n {\n retries: state.retries,\n signal: state.signal,\n },\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n error('Could not retrieve registry versions', {\n name: String(node.name),\n cause: err,\n }),\n )\n versions = []\n }\n\n const greaterVersions = versions.filter((version: string) =>\n gt(version, nodeVersion),\n )\n\n // if there are no greater versions, then the node is not outdated\n if (!greaterVersions.length) {\n return node\n }\n\n const checkKind = new Map<OutdatedKinds, SemverTypeExtraction>([\n ['major', major],\n ['minor', minor],\n ['patch', patch],\n ])\n\n switch (kind) {\n case 'any':\n return\n case 'major':\n case 'minor':\n case 'patch': {\n return (\n greaterVersions.some((version: string) => {\n const va = checkKind.get(kind)?.(version)\n const vb = checkKind.get(kind)?.(nodeVersion)\n /* c8 ignore next - impossible but typescript doesn't know */\n if (va === undefined || vb === undefined) return false\n return va > vb\n })\n ) ?\n undefined\n : node\n }\n // the node should be part of the result as long as it has at least\n // one parent node that has a spec definition that satisfies one\n // of the available remove versions\n case 'in-range': {\n for (const edge of node.edgesIn) {\n // if the edge is not part of the partial results, skip it\n /* c8 ignore next */\n if (!state.partial.edges.has(edge)) continue\n\n if (\n greaterVersions.some(\n version =>\n edge.spec.final.range &&\n satisfies(version, edge.spec.final.range),\n )\n ) {\n return\n }\n }\n return node\n }\n // the node is part of the result as long as none of its parents has\n // a spec definition that satisfies one of the available remote versions\n case 'out-of-range': {\n for (const edge of node.edgesIn) {\n // if the edge is not part of the partial results, skip it\n /* c8 ignore next */\n if (!state.partial.edges.has(edge)) continue\n\n if (\n greaterVersions.some(\n version =>\n edge.spec.final.range &&\n satisfies(version, edge.spec.final.range),\n )\n ) {\n return node\n }\n }\n return\n }\n }\n}\n\n/**\n * Filters out nodes that are not outdated.\n *\n * The :outdated() pseudo selector supports one `type` argument,\n * possible values are the following:\n *\n * - `any`: Selects all nodes that have a greater version available.\n * - `major`: Selects all nodes that have a greater major version available.\n * - `minor`: Selects all nodes that have a greater minor version available.\n * - `patch`: Selects all nodes that have a greater patch version available.\n * - `in-range`: Selects all nodes that have a parent node with a spec definition\n * that satisfies one of the available remote versions.\n * - `out-of-range`: Selects all nodes that have a parent node with a spec definition\n * that does not satisfy any of the available remote versions.\n */\nexport const outdated = 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 :outdated selector', {\n cause: err,\n })\n }\n\n const { kind } = internals\n const queue = []\n\n for (const node of state.partial.nodes) {\n // filter out nodes that are always ignored by the outdated selector\n if (\n node.mainImporter ||\n node.manifest?.private ||\n splitDepID(node.id)[0] !== 'registry'\n ) {\n removeNode(state, node)\n continue\n }\n\n // fetchs outdated info and performs checks to define\n // whether or not a node should be filtered out\n queue.push(queueNode(state, node, kind))\n }\n\n // nodes queued for removal are then finally removed\n const removeNodeQueue = await Promise.all(queue)\n for (const node of removeNodeQueue) {\n if (node) {\n removeNode(state, node)\n }\n }\n\n return state\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ParserState } from '../types.ts';
2
+ /**
3
+ * :peer Pseudo-Selector will only match peer dependencies.
4
+ */
5
+ export declare const peer: (state: ParserState) => Promise<ParserState>;
6
+ //# sourceMappingURL=peer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer.d.ts","sourceRoot":"","sources":["../../../src/pseudo/peer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C;;GAEG;AACH,eAAO,MAAM,IAAI,UAAiB,WAAW,yBAW5C,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { removeEdge, removeUnlinkedNodes } from "./helpers.js";
2
+ /**
3
+ * :peer Pseudo-Selector will only match peer dependencies.
4
+ */
5
+ export const peer = async (state) => {
6
+ // filter edges that aren't marked as peer
7
+ for (const edge of state.partial.edges) {
8
+ if (!edge.peer) {
9
+ removeEdge(state, edge);
10
+ }
11
+ }
12
+ removeUnlinkedNodes(state);
13
+ return state;
14
+ };
15
+ //# sourceMappingURL=peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer.js","sourceRoot":"","sources":["../../../src/pseudo/peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE9D;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAC/C,0CAA0C;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,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 type { ParserState } from '../types.ts'\nimport { removeEdge, removeUnlinkedNodes } from './helpers.ts'\n\n/**\n * :peer Pseudo-Selector will only match peer dependencies.\n */\nexport const peer = async (state: ParserState) => {\n // filter edges that aren't marked as peer\n for (const edge of state.partial.edges) {\n if (!edge.peer) {\n removeEdge(state, edge)\n }\n }\n\n removeUnlinkedNodes(state)\n\n return state\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { ParserState } from '../types.ts';
2
+ /**
3
+ * :private Pseudo-Selector will only match packages that have
4
+ * a `private: true` key set in their `package.json` metadata.
5
+ */
6
+ export declare const privateParser: (state: ParserState) => Promise<ParserState>;
7
+ //# sourceMappingURL=private.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../../../src/pseudo/private.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C;;;GAGG;AACH,eAAO,MAAM,aAAa,UAAiB,WAAW,yBAUrD,CAAA"}
@@ -0,0 +1,16 @@
1
+ import { asManifest } from '@vltpkg/types';
2
+ import { removeNode, removeDanglingEdges } from "./helpers.js";
3
+ /**
4
+ * :private Pseudo-Selector will only match packages that have
5
+ * a `private: true` key set in their `package.json` metadata.
6
+ */
7
+ export const privateParser = async (state) => {
8
+ for (const node of state.partial.nodes) {
9
+ if (!node.manifest || !asManifest(node.manifest).private) {
10
+ removeNode(state, node);
11
+ }
12
+ }
13
+ removeDanglingEdges(state);
14
+ return state;
15
+ };
16
+ //# sourceMappingURL=private.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private.js","sourceRoot":"","sources":["../../../src/pseudo/private.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IACxD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YACzD,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 { asManifest } from '@vltpkg/types'\nimport type { ParserState } from '../types.ts'\nimport { removeNode, removeDanglingEdges } from './helpers.ts'\n\n/**\n * :private Pseudo-Selector will only match packages that have\n * a `private: true` key set in their `package.json` metadata.\n */\nexport const privateParser = async (state: ParserState) => {\n for (const node of state.partial.nodes) {\n if (!node.manifest || !asManifest(node.manifest).private) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ParserState } from '../types.ts';
2
+ /**
3
+ * :prod Pseudo-Selector will only match production dependencies.
4
+ */
5
+ export declare const prod: (state: ParserState) => Promise<ParserState>;
6
+ //# sourceMappingURL=prod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prod.d.ts","sourceRoot":"","sources":["../../../src/pseudo/prod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C;;GAEG;AACH,eAAO,MAAM,IAAI,UAAiB,WAAW,yBAW5C,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { removeEdge, removeUnlinkedNodes } from "./helpers.js";
2
+ /**
3
+ * :prod Pseudo-Selector will only match production dependencies.
4
+ */
5
+ export const prod = async (state) => {
6
+ // filter edges that don't have type 'prod'
7
+ for (const edge of state.partial.edges) {
8
+ if (edge.type !== 'prod') {
9
+ removeEdge(state, edge);
10
+ }
11
+ }
12
+ removeUnlinkedNodes(state);
13
+ return state;
14
+ };
15
+ //# sourceMappingURL=prod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prod.js","sourceRoot":"","sources":["../../../src/pseudo/prod.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE9D;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAC/C,2CAA2C;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,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 type { ParserState } from '../types.ts'\nimport { removeEdge, removeUnlinkedNodes } from './helpers.ts'\n\n/**\n * :prod Pseudo-Selector will only match production dependencies.\n */\nexport const prod = async (state: ParserState) => {\n // filter edges that don't have type 'prod'\n for (const edge of state.partial.edges) {\n if (edge.type !== 'prod') {\n removeEdge(state, edge)\n }\n }\n\n removeUnlinkedNodes(state)\n\n return state\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import type { NodeLike } from '@vltpkg/graph';
2
+ import type { SpecOptions } from '@vltpkg/spec/browser';
3
+ import type { ParserState, PostcssNode } from '../types.ts';
4
+ /**
5
+ * The possible comparator values accepted by the :published() pseudo selector.
6
+ */
7
+ export type PublishedComparator = '>' | '<' | '>=' | '<=' | undefined;
8
+ /**
9
+ * Result of the internal parsing of the :published() pseudo selector.
10
+ */
11
+ export type PublishedInternals = {
12
+ relativeDate: string;
13
+ comparator: PublishedComparator;
14
+ };
15
+ /**
16
+ * Fetches the published date of a package version from the npm registry.
17
+ */
18
+ export declare const retrieveRemoteDate: (node: NodeLike, specOptions: SpecOptions, signal?: AbortSignal) => Promise<string | undefined>;
19
+ /**
20
+ * Retrieves what kind of check the :published selector should perform.
21
+ */
22
+ export declare const parseInternals: (nodes: PostcssNode[]) => PublishedInternals;
23
+ /**
24
+ * Filter nodes by queueing up for removal those that don't match the date criteria.
25
+ */
26
+ export declare const queueNode: (state: ParserState, node: NodeLike, relativeDate: string, comparator: PublishedComparator) => Promise<NodeLike | undefined>;
27
+ /**
28
+ * Filters out nodes that don't match the published date criteria.
29
+ *
30
+ * The :published() pseudo selector supports a date parameter that can be prefixed
31
+ * with a comparator (>, <, >=, <=). If no comparator is provided, it will match
32
+ * exact dates.
33
+ *
34
+ * Examples:
35
+ * - :published("2024-01-01") - Matches packages published exactly on January 1st, 2024
36
+ * - :published(">2024-01-01") - Matches packages published after January 1st, 2024
37
+ * - :published("<=2023-12-31") - Matches packages published on or before December 31st, 2023
38
+ */
39
+ export declare const published: (state: ParserState) => Promise<ParserState>;
40
+ //# sourceMappingURL=published.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"published.d.ts","sourceRoot":"","sources":["../../../src/pseudo/published.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AASvD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAO3D;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,CAAA;AAErE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,mBAAmB,CAAA;CAChC,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,SACvB,QAAQ,eACD,WAAW,WACf,WAAW,KACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CA2B5B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,UAClB,WAAW,EAAE,KACnB,kBAoCF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,UACb,WAAW,QACZ,QAAQ,gBACA,MAAM,cACR,mBAAmB,KAC9B,OAAO,CAAC,QAAQ,GAAG,SAAS,CAkD9B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,UAAiB,WAAW,yBA0CjD,CAAA"}
@@ -0,0 +1,159 @@
1
+ import pRetry, { AbortError } from 'p-retry';
2
+ import { hydrate, splitDepID } from '@vltpkg/dep-id/browser';
3
+ import { error } from '@vltpkg/error-cause';
4
+ import { asPostcssNodeWithChildren, asStringNode, asTagNode, isStringNode, isTagNode, } from "../types.js";
5
+ import { removeDanglingEdges, removeNode, removeQuotes, } from "./helpers.js";
6
+ /**
7
+ * Fetches the published date of a package version from the npm registry.
8
+ */
9
+ export const retrieveRemoteDate = async (node, specOptions, signal) => {
10
+ const spec = hydrate(node.id, String(node.name), specOptions);
11
+ if (!spec.registry || !node.name || !node.version) {
12
+ return undefined;
13
+ }
14
+ const url = new URL(spec.registry);
15
+ url.pathname = `/${node.name}`;
16
+ const response = await fetch(String(url), {
17
+ signal,
18
+ });
19
+ // on missing valid auth or API, it should abort the retry logic
20
+ if (response.status === 404) {
21
+ throw new AbortError('Missing API');
22
+ }
23
+ if (!response.ok) {
24
+ throw error('Failed to fetch packument', {
25
+ name: String(node.name),
26
+ spec,
27
+ response,
28
+ });
29
+ }
30
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
31
+ const packument = await response.json();
32
+ const res = packument.time?.[node.version];
33
+ return res;
34
+ };
35
+ /**
36
+ * Retrieves what kind of check the :published selector should perform.
37
+ */
38
+ export const parseInternals = (nodes) => {
39
+ let value = '';
40
+ if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
41
+ value = removeQuotes(asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])
42
+ .value);
43
+ }
44
+ else if (isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {
45
+ const tagNode = asTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0]);
46
+ value = tagNode.value;
47
+ }
48
+ // Check if the value starts with a comparator
49
+ let comparator;
50
+ let relativeDate = value;
51
+ if (value.startsWith('>=')) {
52
+ comparator = '>=';
53
+ relativeDate = value.slice(2);
54
+ }
55
+ else if (value.startsWith('<=')) {
56
+ comparator = '<=';
57
+ relativeDate = value.slice(2);
58
+ }
59
+ else if (value.startsWith('>')) {
60
+ comparator = '>';
61
+ relativeDate = value.slice(1);
62
+ }
63
+ else if (value.startsWith('<')) {
64
+ comparator = '<';
65
+ relativeDate = value.slice(1);
66
+ }
67
+ return { relativeDate, comparator };
68
+ };
69
+ /**
70
+ * Filter nodes by queueing up for removal those that don't match the date criteria.
71
+ */
72
+ export const queueNode = async (state, node, relativeDate, comparator) => {
73
+ if (!node.name || !node.version) {
74
+ return node;
75
+ }
76
+ let publishedDate;
77
+ try {
78
+ publishedDate = await pRetry(() => retrieveRemoteDate(node, state.specOptions, state.signal), {
79
+ retries: state.retries,
80
+ signal: state.signal,
81
+ });
82
+ }
83
+ catch (err) {
84
+ // eslint-disable-next-line no-console
85
+ console.warn(error('Could not retrieve registry publish date', {
86
+ name: String(node.name),
87
+ cause: err,
88
+ }));
89
+ return node;
90
+ }
91
+ if (!publishedDate) {
92
+ return node;
93
+ }
94
+ // only matches the same amount of date information
95
+ // as provided in the relative date
96
+ const nodeDate = new Date(publishedDate.slice(0, relativeDate.length));
97
+ const compareDate = new Date(relativeDate);
98
+ switch (comparator) {
99
+ case '>':
100
+ return nodeDate > compareDate ? undefined : node;
101
+ case '<':
102
+ return nodeDate < compareDate ? undefined : node;
103
+ case '>=':
104
+ return nodeDate >= compareDate ? undefined : node;
105
+ case '<=':
106
+ return nodeDate <= compareDate ? undefined : node;
107
+ default:
108
+ return nodeDate.getTime() === compareDate.getTime() ?
109
+ undefined
110
+ : node;
111
+ }
112
+ };
113
+ /**
114
+ * Filters out nodes that don't match the published date criteria.
115
+ *
116
+ * The :published() pseudo selector supports a date parameter that can be prefixed
117
+ * with a comparator (>, <, >=, <=). If no comparator is provided, it will match
118
+ * exact dates.
119
+ *
120
+ * Examples:
121
+ * - :published("2024-01-01") - Matches packages published exactly on January 1st, 2024
122
+ * - :published(">2024-01-01") - Matches packages published after January 1st, 2024
123
+ * - :published("<=2023-12-31") - Matches packages published on or before December 31st, 2023
124
+ */
125
+ export const published = async (state) => {
126
+ let internals;
127
+ try {
128
+ internals = parseInternals(asPostcssNodeWithChildren(state.current).nodes);
129
+ }
130
+ catch (err) {
131
+ throw error('Failed to parse :published selector', {
132
+ cause: err,
133
+ });
134
+ }
135
+ const { relativeDate, comparator } = internals;
136
+ const queue = [];
137
+ for (const node of state.partial.nodes) {
138
+ // filter out nodes that are always ignored by the published selector
139
+ if (node.mainImporter ||
140
+ node.manifest?.private ||
141
+ splitDepID(node.id)[0] !== 'registry') {
142
+ removeNode(state, node);
143
+ continue;
144
+ }
145
+ // fetch published date info and perform checks to define
146
+ // whether or not a node should be filtered out
147
+ queue.push(queueNode(state, node, relativeDate, comparator));
148
+ }
149
+ // nodes queued for removal are then finally removed
150
+ const removeNodeQueue = await Promise.all(queue);
151
+ for (const node of removeNodeQueue) {
152
+ if (node) {
153
+ removeNode(state, node);
154
+ }
155
+ }
156
+ removeDanglingEdges(state);
157
+ return state;
158
+ };
159
+ //# sourceMappingURL=published.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"published.js","sourceRoot":"","sources":["../../../src/pseudo/published.ts"],"names":[],"mappings":"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","sourcesContent":["import pRetry, { AbortError } from 'p-retry'\nimport { hydrate, splitDepID } from '@vltpkg/dep-id/browser'\nimport { error } from '@vltpkg/error-cause'\nimport type { NodeLike } from '@vltpkg/graph'\nimport type { SpecOptions } from '@vltpkg/spec/browser'\nimport type { Packument } from '@vltpkg/types'\nimport {\n asPostcssNodeWithChildren,\n asStringNode,\n asTagNode,\n isStringNode,\n isTagNode,\n} from '../types.ts'\nimport type { ParserState, PostcssNode } from '../types.ts'\nimport {\n removeDanglingEdges,\n removeNode,\n removeQuotes,\n} from './helpers.ts'\n\n/**\n * The possible comparator values accepted by the :published() pseudo selector.\n */\nexport type PublishedComparator = '>' | '<' | '>=' | '<=' | undefined\n\n/**\n * Result of the internal parsing of the :published() pseudo selector.\n */\nexport type PublishedInternals = {\n relativeDate: string\n comparator: PublishedComparator\n}\n\n/**\n * Fetches the published date of a package version from the npm registry.\n */\nexport const retrieveRemoteDate = async (\n node: NodeLike,\n specOptions: SpecOptions,\n signal?: AbortSignal,\n): Promise<string | undefined> => {\n const spec = hydrate(node.id, String(node.name), specOptions)\n if (!spec.registry || !node.name || !node.version) {\n return undefined\n }\n\n const url = new URL(spec.registry)\n url.pathname = `/${node.name}`\n\n const response = await fetch(String(url), {\n signal,\n })\n // on missing valid auth or API, it should abort the retry logic\n if (response.status === 404) {\n throw new AbortError('Missing API')\n }\n if (!response.ok) {\n throw error('Failed to fetch packument', {\n name: String(node.name),\n spec,\n response,\n })\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const packument: Packument = await response.json()\n const res = packument.time?.[node.version]\n return res\n}\n\n/**\n * Retrieves what kind of check the :published selector should perform.\n */\nexport const parseInternals = (\n nodes: PostcssNode[],\n): PublishedInternals => {\n let value = ''\n\n if (isStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])) {\n value = removeQuotes(\n asStringNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n .value,\n )\n } else if (\n isTagNode(asPostcssNodeWithChildren(nodes[0]).nodes[0])\n ) {\n const tagNode = asTagNode(\n asPostcssNodeWithChildren(nodes[0]).nodes[0],\n )\n value = tagNode.value\n }\n\n // Check if the value starts with a comparator\n let comparator: PublishedComparator\n let relativeDate = value\n\n if (value.startsWith('>=')) {\n comparator = '>='\n relativeDate = value.slice(2)\n } else if (value.startsWith('<=')) {\n comparator = '<='\n relativeDate = value.slice(2)\n } else if (value.startsWith('>')) {\n comparator = '>'\n relativeDate = value.slice(1)\n } else if (value.startsWith('<')) {\n comparator = '<'\n relativeDate = value.slice(1)\n }\n\n return { relativeDate, comparator }\n}\n\n/**\n * Filter nodes by queueing up for removal those that don't match the date criteria.\n */\nexport const queueNode = async (\n state: ParserState,\n node: NodeLike,\n relativeDate: string,\n comparator: PublishedComparator,\n): Promise<NodeLike | undefined> => {\n if (!node.name || !node.version) {\n return node\n }\n\n let publishedDate: string | undefined\n try {\n publishedDate = await pRetry(\n () => retrieveRemoteDate(node, state.specOptions, state.signal),\n {\n retries: state.retries,\n signal: state.signal,\n },\n )\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n error('Could not retrieve registry publish date', {\n name: String(node.name),\n cause: err,\n }),\n )\n return node\n }\n\n if (!publishedDate) {\n return node\n }\n\n // only matches the same amount of date information\n // as provided in the relative date\n const nodeDate = new Date(\n publishedDate.slice(0, relativeDate.length),\n )\n const compareDate = new Date(relativeDate)\n\n switch (comparator) {\n case '>':\n return nodeDate > compareDate ? undefined : node\n case '<':\n return nodeDate < compareDate ? undefined : node\n case '>=':\n return nodeDate >= compareDate ? undefined : node\n case '<=':\n return nodeDate <= compareDate ? undefined : node\n default:\n return nodeDate.getTime() === compareDate.getTime() ?\n undefined\n : node\n }\n}\n\n/**\n * Filters out nodes that don't match the published date criteria.\n *\n * The :published() pseudo selector supports a date parameter that can be prefixed\n * with a comparator (>, <, >=, <=). If no comparator is provided, it will match\n * exact dates.\n *\n * Examples:\n * - :published(\"2024-01-01\") - Matches packages published exactly on January 1st, 2024\n * - :published(\">2024-01-01\") - Matches packages published after January 1st, 2024\n * - :published(\"<=2023-12-31\") - Matches packages published on or before December 31st, 2023\n */\nexport const published = 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 :published selector', {\n cause: err,\n })\n }\n\n const { relativeDate, comparator } = internals\n const queue = []\n\n for (const node of state.partial.nodes) {\n // filter out nodes that are always ignored by the published selector\n if (\n node.mainImporter ||\n node.manifest?.private ||\n splitDepID(node.id)[0] !== 'registry'\n ) {\n removeNode(state, node)\n continue\n }\n\n // fetch published date info and perform checks to define\n // whether or not a node should be filtered out\n queue.push(queueNode(state, node, relativeDate, comparator))\n }\n\n // nodes queued for removal are then finally removed\n const removeNodeQueue = await Promise.all(queue)\n for (const node of removeNodeQueue) {\n if (node) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import type { ParserState } from '../types.ts';
2
2
  /**
3
- * Ensures that security report data is available for all packages in the current graph.
4
- * Throws an error if security data is not available.
3
+ * :scanned pseudo selector.
4
+ *
5
+ * Remove all nodes that do not have available metadata
6
+ * in the security archive.
5
7
  */
6
8
  export declare const scanned: (state: ParserState) => Promise<ParserState>;
7
9
  //# sourceMappingURL=scanned.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanned.d.ts","sourceRoot":"","sources":["../../../src/pseudo/scanned.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;GAGG;AACH,eAAO,MAAM,OAAO,UAAiB,WAAW,yBAK/C,CAAA"}
1
+ {"version":3,"file":"scanned.d.ts","sourceRoot":"","sources":["../../../src/pseudo/scanned.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,OAAO,UAAiB,WAAW,yBAU/C,CAAA"}
@@ -1,12 +1,17 @@
1
- import { error } from '@vltpkg/error-cause';
1
+ import { removeDanglingEdges, removeNode } from "./helpers.js";
2
2
  /**
3
- * Ensures that security report data is available for all packages in the current graph.
4
- * Throws an error if security data is not available.
3
+ * :scanned pseudo selector.
4
+ *
5
+ * Remove all nodes that do not have available metadata
6
+ * in the security archive.
5
7
  */
6
8
  export const scanned = async (state) => {
7
- if (!state.securityArchive?.ok) {
8
- throw error('Security report data missing');
9
+ for (const node of state.partial.nodes) {
10
+ if (!state.securityArchive?.has(node.id)) {
11
+ removeNode(state, node);
12
+ }
9
13
  }
14
+ removeDanglingEdges(state);
10
15
  return state;
11
16
  };
12
17
  //# sourceMappingURL=scanned.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanned.js","sourceRoot":"","sources":["../../../src/pseudo/scanned.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAClD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC;QAC/B,MAAM,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { error } from '@vltpkg/error-cause'\nimport type { ParserState } from '../types.ts'\n\n/**\n * Ensures that security report data is available for all packages in the current graph.\n * Throws an error if security data is not available.\n */\nexport const scanned = async (state: ParserState) => {\n if (!state.securityArchive?.ok) {\n throw error('Security report data missing')\n }\n return state\n}\n"]}
1
+ {"version":3,"file":"scanned.js","sourceRoot":"","sources":["../../../src/pseudo/scanned.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,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 { removeDanglingEdges, removeNode } from './helpers.ts'\nimport type { ParserState } from '../types.ts'\n\n/**\n * :scanned pseudo selector.\n *\n * Remove all nodes that do not have available metadata\n * in the security archive.\n */\nexport const scanned = async (state: ParserState) => {\n for (const node of state.partial.nodes) {\n if (!state.securityArchive?.has(node.id)) {\n removeNode(state, node)\n }\n }\n\n removeDanglingEdges(state)\n\n return state\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import type { ParserState, PostcssNode } from '../types.ts';
2
+ import type { PackageScore } from '@vltpkg/security-archive';
3
+ export type ScoreKinds = keyof PackageScore;
4
+ export type ScoreComparator = '>' | '<' | '>=' | '<=' | '=' | undefined;
5
+ export declare const isScoreKind: (value?: string) => value is ScoreKinds;
6
+ export declare const asScoreKind: (value?: string) => ScoreKinds;
7
+ export declare const parseInternals: (nodes: PostcssNode[]) => {
8
+ comparator: ScoreComparator;
9
+ rate: number;
10
+ kind: ScoreKinds;
11
+ };
12
+ export declare const score: (state: ParserState) => Promise<ParserState & {
13
+ securityArchive: NonNullable<ParserState["securityArchive"]>;
14
+ }>;
15
+ //# sourceMappingURL=score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../../src/pseudo/score.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAO3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,MAAM,MAAM,UAAU,GAAG,MAAM,YAAY,CAAA;AAE3C,MAAM,MAAM,eAAe,GACvB,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,GAAG,GACH,SAAS,CAAA;AAYb,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,UAAU,EAAE,eAAe,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;CAsEjB,CAAA;AAED,eAAO,MAAM,KAAK,UAAiB,WAAW;;EAiD7C,CAAA"}