@vltpkg/query 1.5.0 → 1.6.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.
Files changed (211) hide show
  1. package/dist/id.js +12 -5
  2. package/package.json +10 -12
  3. package/skills/dss-query/REFERENCE.md +0 -125
  4. package/skills/dss-query/SKILL.md +0 -190
  5. package/skills/dss-query/evals/README.md +0 -81
  6. package/skills/dss-query/evals/evals.json +0 -89
  7. package/skills/dss-query/evals/grade.mjs +0 -481
  8. package/src/attribute.ts +0 -190
  9. package/src/combinator.ts +0 -135
  10. package/src/error.ts +0 -78
  11. package/src/id.ts +0 -46
  12. package/src/index.ts +0 -670
  13. package/src/parser.ts +0 -122
  14. package/src/pseudo/abandoned.ts +0 -9
  15. package/src/pseudo/attr.ts +0 -92
  16. package/src/pseudo/built.ts +0 -19
  17. package/src/pseudo/confused.ts +0 -29
  18. package/src/pseudo/cve.ts +0 -93
  19. package/src/pseudo/cwe.ts +0 -97
  20. package/src/pseudo/debug.ts +0 -9
  21. package/src/pseudo/deprecated.ts +0 -9
  22. package/src/pseudo/dev.ts +0 -18
  23. package/src/pseudo/diff.ts +0 -90
  24. package/src/pseudo/dist.ts +0 -148
  25. package/src/pseudo/dynamic.ts +0 -9
  26. package/src/pseudo/empty.ts +0 -15
  27. package/src/pseudo/entropic.ts +0 -9
  28. package/src/pseudo/env.ts +0 -6
  29. package/src/pseudo/eval.ts +0 -9
  30. package/src/pseudo/fs.ts +0 -9
  31. package/src/pseudo/helpers.ts +0 -106
  32. package/src/pseudo/host.ts +0 -111
  33. package/src/pseudo/hostname.ts +0 -156
  34. package/src/pseudo/license.ts +0 -134
  35. package/src/pseudo/link.ts +0 -30
  36. package/src/pseudo/malware.ts +0 -41
  37. package/src/pseudo/minified.ts +0 -9
  38. package/src/pseudo/missing.ts +0 -16
  39. package/src/pseudo/native.ts +0 -9
  40. package/src/pseudo/network.ts +0 -9
  41. package/src/pseudo/obfuscated.ts +0 -9
  42. package/src/pseudo/optional.ts +0 -18
  43. package/src/pseudo/outdated.ts +0 -345
  44. package/src/pseudo/overridden.ts +0 -20
  45. package/src/pseudo/path.ts +0 -146
  46. package/src/pseudo/peer.ts +0 -18
  47. package/src/pseudo/prerelease.ts +0 -47
  48. package/src/pseudo/private.ts +0 -19
  49. package/src/pseudo/prod.ts +0 -18
  50. package/src/pseudo/published.ts +0 -250
  51. package/src/pseudo/registry.ts +0 -29
  52. package/src/pseudo/root.ts +0 -19
  53. package/src/pseudo/scanned.ts +0 -20
  54. package/src/pseudo/score.ts +0 -186
  55. package/src/pseudo/scripts.ts +0 -61
  56. package/src/pseudo/semver.ts +0 -320
  57. package/src/pseudo/severity.ts +0 -231
  58. package/src/pseudo/shell.ts +0 -9
  59. package/src/pseudo/shrinkwrap.ts +0 -9
  60. package/src/pseudo/skill.ts +0 -59
  61. package/src/pseudo/skills.ts +0 -29
  62. package/src/pseudo/spec.ts +0 -131
  63. package/src/pseudo/squat.ts +0 -225
  64. package/src/pseudo/suspicious.ts +0 -9
  65. package/src/pseudo/tracker.ts +0 -9
  66. package/src/pseudo/trivial.ts +0 -9
  67. package/src/pseudo/type.ts +0 -26
  68. package/src/pseudo/undesirable.ts +0 -9
  69. package/src/pseudo/unknown.ts +0 -9
  70. package/src/pseudo/unmaintained.ts +0 -9
  71. package/src/pseudo/unpopular.ts +0 -9
  72. package/src/pseudo/unstable.ts +0 -9
  73. package/src/pseudo/vuln.ts +0 -273
  74. package/src/pseudo/workspace.ts +0 -22
  75. package/src/pseudo.ts +0 -440
  76. package/src/types.ts +0 -206
  77. package/tap-snapshots/test/attribute.ts.test.cjs +0 -304
  78. package/tap-snapshots/test/combinator.ts.test.cjs +0 -333
  79. package/tap-snapshots/test/id.ts.test.cjs +0 -118
  80. package/tap-snapshots/test/parser.ts.test.cjs +0 -344
  81. package/tap-snapshots/test/pseudo/abandoned.ts.test.cjs +0 -18
  82. package/tap-snapshots/test/pseudo/attr.ts.test.cjs +0 -161
  83. package/tap-snapshots/test/pseudo/built.ts.test.cjs +0 -70
  84. package/tap-snapshots/test/pseudo/confused.ts.test.cjs +0 -32
  85. package/tap-snapshots/test/pseudo/cve.ts.test.cjs +0 -49
  86. package/tap-snapshots/test/pseudo/cwe.ts.test.cjs +0 -49
  87. package/tap-snapshots/test/pseudo/debug.ts.test.cjs +0 -18
  88. package/tap-snapshots/test/pseudo/deprecated.ts.test.cjs +0 -18
  89. package/tap-snapshots/test/pseudo/dist.ts.test.cjs +0 -30
  90. package/tap-snapshots/test/pseudo/dynamic.ts.test.cjs +0 -18
  91. package/tap-snapshots/test/pseudo/empty.ts.test.cjs +0 -50
  92. package/tap-snapshots/test/pseudo/entropic.ts.test.cjs +0 -18
  93. package/tap-snapshots/test/pseudo/env.ts.test.cjs +0 -18
  94. package/tap-snapshots/test/pseudo/eval.ts.test.cjs +0 -18
  95. package/tap-snapshots/test/pseudo/fs.ts.test.cjs +0 -18
  96. package/tap-snapshots/test/pseudo/helpers.ts.test.cjs +0 -18
  97. package/tap-snapshots/test/pseudo/hostname.ts.test.cjs +0 -148
  98. package/tap-snapshots/test/pseudo/license.ts.test.cjs +0 -41
  99. package/tap-snapshots/test/pseudo/link.ts.test.cjs +0 -36
  100. package/tap-snapshots/test/pseudo/malware.ts.test.cjs +0 -22
  101. package/tap-snapshots/test/pseudo/minified.ts.test.cjs +0 -18
  102. package/tap-snapshots/test/pseudo/missing.ts.test.cjs +0 -30
  103. package/tap-snapshots/test/pseudo/native.ts.test.cjs +0 -18
  104. package/tap-snapshots/test/pseudo/network.ts.test.cjs +0 -18
  105. package/tap-snapshots/test/pseudo/obfuscated.ts.test.cjs +0 -18
  106. package/tap-snapshots/test/pseudo/outdated.ts.test.cjs +0 -132
  107. package/tap-snapshots/test/pseudo/overridden.ts.test.cjs +0 -75
  108. package/tap-snapshots/test/pseudo/prerelease.ts.test.cjs +0 -101
  109. package/tap-snapshots/test/pseudo/private.ts.test.cjs +0 -38
  110. package/tap-snapshots/test/pseudo/published.ts.test.cjs +0 -171
  111. package/tap-snapshots/test/pseudo/registry.ts.test.cjs +0 -68
  112. package/tap-snapshots/test/pseudo/root.ts.test.cjs +0 -24
  113. package/tap-snapshots/test/pseudo/scanned.ts.test.cjs +0 -18
  114. package/tap-snapshots/test/pseudo/score.ts.test.cjs +0 -239
  115. package/tap-snapshots/test/pseudo/scripts.ts.test.cjs +0 -62
  116. package/tap-snapshots/test/pseudo/semver.ts.test.cjs +0 -575
  117. package/tap-snapshots/test/pseudo/severity.ts.test.cjs +0 -122
  118. package/tap-snapshots/test/pseudo/shell.ts.test.cjs +0 -18
  119. package/tap-snapshots/test/pseudo/shrinkwrap.ts.test.cjs +0 -18
  120. package/tap-snapshots/test/pseudo/skills.ts.test.cjs +0 -19
  121. package/tap-snapshots/test/pseudo/spec.ts.test.cjs +0 -148
  122. package/tap-snapshots/test/pseudo/squat.ts.test.cjs +0 -129
  123. package/tap-snapshots/test/pseudo/suspicious.ts.test.cjs +0 -18
  124. package/tap-snapshots/test/pseudo/tracker.ts.test.cjs +0 -18
  125. package/tap-snapshots/test/pseudo/trivial.ts.test.cjs +0 -18
  126. package/tap-snapshots/test/pseudo/type.ts.test.cjs +0 -51
  127. package/tap-snapshots/test/pseudo/undesirable.ts.test.cjs +0 -18
  128. package/tap-snapshots/test/pseudo/unknown.ts.test.cjs +0 -18
  129. package/tap-snapshots/test/pseudo/unmaintained.ts.test.cjs +0 -18
  130. package/tap-snapshots/test/pseudo/unpopular.ts.test.cjs +0 -18
  131. package/tap-snapshots/test/pseudo/unstable.ts.test.cjs +0 -18
  132. package/tap-snapshots/test/pseudo/vuln.ts.test.cjs +0 -208
  133. package/tap-snapshots/test/pseudo/vulnerable.ts.test.cjs +0 -20
  134. package/tap-snapshots/test/pseudo/workspace.ts.test.cjs +0 -19
  135. package/tap-snapshots/test/pseudo.ts.test.cjs +0 -1247
  136. package/test/attribute.ts +0 -273
  137. package/test/combinator.ts +0 -175
  138. package/test/error.ts +0 -60
  139. package/test/fixtures/graph.ts +0 -999
  140. package/test/fixtures/selector.ts +0 -103
  141. package/test/fixtures/types.ts +0 -7
  142. package/test/id.ts +0 -102
  143. package/test/index.ts +0 -1148
  144. package/test/parser.ts +0 -117
  145. package/test/pseudo/abandoned.ts +0 -98
  146. package/test/pseudo/attr.ts +0 -298
  147. package/test/pseudo/built.ts +0 -214
  148. package/test/pseudo/confused.ts +0 -160
  149. package/test/pseudo/cve.ts +0 -249
  150. package/test/pseudo/cwe.ts +0 -255
  151. package/test/pseudo/debug.ts +0 -98
  152. package/test/pseudo/deprecated.ts +0 -98
  153. package/test/pseudo/dev.ts +0 -61
  154. package/test/pseudo/diff.ts +0 -417
  155. package/test/pseudo/dist.ts +0 -215
  156. package/test/pseudo/dynamic.ts +0 -98
  157. package/test/pseudo/empty.ts +0 -108
  158. package/test/pseudo/entropic.ts +0 -101
  159. package/test/pseudo/env.ts +0 -98
  160. package/test/pseudo/eval.ts +0 -98
  161. package/test/pseudo/fs.ts +0 -98
  162. package/test/pseudo/helpers.ts +0 -370
  163. package/test/pseudo/host-context.ts +0 -276
  164. package/test/pseudo/hostname.ts +0 -314
  165. package/test/pseudo/license.ts +0 -265
  166. package/test/pseudo/link.ts +0 -94
  167. package/test/pseudo/malware.ts +0 -184
  168. package/test/pseudo/minified.ts +0 -98
  169. package/test/pseudo/missing.ts +0 -111
  170. package/test/pseudo/native.ts +0 -98
  171. package/test/pseudo/network.ts +0 -98
  172. package/test/pseudo/obfuscated.ts +0 -98
  173. package/test/pseudo/optional.ts +0 -73
  174. package/test/pseudo/outdated.ts +0 -461
  175. package/test/pseudo/overridden.ts +0 -317
  176. package/test/pseudo/path.ts +0 -680
  177. package/test/pseudo/peer.ts +0 -101
  178. package/test/pseudo/prerelease.ts +0 -279
  179. package/test/pseudo/private.ts +0 -108
  180. package/test/pseudo/prod.ts +0 -61
  181. package/test/pseudo/published.ts +0 -557
  182. package/test/pseudo/registry.ts +0 -122
  183. package/test/pseudo/root.ts +0 -66
  184. package/test/pseudo/scanned.ts +0 -144
  185. package/test/pseudo/score.ts +0 -591
  186. package/test/pseudo/scripts.ts +0 -324
  187. package/test/pseudo/semver.ts +0 -822
  188. package/test/pseudo/severity.ts +0 -342
  189. package/test/pseudo/shell.ts +0 -98
  190. package/test/pseudo/shrinkwrap.ts +0 -98
  191. package/test/pseudo/skill.ts +0 -189
  192. package/test/pseudo/skills.ts +0 -90
  193. package/test/pseudo/spec.ts +0 -525
  194. package/test/pseudo/squat.ts +0 -565
  195. package/test/pseudo/suspicious.ts +0 -98
  196. package/test/pseudo/tracker.ts +0 -98
  197. package/test/pseudo/trivial.ts +0 -98
  198. package/test/pseudo/type.ts +0 -105
  199. package/test/pseudo/undesirable.ts +0 -98
  200. package/test/pseudo/unknown.ts +0 -98
  201. package/test/pseudo/unmaintained.ts +0 -98
  202. package/test/pseudo/unpopular.ts +0 -98
  203. package/test/pseudo/unstable.ts +0 -98
  204. package/test/pseudo/vuln.ts +0 -625
  205. package/test/pseudo/vulnerable.ts +0 -137
  206. package/test/pseudo/workspace.ts +0 -111
  207. package/test/pseudo.ts +0 -584
  208. package/tsconfig.json +0 -3
  209. package/tsconfig.publish.json +0 -19
  210. package/tsconfig.publish.tsbuildinfo +0 -1
  211. 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
- }