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