@vltpkg/query 1.5.0 → 1.6.0

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 (210) hide show
  1. package/package.json +10 -12
  2. package/skills/dss-query/REFERENCE.md +0 -125
  3. package/skills/dss-query/SKILL.md +0 -190
  4. package/skills/dss-query/evals/README.md +0 -81
  5. package/skills/dss-query/evals/evals.json +0 -89
  6. package/skills/dss-query/evals/grade.mjs +0 -481
  7. package/src/attribute.ts +0 -190
  8. package/src/combinator.ts +0 -135
  9. package/src/error.ts +0 -78
  10. package/src/id.ts +0 -46
  11. package/src/index.ts +0 -670
  12. package/src/parser.ts +0 -122
  13. package/src/pseudo/abandoned.ts +0 -9
  14. package/src/pseudo/attr.ts +0 -92
  15. package/src/pseudo/built.ts +0 -19
  16. package/src/pseudo/confused.ts +0 -29
  17. package/src/pseudo/cve.ts +0 -93
  18. package/src/pseudo/cwe.ts +0 -97
  19. package/src/pseudo/debug.ts +0 -9
  20. package/src/pseudo/deprecated.ts +0 -9
  21. package/src/pseudo/dev.ts +0 -18
  22. package/src/pseudo/diff.ts +0 -90
  23. package/src/pseudo/dist.ts +0 -148
  24. package/src/pseudo/dynamic.ts +0 -9
  25. package/src/pseudo/empty.ts +0 -15
  26. package/src/pseudo/entropic.ts +0 -9
  27. package/src/pseudo/env.ts +0 -6
  28. package/src/pseudo/eval.ts +0 -9
  29. package/src/pseudo/fs.ts +0 -9
  30. package/src/pseudo/helpers.ts +0 -106
  31. package/src/pseudo/host.ts +0 -111
  32. package/src/pseudo/hostname.ts +0 -156
  33. package/src/pseudo/license.ts +0 -134
  34. package/src/pseudo/link.ts +0 -30
  35. package/src/pseudo/malware.ts +0 -41
  36. package/src/pseudo/minified.ts +0 -9
  37. package/src/pseudo/missing.ts +0 -16
  38. package/src/pseudo/native.ts +0 -9
  39. package/src/pseudo/network.ts +0 -9
  40. package/src/pseudo/obfuscated.ts +0 -9
  41. package/src/pseudo/optional.ts +0 -18
  42. package/src/pseudo/outdated.ts +0 -345
  43. package/src/pseudo/overridden.ts +0 -20
  44. package/src/pseudo/path.ts +0 -146
  45. package/src/pseudo/peer.ts +0 -18
  46. package/src/pseudo/prerelease.ts +0 -47
  47. package/src/pseudo/private.ts +0 -19
  48. package/src/pseudo/prod.ts +0 -18
  49. package/src/pseudo/published.ts +0 -250
  50. package/src/pseudo/registry.ts +0 -29
  51. package/src/pseudo/root.ts +0 -19
  52. package/src/pseudo/scanned.ts +0 -20
  53. package/src/pseudo/score.ts +0 -186
  54. package/src/pseudo/scripts.ts +0 -61
  55. package/src/pseudo/semver.ts +0 -320
  56. package/src/pseudo/severity.ts +0 -231
  57. package/src/pseudo/shell.ts +0 -9
  58. package/src/pseudo/shrinkwrap.ts +0 -9
  59. package/src/pseudo/skill.ts +0 -59
  60. package/src/pseudo/skills.ts +0 -29
  61. package/src/pseudo/spec.ts +0 -131
  62. package/src/pseudo/squat.ts +0 -225
  63. package/src/pseudo/suspicious.ts +0 -9
  64. package/src/pseudo/tracker.ts +0 -9
  65. package/src/pseudo/trivial.ts +0 -9
  66. package/src/pseudo/type.ts +0 -26
  67. package/src/pseudo/undesirable.ts +0 -9
  68. package/src/pseudo/unknown.ts +0 -9
  69. package/src/pseudo/unmaintained.ts +0 -9
  70. package/src/pseudo/unpopular.ts +0 -9
  71. package/src/pseudo/unstable.ts +0 -9
  72. package/src/pseudo/vuln.ts +0 -273
  73. package/src/pseudo/workspace.ts +0 -22
  74. package/src/pseudo.ts +0 -440
  75. package/src/types.ts +0 -206
  76. package/tap-snapshots/test/attribute.ts.test.cjs +0 -304
  77. package/tap-snapshots/test/combinator.ts.test.cjs +0 -333
  78. package/tap-snapshots/test/id.ts.test.cjs +0 -118
  79. package/tap-snapshots/test/parser.ts.test.cjs +0 -344
  80. package/tap-snapshots/test/pseudo/abandoned.ts.test.cjs +0 -18
  81. package/tap-snapshots/test/pseudo/attr.ts.test.cjs +0 -161
  82. package/tap-snapshots/test/pseudo/built.ts.test.cjs +0 -70
  83. package/tap-snapshots/test/pseudo/confused.ts.test.cjs +0 -32
  84. package/tap-snapshots/test/pseudo/cve.ts.test.cjs +0 -49
  85. package/tap-snapshots/test/pseudo/cwe.ts.test.cjs +0 -49
  86. package/tap-snapshots/test/pseudo/debug.ts.test.cjs +0 -18
  87. package/tap-snapshots/test/pseudo/deprecated.ts.test.cjs +0 -18
  88. package/tap-snapshots/test/pseudo/dist.ts.test.cjs +0 -30
  89. package/tap-snapshots/test/pseudo/dynamic.ts.test.cjs +0 -18
  90. package/tap-snapshots/test/pseudo/empty.ts.test.cjs +0 -50
  91. package/tap-snapshots/test/pseudo/entropic.ts.test.cjs +0 -18
  92. package/tap-snapshots/test/pseudo/env.ts.test.cjs +0 -18
  93. package/tap-snapshots/test/pseudo/eval.ts.test.cjs +0 -18
  94. package/tap-snapshots/test/pseudo/fs.ts.test.cjs +0 -18
  95. package/tap-snapshots/test/pseudo/helpers.ts.test.cjs +0 -18
  96. package/tap-snapshots/test/pseudo/hostname.ts.test.cjs +0 -148
  97. package/tap-snapshots/test/pseudo/license.ts.test.cjs +0 -41
  98. package/tap-snapshots/test/pseudo/link.ts.test.cjs +0 -36
  99. package/tap-snapshots/test/pseudo/malware.ts.test.cjs +0 -22
  100. package/tap-snapshots/test/pseudo/minified.ts.test.cjs +0 -18
  101. package/tap-snapshots/test/pseudo/missing.ts.test.cjs +0 -30
  102. package/tap-snapshots/test/pseudo/native.ts.test.cjs +0 -18
  103. package/tap-snapshots/test/pseudo/network.ts.test.cjs +0 -18
  104. package/tap-snapshots/test/pseudo/obfuscated.ts.test.cjs +0 -18
  105. package/tap-snapshots/test/pseudo/outdated.ts.test.cjs +0 -132
  106. package/tap-snapshots/test/pseudo/overridden.ts.test.cjs +0 -75
  107. package/tap-snapshots/test/pseudo/prerelease.ts.test.cjs +0 -101
  108. package/tap-snapshots/test/pseudo/private.ts.test.cjs +0 -38
  109. package/tap-snapshots/test/pseudo/published.ts.test.cjs +0 -171
  110. package/tap-snapshots/test/pseudo/registry.ts.test.cjs +0 -68
  111. package/tap-snapshots/test/pseudo/root.ts.test.cjs +0 -24
  112. package/tap-snapshots/test/pseudo/scanned.ts.test.cjs +0 -18
  113. package/tap-snapshots/test/pseudo/score.ts.test.cjs +0 -239
  114. package/tap-snapshots/test/pseudo/scripts.ts.test.cjs +0 -62
  115. package/tap-snapshots/test/pseudo/semver.ts.test.cjs +0 -575
  116. package/tap-snapshots/test/pseudo/severity.ts.test.cjs +0 -122
  117. package/tap-snapshots/test/pseudo/shell.ts.test.cjs +0 -18
  118. package/tap-snapshots/test/pseudo/shrinkwrap.ts.test.cjs +0 -18
  119. package/tap-snapshots/test/pseudo/skills.ts.test.cjs +0 -19
  120. package/tap-snapshots/test/pseudo/spec.ts.test.cjs +0 -148
  121. package/tap-snapshots/test/pseudo/squat.ts.test.cjs +0 -129
  122. package/tap-snapshots/test/pseudo/suspicious.ts.test.cjs +0 -18
  123. package/tap-snapshots/test/pseudo/tracker.ts.test.cjs +0 -18
  124. package/tap-snapshots/test/pseudo/trivial.ts.test.cjs +0 -18
  125. package/tap-snapshots/test/pseudo/type.ts.test.cjs +0 -51
  126. package/tap-snapshots/test/pseudo/undesirable.ts.test.cjs +0 -18
  127. package/tap-snapshots/test/pseudo/unknown.ts.test.cjs +0 -18
  128. package/tap-snapshots/test/pseudo/unmaintained.ts.test.cjs +0 -18
  129. package/tap-snapshots/test/pseudo/unpopular.ts.test.cjs +0 -18
  130. package/tap-snapshots/test/pseudo/unstable.ts.test.cjs +0 -18
  131. package/tap-snapshots/test/pseudo/vuln.ts.test.cjs +0 -208
  132. package/tap-snapshots/test/pseudo/vulnerable.ts.test.cjs +0 -20
  133. package/tap-snapshots/test/pseudo/workspace.ts.test.cjs +0 -19
  134. package/tap-snapshots/test/pseudo.ts.test.cjs +0 -1247
  135. package/test/attribute.ts +0 -273
  136. package/test/combinator.ts +0 -175
  137. package/test/error.ts +0 -60
  138. package/test/fixtures/graph.ts +0 -999
  139. package/test/fixtures/selector.ts +0 -103
  140. package/test/fixtures/types.ts +0 -7
  141. package/test/id.ts +0 -102
  142. package/test/index.ts +0 -1148
  143. package/test/parser.ts +0 -117
  144. package/test/pseudo/abandoned.ts +0 -98
  145. package/test/pseudo/attr.ts +0 -298
  146. package/test/pseudo/built.ts +0 -214
  147. package/test/pseudo/confused.ts +0 -160
  148. package/test/pseudo/cve.ts +0 -249
  149. package/test/pseudo/cwe.ts +0 -255
  150. package/test/pseudo/debug.ts +0 -98
  151. package/test/pseudo/deprecated.ts +0 -98
  152. package/test/pseudo/dev.ts +0 -61
  153. package/test/pseudo/diff.ts +0 -417
  154. package/test/pseudo/dist.ts +0 -215
  155. package/test/pseudo/dynamic.ts +0 -98
  156. package/test/pseudo/empty.ts +0 -108
  157. package/test/pseudo/entropic.ts +0 -101
  158. package/test/pseudo/env.ts +0 -98
  159. package/test/pseudo/eval.ts +0 -98
  160. package/test/pseudo/fs.ts +0 -98
  161. package/test/pseudo/helpers.ts +0 -370
  162. package/test/pseudo/host-context.ts +0 -276
  163. package/test/pseudo/hostname.ts +0 -314
  164. package/test/pseudo/license.ts +0 -265
  165. package/test/pseudo/link.ts +0 -94
  166. package/test/pseudo/malware.ts +0 -184
  167. package/test/pseudo/minified.ts +0 -98
  168. package/test/pseudo/missing.ts +0 -111
  169. package/test/pseudo/native.ts +0 -98
  170. package/test/pseudo/network.ts +0 -98
  171. package/test/pseudo/obfuscated.ts +0 -98
  172. package/test/pseudo/optional.ts +0 -73
  173. package/test/pseudo/outdated.ts +0 -461
  174. package/test/pseudo/overridden.ts +0 -317
  175. package/test/pseudo/path.ts +0 -680
  176. package/test/pseudo/peer.ts +0 -101
  177. package/test/pseudo/prerelease.ts +0 -279
  178. package/test/pseudo/private.ts +0 -108
  179. package/test/pseudo/prod.ts +0 -61
  180. package/test/pseudo/published.ts +0 -557
  181. package/test/pseudo/registry.ts +0 -122
  182. package/test/pseudo/root.ts +0 -66
  183. package/test/pseudo/scanned.ts +0 -144
  184. package/test/pseudo/score.ts +0 -591
  185. package/test/pseudo/scripts.ts +0 -324
  186. package/test/pseudo/semver.ts +0 -822
  187. package/test/pseudo/severity.ts +0 -342
  188. package/test/pseudo/shell.ts +0 -98
  189. package/test/pseudo/shrinkwrap.ts +0 -98
  190. package/test/pseudo/skill.ts +0 -189
  191. package/test/pseudo/skills.ts +0 -90
  192. package/test/pseudo/spec.ts +0 -525
  193. package/test/pseudo/squat.ts +0 -565
  194. package/test/pseudo/suspicious.ts +0 -98
  195. package/test/pseudo/tracker.ts +0 -98
  196. package/test/pseudo/trivial.ts +0 -98
  197. package/test/pseudo/type.ts +0 -105
  198. package/test/pseudo/undesirable.ts +0 -98
  199. package/test/pseudo/unknown.ts +0 -98
  200. package/test/pseudo/unmaintained.ts +0 -98
  201. package/test/pseudo/unpopular.ts +0 -98
  202. package/test/pseudo/unstable.ts +0 -98
  203. package/test/pseudo/vuln.ts +0 -625
  204. package/test/pseudo/vulnerable.ts +0 -137
  205. package/test/pseudo/workspace.ts +0 -111
  206. package/test/pseudo.ts +0 -584
  207. package/tsconfig.json +0 -3
  208. package/tsconfig.publish.json +0 -19
  209. package/tsconfig.publish.tsbuildinfo +0 -1
  210. package/typedoc.mjs +0 -2
package/src/pseudo.ts DELETED
@@ -1,440 +0,0 @@
1
- import { error } from '@vltpkg/error-cause'
2
- import { removeDanglingEdges, removeNode } from './pseudo/helpers.ts'
3
- import { didYouMean, queryError, selectorText } from './error.ts'
4
- import {
5
- asPostcssNodeWithChildren,
6
- asPseudoNode,
7
- isSelectorNode,
8
- } from '@vltpkg/dss-parser'
9
-
10
- // imported pseudo selectors
11
- import { abandoned } from './pseudo/abandoned.ts'
12
- import { attr } from './pseudo/attr.ts'
13
- import { built } from './pseudo/built.ts'
14
- import { confused } from './pseudo/confused.ts'
15
- import { cve } from './pseudo/cve.ts'
16
- import { cwe } from './pseudo/cwe.ts'
17
- import { debug } from './pseudo/debug.ts'
18
- import { deprecated } from './pseudo/deprecated.ts'
19
- import { dev } from './pseudo/dev.ts'
20
- import { diff } from './pseudo/diff.ts'
21
- import { dist } from './pseudo/dist.ts'
22
- import { dynamic } from './pseudo/dynamic.ts'
23
- import { empty } from './pseudo/empty.ts'
24
- import { entropic } from './pseudo/entropic.ts'
25
- import { env } from './pseudo/env.ts'
26
- import { evalParser } from './pseudo/eval.ts'
27
- import { fs } from './pseudo/fs.ts'
28
- import { hostContext } from './pseudo/host.ts'
29
- import { hostname } from './pseudo/hostname.ts'
30
- import { license } from './pseudo/license.ts'
31
- import { link } from './pseudo/link.ts'
32
- import { malware } from './pseudo/malware.ts'
33
- import { minified } from './pseudo/minified.ts'
34
- import { missing } from './pseudo/missing.ts'
35
- import { nativeParser } from './pseudo/native.ts'
36
- import { network } from './pseudo/network.ts'
37
- import { obfuscated } from './pseudo/obfuscated.ts'
38
- import { optional } from './pseudo/optional.ts'
39
- import { outdated } from './pseudo/outdated.ts'
40
- import { overridden } from './pseudo/overridden.ts'
41
- import { path } from './pseudo/path.ts'
42
- import { peer } from './pseudo/peer.ts'
43
- import { prerelease } from './pseudo/prerelease.ts'
44
- import { published } from './pseudo/published.ts'
45
- import { privateParser } from './pseudo/private.ts'
46
- import { registry } from './pseudo/registry.ts'
47
- import { prod } from './pseudo/prod.ts'
48
- import { root } from './pseudo/root.ts'
49
- import { scanned } from './pseudo/scanned.ts'
50
- import { score } from './pseudo/score.ts'
51
- import { scripts } from './pseudo/scripts.ts'
52
- import { shell } from './pseudo/shell.ts'
53
- import { semverParser as semver } from './pseudo/semver.ts'
54
- import { severity } from './pseudo/severity.ts'
55
- import { spec } from './pseudo/spec.ts'
56
- import { shrinkwrap } from './pseudo/shrinkwrap.ts'
57
- import { skill } from './pseudo/skill.ts'
58
- import { skills } from './pseudo/skills.ts'
59
- import { squat } from './pseudo/squat.ts'
60
- import { suspicious } from './pseudo/suspicious.ts'
61
- import { tracker } from './pseudo/tracker.ts'
62
- import { trivial } from './pseudo/trivial.ts'
63
- import { type } from './pseudo/type.ts'
64
- import { undesirable } from './pseudo/undesirable.ts'
65
- import { unknown } from './pseudo/unknown.ts'
66
- import { unmaintained } from './pseudo/unmaintained.ts'
67
- import { unpopular } from './pseudo/unpopular.ts'
68
- import { unstable } from './pseudo/unstable.ts'
69
- import { vuln } from './pseudo/vuln.ts'
70
- import { workspace } from './pseudo/workspace.ts'
71
-
72
- import type { PseudoClassName } from '@vltpkg/dss-parser'
73
- import type { EdgeLike, NodeLike } from '@vltpkg/types'
74
- import type { ParserFn, ParserState } from './types.ts'
75
-
76
- /**
77
- * :has Pseudo-Selector, matches only nodes that have valid results
78
- * for its nested selector expressions.
79
- */
80
- const has = async (state: ParserState) => {
81
- const top = asPostcssNodeWithChildren(state.current)
82
- const collectNodes = new Set<NodeLike>()
83
- const collectEdges = new Set<EdgeLike>()
84
-
85
- for (const node of top.nodes) {
86
- if (isSelectorNode(node)) {
87
- const nestedState = await state.walk({
88
- cancellable: state.cancellable,
89
- initial: {
90
- edges: new Set(state.initial.edges),
91
- nodes: new Set(state.initial.nodes),
92
- },
93
- current: node,
94
- walk: state.walk,
95
- collect: {
96
- edges: new Set(),
97
- nodes: new Set(),
98
- },
99
- partial: {
100
- edges: new Set(state.partial.edges),
101
- nodes: new Set(state.partial.nodes),
102
- },
103
- diffFiles: state.diffFiles,
104
- hasSkills: state.hasSkills,
105
- loose: state.loose,
106
- hostContexts: state.hostContexts,
107
- importers: state.importers,
108
- retries: state.retries,
109
- securityArchive: state.securityArchive,
110
- signal: state.signal,
111
- scopeIDs: state.scopeIDs,
112
- comment: state.comment,
113
- specificity: { ...state.specificity },
114
- })
115
- for (const n of nestedState.collect.nodes) {
116
- collectNodes.add(n)
117
- }
118
- for (const e of nestedState.partial.edges) {
119
- collectEdges.add(e)
120
- }
121
- }
122
- }
123
-
124
- // if the nested selector did not match anything, that means
125
- // no current node has any matches
126
- if (collectNodes.size === 0) {
127
- state.partial.edges.clear()
128
- state.partial.nodes.clear()
129
- return state
130
- }
131
-
132
- // handles transitive dependencies
133
- // compareNodes collects a list of all ancestor nodes
134
- // from the resulting nodes of the nested selector
135
- const compareNodes = new Set<NodeLike>()
136
- const traverse = new Set(collectNodes)
137
- for (const node of traverse) {
138
- for (const edge of node.edgesIn) {
139
- compareNodes.add(edge.from)
140
- if (edge.from.edgesIn.size) {
141
- traverse.add(edge.from)
142
- }
143
- }
144
- }
145
-
146
- // for each node in the current list checks to see if
147
- // it has a node in the resulting nested state that is
148
- // a transitive dependency / children.
149
- nodesLoop: for (const node of state.partial.nodes) {
150
- if (node.edgesOut.size === 0 || !compareNodes.has(node)) {
151
- removeNode(state, node)
152
- continue
153
- }
154
-
155
- for (const edge of node.edgesOut.values()) {
156
- if (collectEdges.has(edge)) {
157
- continue nodesLoop
158
- }
159
- }
160
- removeNode(state, node)
161
- }
162
-
163
- removeDanglingEdges(state)
164
-
165
- return state
166
- }
167
-
168
- /**
169
- * :is Pseudo-selector, acts as a shortcut for writing more compact expressions
170
- * by allowing multiple nested selectors to match on the previous results.
171
- *
172
- * It also enables the loose parsing mode, skipping instead of erroring usage
173
- * of non-existing classes, identifiers, pseudo-classes, etc.
174
- */
175
- const is = async (state: ParserState) => {
176
- const top = asPostcssNodeWithChildren(state.current)
177
- const collect = new Set()
178
- for (const node of top.nodes) {
179
- if (isSelectorNode(node)) {
180
- const nestedState = await state.walk({
181
- cancellable: state.cancellable,
182
- collect: {
183
- edges: new Set(),
184
- nodes: new Set(),
185
- },
186
- current: node,
187
- diffFiles: state.diffFiles,
188
- hasSkills: state.hasSkills,
189
- initial: state.initial,
190
- loose: true,
191
- partial: {
192
- nodes: new Set(state.partial.nodes),
193
- edges: new Set(state.partial.edges),
194
- },
195
- importers: state.importers,
196
- hostContexts: state.hostContexts,
197
- walk: state.walk,
198
- retries: state.retries,
199
- securityArchive: state.securityArchive,
200
- signal: state.signal,
201
- scopeIDs: state.scopeIDs,
202
- comment: state.comment,
203
- specificity: { ...state.specificity },
204
- })
205
- for (const n of nestedState.collect.nodes) {
206
- collect.add(n)
207
- }
208
- }
209
- }
210
- for (const node of state.partial.nodes) {
211
- if (!collect.has(node)) {
212
- removeNode(state, node)
213
- }
214
- }
215
- return state
216
- }
217
-
218
- /**
219
- * :not Pseudo-class, serves to create negate expressions, anything that
220
- * matches selectors declared inside the `:not()` expression is going to be
221
- * filtered out in the final result.
222
- */
223
- const not = async (state: ParserState) => {
224
- const top = asPostcssNodeWithChildren(state.current)
225
- const collect = new Set()
226
- for (const node of top.nodes) {
227
- if (isSelectorNode(node)) {
228
- const nestedState = await state.walk({
229
- cancellable: state.cancellable,
230
- collect: {
231
- edges: new Set(),
232
- nodes: new Set(),
233
- },
234
- current: node,
235
- diffFiles: state.diffFiles,
236
- hasSkills: state.hasSkills,
237
- initial: state.initial,
238
- loose: state.loose,
239
- partial: {
240
- nodes: new Set(state.partial.nodes),
241
- edges: new Set(state.partial.edges),
242
- },
243
- importers: state.importers,
244
- hostContexts: state.hostContexts,
245
- walk: state.walk,
246
- retries: state.retries,
247
- securityArchive: state.securityArchive,
248
- signal: state.signal,
249
- scopeIDs: state.scopeIDs,
250
- comment: state.comment,
251
- specificity: { ...state.specificity },
252
- })
253
- for (const n of nestedState.collect.nodes) {
254
- collect.add(n)
255
- }
256
- /* c8 ignore start - should be impossible */
257
- } else {
258
- throw error('Error parsing :not() selectors', {
259
- wanted: { type: 'selector' },
260
- found: node,
261
- })
262
- }
263
- /* c8 ignore stop */
264
- }
265
- for (const node of state.partial.nodes) {
266
- if (collect.has(node)) {
267
- removeNode(state, node)
268
- }
269
- }
270
-
271
- removeDanglingEdges(state)
272
-
273
- return state
274
- }
275
-
276
- /**
277
- * :project Pseudo-Class, matches only graph importers (e.g: the
278
- * root node along with any configured workspace)
279
- */
280
- const project = async (state: ParserState) => {
281
- for (const node of state.partial.nodes) {
282
- if (!node.importer) {
283
- removeNode(state, node)
284
- }
285
- }
286
- for (const edge of state.partial.edges) {
287
- if (!edge.to?.importer) {
288
- state.partial.edges.delete(edge)
289
- }
290
- }
291
- return state
292
- }
293
-
294
- /**
295
- * :scope Pseudo-Element, returns only the nodes that match the provided scopeIDs
296
- * from the Query.search method.
297
- */
298
- const scope = async (state: ParserState) => {
299
- const scopeIDSet = new Set(state.scopeIDs)
300
-
301
- for (const node of state.partial.nodes) {
302
- if (!scopeIDSet.has(node.id)) {
303
- removeNode(state, node)
304
- }
305
- }
306
-
307
- removeDanglingEdges(state)
308
-
309
- return state
310
- }
311
-
312
- const pseudoSelectors = new Map<string, ParserFn>(
313
- Object.entries({
314
- abandoned,
315
- attr,
316
- built,
317
- confused,
318
- cve,
319
- cwe,
320
- debug,
321
- deprecated,
322
- dev,
323
- diff,
324
- dist,
325
- dynamic,
326
- eval: evalParser,
327
- empty,
328
- entropic,
329
- env,
330
- fs,
331
- has,
332
- host: hostContext,
333
- hostname,
334
- is,
335
- license,
336
- link,
337
- malware,
338
- minified,
339
- missing,
340
- native: nativeParser,
341
- network,
342
- not,
343
- obfuscated,
344
- optional,
345
- outdated,
346
- overridden,
347
- path,
348
- peer,
349
- prerelease,
350
- published,
351
- private: privateParser,
352
- prod,
353
- registry,
354
- project,
355
- root,
356
- scanned,
357
- scope,
358
- score,
359
- scripts,
360
- semver,
361
- sev: severity,
362
- spec,
363
- severity,
364
- shell,
365
- shrinkwrap,
366
- skill,
367
- skills,
368
- squat,
369
- suspicious,
370
- tracker,
371
- trivial,
372
- type,
373
- undesirable,
374
- unknown,
375
- unmaintained,
376
- unpopular,
377
- unstable,
378
- v: semver,
379
- vuln,
380
- vulnerable: vuln,
381
- workspace,
382
- } satisfies Record<PseudoClassName, ParserFn>),
383
- )
384
-
385
- /**
386
- * Names of every supported pseudo-class, without the leading `:`.
387
- */
388
- export const pseudoSelectorNames: ReadonlySet<string> = new Set(
389
- pseudoSelectors.keys(),
390
- )
391
-
392
- /**
393
- * Parsers the `pseudo` node types.
394
- */
395
- export const pseudo = async (state: ParserState) => {
396
- await state.cancellable()
397
-
398
- const curr = asPseudoNode(state.current)
399
- const parserFn =
400
- curr.value && pseudoSelectors.get(curr.value.slice(1))
401
-
402
- if (!parserFn) {
403
- if (state.loose) {
404
- state.partial.edges.clear()
405
- state.partial.nodes.clear()
406
- return state
407
- }
408
-
409
- // `:difff(x)` should still suggest `:diff`, so drop any arguments
410
- const name = selectorText(state.current)
411
- .replace(/^:/, '')
412
- .replace(/\(.*$/s, '')
413
- const suggestions = didYouMean(name, pseudoSelectorNames).map(
414
- n => `:${n}`,
415
- )
416
- throw queryError(
417
- `Unsupported pseudo-class: ${state.current.value}`,
418
- state.current,
419
- suggestions.length > 1 ?
420
- { validOptions: suggestions }
421
- : { wanted: suggestions[0] },
422
- )
423
- }
424
-
425
- const result = await parserFn(state)
426
-
427
- // Increment the commonCounter for specificity, except for
428
- // nesting selectors which don't contribute to specificity
429
- const pseudoValue = curr.value.slice(1)
430
- if (
431
- pseudoValue &&
432
- pseudoValue !== 'not' &&
433
- pseudoValue !== 'is' &&
434
- pseudoValue !== 'has'
435
- ) {
436
- result.specificity.commonCounter += 1
437
- }
438
-
439
- return result
440
- }
package/src/types.ts DELETED
@@ -1,206 +0,0 @@
1
- import type { EdgeLike, NodeLike } from '@vltpkg/types'
2
- import type {
3
- SecurityArchiveLike,
4
- PackageScore,
5
- } from '@vltpkg/security-archive'
6
- import type { DepID } from '@vltpkg/dep-id'
7
- import type { PartPseudoName, PostcssNode } from '@vltpkg/dss-parser'
8
-
9
- export type HostContextsMapResult = {
10
- initialEdges: EdgeLike[]
11
- initialNodes: NodeLike[]
12
- edges: EdgeLike[]
13
- nodes: NodeLike[]
14
- securityArchive: SecurityArchiveLike | undefined
15
- }
16
-
17
- export type HostContextsMap = Map<
18
- string,
19
- () => Promise<HostContextsMapResult>
20
- >
21
-
22
- export type Specificity = {
23
- idCounter: number
24
- commonCounter: number
25
- }
26
-
27
- export type GraphSelectionState = {
28
- nodes: Set<NodeLike>
29
- edges: Set<EdgeLike>
30
- }
31
-
32
- /**
33
- * Callback that returns changed file paths for a given
34
- * commitish reference. Used by the :diff() pseudo selector.
35
- * The returned paths should be relative to the project root.
36
- */
37
- export type DiffFilesProvider = (commitish: string) => Set<string>
38
-
39
- /**
40
- * Callback that returns the `authorization` header value to use when
41
- * fetching data from a registry URL, e.g. by the :outdated() pseudo
42
- * selector. Keeps the browser-safe query package free of any direct
43
- * keychain / registry-client dependency.
44
- */
45
- export type GetAuthHeader = (
46
- url: string,
47
- ) => Promise<string | undefined>
48
-
49
- /**
50
- * Whether an installed package ships agent skills; for `:skills`.
51
- * Keeps fs out of this package.
52
- */
53
- export type HasSkills = (node: NodeLike) => Promise<boolean>
54
-
55
- /**
56
- * One top-level selector of a query and the nodes it matched. `name`
57
- * and `patterns` are set when it ends in a part selector, e.g.
58
- * `#a:skill(x, y*)`.
59
- */
60
- export type QueryPart<N = QueryResponseNode> = {
61
- name?: PartPseudoName
62
- /** as typed, `*` = glob; for matching only, never paths */
63
- patterns?: string[]
64
- nodes: N[]
65
- }
66
-
67
- export type ParserState = {
68
- cancellable: () => Promise<void>
69
- collect: GraphSelectionState
70
- comment: string
71
- current: PostcssNode
72
- diffFiles?: DiffFilesProvider
73
- getAuthHeader?: GetAuthHeader
74
- hasSkills?: HasSkills
75
- hostContexts?: HostContextsMap
76
- importers: Set<NodeLike>
77
- initial: GraphSelectionState
78
- loose?: boolean
79
- next?: PostcssNode
80
- prev?: PostcssNode
81
- result?: NodeLike[]
82
- signal: AbortSignal
83
- walk: ParserFn
84
- partial: GraphSelectionState
85
- /** set by `:skill()`, read and cleared by `walk()` */
86
- part?: Pick<QueryPart, 'name' | 'patterns'>
87
- /** one entry per top-level selector, only when opted in */
88
- parts?: QueryPart<NodeLike>[]
89
- /** part selectors this consumer allows */
90
- partSelectors?: ReadonlySet<PartPseudoName>
91
- retries: number
92
- securityArchive: SecurityArchiveLike | undefined
93
- scopeIDs?: DepID[]
94
- specificity: Specificity
95
- }
96
-
97
- export type QueryResponse = {
98
- edges: QueryResponseEdge[]
99
- nodes: QueryResponseNode[]
100
- importers: QueryResponseNode[]
101
- comment: string
102
- specificity: Specificity
103
- /**
104
- * one entry per top-level selector, only with `partSelectors` and
105
- * a non-empty query
106
- */
107
- parts?: QueryPart[]
108
- }
109
-
110
- export type QueryResponseEdge = Omit<EdgeLike, 'from' | 'to'> & {
111
- from: QueryResponseNode
112
- to?: QueryResponseNode
113
- }
114
-
115
- export type QueryResponseNode = Omit<
116
- NodeLike,
117
- 'edgesIn' | 'edgesOut'
118
- > & {
119
- edgesIn: Set<QueryResponseEdge>
120
- edgesOut: Map<string, QueryResponseEdge>
121
- insights: Insights
122
- toJSON: () => Pick<
123
- QueryResponseNode,
124
- | 'id'
125
- | 'name'
126
- | 'version'
127
- | 'location'
128
- | 'importer'
129
- | 'manifest'
130
- | 'projectRoot'
131
- | 'integrity'
132
- | 'resolved'
133
- | 'dev'
134
- | 'optional'
135
- | 'insights'
136
- | 'confused'
137
- >
138
- }
139
-
140
- export type Insights = {
141
- abandoned?: boolean
142
- confused?: boolean
143
- cve?: `CVE-${string}`[]
144
- cwe?: `CWE-${string}`[]
145
- debug?: boolean
146
- deprecated?: boolean
147
- dynamic?: boolean
148
- entropic?: boolean
149
- env?: boolean
150
- eval?: boolean
151
- fs?: boolean
152
- license?: LicenseInsights
153
- malware?: boolean
154
- minified?: boolean
155
- native?: boolean
156
- network?: boolean
157
- obfuscated?: boolean
158
- scanned: boolean
159
- score?: PackageScore
160
- scripts?: boolean
161
- severity?: SeverityInsights
162
- shell?: boolean
163
- shrinkwrap?: boolean
164
- squat?: SquatInsights
165
- suspicious?: boolean
166
- tracker?: boolean
167
- trivial?: boolean
168
- undesirable?: boolean
169
- unknown?: boolean
170
- unmaintained?: boolean
171
- unpopular?: boolean
172
- unstable?: boolean
173
- vuln?: VulnInsights
174
- }
175
-
176
- export type LicenseInsights = {
177
- unlicensed: boolean
178
- misc: boolean
179
- restricted: boolean
180
- ambiguous: boolean
181
- copyleft: boolean
182
- unknown: boolean
183
- none: boolean
184
- exception: boolean
185
- }
186
-
187
- export type LeveledInsights = {
188
- low: boolean
189
- medium: boolean
190
- high: boolean
191
- critical: boolean
192
- }
193
-
194
- export type SeverityInsights = LeveledInsights
195
- export type VulnInsights = LeveledInsights
196
-
197
- export type SquatInsights = {
198
- medium: boolean
199
- critical: boolean
200
- }
201
-
202
- export type ParserFn = (opt: ParserState) => Promise<ParserState>
203
-
204
- export type ParsedSelectorToken = PostcssNode & {
205
- token: string
206
- }