@hominis/fireforge 0.50.0 → 0.52.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 (212) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/build-info.json +4 -4
  3. package/dist/src/commands/check-report.d.ts +17 -4
  4. package/dist/src/commands/check-report.js +19 -6
  5. package/dist/src/commands/check-run.d.ts +5 -0
  6. package/dist/src/commands/check-run.js +9 -1
  7. package/dist/src/commands/check-steps.d.ts +8 -0
  8. package/dist/src/commands/check-steps.js +31 -6
  9. package/dist/src/commands/check.js +1 -1
  10. package/dist/src/commands/declarations-report.d.ts +43 -0
  11. package/dist/src/commands/declarations-report.js +76 -0
  12. package/dist/src/commands/export-placement-gate.js +8 -0
  13. package/dist/src/commands/furnace/rename-registrations.js +7 -2
  14. package/dist/src/commands/furnace/validate.js +26 -1
  15. package/dist/src/commands/lint-per-patch.js +6 -2
  16. package/dist/src/commands/lint-per-run-checkjs.js +2 -2
  17. package/dist/src/commands/lint-report.js +7 -2
  18. package/dist/src/commands/manifest.js +2 -0
  19. package/dist/src/commands/park.d.ts +22 -0
  20. package/dist/src/commands/park.js +232 -0
  21. package/dist/src/commands/patch/delete.js +11 -6
  22. package/dist/src/commands/patch/index.d.ts +3 -3
  23. package/dist/src/commands/patch/index.js +8 -4
  24. package/dist/src/commands/patch/lint-ignore-from.d.ts +44 -0
  25. package/dist/src/commands/patch/lint-ignore-from.js +142 -0
  26. package/dist/src/commands/patch/lint-ignore.js +39 -29
  27. package/dist/src/commands/patch/move-files-create.js +11 -4
  28. package/dist/src/commands/patch/move-files-into.js +10 -4
  29. package/dist/src/commands/patch/move-files.js +3 -1
  30. package/dist/src/commands/patch/removal-created-files.d.ts +48 -0
  31. package/dist/src/commands/patch/removal-created-files.js +83 -0
  32. package/dist/src/commands/patch/rename.js +15 -3
  33. package/dist/src/commands/patch/reserve.d.ts +33 -0
  34. package/dist/src/commands/patch/reserve.js +152 -0
  35. package/dist/src/commands/patch/retire.js +11 -6
  36. package/dist/src/commands/patch/split-plan.d.ts +10 -1
  37. package/dist/src/commands/patch/split-plan.js +16 -1
  38. package/dist/src/commands/patch/split.js +14 -5
  39. package/dist/src/commands/patch/stage.d.ts +34 -0
  40. package/dist/src/commands/patch/stage.js +153 -0
  41. package/dist/src/commands/patch/staged-dependency-remove.d.ts +31 -0
  42. package/dist/src/commands/patch/staged-dependency-remove.js +80 -0
  43. package/dist/src/commands/patch/staged-dependency.js +40 -98
  44. package/dist/src/commands/re-export-adjacent.d.ts +5 -0
  45. package/dist/src/commands/re-export-adjacent.js +4 -3
  46. package/dist/src/commands/re-export-bulk-scan.d.ts +2 -1
  47. package/dist/src/commands/re-export-bulk-scan.js +22 -7
  48. package/dist/src/commands/re-export-hunks.d.ts +35 -0
  49. package/dist/src/commands/re-export-hunks.js +220 -0
  50. package/dist/src/commands/re-export-options.js +29 -2
  51. package/dist/src/commands/re-export-purity-scope.d.ts +18 -0
  52. package/dist/src/commands/re-export-purity-scope.js +131 -0
  53. package/dist/src/commands/re-export-register.js +15 -1
  54. package/dist/src/commands/re-export-removed.d.ts +1 -1
  55. package/dist/src/commands/re-export-removed.js +17 -2
  56. package/dist/src/commands/re-export-scan.d.ts +2 -0
  57. package/dist/src/commands/re-export-scan.js +4 -1
  58. package/dist/src/commands/re-export-single.js +102 -42
  59. package/dist/src/commands/re-export-stale-registrations.d.ts +18 -0
  60. package/dist/src/commands/re-export-stale-registrations.js +62 -0
  61. package/dist/src/commands/re-export.js +35 -34
  62. package/dist/src/commands/status-output.js +5 -1
  63. package/dist/src/commands/test-build-furnace.d.ts +3 -2
  64. package/dist/src/commands/test-build-furnace.js +8 -2
  65. package/dist/src/commands/test-build-phase.d.ts +2 -0
  66. package/dist/src/commands/test-build-phase.js +34 -17
  67. package/dist/src/commands/test-checkjs.js +3 -2
  68. package/dist/src/commands/test-dispatch.d.ts +39 -0
  69. package/dist/src/commands/test-dispatch.js +220 -0
  70. package/dist/src/commands/test-furnace-reach.d.ts +37 -0
  71. package/dist/src/commands/test-furnace-reach.js +132 -0
  72. package/dist/src/commands/test-orchestrate.d.ts +14 -0
  73. package/dist/src/commands/test-orchestrate.js +25 -4
  74. package/dist/src/commands/test-perf-scope.d.ts +21 -0
  75. package/dist/src/commands/test-perf-scope.js +55 -0
  76. package/dist/src/commands/test-prelock.js +100 -4
  77. package/dist/src/commands/test-register.js +18 -3
  78. package/dist/src/commands/test-results.d.ts +62 -0
  79. package/dist/src/commands/test-results.js +62 -0
  80. package/dist/src/commands/test-run.d.ts +13 -55
  81. package/dist/src/commands/test-run.js +73 -101
  82. package/dist/src/commands/test-shards.d.ts +110 -0
  83. package/dist/src/commands/test-shards.js +255 -0
  84. package/dist/src/commands/test-stale-gate.d.ts +5 -1
  85. package/dist/src/commands/test-stale-gate.js +11 -2
  86. package/dist/src/commands/test-verdict.d.ts +2 -1
  87. package/dist/src/commands/test.d.ts +1 -1
  88. package/dist/src/commands/test.js +68 -75
  89. package/dist/src/commands/token-lint.js +48 -8
  90. package/dist/src/commands/verify.js +9 -2
  91. package/dist/src/core/build-baseline-types.d.ts +13 -0
  92. package/dist/src/core/build-baseline-validate.js +9 -0
  93. package/dist/src/core/build-baseline.js +7 -0
  94. package/dist/src/core/build-prepare.d.ts +6 -0
  95. package/dist/src/core/build-prepare.js +29 -3
  96. package/dist/src/core/config-paths.d.ts +1 -1
  97. package/dist/src/core/config-paths.js +2 -0
  98. package/dist/src/core/config-validate-check.js +83 -7
  99. package/dist/src/core/config-validate-test-toolchains.js +14 -0
  100. package/dist/src/core/config-validate-token-scales.d.ts +3 -0
  101. package/dist/src/core/config-validate-token-scales.js +47 -5
  102. package/dist/src/core/config-validate.js +6 -0
  103. package/dist/src/core/coverage-extend.js +2 -2
  104. package/dist/src/core/coverage-records.d.ts +11 -0
  105. package/dist/src/core/coverage-records.js +34 -0
  106. package/dist/src/core/engine-session-lock.d.ts +6 -0
  107. package/dist/src/core/engine-session-lock.js +10 -2
  108. package/dist/src/core/file-lock-shared.d.ts +57 -0
  109. package/dist/src/core/file-lock-shared.js +117 -0
  110. package/dist/src/core/file-lock.d.ts +9 -0
  111. package/dist/src/core/file-lock.js +58 -2
  112. package/dist/src/core/furnace-apply.js +10 -10
  113. package/dist/src/core/furnace-config-validate-exceptions.d.ts +11 -3
  114. package/dist/src/core/furnace-config-validate-exceptions.js +59 -8
  115. package/dist/src/core/furnace-config-validate.js +7 -1
  116. package/dist/src/core/furnace-registration-jar-inplace.d.ts +12 -0
  117. package/dist/src/core/furnace-registration-jar-inplace.js +80 -0
  118. package/dist/src/core/furnace-validate-accessibility.d.ts +5 -3
  119. package/dist/src/core/furnace-validate-accessibility.js +75 -30
  120. package/dist/src/core/furnace-validate-exceptions.d.ts +13 -4
  121. package/dist/src/core/furnace-validate-exceptions.js +59 -4
  122. package/dist/src/core/furnace-validate-icon-button.js +30 -1
  123. package/dist/src/core/history-log-file.js +8 -1
  124. package/dist/src/core/line-prefixer.d.ts +18 -0
  125. package/dist/src/core/line-prefixer.js +34 -0
  126. package/dist/src/core/mach.d.ts +7 -0
  127. package/dist/src/core/mach.js +24 -9
  128. package/dist/src/core/module-resolution-preflight.d.ts +19 -3
  129. package/dist/src/core/module-resolution-preflight.js +24 -6
  130. package/dist/src/core/negative-control-compiled.d.ts +36 -0
  131. package/dist/src/core/negative-control-compiled.js +87 -0
  132. package/dist/src/core/negative-control-diff.d.ts +14 -2
  133. package/dist/src/core/negative-control-diff.js +49 -6
  134. package/dist/src/core/negative-control.d.ts +12 -0
  135. package/dist/src/core/negative-control.js +48 -5
  136. package/dist/src/core/park-store.d.ts +63 -0
  137. package/dist/src/core/park-store.js +216 -0
  138. package/dist/src/core/patch-export-update.d.ts +4 -0
  139. package/dist/src/core/patch-export-update.js +12 -3
  140. package/dist/src/core/patch-export.d.ts +3 -2
  141. package/dist/src/core/patch-export.js +21 -14
  142. package/dist/src/core/patch-files.js +26 -8
  143. package/dist/src/core/patch-lint-checkjs-any-import.d.ts +6 -4
  144. package/dist/src/core/patch-lint-checkjs-any-import.js +9 -7
  145. package/dist/src/core/patch-lint-checkjs-diagnostics.d.ts +17 -0
  146. package/dist/src/core/patch-lint-checkjs-diagnostics.js +32 -0
  147. package/dist/src/core/patch-lint-checkjs.d.ts +10 -1
  148. package/dist/src/core/patch-lint-checkjs.js +13 -3
  149. package/dist/src/core/patch-lint-cross.d.ts +3 -1
  150. package/dist/src/core/patch-lint-cross.js +5 -0
  151. package/dist/src/core/patch-lint-css.js +14 -10
  152. package/dist/src/core/patch-lint-forward-registration-extended.d.ts +5 -0
  153. package/dist/src/core/patch-lint-forward-registration-extended.js +1 -1
  154. package/dist/src/core/patch-lint-ignore.d.ts +56 -12
  155. package/dist/src/core/patch-lint-ignore.js +173 -43
  156. package/dist/src/core/patch-lint-ownership.d.ts +10 -0
  157. package/dist/src/core/patch-lint-ownership.js +26 -0
  158. package/dist/src/core/patch-lint-size.js +9 -1
  159. package/dist/src/core/patch-lint-token-scale.d.ts +26 -8
  160. package/dist/src/core/patch-lint-token-scale.js +206 -29
  161. package/dist/src/core/patch-lint.js +2 -2
  162. package/dist/src/core/patch-manifest-io.js +8 -1
  163. package/dist/src/core/patch-manifest-key-order.d.ts +24 -0
  164. package/dist/src/core/patch-manifest-key-order.js +61 -0
  165. package/dist/src/core/patch-manifest-stage.d.ts +46 -0
  166. package/dist/src/core/patch-manifest-stage.js +96 -0
  167. package/dist/src/core/patch-manifest-validate.js +27 -1
  168. package/dist/src/core/patch-order-legal.d.ts +2 -1
  169. package/dist/src/core/patch-order-legal.js +7 -2
  170. package/dist/src/core/patch-policy.d.ts +6 -2
  171. package/dist/src/core/patch-policy.js +14 -7
  172. package/dist/src/core/patch-retired.d.ts +26 -4
  173. package/dist/src/core/patch-retired.js +40 -2
  174. package/dist/src/core/run-log.d.ts +6 -0
  175. package/dist/src/core/run-log.js +17 -1
  176. package/dist/src/core/test-harness-crash.d.ts +2 -1
  177. package/dist/src/core/test-harness-crash.js +5 -8
  178. package/dist/src/core/test-harness-signature.d.ts +16 -0
  179. package/dist/src/core/test-harness-signature.js +19 -1
  180. package/dist/src/core/test-raw-log.d.ts +66 -0
  181. package/dist/src/core/test-raw-log.js +122 -0
  182. package/dist/src/core/test-run-completeness.d.ts +47 -7
  183. package/dist/src/core/test-run-completeness.js +70 -23
  184. package/dist/src/core/test-stale-check.d.ts +10 -1
  185. package/dist/src/core/test-stale-check.js +15 -1
  186. package/dist/src/core/test-xpcshell-retry.d.ts +2 -0
  187. package/dist/src/core/test-xpcshell-retry.js +2 -1
  188. package/dist/src/core/token-lint.d.ts +5 -2
  189. package/dist/src/core/token-lint.js +8 -3
  190. package/dist/src/core/token-sibling-sheets.d.ts +46 -0
  191. package/dist/src/core/token-sibling-sheets.js +119 -0
  192. package/dist/src/core/tree-guard.js +2 -0
  193. package/dist/src/core/typecheck-shim.d.ts +6 -1
  194. package/dist/src/core/typecheck-shim.js +139 -2
  195. package/dist/src/core/typecheck.js +3 -1
  196. package/dist/src/index.d.ts +9 -3
  197. package/dist/src/index.js +4 -1
  198. package/dist/src/types/commands/index.d.ts +2 -2
  199. package/dist/src/types/commands/options.d.ts +68 -7
  200. package/dist/src/types/commands/patches.d.ts +43 -0
  201. package/dist/src/types/config.d.ts +74 -2
  202. package/dist/src/types/furnace.d.ts +29 -0
  203. package/dist/src/types/index.d.ts +1 -1
  204. package/dist/src/utils/options.d.ts +3 -2
  205. package/dist/src/utils/options.js +9 -4
  206. package/docs/configuration.md +110 -9
  207. package/docs/furnace.md +61 -1
  208. package/docs/lifecycle-invariants.md +13 -11
  209. package/docs/machine-output.md +68 -18
  210. package/docs/patch-workflow.md +174 -13
  211. package/docs/testing.md +89 -5
  212. package/package.json +3 -3
package/docs/testing.md CHANGED
@@ -107,6 +107,25 @@ read from the objdir, not from `engine/`, so a control on it stays green
107
107
  and reports `missed`: that result is the signal to target the file the
108
108
  browser actually loads.
109
109
 
110
+ A control on compiled source (C/C++, Rust, IDL, WebIDL, IPDL or YAML that no
111
+ install manifest ships) can only reach the binary through a build. Without
112
+ `--build` it is refused before the lock. With `--build` it is applied before
113
+ the pre-test build, so the binary under test carries it, stays applied for
114
+ every `--repeat` run, and is restored with a fresh mtime so the next build
115
+ recompiles the original. Since 0.52.0 that pre-test build is a full
116
+ `mach build`, with a notice naming the control's files: the default
117
+ `mach build faster` compiles nothing, so before, the control still tested
118
+ the previous binary and reported `missed`. The verdict adds
119
+ `control-build=compiled`. A
120
+ build-less control whose packaging is not current is refused before the
121
+ lock with the advice to add `--build`, instead of ending `inconclusive`
122
+ after a full queue.
123
+
124
+ Besides `git diff` output, a control may be a plain unified diff
125
+ (`diff -u`, no `diff --git` lines; the path comes from `---`/`+++`) or a
126
+ `git diff --no-index <engine file> <edited copy>`: when the new side names a
127
+ copy outside `engine/` and `components/`, the control targets the old side.
128
+
110
129
  ### The restore safety model
111
130
 
112
131
  - **Only under the lock.** Apply, run and restore all happen inside the
@@ -194,13 +213,22 @@ earlier path whose own inputs and `engine/mozconfig` are unchanged, whatever
194
213
  moved elsewhere in the engine, including a peer's edits and an engine HEAD
195
214
  move that touches none of them. A path whose inputs changed is dropped and
196
215
  named, with the inputs that changed. Changed inputs this build restages are
197
- allowed.
216
+ allowed, and a scoped build of one file restages that file's test manifest
217
+ too: a manifest that gained an entry for the new file no longer drops the
218
+ claims of its sibling files. A build-less run's packaging gates also run
219
+ before the lock is requested, so a `coverage-replaced` or `stale-build`
220
+ refusal arrives before the run queues.
198
221
 
199
222
  A scoped build after a full build keeps the claim full while nothing outside
200
223
  its scope moved. Otherwise it carries the full build's anchor forward, and a
201
224
  later build-less run over any path stays covered while that path's own
202
225
  staging inputs are unchanged since the full build. A refusal names the inputs
203
- that did change.
226
+ that did change, and since 0.52.0 who wrote the coverage record: its
227
+ invocation, when, and the writing process's pid (marked `still running`
228
+ while it is), `FIREFORGE_SESSION_ID` and invocation id, the id its history
229
+ records carry. `status --test-coverage` shows the pid and session too. A
230
+ peer whose run a scoped build or a test-file edit refused can tell whose
231
+ build to wait for.
204
232
 
205
233
  `--extend-coverage` remains accepted. Retention is now the default, so the
206
234
  flag only turns a drop into a refusal before the build. Before 0.50.0 a
@@ -221,6 +249,15 @@ packages `engine/` as it stands, for example for a before-capture, names the
221
249
  components with undeployed edits it left out, and stamps
222
250
  `furnace-apply=skipped`.
223
251
 
252
+ On a shared engine a peer's default `test --build` deploys every session's
253
+ undeployed component edits. `--furnace-apply reached` (or
254
+ `test.furnaceApply: "reached"`) deploys only the components a requested test
255
+ reaches: the test path, the test file, a `head*.js` beside it, or any test
256
+ file under a requested directory names the component. The rest are named in
257
+ a notice and stamped `furnace-skipped=<names>`. A path-less build reaches
258
+ every component. `--furnace-apply none` is `--no-furnace-apply`; `all` is the
259
+ default.
260
+
224
261
  When `patchLint.checkJs` and `patchLint.checkJsTestFiles` are enabled, named
225
262
  pre-test builds check the selected test scripts before deployment or mach.
226
263
  This includes new scripts not yet owned by an exported patch. The check runs
@@ -247,7 +284,7 @@ launchd-parented app remains unattributed and is not automatically killed.
247
284
  `test --wait-browser [seconds]` waits for this objdir's browser to exit;
248
285
  `test --wait-port [seconds]` waits for mochitest and Marionette listeners.
249
286
  `build --wait-browser [seconds]` queues a full or UI build behind the browser.
250
- Bare flags wait 60 seconds; explicit values accept 1–3600 seconds. They are
287
+ Bare flags wait 60 seconds; explicit values accept 1–86400 seconds. They are
251
288
  independent of the FireForge lock budget, and they are spent BEFORE the
252
289
  engine session lock is requested, so a run waiting out a browser or a port
253
290
  does not hold every peer's build, test and re-export behind it. The run then
@@ -433,9 +470,16 @@ group sweep.
433
470
  Every test run ends with one machine-readable line:
434
471
 
435
472
  ```
436
- FIREFORGE-VERDICT: PASS|FAIL reason=… [note=<class>] [started=<n>/<m> first-unstarted=<path>] [runs=<p>/<n>] [control=<outcome>] [shuffle=<seed>] [orphans-reaped=<n>] [furnace-applied=<names>|furnace-apply=skipped] [log=<path>]
473
+ FIREFORGE-VERDICT: PASS|FAIL reason=… [note=<class>] [started=<n>/<m> first-unstarted=<path> started-source=<src>] [shards=<p>/<t> [failed-shards=<labels>]] [runs=<p>/<n>] [control=<outcome>] [shuffle=<seed>] [orphans-reaped=<n>] [furnace-applied=<names>|furnace-apply=skipped] [furnace-skipped=<names>] [jobs=<n>] [lock=shared] [results=<path>] [log=<path>]
437
474
  ```
438
475
 
476
+ The start count reads every line the harness printed, not the last 2 MB of
477
+ captured output: a suite printing more than that (a large browser directory,
478
+ or any run under `--full-output`) used to report files that ran and passed
479
+ as never started. `started-source=` names the evidence. A sharded run also
480
+ prints a `FIREFORGE-SHARD:` line per shard and names the shards that did not
481
+ pass as `failed-shards=`; see [`machine-output.md`](machine-output.md).
482
+
439
483
  A run is never `PASS` when its summary reports unexpected results, when the
440
484
  harness printed "Application shut down (without crashing) in the middle of a
441
485
  test", or when a requested test file never produced a start (or skip)
@@ -528,7 +572,47 @@ The two phases handle it differently, on purpose:
528
572
 
529
573
  A test run holds the engine-session lock and snapshots the engine git
530
574
  generation before and after the harness run, failing the verdict as invalid
531
- if the tree changed mid-run. The checks that need no lock run before it is
575
+ if the tree changed mid-run in a way the running browser can see: a file the
576
+ objdir links to its source, a file staged at dispatch, or a test file or
577
+ staging input of the run. A peer's edit to anything else (a compiled source,
578
+ a copied file, an unrelated test) leaves the verdict standing with a warning
579
+ and `drift-tolerated=<n>`; the next run's stale-build gate judges whether it
580
+ needs a rebuild.
581
+
582
+ `--shared-lock` (or `test.lockMode: "shared"`) holds the lock shared for a
583
+ build-less run that applies no negative control and uses auto ports, so
584
+ several such runs on one objdir overlap. Anything that writes (a build, a
585
+ re-export, a `test --build`) still holds the lock alone: it waits for shared
586
+ holders to finish, and new shared holders queue behind it.
587
+ `status --lock` counts shared holders. Orphan reaping only touches helpers
588
+ whose parent died, so overlapping runs do not reap each other's live
589
+ helpers.
590
+
591
+ `--jobs <n>` runs a request's shards on n harness instances inside one lock
592
+ hold. Each instance has its own profile and its own Marionette port, and
593
+ auto ports (required) move each instance's mochitest server ports; output
594
+ lines carry a `[job <i>]` prefix in the terminal and the run log. Since
595
+ 0.52.0 each instance also writes its own mochitest test list
596
+ (`--testrun-manifest-file`): on the harness's shared default
597
+ `_tests/testing/mochitest/tests.json`, the second instance ran the first
598
+ shard's file and passed, or found none. A `--jobs` run always reads each
599
+ dispatch's mozlog raw log, and a dispatch whose raw log starts none of its
600
+ requested files fails with `started=0/<m>` instead of passing on another
601
+ shard's results. With `--no-shard`, or a single directory argument, the
602
+ files are split in order into n contiguous chunks. Parallel browsers raise
603
+ host load, so measure before relying on it.
604
+
605
+ `--shard-size <n>` dispatches n files per mach invocation (mochitest restarts
606
+ the browser between files), paying the harness start once per chunk instead
607
+ of once per file, and judges each file from mozlog's structured log:
608
+ `shards=` then counts files and `failed-shards=` names failed files.
609
+
610
+ `--results <path>` writes one JSON record per test file and `--repeat` run
611
+ (status, expected status, duration, unexpected subtests, the shard, and the
612
+ run-log line where the dispatch began) from mozlog's structured log, which
613
+ each dispatch then writes with `--log-raw`, and names it on the verdict as
614
+ `results=<path>`. A `--log-raw <file>` already forwarded with `--mach-arg` is
615
+ read instead. The checks that need no lock run before it is
532
616
  requested: the launchable binary, the named-file checkJs pass, and the
533
617
  `--wait-browser`/`--wait-port` budgets. The run log is open from the start,
534
618
  so a `reason=lock-timeout` line carries `log=` too.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hominis/fireforge",
3
- "version": "0.50.0",
3
+ "version": "0.52.0",
4
4
  "description": "FireForge — a build tool for customizing Firefox",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -76,9 +76,9 @@
76
76
  "eslint-plugin-simple-import-sort": "^14.0.0",
77
77
  "fast-check": "^4.6.0",
78
78
  "husky": "^9.1.7",
79
- "knip": "6.39.0",
79
+ "knip": "6.41.0",
80
80
  "lint-staged": "^17.0.4",
81
- "prettier": "3.9.9",
81
+ "prettier": "3.9.10",
82
82
  "tsx": "^4.7.0",
83
83
  "typescript": "~6.0.0",
84
84
  "typescript-eslint": "^8.0.0",