diffninja 0.3.1 → 0.4.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 (64) hide show
  1. package/README.md +65 -11
  2. package/dist/executables.d.ts +18 -0
  3. package/dist/executables.js +32 -0
  4. package/dist/git.d.ts +26 -1
  5. package/dist/git.js +56 -4
  6. package/dist/languages/child-env.d.ts +11 -0
  7. package/dist/languages/child-env.js +60 -0
  8. package/dist/languages/grammar-lock.d.ts +569 -0
  9. package/dist/languages/grammar-lock.js +574 -0
  10. package/dist/languages/grammars.d.ts +69 -9
  11. package/dist/languages/grammars.js +186 -119
  12. package/dist/review/call-flow-html.d.ts +3 -1
  13. package/dist/review/call-flow-html.js +13 -11
  14. package/dist/review/change-facts.d.ts +21 -1
  15. package/dist/review/change-facts.js +271 -49
  16. package/dist/review/cli.js +13 -1
  17. package/dist/review/connected-analysis.d.ts +4 -1
  18. package/dist/review/connected-analysis.js +4 -2
  19. package/dist/review/connected-html.d.ts +15 -4
  20. package/dist/review/connected-html.js +342 -35
  21. package/dist/review/connected.js +47 -14
  22. package/dist/review/escape-html.d.ts +5 -1
  23. package/dist/review/escape-html.js +7 -2
  24. package/dist/review/explanation.d.ts +4 -0
  25. package/dist/review/explanation.js +6 -1
  26. package/dist/review/github.d.ts +56 -0
  27. package/dist/review/github.js +234 -33
  28. package/dist/review/grammars-command.d.ts +12 -0
  29. package/dist/review/grammars-command.js +60 -0
  30. package/dist/review/hidden-characters.d.ts +31 -0
  31. package/dist/review/hidden-characters.js +113 -0
  32. package/dist/review/history.js +7 -3
  33. package/dist/review/html.d.ts +3 -2
  34. package/dist/review/html.js +19 -18
  35. package/dist/review/input.js +5 -2
  36. package/dist/review/intent.d.ts +7 -0
  37. package/dist/review/intent.js +25 -3
  38. package/dist/review/markdown.js +11 -0
  39. package/dist/review/mcp-cli.js +4 -1
  40. package/dist/review/mcp.d.ts +7 -1
  41. package/dist/review/mcp.js +145 -59
  42. package/dist/review/pipeline.d.ts +2 -1
  43. package/dist/review/pipeline.js +4 -3
  44. package/dist/review/pr-input.d.ts +7 -0
  45. package/dist/review/pr-input.js +25 -3
  46. package/dist/review/process-html.d.ts +1 -5
  47. package/dist/review/process-html.js +3 -12
  48. package/dist/review/questions.js +11 -3
  49. package/dist/review/reference-check.d.ts +5 -1
  50. package/dist/review/reference-check.js +40 -16
  51. package/dist/review/report-pages.d.ts +24 -9
  52. package/dist/review/report-pages.js +111 -28
  53. package/dist/review/result-budget.d.ts +28 -0
  54. package/dist/review/result-budget.js +136 -0
  55. package/dist/review/service.js +26 -2
  56. package/dist/review/setup.d.ts +1 -1
  57. package/dist/review/setup.js +9 -4
  58. package/dist/review/types.d.ts +19 -5
  59. package/dist/review/types.js +2 -1
  60. package/dist/review/update-check.d.ts +35 -0
  61. package/dist/review/update-check.js +76 -0
  62. package/dist/run.js +11 -5
  63. package/npm-shrinkwrap.json +3483 -0
  64. package/package.json +3 -2
@@ -0,0 +1,574 @@
1
+ // GENERATED by scripts/pin-grammars.mjs. Do not edit; change PINS there and rerun it.
2
+ //
3
+ // The tree-sitter grammars `diffninja grammars install` may download, with the
4
+ // registry's integrity hash of every tarball (npm lockfile v3). Nothing outside
5
+ // this file is ever installed on a reviewer's behalf.
6
+ /** The grammar packages and the exact version of each. */
7
+ export const GRAMMAR_PINS = {
8
+ "@tree-sitter-grammars/tree-sitter-lua": "0.2.0",
9
+ "@tree-sitter-grammars/tree-sitter-zig": "1.1.2",
10
+ "tree-sitter-bash": "0.25.1",
11
+ "tree-sitter-c": "0.24.1",
12
+ "tree-sitter-c-sharp": "0.23.1",
13
+ "tree-sitter-cpp": "0.23.4",
14
+ "tree-sitter-elixir": "0.3.5",
15
+ "tree-sitter-go": "0.25.0",
16
+ "tree-sitter-haskell": "0.23.1",
17
+ "tree-sitter-java": "0.23.5",
18
+ "tree-sitter-kotlin": "0.3.8",
19
+ "tree-sitter-ocaml": "0.24.2",
20
+ "tree-sitter-perl": "2.0.0",
21
+ "tree-sitter-php": "0.24.2",
22
+ "tree-sitter-python": "0.25.0",
23
+ "tree-sitter-ruby": "0.23.1",
24
+ "tree-sitter-rust": "0.24.0",
25
+ "tree-sitter-scala": "0.24.0",
26
+ "tree-sitter-solidity": "1.2.13",
27
+ "tree-sitter-swift": "0.7.1"
28
+ };
29
+ /** Pinned packages that ship no prebuilt binary and load only after `grammars install --build`. */
30
+ export const GRAMMAR_BUILD_ONLY = ["tree-sitter-kotlin", "tree-sitter-perl"];
31
+ /** The cache directory's package.json; its dependencies are GRAMMAR_PINS. */
32
+ export const GRAMMAR_PACKAGE_JSON = {
33
+ "name": "diffninja-grammar-cache",
34
+ "version": "1.0.0",
35
+ "private": true,
36
+ "dependencies": {
37
+ "@tree-sitter-grammars/tree-sitter-lua": "0.2.0",
38
+ "@tree-sitter-grammars/tree-sitter-zig": "1.1.2",
39
+ "tree-sitter-bash": "0.25.1",
40
+ "tree-sitter-c": "0.24.1",
41
+ "tree-sitter-c-sharp": "0.23.1",
42
+ "tree-sitter-cpp": "0.23.4",
43
+ "tree-sitter-elixir": "0.3.5",
44
+ "tree-sitter-go": "0.25.0",
45
+ "tree-sitter-haskell": "0.23.1",
46
+ "tree-sitter-java": "0.23.5",
47
+ "tree-sitter-kotlin": "0.3.8",
48
+ "tree-sitter-ocaml": "0.24.2",
49
+ "tree-sitter-perl": "2.0.0",
50
+ "tree-sitter-php": "0.24.2",
51
+ "tree-sitter-python": "0.25.0",
52
+ "tree-sitter-ruby": "0.23.1",
53
+ "tree-sitter-rust": "0.24.0",
54
+ "tree-sitter-scala": "0.24.0",
55
+ "tree-sitter-solidity": "1.2.13",
56
+ "tree-sitter-swift": "0.7.1"
57
+ }
58
+ };
59
+ /** The cache directory's package-lock.json, exactly as npm resolved it. */
60
+ export const GRAMMAR_PACKAGE_LOCK = {
61
+ "name": "diffninja-grammar-cache",
62
+ "version": "1.0.0",
63
+ "lockfileVersion": 3,
64
+ "requires": true,
65
+ "packages": {
66
+ "": {
67
+ "name": "diffninja-grammar-cache",
68
+ "version": "1.0.0",
69
+ "dependencies": {
70
+ "@tree-sitter-grammars/tree-sitter-lua": "0.2.0",
71
+ "@tree-sitter-grammars/tree-sitter-zig": "1.1.2",
72
+ "tree-sitter-bash": "0.25.1",
73
+ "tree-sitter-c": "0.24.1",
74
+ "tree-sitter-c-sharp": "0.23.1",
75
+ "tree-sitter-cpp": "0.23.4",
76
+ "tree-sitter-elixir": "0.3.5",
77
+ "tree-sitter-go": "0.25.0",
78
+ "tree-sitter-haskell": "0.23.1",
79
+ "tree-sitter-java": "0.23.5",
80
+ "tree-sitter-kotlin": "0.3.8",
81
+ "tree-sitter-ocaml": "0.24.2",
82
+ "tree-sitter-perl": "2.0.0",
83
+ "tree-sitter-php": "0.24.2",
84
+ "tree-sitter-python": "0.25.0",
85
+ "tree-sitter-ruby": "0.23.1",
86
+ "tree-sitter-rust": "0.24.0",
87
+ "tree-sitter-scala": "0.24.0",
88
+ "tree-sitter-solidity": "1.2.13",
89
+ "tree-sitter-swift": "0.7.1"
90
+ }
91
+ },
92
+ "node_modules/@tree-sitter-grammars/tree-sitter-lua": {
93
+ "version": "0.2.0",
94
+ "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-lua/-/tree-sitter-lua-0.2.0.tgz",
95
+ "integrity": "sha512-VPk971J3hBUNr7CpZJvgTU5UmEkW8iMQ0Sk6br4O3xL00XFEO4PCjSSGeYYakRgPAJiIR8J594UcBK+7ilBvqw==",
96
+ "hasInstallScript": true,
97
+ "license": "MIT",
98
+ "dependencies": {
99
+ "node-addon-api": "^8.0.0",
100
+ "node-gyp-build": "^4.8.1"
101
+ },
102
+ "peerDependencies": {
103
+ "tree-sitter": "^0.21.1"
104
+ },
105
+ "peerDependenciesMeta": {
106
+ "tree_sitter": {
107
+ "optional": true
108
+ }
109
+ }
110
+ },
111
+ "node_modules/@tree-sitter-grammars/tree-sitter-zig": {
112
+ "version": "1.1.2",
113
+ "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-zig/-/tree-sitter-zig-1.1.2.tgz",
114
+ "integrity": "sha512-J0L31HZ2isy3F5zb2g5QWQOv2r/pbruQNL9ADhuQv2pn5BQOzxt80WcEJaYXBeuJ8GHxVT42slpCna8k1c8LOw==",
115
+ "hasInstallScript": true,
116
+ "license": "MIT",
117
+ "dependencies": {
118
+ "node-addon-api": "^8.3.0",
119
+ "node-gyp-build": "^4.8.4"
120
+ },
121
+ "peerDependencies": {
122
+ "tree-sitter": "^0.22.1"
123
+ },
124
+ "peerDependenciesMeta": {
125
+ "tree-sitter": {
126
+ "optional": true
127
+ }
128
+ }
129
+ },
130
+ "node_modules/isexe": {
131
+ "version": "2.0.0",
132
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
133
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
134
+ "license": "ISC"
135
+ },
136
+ "node_modules/node-addon-api": {
137
+ "version": "8.9.2",
138
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz",
139
+ "integrity": "sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==",
140
+ "license": "MIT",
141
+ "engines": {
142
+ "node": "^18 || ^20 || >= 21"
143
+ }
144
+ },
145
+ "node_modules/node-gyp-build": {
146
+ "version": "4.8.4",
147
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
148
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
149
+ "license": "MIT",
150
+ "bin": {
151
+ "node-gyp-build": "bin.js",
152
+ "node-gyp-build-optional": "optional.js",
153
+ "node-gyp-build-test": "build-test.js"
154
+ }
155
+ },
156
+ "node_modules/tree-sitter-bash": {
157
+ "version": "0.25.1",
158
+ "resolved": "https://registry.npmjs.org/tree-sitter-bash/-/tree-sitter-bash-0.25.1.tgz",
159
+ "integrity": "sha512-7hMytuYIMoXOq24yRulgIxthE9YmggZIOHCyPTTuJcu6EU54tYD+4G39cUb28kxC6jMf/AbPfWGLQtgPTdh3xw==",
160
+ "hasInstallScript": true,
161
+ "license": "MIT",
162
+ "dependencies": {
163
+ "node-addon-api": "^8.2.1",
164
+ "node-gyp-build": "^4.8.2"
165
+ },
166
+ "peerDependencies": {
167
+ "tree-sitter": "^0.25.0"
168
+ },
169
+ "peerDependenciesMeta": {
170
+ "tree-sitter": {
171
+ "optional": true
172
+ }
173
+ }
174
+ },
175
+ "node_modules/tree-sitter-c": {
176
+ "version": "0.24.1",
177
+ "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.24.1.tgz",
178
+ "integrity": "sha512-lkYwWN3SRecpvaeqmFKkuPNR3ZbtnvHU+4XAEEkJdrp3JfSp2pBrhXOtvfsENUneye76g889Y0ddF2DM0gEDpA==",
179
+ "hasInstallScript": true,
180
+ "license": "MIT",
181
+ "dependencies": {
182
+ "node-addon-api": "^8.3.1",
183
+ "node-gyp-build": "^4.8.4"
184
+ },
185
+ "peerDependencies": {
186
+ "tree-sitter": "^0.22.4"
187
+ },
188
+ "peerDependenciesMeta": {
189
+ "tree-sitter": {
190
+ "optional": true
191
+ }
192
+ }
193
+ },
194
+ "node_modules/tree-sitter-c-sharp": {
195
+ "version": "0.23.1",
196
+ "resolved": "https://registry.npmjs.org/tree-sitter-c-sharp/-/tree-sitter-c-sharp-0.23.1.tgz",
197
+ "integrity": "sha512-9zZ4FlcTRWWfRf6f4PgGhG8saPls6qOOt75tDfX7un9vQZJmARjPrAC6yBNCX2T/VKcCjIDbgq0evFaB3iGhQw==",
198
+ "hasInstallScript": true,
199
+ "license": "MIT",
200
+ "dependencies": {
201
+ "node-addon-api": "^8.2.2",
202
+ "node-gyp-build": "^4.8.2"
203
+ },
204
+ "peerDependencies": {
205
+ "tree-sitter": "^0.21.1"
206
+ },
207
+ "peerDependenciesMeta": {
208
+ "tree-sitter": {
209
+ "optional": true
210
+ }
211
+ }
212
+ },
213
+ "node_modules/tree-sitter-cli": {
214
+ "version": "0.23.2",
215
+ "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.23.2.tgz",
216
+ "integrity": "sha512-kPPXprOqREX+C/FgUp2Qpt9jd0vSwn+hOgjzVv/7hapdoWpa+VeWId53rf4oNNd29ikheF12BYtGD/W90feMbA==",
217
+ "hasInstallScript": true,
218
+ "license": "MIT",
219
+ "bin": {
220
+ "tree-sitter": "cli.js"
221
+ },
222
+ "engines": {
223
+ "node": ">=12.0.0"
224
+ }
225
+ },
226
+ "node_modules/tree-sitter-cpp": {
227
+ "version": "0.23.4",
228
+ "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.23.4.tgz",
229
+ "integrity": "sha512-qR5qUDyhZ5jJ6V8/umiBxokRbe89bCGmcq/dk94wI4kN86qfdV8k0GHIUEKaqWgcu42wKal5E97LKpLeVW8sKw==",
230
+ "hasInstallScript": true,
231
+ "license": "MIT",
232
+ "dependencies": {
233
+ "node-addon-api": "^8.2.1",
234
+ "node-gyp-build": "^4.8.2",
235
+ "tree-sitter-c": "^0.23.1"
236
+ },
237
+ "peerDependencies": {
238
+ "tree-sitter": "^0.21.1"
239
+ },
240
+ "peerDependenciesMeta": {
241
+ "tree-sitter": {
242
+ "optional": true
243
+ }
244
+ }
245
+ },
246
+ "node_modules/tree-sitter-cpp/node_modules/tree-sitter-c": {
247
+ "version": "0.23.6",
248
+ "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.23.6.tgz",
249
+ "integrity": "sha512-0dxXKznVyUA0s6PjNolJNs2yF87O5aL538A/eR6njA5oqX3C3vH4vnx3QdOKwuUdpKEcFdHuiDpRKLLCA/tjvQ==",
250
+ "hasInstallScript": true,
251
+ "license": "MIT",
252
+ "dependencies": {
253
+ "node-addon-api": "^8.3.0",
254
+ "node-gyp-build": "^4.8.4"
255
+ },
256
+ "peerDependencies": {
257
+ "tree-sitter": "^0.22.1"
258
+ },
259
+ "peerDependenciesMeta": {
260
+ "tree-sitter": {
261
+ "optional": true
262
+ }
263
+ }
264
+ },
265
+ "node_modules/tree-sitter-elixir": {
266
+ "version": "0.3.5",
267
+ "resolved": "https://registry.npmjs.org/tree-sitter-elixir/-/tree-sitter-elixir-0.3.5.tgz",
268
+ "integrity": "sha512-xozQMvYK0aSolcQZAx2d84Xe/YMWFuRPYFlLVxO01bM2GITh5jyiIp0TqPCQa8754UzRAI7A83hZmfiYub5TZQ==",
269
+ "hasInstallScript": true,
270
+ "license": "Apache-2.0",
271
+ "dependencies": {
272
+ "node-addon-api": "^7.1.0",
273
+ "node-gyp-build": "^4.8.0"
274
+ },
275
+ "peerDependencies": {
276
+ "tree-sitter": "^0.21.0"
277
+ }
278
+ },
279
+ "node_modules/tree-sitter-elixir/node_modules/node-addon-api": {
280
+ "version": "7.1.1",
281
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
282
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
283
+ "license": "MIT"
284
+ },
285
+ "node_modules/tree-sitter-go": {
286
+ "version": "0.25.0",
287
+ "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.25.0.tgz",
288
+ "integrity": "sha512-APBc/Dq3xz/e35Xpkhb1blu5UgW+2E3RyGWawZSCNcbGwa7jhSQPS8KsUupuzBla8PCo8+lz9W/JDJjmfRa2tw==",
289
+ "hasInstallScript": true,
290
+ "license": "MIT",
291
+ "dependencies": {
292
+ "node-addon-api": "^8.3.1",
293
+ "node-gyp-build": "^4.8.4"
294
+ },
295
+ "peerDependencies": {
296
+ "tree-sitter": "^0.25.0"
297
+ },
298
+ "peerDependenciesMeta": {
299
+ "tree-sitter": {
300
+ "optional": true
301
+ }
302
+ }
303
+ },
304
+ "node_modules/tree-sitter-haskell": {
305
+ "version": "0.23.1",
306
+ "resolved": "https://registry.npmjs.org/tree-sitter-haskell/-/tree-sitter-haskell-0.23.1.tgz",
307
+ "integrity": "sha512-qG4CYhejveu9DLMLEGBz/n9/TTeGSFLC6wniwOgG6m8/v7Dng8qR0ob0EVG7+XH+9WiOxohpGA23EhceWuxY4w==",
308
+ "hasInstallScript": true,
309
+ "license": "MIT",
310
+ "dependencies": {
311
+ "node-addon-api": "^8.2.2",
312
+ "node-gyp-build": "^4.8.2"
313
+ },
314
+ "peerDependencies": {
315
+ "tree-sitter": "^0.21.1"
316
+ },
317
+ "peerDependenciesMeta": {
318
+ "tree-sitter": {
319
+ "optional": true
320
+ }
321
+ }
322
+ },
323
+ "node_modules/tree-sitter-java": {
324
+ "version": "0.23.5",
325
+ "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.23.5.tgz",
326
+ "integrity": "sha512-Yju7oQ0Xx7GcUT01mUglPP+bYfvqjNCGdxqigTnew9nLGoII42PNVP3bHrYeMxswiCRM0yubWmN5qk+zsg0zMA==",
327
+ "hasInstallScript": true,
328
+ "license": "MIT",
329
+ "dependencies": {
330
+ "node-addon-api": "^8.2.2",
331
+ "node-gyp-build": "^4.8.2"
332
+ },
333
+ "peerDependencies": {
334
+ "tree-sitter": "^0.21.1"
335
+ },
336
+ "peerDependenciesMeta": {
337
+ "tree-sitter": {
338
+ "optional": true
339
+ }
340
+ }
341
+ },
342
+ "node_modules/tree-sitter-kotlin": {
343
+ "version": "0.3.8",
344
+ "resolved": "https://registry.npmjs.org/tree-sitter-kotlin/-/tree-sitter-kotlin-0.3.8.tgz",
345
+ "integrity": "sha512-A4obq6bjzmYrA+F0JLLoheFPcofFkctNaZSpnDd+GPn1SfVZLY4/GG4C0cYVBTOShuPBGGAOPLM1JWLZQV4m1g==",
346
+ "hasInstallScript": true,
347
+ "license": "MIT",
348
+ "dependencies": {
349
+ "node-addon-api": "^7.1.0",
350
+ "node-gyp-build": "^4.8.0"
351
+ },
352
+ "peerDependencies": {
353
+ "tree-sitter": "^0.21.0"
354
+ },
355
+ "peerDependenciesMeta": {
356
+ "tree_sitter": {
357
+ "optional": true
358
+ }
359
+ }
360
+ },
361
+ "node_modules/tree-sitter-kotlin/node_modules/node-addon-api": {
362
+ "version": "7.1.1",
363
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
364
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
365
+ "license": "MIT"
366
+ },
367
+ "node_modules/tree-sitter-ocaml": {
368
+ "version": "0.24.2",
369
+ "resolved": "https://registry.npmjs.org/tree-sitter-ocaml/-/tree-sitter-ocaml-0.24.2.tgz",
370
+ "integrity": "sha512-H0RAeCepIyXyTPCQra6yMd7Bn5ZBYkIaddzdLNwVZpM9mCe2e8av+3O6Ojl7Z8YHrV/kYsfHvI2y+Hh7qzcYQQ==",
371
+ "hasInstallScript": true,
372
+ "license": "MIT",
373
+ "dependencies": {
374
+ "node-addon-api": "^8.3.0",
375
+ "node-gyp-build": "^4.8.4"
376
+ },
377
+ "peerDependencies": {
378
+ "tree-sitter": "^0.22.4"
379
+ },
380
+ "peerDependenciesMeta": {
381
+ "tree-sitter": {
382
+ "optional": true
383
+ }
384
+ }
385
+ },
386
+ "node_modules/tree-sitter-perl": {
387
+ "version": "2.0.0",
388
+ "resolved": "https://registry.npmjs.org/tree-sitter-perl/-/tree-sitter-perl-2.0.0.tgz",
389
+ "integrity": "sha512-sKZfFIvw5S18UHHAMe7rRpuZzzkLxaeslmZeflPlFKLfKAWCT8XAIqu/IBWzWR5phkMTZM3DxqOxX2IXC51SdA==",
390
+ "hasInstallScript": true,
391
+ "license": "MIT",
392
+ "dependencies": {
393
+ "node-addon-api": "^8.3.0",
394
+ "node-gyp-build": "^4.8.4"
395
+ },
396
+ "engines": {
397
+ "node": ">= 20.0.0"
398
+ },
399
+ "peerDependencies": {
400
+ "tree-sitter": ">=0.25.0"
401
+ },
402
+ "peerDependenciesMeta": {
403
+ "tree-sitter": {
404
+ "optional": true
405
+ }
406
+ }
407
+ },
408
+ "node_modules/tree-sitter-php": {
409
+ "version": "0.24.2",
410
+ "resolved": "https://registry.npmjs.org/tree-sitter-php/-/tree-sitter-php-0.24.2.tgz",
411
+ "integrity": "sha512-zwgAePc/HozNaWOOfwRAA+3p8yhuehRw8Fb7vn5qd2XjiIc93uJPryDTMYTSjBRjVIUg/KY6pM3rRzs8dSwKfw==",
412
+ "hasInstallScript": true,
413
+ "license": "MIT",
414
+ "dependencies": {
415
+ "node-addon-api": "^8.2.2",
416
+ "node-gyp-build": "^4.8.2"
417
+ },
418
+ "peerDependencies": {
419
+ "tree-sitter": "^0.22.4"
420
+ },
421
+ "peerDependenciesMeta": {
422
+ "tree-sitter": {
423
+ "optional": true
424
+ }
425
+ }
426
+ },
427
+ "node_modules/tree-sitter-python": {
428
+ "version": "0.25.0",
429
+ "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.25.0.tgz",
430
+ "integrity": "sha512-eCmJx6zQa35GxaCtQD+wXHOhYqBxEL+bp71W/s3fcDMu06MrtzkVXR437dRrCrbrDbyLuUDJpAgycs7ncngLXw==",
431
+ "hasInstallScript": true,
432
+ "license": "MIT",
433
+ "dependencies": {
434
+ "node-addon-api": "^8.5.0",
435
+ "node-gyp-build": "^4.8.4"
436
+ },
437
+ "peerDependencies": {
438
+ "tree-sitter": "^0.25.0"
439
+ },
440
+ "peerDependenciesMeta": {
441
+ "tree-sitter": {
442
+ "optional": true
443
+ }
444
+ }
445
+ },
446
+ "node_modules/tree-sitter-ruby": {
447
+ "version": "0.23.1",
448
+ "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.23.1.tgz",
449
+ "integrity": "sha512-d9/RXgWjR6HanN7wTYhS5bpBQLz1VkH048Vm3CodPGyJVnamXMGb8oEhDypVCBq4QnHui9sTXuJBBP3WtCw5RA==",
450
+ "hasInstallScript": true,
451
+ "license": "MIT",
452
+ "dependencies": {
453
+ "node-addon-api": "^8.2.2",
454
+ "node-gyp-build": "^4.8.2"
455
+ },
456
+ "peerDependencies": {
457
+ "tree-sitter": "^0.21.1"
458
+ },
459
+ "peerDependenciesMeta": {
460
+ "tree-sitter": {
461
+ "optional": true
462
+ }
463
+ }
464
+ },
465
+ "node_modules/tree-sitter-rust": {
466
+ "version": "0.24.0",
467
+ "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.24.0.tgz",
468
+ "integrity": "sha512-NWemUDf629Tfc90Y0Z55zuwPCAHkLxWnMf2RznYu4iBkkrQl2o/CHGB7Cr52TyN5F1DAx8FmUnDtCy9iUkXZEQ==",
469
+ "hasInstallScript": true,
470
+ "license": "MIT",
471
+ "dependencies": {
472
+ "node-addon-api": "^8.2.2",
473
+ "node-gyp-build": "^4.8.4"
474
+ },
475
+ "peerDependencies": {
476
+ "tree-sitter": "^0.22.1"
477
+ },
478
+ "peerDependenciesMeta": {
479
+ "tree-sitter": {
480
+ "optional": true
481
+ }
482
+ }
483
+ },
484
+ "node_modules/tree-sitter-scala": {
485
+ "version": "0.24.0",
486
+ "resolved": "https://registry.npmjs.org/tree-sitter-scala/-/tree-sitter-scala-0.24.0.tgz",
487
+ "integrity": "sha512-vkMuAUrBZ1zZz2XcGDQk18Kz73JkpgaeXzbNVobPke0G35sd9jH32aUxG6OLRKM7et0TbsfqkWf4DeJoGk4K1g==",
488
+ "hasInstallScript": true,
489
+ "license": "MIT",
490
+ "dependencies": {
491
+ "node-addon-api": "^8.2.2",
492
+ "node-gyp-build": "^4.8.2"
493
+ },
494
+ "peerDependencies": {
495
+ "tree-sitter": "^0.21.1"
496
+ },
497
+ "peerDependenciesMeta": {
498
+ "tree-sitter": {
499
+ "optional": true
500
+ }
501
+ }
502
+ },
503
+ "node_modules/tree-sitter-solidity": {
504
+ "version": "1.2.13",
505
+ "resolved": "https://registry.npmjs.org/tree-sitter-solidity/-/tree-sitter-solidity-1.2.13.tgz",
506
+ "integrity": "sha512-nO2AbcAuz2Qba8JnPNe/3FVjRRvGY3ApxSJ8UPIzfynJm4PYCMbBoXxxbprvMgjCbGYR/ZrHGIPKzXV7zBa+lQ==",
507
+ "hasInstallScript": true,
508
+ "license": "MIT",
509
+ "dependencies": {
510
+ "node-addon-api": "^8.2.2",
511
+ "node-gyp-build": "^4.8.2",
512
+ "yarn": "^1.22.21"
513
+ },
514
+ "peerDependencies": {
515
+ "tree-sitter": "^0.25.0"
516
+ },
517
+ "peerDependenciesMeta": {
518
+ "tree_sitter": {
519
+ "optional": true
520
+ }
521
+ }
522
+ },
523
+ "node_modules/tree-sitter-swift": {
524
+ "version": "0.7.1",
525
+ "resolved": "https://registry.npmjs.org/tree-sitter-swift/-/tree-sitter-swift-0.7.1.tgz",
526
+ "integrity": "sha512-pneKVTuGamaBsqqqfB9BvNQjktzh/0IVPR54jLB5Fq/JTDQwYHd0Wo6pVyZ5jAYpbztzq+rJ/rpL9ruxTmSoKw==",
527
+ "hasInstallScript": true,
528
+ "license": "MIT",
529
+ "dependencies": {
530
+ "node-addon-api": "^8.0.0",
531
+ "node-gyp-build": "^4.8.0",
532
+ "tree-sitter-cli": "^0.23",
533
+ "which": "2.0.2"
534
+ },
535
+ "peerDependencies": {
536
+ "tree-sitter": "^0.22.1"
537
+ },
538
+ "peerDependenciesMeta": {
539
+ "tree_sitter": {
540
+ "optional": true
541
+ }
542
+ }
543
+ },
544
+ "node_modules/which": {
545
+ "version": "2.0.2",
546
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
547
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
548
+ "license": "ISC",
549
+ "dependencies": {
550
+ "isexe": "^2.0.0"
551
+ },
552
+ "bin": {
553
+ "node-which": "bin/node-which"
554
+ },
555
+ "engines": {
556
+ "node": ">= 8"
557
+ }
558
+ },
559
+ "node_modules/yarn": {
560
+ "version": "1.22.22",
561
+ "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz",
562
+ "integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==",
563
+ "hasInstallScript": true,
564
+ "license": "BSD-2-Clause",
565
+ "bin": {
566
+ "yarn": "bin/yarn.js",
567
+ "yarnpkg": "bin/yarn.js"
568
+ },
569
+ "engines": {
570
+ "node": ">=4.0.0"
571
+ }
572
+ }
573
+ }
574
+ };
@@ -10,16 +10,39 @@ export type GrammarModule = {
10
10
  };
11
11
  /** Runtime grammar handle passed to `parser.setLanguage`. */
12
12
  export type GrammarLanguage = GrammarModule;
13
- /** On-disk cache of npm-installed tree-sitter grammar packages. */
13
+ /**
14
+ * Where `diffninja grammars install` puts the pinned grammars. Private to
15
+ * diffninja: the shared calldiff cache holds whatever an unpinned install once
16
+ * fetched, and is never read.
17
+ */
14
18
  export declare function grammarCacheDir(): string;
15
19
  /**
16
- * The cache's own package.json, which also allows the grammar's install
17
- * script: npm 12 blocks dependency install scripts unless `allowScripts`
18
- * names them, and rejects `--allow-scripts` in a project install like this
19
- * one. Earlier npm ignores the field. A cache written before this keeps its
20
- * other fields and gains the entry.
20
+ * Why grammars in this directory must not be loaded, or undefined when it is safe to.
21
+ * It must belong to the user running diffninja and be writable by no one else. A missing
22
+ * directory is no problem, since there is nothing in it to trust. Windows has no uid or mode bits,
23
+ * so nothing is checked there.
24
+ */
25
+ export declare function cacheDirectoryProblem(dir: string): string | undefined;
26
+ /** The exact version diffninja pins for a grammar package, or undefined when it is not one of them. */
27
+ export declare function pinnedVersion(npmPackage: string): string | undefined;
28
+ /** Fingerprint of the lock this build of diffninja installs from. */
29
+ export declare function grammarLockDigest(): string;
30
+ /**
31
+ * The command that installs these grammars where this diffninja reads them. It names this
32
+ * version, because a cache is read only by a diffninja with the same lock, and `@latest` or
33
+ * whatever `diffninja` is on PATH may have another. Kotlin and Perl need `--build`.
21
34
  */
22
- export declare function ensureCachePackageJson(cacheDir: string, npmPackage: string): void;
35
+ export declare function grammarsInstallCommand(npmPackages: readonly string[]): string;
36
+ /**
37
+ * A grammar this review needed is not installed. diffninja never downloads code
38
+ * while it reviews; the person installs the pinned set once, on purpose.
39
+ */
40
+ export declare class GrammarNotInstalledError extends Error {
41
+ readonly npmPackage: string;
42
+ constructor(npmPackage: string);
43
+ }
44
+ /** The grammars that were needed and absent since the last call, sorted; clears the record. */
45
+ export declare function takeMissingGrammars(): string[];
23
46
  /**
24
47
  * Absolute path to one of npm's JS entry points (`npm-cli.js`, `npx-cli.js`),
25
48
  * or undefined when npm is not installed beside Node.
@@ -41,9 +64,46 @@ export declare function npmSpawnSpec(args: string[], platform?: NodeJS.Platform)
41
64
  * Exported for tests and diagnostics.
42
65
  */
43
66
  export declare function mislabeledPrebuild(packageRoot: string): string | null;
67
+ /** Runs npm in `cwd`; replaced in tests. Throws with npm's own message when it fails. */
68
+ export type NpmRunner = (cwd: string, args: string[]) => void;
69
+ export interface InstalledGrammars {
70
+ cacheDir: string;
71
+ packages: Array<{
72
+ name: string;
73
+ version: string;
74
+ }>;
75
+ }
76
+ /**
77
+ * Install exactly the pinned grammars, and nothing else, into the cache. This is
78
+ * the only place diffninja downloads grammar code, and only when a person runs
79
+ * `diffninja grammars install`. `npm ci` from the shipped lock refuses any
80
+ * tarball whose sha512 differs, `--ignore-scripts` keeps every install script
81
+ * (the packages' own and their dependencies') from running, and the grammars
82
+ * load from their bundled prebuilt binaries. Reviews never call this.
83
+ */
84
+ export declare function installPinnedGrammars(options?: {
85
+ cacheDir?: string;
86
+ runNpm?: NpmRunner;
87
+ build?: boolean;
88
+ }): InstalledGrammars;
89
+ export interface GrammarStatus {
90
+ cacheDir: string;
91
+ /** The cache was installed by this diffninja's lock, so its grammars are used. */
92
+ trusted: boolean;
93
+ packages: Array<{
94
+ name: string;
95
+ version: string;
96
+ installed: boolean;
97
+ needsBuild: boolean;
98
+ }>;
99
+ }
100
+ export declare function grammarStatus(cacheDir?: string): GrammarStatus;
44
101
  /**
45
- * Install an npm grammar package into the shared cache if missing, then require it.
46
- * Reuses the cache across CLI invocations.
102
+ * The grammar package's module. Bundled grammars come from diffninja's own
103
+ * dependencies; every other one from the cache `diffninja grammars install`
104
+ * filled, and only when that cache holds the exact pinned version. Nothing is
105
+ * ever downloaded here: a missing grammar throws GrammarNotInstalledError, which
106
+ * call-flow analysis reports once instead of skipping silently.
47
107
  */
48
108
  export declare function loadGrammarPackage(npmPackage: string): GrammarModule;
49
109
  /** Resolve the value to pass to parser.setLanguage. */