@hominis/fireforge 0.50.0 → 0.51.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.
- package/CHANGELOG.md +47 -0
- package/dist/build-info.json +4 -4
- package/dist/src/commands/check-report.d.ts +17 -4
- package/dist/src/commands/check-report.js +19 -6
- package/dist/src/commands/check-run.d.ts +5 -0
- package/dist/src/commands/check-run.js +9 -1
- package/dist/src/commands/check-steps.d.ts +8 -0
- package/dist/src/commands/check-steps.js +31 -6
- package/dist/src/commands/check.js +1 -1
- package/dist/src/commands/declarations-report.d.ts +43 -0
- package/dist/src/commands/declarations-report.js +76 -0
- package/dist/src/commands/export-placement-gate.js +8 -0
- package/dist/src/commands/furnace/rename-registrations.js +7 -2
- package/dist/src/commands/furnace/validate.js +26 -1
- package/dist/src/commands/lint-per-patch.js +6 -2
- package/dist/src/commands/lint-per-run-checkjs.js +2 -2
- package/dist/src/commands/lint-report.js +7 -2
- package/dist/src/commands/manifest.js +2 -0
- package/dist/src/commands/park.d.ts +22 -0
- package/dist/src/commands/park.js +232 -0
- package/dist/src/commands/patch/delete.js +11 -6
- package/dist/src/commands/patch/index.d.ts +3 -3
- package/dist/src/commands/patch/index.js +8 -4
- package/dist/src/commands/patch/lint-ignore-from.d.ts +44 -0
- package/dist/src/commands/patch/lint-ignore-from.js +142 -0
- package/dist/src/commands/patch/lint-ignore.js +39 -29
- package/dist/src/commands/patch/move-files-create.js +11 -4
- package/dist/src/commands/patch/move-files-into.js +10 -4
- package/dist/src/commands/patch/move-files.js +3 -1
- package/dist/src/commands/patch/removal-created-files.d.ts +48 -0
- package/dist/src/commands/patch/removal-created-files.js +83 -0
- package/dist/src/commands/patch/rename.js +15 -3
- package/dist/src/commands/patch/reserve.d.ts +33 -0
- package/dist/src/commands/patch/reserve.js +152 -0
- package/dist/src/commands/patch/retire.js +11 -6
- package/dist/src/commands/patch/split-plan.d.ts +10 -1
- package/dist/src/commands/patch/split-plan.js +16 -1
- package/dist/src/commands/patch/split.js +14 -5
- package/dist/src/commands/patch/stage.d.ts +34 -0
- package/dist/src/commands/patch/stage.js +153 -0
- package/dist/src/commands/patch/staged-dependency-remove.d.ts +31 -0
- package/dist/src/commands/patch/staged-dependency-remove.js +80 -0
- package/dist/src/commands/patch/staged-dependency.js +40 -98
- package/dist/src/commands/re-export-adjacent.d.ts +5 -0
- package/dist/src/commands/re-export-adjacent.js +4 -3
- package/dist/src/commands/re-export-bulk-scan.d.ts +2 -1
- package/dist/src/commands/re-export-bulk-scan.js +22 -7
- package/dist/src/commands/re-export-hunks.d.ts +35 -0
- package/dist/src/commands/re-export-hunks.js +220 -0
- package/dist/src/commands/re-export-options.js +29 -2
- package/dist/src/commands/re-export-purity-scope.d.ts +18 -0
- package/dist/src/commands/re-export-purity-scope.js +131 -0
- package/dist/src/commands/re-export-register.js +15 -1
- package/dist/src/commands/re-export-removed.d.ts +1 -1
- package/dist/src/commands/re-export-removed.js +17 -2
- package/dist/src/commands/re-export-scan.d.ts +2 -0
- package/dist/src/commands/re-export-scan.js +4 -1
- package/dist/src/commands/re-export-single.js +102 -42
- package/dist/src/commands/re-export-stale-registrations.d.ts +18 -0
- package/dist/src/commands/re-export-stale-registrations.js +62 -0
- package/dist/src/commands/re-export.js +35 -34
- package/dist/src/commands/test-build-furnace.d.ts +3 -2
- package/dist/src/commands/test-build-furnace.js +8 -2
- package/dist/src/commands/test-build-phase.js +24 -7
- package/dist/src/commands/test-checkjs.js +3 -2
- package/dist/src/commands/test-dispatch.d.ts +39 -0
- package/dist/src/commands/test-dispatch.js +211 -0
- package/dist/src/commands/test-furnace-reach.d.ts +37 -0
- package/dist/src/commands/test-furnace-reach.js +132 -0
- package/dist/src/commands/test-orchestrate.d.ts +9 -0
- package/dist/src/commands/test-orchestrate.js +22 -4
- package/dist/src/commands/test-perf-scope.d.ts +21 -0
- package/dist/src/commands/test-perf-scope.js +55 -0
- package/dist/src/commands/test-prelock.js +100 -4
- package/dist/src/commands/test-register.js +18 -3
- package/dist/src/commands/test-results.d.ts +62 -0
- package/dist/src/commands/test-results.js +62 -0
- package/dist/src/commands/test-run.d.ts +13 -55
- package/dist/src/commands/test-run.js +73 -101
- package/dist/src/commands/test-shards.d.ts +110 -0
- package/dist/src/commands/test-shards.js +255 -0
- package/dist/src/commands/test-stale-gate.d.ts +5 -1
- package/dist/src/commands/test-stale-gate.js +4 -2
- package/dist/src/commands/test-verdict.d.ts +2 -1
- package/dist/src/commands/test.d.ts +1 -1
- package/dist/src/commands/test.js +65 -75
- package/dist/src/commands/token-lint.js +48 -8
- package/dist/src/commands/verify.js +9 -2
- package/dist/src/core/build-prepare.d.ts +6 -0
- package/dist/src/core/build-prepare.js +29 -3
- package/dist/src/core/config-paths.d.ts +1 -1
- package/dist/src/core/config-paths.js +2 -0
- package/dist/src/core/config-validate-check.js +83 -7
- package/dist/src/core/config-validate-test-toolchains.js +14 -0
- package/dist/src/core/config-validate-token-scales.d.ts +3 -0
- package/dist/src/core/config-validate-token-scales.js +47 -5
- package/dist/src/core/config-validate.js +6 -0
- package/dist/src/core/coverage-extend.js +2 -2
- package/dist/src/core/coverage-records.d.ts +11 -0
- package/dist/src/core/coverage-records.js +34 -0
- package/dist/src/core/engine-session-lock.d.ts +6 -0
- package/dist/src/core/engine-session-lock.js +10 -2
- package/dist/src/core/file-lock-shared.d.ts +57 -0
- package/dist/src/core/file-lock-shared.js +117 -0
- package/dist/src/core/file-lock.d.ts +9 -0
- package/dist/src/core/file-lock.js +58 -2
- package/dist/src/core/furnace-apply.js +10 -10
- package/dist/src/core/furnace-config-validate-exceptions.d.ts +10 -3
- package/dist/src/core/furnace-config-validate-exceptions.js +39 -8
- package/dist/src/core/furnace-config-validate.js +7 -1
- package/dist/src/core/furnace-registration-jar-inplace.d.ts +12 -0
- package/dist/src/core/furnace-registration-jar-inplace.js +80 -0
- package/dist/src/core/furnace-validate-accessibility.d.ts +4 -2
- package/dist/src/core/furnace-validate-accessibility.js +61 -27
- package/dist/src/core/furnace-validate-exceptions.d.ts +12 -4
- package/dist/src/core/furnace-validate-exceptions.js +41 -4
- package/dist/src/core/furnace-validate-icon-button.js +30 -1
- package/dist/src/core/history-log-file.js +8 -1
- package/dist/src/core/line-prefixer.d.ts +18 -0
- package/dist/src/core/line-prefixer.js +34 -0
- package/dist/src/core/mach.d.ts +7 -0
- package/dist/src/core/mach.js +24 -9
- package/dist/src/core/module-resolution-preflight.d.ts +19 -3
- package/dist/src/core/module-resolution-preflight.js +24 -6
- package/dist/src/core/negative-control-compiled.d.ts +27 -0
- package/dist/src/core/negative-control-compiled.js +73 -0
- package/dist/src/core/negative-control-diff.d.ts +14 -2
- package/dist/src/core/negative-control-diff.js +49 -6
- package/dist/src/core/negative-control.d.ts +12 -0
- package/dist/src/core/negative-control.js +48 -5
- package/dist/src/core/park-store.d.ts +63 -0
- package/dist/src/core/park-store.js +216 -0
- package/dist/src/core/patch-export-update.d.ts +4 -0
- package/dist/src/core/patch-export-update.js +12 -3
- package/dist/src/core/patch-export.d.ts +3 -2
- package/dist/src/core/patch-export.js +21 -14
- package/dist/src/core/patch-files.js +26 -8
- package/dist/src/core/patch-lint-checkjs-any-import.d.ts +6 -4
- package/dist/src/core/patch-lint-checkjs-any-import.js +9 -7
- package/dist/src/core/patch-lint-checkjs-diagnostics.d.ts +17 -0
- package/dist/src/core/patch-lint-checkjs-diagnostics.js +32 -0
- package/dist/src/core/patch-lint-checkjs.d.ts +10 -1
- package/dist/src/core/patch-lint-checkjs.js +13 -3
- package/dist/src/core/patch-lint-cross.d.ts +3 -1
- package/dist/src/core/patch-lint-cross.js +5 -0
- package/dist/src/core/patch-lint-css.js +14 -10
- package/dist/src/core/patch-lint-forward-registration-extended.d.ts +5 -0
- package/dist/src/core/patch-lint-forward-registration-extended.js +1 -1
- package/dist/src/core/patch-lint-ignore.d.ts +56 -12
- package/dist/src/core/patch-lint-ignore.js +173 -43
- package/dist/src/core/patch-lint-ownership.d.ts +10 -0
- package/dist/src/core/patch-lint-ownership.js +26 -0
- package/dist/src/core/patch-lint-size.js +9 -1
- package/dist/src/core/patch-lint-token-scale.d.ts +26 -8
- package/dist/src/core/patch-lint-token-scale.js +206 -29
- package/dist/src/core/patch-lint.js +2 -2
- package/dist/src/core/patch-manifest-io.js +8 -1
- package/dist/src/core/patch-manifest-key-order.d.ts +24 -0
- package/dist/src/core/patch-manifest-key-order.js +61 -0
- package/dist/src/core/patch-manifest-stage.d.ts +46 -0
- package/dist/src/core/patch-manifest-stage.js +96 -0
- package/dist/src/core/patch-manifest-validate.js +27 -1
- package/dist/src/core/patch-order-legal.d.ts +2 -1
- package/dist/src/core/patch-order-legal.js +7 -2
- package/dist/src/core/patch-policy.d.ts +6 -2
- package/dist/src/core/patch-policy.js +14 -7
- package/dist/src/core/patch-retired.d.ts +26 -4
- package/dist/src/core/patch-retired.js +40 -2
- package/dist/src/core/run-log.d.ts +6 -0
- package/dist/src/core/run-log.js +17 -1
- package/dist/src/core/test-harness-crash.d.ts +2 -1
- package/dist/src/core/test-harness-crash.js +5 -8
- package/dist/src/core/test-harness-signature.d.ts +16 -0
- package/dist/src/core/test-harness-signature.js +19 -1
- package/dist/src/core/test-raw-log.d.ts +66 -0
- package/dist/src/core/test-raw-log.js +122 -0
- package/dist/src/core/test-run-completeness.d.ts +36 -3
- package/dist/src/core/test-run-completeness.js +57 -17
- package/dist/src/core/test-xpcshell-retry.d.ts +2 -0
- package/dist/src/core/test-xpcshell-retry.js +2 -1
- package/dist/src/core/token-lint.d.ts +5 -2
- package/dist/src/core/token-lint.js +8 -3
- package/dist/src/core/token-sibling-sheets.d.ts +46 -0
- package/dist/src/core/token-sibling-sheets.js +119 -0
- package/dist/src/core/tree-guard.js +2 -0
- package/dist/src/core/typecheck-shim.d.ts +5 -1
- package/dist/src/core/typecheck-shim.js +115 -2
- package/dist/src/core/typecheck.js +3 -1
- package/dist/src/index.d.ts +9 -3
- package/dist/src/index.js +4 -1
- package/dist/src/types/commands/index.d.ts +2 -2
- package/dist/src/types/commands/options.d.ts +68 -7
- package/dist/src/types/commands/patches.d.ts +43 -0
- package/dist/src/types/config.d.ts +74 -2
- package/dist/src/types/furnace.d.ts +20 -0
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/utils/options.d.ts +3 -2
- package/dist/src/utils/options.js +9 -4
- package/docs/configuration.md +94 -9
- package/docs/furnace.md +43 -1
- package/docs/lifecycle-invariants.md +13 -11
- package/docs/machine-output.md +64 -18
- package/docs/patch-workflow.md +174 -13
- package/docs/testing.md +73 -4
- package/package.json +3 -3
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Command option types for CLI commands.
|
|
3
3
|
*/
|
|
4
4
|
import type { FirefoxProduct, ProjectLicense } from '../config.js';
|
|
5
|
-
import type { PatchCategory } from './patches.js';
|
|
5
|
+
import type { PatchCategory, PatchSizeShare } from './patches.js';
|
|
6
6
|
/**
|
|
7
7
|
* `--dry-run`: print the planned change and exit without writing anything.
|
|
8
8
|
*
|
|
@@ -334,8 +334,8 @@ export interface ReExportOptions extends EngineLockWaitable {
|
|
|
334
334
|
* unmanaged files exist adjacent to the patch's ownership, instead of
|
|
335
335
|
* warning. Gate-driven workflows use this so a freshly created file
|
|
336
336
|
* beside a patch's owned files cannot be silently left out of the
|
|
337
|
-
* refreshed body.
|
|
338
|
-
* exclusive with `--
|
|
337
|
+
* refreshed body. Beside `--scan` it judges the neighbours the scan did
|
|
338
|
+
* not adopt. Mutually exclusive with `--files`, which sets filesAffected
|
|
339
339
|
* explicitly.
|
|
340
340
|
*/
|
|
341
341
|
refuseAdjacentUnmanaged?: boolean;
|
|
@@ -397,6 +397,23 @@ export interface ReExportOptions extends EngineLockWaitable {
|
|
|
397
397
|
* back at HEAD.
|
|
398
398
|
*/
|
|
399
399
|
expectRemoved?: string[];
|
|
400
|
+
/**
|
|
401
|
+
* Where a refused `--scan` adoption writes its one `--from`-ready
|
|
402
|
+
* declaration report (`--declarations-out`). Defaults to
|
|
403
|
+
* `.fireforge/declarations/`.
|
|
404
|
+
*/
|
|
405
|
+
declarationsOut?: string;
|
|
406
|
+
/**
|
|
407
|
+
* `--hunks-from <diff>`: export each named file as the patch's current
|
|
408
|
+
* body plus only the hunks in this diff, leaving every other session's
|
|
409
|
+
* edits in the file out.
|
|
410
|
+
*/
|
|
411
|
+
hunksFrom?: string;
|
|
412
|
+
/**
|
|
413
|
+
* `--exclude-hunks <diff>`: export each named file as the working tree
|
|
414
|
+
* minus the hunks in this diff.
|
|
415
|
+
*/
|
|
416
|
+
excludeHunks?: string;
|
|
400
417
|
}
|
|
401
418
|
/**
|
|
402
419
|
* Options for the `fireforge patch tier` subcommand. Sets or clears the
|
|
@@ -426,8 +443,15 @@ export interface PatchLintIgnoreOptions extends Confirmable, DryRunnable, PatchL
|
|
|
426
443
|
* bare IDs. Only the measured size rules accept one. Requires `reason`.
|
|
427
444
|
*/
|
|
428
445
|
max?: number;
|
|
429
|
-
/** Why the ceiling exists. Required with `max
|
|
446
|
+
/** Why the ceiling exists. Required with `max` or a `<rule>=<max>` add. */
|
|
430
447
|
reason?: string;
|
|
448
|
+
/** With a ceiling on `large-patch-lines`: the share it bounds. */
|
|
449
|
+
share?: PatchSizeShare;
|
|
450
|
+
/**
|
|
451
|
+
* Add every entry in a JSON file under one lock hold: an array of
|
|
452
|
+
* entries, or a lint report whose ceilings for the patch are rebaselined.
|
|
453
|
+
*/
|
|
454
|
+
from?: string;
|
|
431
455
|
}
|
|
432
456
|
/**
|
|
433
457
|
* Options for the `fireforge patch staged-dependency` subcommand. Modes are
|
|
@@ -490,6 +514,8 @@ export interface PatchSplitOptions extends Confirmable, PatchLockWaitable, Unsaf
|
|
|
490
514
|
dryRun?: boolean;
|
|
491
515
|
/** Skip per-patch lint of the projected bodies. */
|
|
492
516
|
skipLint?: boolean;
|
|
517
|
+
/** Where a refusal writes its one `--from`-ready declaration report. */
|
|
518
|
+
declarationsOut?: string;
|
|
493
519
|
}
|
|
494
520
|
/**
|
|
495
521
|
* Options for the `fireforge patch move-files` subcommand. Without
|
|
@@ -513,6 +539,8 @@ export interface PatchMoveFilesOptions extends Confirmable, PatchLockWaitable, U
|
|
|
513
539
|
dryRun?: boolean;
|
|
514
540
|
/** Skip per-patch lint of the projected bodies. */
|
|
515
541
|
skipLint?: boolean;
|
|
542
|
+
/** Where a refusal writes its one `--from`-ready declaration report. */
|
|
543
|
+
declarationsOut?: string;
|
|
516
544
|
}
|
|
517
545
|
/**
|
|
518
546
|
* Options for the rebase command.
|
|
@@ -650,11 +678,12 @@ export interface TestOptions extends EngineLockWaitable {
|
|
|
650
678
|
*/
|
|
651
679
|
refuseUnexportedDrift?: boolean;
|
|
652
680
|
/**
|
|
653
|
-
*
|
|
654
|
-
*
|
|
681
|
+
* Which components the pre-test build deploys: `all` (default), `reached`
|
|
682
|
+
* (only those a requested test reaches) or `none`. `false` is
|
|
683
|
+
* `--no-furnace-apply`, the same as `none`. Valid only with
|
|
655
684
|
* `--build`/`--build-only`.
|
|
656
685
|
*/
|
|
657
|
-
furnaceApply?: boolean;
|
|
686
|
+
furnaceApply?: boolean | 'all' | 'reached' | 'none';
|
|
658
687
|
/** Forward mach's pathless auto-selection mode. Valid only with no explicit paths. */
|
|
659
688
|
auto?: boolean;
|
|
660
689
|
/**
|
|
@@ -768,6 +797,17 @@ export interface TestOptions extends EngineLockWaitable {
|
|
|
768
797
|
* engine harness's busy-port fallback. Same as `test.mochitestPorts: "auto"`.
|
|
769
798
|
*/
|
|
770
799
|
autoPorts?: boolean;
|
|
800
|
+
/**
|
|
801
|
+
* Hold the engine session lock shared for a build-less run with auto
|
|
802
|
+
* ports, so peers' build-less runs overlap. Same as `test.lockMode: "shared"`.
|
|
803
|
+
*/
|
|
804
|
+
sharedLock?: boolean;
|
|
805
|
+
/** Run shards on this many harness instances at once (requires auto ports). */
|
|
806
|
+
jobs?: number;
|
|
807
|
+
/** Dispatch n files per mach invocation, judged per file from the raw log. */
|
|
808
|
+
shardSize?: number;
|
|
809
|
+
/** Write per-file results (mozlog raw log) as JSON to this path. */
|
|
810
|
+
results?: string;
|
|
771
811
|
}
|
|
772
812
|
/**
|
|
773
813
|
* Options for the furnace apply command.
|
|
@@ -984,6 +1024,8 @@ export interface RegisterOptions {
|
|
|
984
1024
|
export interface PatchDeleteOptions extends Confirmable, DryRunnable, PatchLockWaitable {
|
|
985
1025
|
/** Bypass the hard refusal when later patches depend on the target. */
|
|
986
1026
|
forceUnsafe?: boolean;
|
|
1027
|
+
/** Also delete the engine files the patch creates that are still on disk. */
|
|
1028
|
+
deleteCreated?: boolean;
|
|
987
1029
|
}
|
|
988
1030
|
/**
|
|
989
1031
|
* Options for the `fireforge patch retire` subcommand: `patch delete` that
|
|
@@ -993,6 +1035,25 @@ export interface PatchRetireOptions extends PatchDeleteOptions {
|
|
|
993
1035
|
/** Optional human-readable rationale stored on the retired slot. */
|
|
994
1036
|
reason?: string;
|
|
995
1037
|
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Options for the `fireforge patch stage` subcommand: stage the named
|
|
1040
|
+
* patches' files and only their `patches.json` rows in the project index.
|
|
1041
|
+
*/
|
|
1042
|
+
export type PatchStageOptions = DryRunnable & PatchLockWaitable;
|
|
1043
|
+
/**
|
|
1044
|
+
* Options for the `fireforge patch reserve` subcommand: hold an order
|
|
1045
|
+
* number for a patch not exported yet, or release the hold.
|
|
1046
|
+
*/
|
|
1047
|
+
export interface PatchReserveOptions extends DryRunnable, PatchLockWaitable {
|
|
1048
|
+
/** Category the reserved patch will carry (required to reserve). */
|
|
1049
|
+
category?: string;
|
|
1050
|
+
/** Who holds the reservation (required to reserve). */
|
|
1051
|
+
owner?: string;
|
|
1052
|
+
/** Optional human-readable rationale stored on the reserved slot. */
|
|
1053
|
+
reason?: string;
|
|
1054
|
+
/** Release the reservation at the order instead of creating one. */
|
|
1055
|
+
release?: boolean;
|
|
1056
|
+
}
|
|
996
1057
|
/**
|
|
997
1058
|
* Options for the `fireforge patch rename` subcommand. Updates the patch's
|
|
998
1059
|
* filename, manifest `name`, and (optionally) `description` atomically
|
|
@@ -65,7 +65,22 @@ export interface LintIgnoreCeiling {
|
|
|
65
65
|
max: number;
|
|
66
66
|
/** Why the waiver exists. Required so the ceiling is reviewable. */
|
|
67
67
|
reason: string;
|
|
68
|
+
/**
|
|
69
|
+
* Which share of a split `large-patch-lines` measurement the ceiling
|
|
70
|
+
* bounds: `product` (non-test files) or `test` (test files, held to the
|
|
71
|
+
* test tier). Absent: every finding of the rule. Only valid on
|
|
72
|
+
* `large-patch-lines`, and a rule carries either one share-less ceiling
|
|
73
|
+
* or at most one ceiling per share.
|
|
74
|
+
*/
|
|
75
|
+
share?: PatchSizeShare;
|
|
76
|
+
/**
|
|
77
|
+
* Free-form JSON object FireForge preserves and never reads: a place for
|
|
78
|
+
* a project's own waiver bookkeeping (kind, owner, exit condition).
|
|
79
|
+
*/
|
|
80
|
+
meta?: Record<string, unknown>;
|
|
68
81
|
}
|
|
82
|
+
/** The two classes a split `addedCode` line measurement reports. */
|
|
83
|
+
export type PatchSizeShare = 'test' | 'product';
|
|
69
84
|
/** One `PatchMetadata.lintIgnore` entry: a bare check ID or a ceiling waiver. */
|
|
70
85
|
export type LintIgnoreEntry = string | LintIgnoreCeiling;
|
|
71
86
|
/**
|
|
@@ -227,6 +242,28 @@ export interface PatchesManifest {
|
|
|
227
242
|
* slot, and the slot is dropped on that write.
|
|
228
243
|
*/
|
|
229
244
|
retired?: PatchRetiredSlot[];
|
|
245
|
+
/**
|
|
246
|
+
* Order numbers `patch reserve` holds for a patch a session has agreed to
|
|
247
|
+
* export but has not exported yet. Like a retired slot, a reservation is
|
|
248
|
+
* read only by the `patchPolicy.allowGaps: false` gap check (as an
|
|
249
|
+
* occupied order) and by the earliest-legal-order search (as taken); the
|
|
250
|
+
* export that lands on the order fills it, and the slot is dropped on that
|
|
251
|
+
* write.
|
|
252
|
+
*/
|
|
253
|
+
reserved?: PatchReservedSlot[];
|
|
254
|
+
}
|
|
255
|
+
/** One order held by `patch reserve` until its owner exports it. */
|
|
256
|
+
export interface PatchReservedSlot {
|
|
257
|
+
/** The reserved order number. */
|
|
258
|
+
order: number;
|
|
259
|
+
/** Category the reserved patch will carry, so the slot stays in its range. */
|
|
260
|
+
category: PatchCategory;
|
|
261
|
+
/** Who holds the reservation: a session label or the planned filename. */
|
|
262
|
+
owner: string;
|
|
263
|
+
/** ISO timestamp of the reservation. */
|
|
264
|
+
reservedAt: string;
|
|
265
|
+
/** Optional human-readable rationale. */
|
|
266
|
+
reason?: string;
|
|
230
267
|
}
|
|
231
268
|
/** One placeholder left by `patch retire`. */
|
|
232
269
|
export interface PatchRetiredSlot {
|
|
@@ -306,4 +343,10 @@ export interface PatchLintIssue {
|
|
|
306
343
|
* ceiling compares against it, and `lint --report` carries it.
|
|
307
344
|
*/
|
|
308
345
|
measurement?: number;
|
|
346
|
+
/**
|
|
347
|
+
* For a `large-patch-lines` finding under `patchSizeMetric: "addedCode"`
|
|
348
|
+
* on a general-tier patch: which share of the patch it measured. A
|
|
349
|
+
* share-scoped lintIgnore ceiling matches only findings of its share.
|
|
350
|
+
*/
|
|
351
|
+
share?: PatchSizeShare;
|
|
309
352
|
}
|
|
@@ -62,6 +62,21 @@ export interface TestConfig {
|
|
|
62
62
|
* once. `--auto-ports` is the per-invocation equivalent.
|
|
63
63
|
*/
|
|
64
64
|
mochitestPorts?: 'fixed' | 'auto';
|
|
65
|
+
/**
|
|
66
|
+
* `exclusive` (the default): every `fireforge test` holds the engine
|
|
67
|
+
* session lock alone. `shared`: a build-less run with auto ports holds it
|
|
68
|
+
* shared, so peers' build-less runs on the same objdir overlap while
|
|
69
|
+
* builds and re-exports still wait. `--shared-lock` is the per-invocation
|
|
70
|
+
* equivalent.
|
|
71
|
+
*/
|
|
72
|
+
lockMode?: 'exclusive' | 'shared';
|
|
73
|
+
/**
|
|
74
|
+
* Which components `test --build` deploys before building: `all` (the
|
|
75
|
+
* default) every component with undeployed edits, `reached` only those a
|
|
76
|
+
* requested test reaches, `none` nothing. `--furnace-apply` is the
|
|
77
|
+
* per-invocation equivalent.
|
|
78
|
+
*/
|
|
79
|
+
furnaceApply?: 'all' | 'reached' | 'none';
|
|
65
80
|
}
|
|
66
81
|
/** Patch history log settings stored in fireforge.json. */
|
|
67
82
|
export interface HistoryConfig {
|
|
@@ -243,6 +258,11 @@ export interface CheckExtraStep {
|
|
|
243
258
|
cwd?: string;
|
|
244
259
|
/** Seconds before the step is killed and fails. Unbounded when unset. */
|
|
245
260
|
timeout?: number;
|
|
261
|
+
/**
|
|
262
|
+
* Steps (built-in or extra) that must finish before this one starts,
|
|
263
|
+
* whatever their outcome: an ordering, not a success dependency.
|
|
264
|
+
*/
|
|
265
|
+
after?: string[];
|
|
246
266
|
}
|
|
247
267
|
/** Configuration for `fireforge check`. Every field is optional. */
|
|
248
268
|
export interface CheckConfig {
|
|
@@ -264,6 +284,23 @@ export interface CheckConfig {
|
|
|
264
284
|
};
|
|
265
285
|
/** Project commands run as further steps. */
|
|
266
286
|
extraSteps?: CheckExtraStep[];
|
|
287
|
+
/** Seconds before a built-in step is killed and fails. Unbounded when unset. */
|
|
288
|
+
timeout?: number;
|
|
289
|
+
/** Per-step `timeout` overrides for built-in steps, in seconds. */
|
|
290
|
+
timeouts?: Partial<Record<CheckBuiltinStep, number>>;
|
|
291
|
+
/**
|
|
292
|
+
* Fail the verdict when a built-in step is skipped because it has nothing
|
|
293
|
+
* to run (no `typecheck` block, no furnace.json). A step named in `skip`
|
|
294
|
+
* is a decision, not a gap, and never fails it.
|
|
295
|
+
*/
|
|
296
|
+
failOnSkipped?: boolean;
|
|
297
|
+
/**
|
|
298
|
+
* Project-relative path the lint step writes its `lint --per-patch
|
|
299
|
+
* --report` JSON to. Extra steps receive it as
|
|
300
|
+
* `FIREFORGE_CHECK_LINT_REPORT`, so an audit can read the run's lint
|
|
301
|
+
* report instead of linting the queue a second time.
|
|
302
|
+
*/
|
|
303
|
+
lintReport?: string;
|
|
267
304
|
}
|
|
268
305
|
/**
|
|
269
306
|
* Configuration for the `fireforge typecheck` command. Distinct from
|
|
@@ -308,6 +345,15 @@ export interface TypecheckConfig {
|
|
|
308
345
|
* blocking. `'off'` suppresses them.
|
|
309
346
|
*/
|
|
310
347
|
undefinedIdentifiers?: PatchLintSeverityGate;
|
|
348
|
+
/**
|
|
349
|
+
* Types Lit in the shim: `LitElement` and the template helpers of
|
|
350
|
+
* `chrome://global/content/vendor/lit.all.mjs`, and `MozLitElement` of
|
|
351
|
+
* `chrome://global/content/lit-utils.mjs`, with closed member lists, so a
|
|
352
|
+
* misspelt member of a widget host is an error. Default off: reactive
|
|
353
|
+
* properties declared only through `static properties` or
|
|
354
|
+
* `static queries` then need a JSDoc or constructor declaration.
|
|
355
|
+
*/
|
|
356
|
+
litTypes?: boolean;
|
|
311
357
|
}
|
|
312
358
|
/**
|
|
313
359
|
* Wire command configuration.
|
|
@@ -564,8 +610,12 @@ export interface PatchLintConfig {
|
|
|
564
610
|
export interface PatchLintTokenScale {
|
|
565
611
|
/** CSS properties governed (exact names, or a `*`-suffixed prefix such as `padding*`). */
|
|
566
612
|
properties: string[];
|
|
567
|
-
/**
|
|
568
|
-
|
|
613
|
+
/**
|
|
614
|
+
* Custom-property prefix of the scale's tokens, e.g. `--mybrowser-space-`,
|
|
615
|
+
* or a list of them for a scale whose steps are spelled more than one way
|
|
616
|
+
* (`["--mybrowser-space-", "--mybrowser-gap-"]`).
|
|
617
|
+
*/
|
|
618
|
+
prefix: string | string[];
|
|
569
619
|
/**
|
|
570
620
|
* Literal value atoms accepted without a token (`0`, `auto`, `1px`).
|
|
571
621
|
* `*` is a wildcard, so `*%` accepts any percentage. CSS-wide keywords
|
|
@@ -579,6 +629,28 @@ export interface PatchLintTokenScale {
|
|
|
579
629
|
* tokens.
|
|
580
630
|
*/
|
|
581
631
|
allow?: string[];
|
|
632
|
+
/**
|
|
633
|
+
* Literal atoms accepted only inside a math function (`calc()`, `min()`,
|
|
634
|
+
* `max()`, `clamp()`), with the `allowLiterals` wildcard syntax: a
|
|
635
|
+
* unitless multiplier (`calc(var(--x-space-2) * 2)`) without also
|
|
636
|
+
* accepting a bare `2`.
|
|
637
|
+
*/
|
|
638
|
+
allowInCalc?: string[];
|
|
639
|
+
/**
|
|
640
|
+
* Largest total, in px, a declaration may subtract from this scale's
|
|
641
|
+
* tokens inside a math function (`calc(var(--x-space-4) - 1px)`), for a
|
|
642
|
+
* border or hairline inset. Summed over the declaration.
|
|
643
|
+
*/
|
|
644
|
+
offsetCap?: number;
|
|
645
|
+
/** Engine-relative globs (`**`, `*`, `?`) of files this scale does not govern. */
|
|
646
|
+
exclude?: string[];
|
|
647
|
+
/**
|
|
648
|
+
* The fewest patch-created CSS files (outside `exclude`) that must carry a
|
|
649
|
+
* declaration of this scale's properties. A queue under it fails
|
|
650
|
+
* `token-scale-vacuous`, so a scale that matches nothing, or a scan set
|
|
651
|
+
* a move emptied, cannot pass by judging nothing.
|
|
652
|
+
*/
|
|
653
|
+
minFiles?: number;
|
|
582
654
|
}
|
|
583
655
|
/**
|
|
584
656
|
* Build modes for mach.
|
|
@@ -109,6 +109,12 @@ export interface FurnaceValidationException {
|
|
|
109
109
|
component: string;
|
|
110
110
|
/** The finding's check name, as `furnace validate` prints it in brackets. */
|
|
111
111
|
check: string;
|
|
112
|
+
/**
|
|
113
|
+
* Narrows the exception to the findings on this element tag (a finding's
|
|
114
|
+
* `tags`): a `panel-item` menu row can be accepted without muting the
|
|
115
|
+
* check for every other element of the component.
|
|
116
|
+
*/
|
|
117
|
+
tag?: string;
|
|
112
118
|
/** Why the finding is accepted. Required: the entry is the review record. */
|
|
113
119
|
reason: string;
|
|
114
120
|
}
|
|
@@ -160,6 +166,12 @@ export interface FurnaceConfig {
|
|
|
160
166
|
* `['browser/base/content/browser.xhtml']`, the upstream Firefox path.
|
|
161
167
|
*/
|
|
162
168
|
tokenHostDocuments?: string[];
|
|
169
|
+
/**
|
|
170
|
+
* Stylesheets that load beside others in a document no queue link shows,
|
|
171
|
+
* for `token lint`: `{ "<glob>": ["<path or glob>", …] }`. A sheet the key
|
|
172
|
+
* matches may reference the tokens its partners declare.
|
|
173
|
+
*/
|
|
174
|
+
tokenSiblingSheets?: Record<string, string[]>;
|
|
163
175
|
/**
|
|
164
176
|
* Override the default Fluent (.ftl) base path within the engine.
|
|
165
177
|
* Defaults to `toolkit/locales/en-US/toolkit/global` when not set.
|
|
@@ -185,6 +197,12 @@ export interface FurnaceConfig {
|
|
|
185
197
|
* entry that no longer matches anything as a stale-exception warning.
|
|
186
198
|
*/
|
|
187
199
|
validationExceptions?: FurnaceValidationException[];
|
|
200
|
+
/**
|
|
201
|
+
* The fewest components a full `furnace validate` must judge. A run under
|
|
202
|
+
* it fails with `component-floor`, so a moved or emptied components tree
|
|
203
|
+
* cannot pass by validating nothing.
|
|
204
|
+
*/
|
|
205
|
+
minComponents?: number;
|
|
188
206
|
/**
|
|
189
207
|
* Opt-in `furnace validate` checks (see {@link FURNACE_OPT_IN_CHECKS}).
|
|
190
208
|
* Unset runs only the default checks.
|
|
@@ -359,6 +377,8 @@ export interface ValidationIssue {
|
|
|
359
377
|
check: string;
|
|
360
378
|
/** Human-readable description of the issue */
|
|
361
379
|
message: string;
|
|
380
|
+
/** Element tags the finding is about, when it is about particular elements. */
|
|
381
|
+
tags?: string[];
|
|
362
382
|
}
|
|
363
383
|
/** Resolved test-harness selection for a `furnace create` run. */
|
|
364
384
|
export type ResolvedTestStyle = 'mochikit' | 'browser-chrome' | 'xpcshell' | 'none';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Re-exports all type definitions.
|
|
3
3
|
*/
|
|
4
|
-
export type { BuildConfig, FireForgeConfig, FirefoxConfig, FirefoxProduct, PatchLintFileSizeThresholds, PatchLintFileSizeTier, ProjectLicense, ProjectPaths, WireConfig, } from './config.js';
|
|
4
|
+
export type { BuildConfig, FireForgeConfig, FirefoxConfig, FirefoxProduct, PatchLintFileSizeThresholds, PatchLintFileSizeTier, PatchLintPatchSizeMetric, ProjectLicense, ProjectPaths, WireConfig, } from './config.js';
|
|
5
5
|
export type { ApplyResult, ComponentType, CustomComponentConfig, DryRunAction, FurnaceConfig, FurnaceState, OverrideComponentConfig, OverrideType, StepError, ValidationIssue, } from './furnace.js';
|
|
@@ -49,13 +49,14 @@ export declare function commanderArgParser<T>(parse: (raw: string) => T): (raw:
|
|
|
49
49
|
export declare function stringListOption(): [(value: string, previous: string[]) => string[], string[]];
|
|
50
50
|
/** Environment variable naming a standing wait budget for the whole session. */
|
|
51
51
|
export declare const WAIT_LOCK_ENV_VAR = "FIREFORGE_WAIT_LOCK";
|
|
52
|
+
export declare const MAX_WAIT_LOCK_SECONDS = 86400;
|
|
52
53
|
/**
|
|
53
54
|
* Resolves the parsed `--wait-lock [seconds]` option value into a wait budget
|
|
54
55
|
* in seconds for `withEngineSessionLock`:
|
|
55
56
|
* - absent (`undefined`) → {@link WAIT_LOCK_ENV_VAR} if set, else `undefined`
|
|
56
57
|
* (the ~1 s fail-fast),
|
|
57
58
|
* - bare flag (`true`) → {@link DEFAULT_WAIT_LOCK_SECONDS},
|
|
58
|
-
* - explicit value → integer validated into 1..
|
|
59
|
+
* - explicit value → integer validated into 1..86400.
|
|
59
60
|
*
|
|
60
61
|
* The flag always wins over the environment: the environment expresses a
|
|
61
62
|
* default for a session, and an invocation that names a budget has said
|
|
@@ -125,7 +126,7 @@ export declare function isPathShapedArgument(token: string): boolean;
|
|
|
125
126
|
*
|
|
126
127
|
* Commander binds the next non-dash token to an optional value, so
|
|
127
128
|
* `fireforge test --build --wait-lock browser_x.js` failed with
|
|
128
|
-
* "--wait-lock must be an integer in 1..
|
|
129
|
+
* "--wait-lock must be an integer in 1..86400 (got "browser_x.js")": the
|
|
129
130
|
* help says the value is optional, and the obvious spelling refused. The
|
|
130
131
|
* released flag moves to the end of the option section (before any `--`),
|
|
131
132
|
* where nothing follows it, so commander reads it bare. Operands keep their
|
|
@@ -68,9 +68,14 @@ export function stringListOption() {
|
|
|
68
68
|
const DEFAULT_WAIT_LOCK_SECONDS = 60;
|
|
69
69
|
/** Environment variable naming a standing wait budget for the whole session. */
|
|
70
70
|
export const WAIT_LOCK_ENV_VAR = 'FIREFORGE_WAIT_LOCK';
|
|
71
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* Bounds shared by the flag and the environment variable. The ceiling is a
|
|
73
|
+
* day: on a shared engine a re-export or `test --build` queued behind a
|
|
74
|
+
* peer's long series can need more than the hour the cap used to be, and a
|
|
75
|
+
* longer wait then had to be a requeue after exit 15.
|
|
76
|
+
*/
|
|
72
77
|
const MIN_WAIT_LOCK_SECONDS = 1;
|
|
73
|
-
const MAX_WAIT_LOCK_SECONDS =
|
|
78
|
+
export const MAX_WAIT_LOCK_SECONDS = 86_400;
|
|
74
79
|
/**
|
|
75
80
|
* Parses a wait budget from text, or undefined when it is not an integer in
|
|
76
81
|
* range. Shared by the flag and {@link WAIT_LOCK_ENV_VAR} so the two cannot
|
|
@@ -115,7 +120,7 @@ function waitLockSecondsFromEnv() {
|
|
|
115
120
|
* - absent (`undefined`) → {@link WAIT_LOCK_ENV_VAR} if set, else `undefined`
|
|
116
121
|
* (the ~1 s fail-fast),
|
|
117
122
|
* - bare flag (`true`) → {@link DEFAULT_WAIT_LOCK_SECONDS},
|
|
118
|
-
* - explicit value → integer validated into 1..
|
|
123
|
+
* - explicit value → integer validated into 1..86400.
|
|
119
124
|
*
|
|
120
125
|
* The flag always wins over the environment: the environment expresses a
|
|
121
126
|
* default for a session, and an invocation that names a budget has said
|
|
@@ -237,7 +242,7 @@ export function isPathShapedArgument(token) {
|
|
|
237
242
|
*
|
|
238
243
|
* Commander binds the next non-dash token to an optional value, so
|
|
239
244
|
* `fireforge test --build --wait-lock browser_x.js` failed with
|
|
240
|
-
* "--wait-lock must be an integer in 1..
|
|
245
|
+
* "--wait-lock must be an integer in 1..86400 (got "browser_x.js")": the
|
|
241
246
|
* help says the value is optional, and the obvious spelling refused. The
|
|
242
247
|
* released flag moves to the end of the option section (before any `--`),
|
|
243
248
|
* where nothing follows it, so commander reads it bare. Operands keep their
|
package/docs/configuration.md
CHANGED
|
@@ -253,10 +253,34 @@ lint instead of throwing at runtime (since 0.50.0). The same shim backs
|
|
|
253
253
|
is a wildcard), or a CSS-wide keyword (`inherit`, `initial`, `unset`,
|
|
254
254
|
`revert`, `revert-layer`). A `var()` fallback is held to the same scale,
|
|
255
255
|
so `var(--mybrowser-gap, 7px)` fails on `7px`. `calc()`, `min()`, `max()`
|
|
256
|
-
and `clamp()` are transparent
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
256
|
+
and `clamp()` are transparent. Files the patch modifies rather than
|
|
257
|
+
creates are not checked, and a line carrying
|
|
258
|
+
`fireforge-ignore: token-scale` is skipped. Declarations inside
|
|
259
|
+
descriptor at-rules (`@font-face`, `@counter-style`, `@property`,
|
|
260
|
+
`@font-feature-values`, `@font-palette-values`, `@page` and its margin
|
|
261
|
+
boxes) are descriptors, not properties, and are not judged.
|
|
262
|
+
|
|
263
|
+
Since 0.51.0 a scale also takes:
|
|
264
|
+
|
|
265
|
+
- `prefix` as a list (`["--mybrowser-space-", "--mybrowser-gap-"]`) for a
|
|
266
|
+
scale whose steps are spelled more than one way.
|
|
267
|
+
- `allowInCalc`: literals legal only inside a math function, such as the
|
|
268
|
+
unitless multiplier in `calc(var(--mybrowser-space-2) * 2)`, without
|
|
269
|
+
also passing a bare `2`. Same wildcard syntax as `allowLiterals`.
|
|
270
|
+
- `offsetCap`: the px a declaration may subtract from the scale's tokens
|
|
271
|
+
inside a math function (`calc(var(--mybrowser-space-4) - 1px)`), summed
|
|
272
|
+
over the declaration. A px value anywhere else still fails.
|
|
273
|
+
- `exclude`: engine-relative globs of files the scale does not govern,
|
|
274
|
+
such as a vendored minified sheet, so its patch needs no patch-wide
|
|
275
|
+
waiver.
|
|
276
|
+
- `minFiles`: the fewest patch-created stylesheets (outside `exclude`)
|
|
277
|
+
that must declare one of the scale's properties. Under it the queue
|
|
278
|
+
fails `token-scale-vacuous` (an error on `fireforge.json` in
|
|
279
|
+
`lint --per-patch`), so a scale that matches nothing, or a scan set a
|
|
280
|
+
move emptied, cannot pass by judging nothing. A `--patches` run does
|
|
281
|
+
not judge the floor.
|
|
282
|
+
|
|
283
|
+
An unknown key in a scale is refused.
|
|
260
284
|
|
|
261
285
|
## `typecheck`
|
|
262
286
|
|
|
@@ -275,6 +299,26 @@ program: prior incremental diagnostic state is never restored. Cached and
|
|
|
275
299
|
also disables build-info writes. A jsconfig's own `incremental` and
|
|
276
300
|
`tsBuildInfoFile` remain ignored.
|
|
277
301
|
|
|
302
|
+
`typecheck.litTypes: true` (since 0.51.0, default off) types Lit in the
|
|
303
|
+
shim: `LitElement` and the helpers of
|
|
304
|
+
`chrome://global/content/vendor/lit.all.mjs`, and `MozLitElement` of
|
|
305
|
+
`chrome://global/content/lit-utils.mjs`. The element classes carry closed
|
|
306
|
+
member lists, as `Cu` does, so a misspelt member of a widget host is an
|
|
307
|
+
error rather than `any`. Template helpers and directives stay loose. It is
|
|
308
|
+
off by default because a reactive property declared only in
|
|
309
|
+
`static properties` or `static queries` then needs a constructor
|
|
310
|
+
assignment or a JSDoc declaration to be known. A project shim can add
|
|
311
|
+
members by merging `interface LitElementShimMembers`; a jsconfig `paths`
|
|
312
|
+
entry that maps these URLs to real sources takes precedence.
|
|
313
|
+
|
|
314
|
+
Per-patch checkJs gives each test script its own program. Since 0.51.0 a
|
|
315
|
+
test's `resource:///` and `chrome://` imports (including a
|
|
316
|
+
`typeof import("…")` cast) resolve to the modules the queue creates up to
|
|
317
|
+
the test's own patch, so a test of an earlier patch's module is checked
|
|
318
|
+
against its real types. A module a later patch creates, an upstream module
|
|
319
|
+
and a basename two patches create still type as `any`, and an implicit-any
|
|
320
|
+
finding on such an import names it.
|
|
321
|
+
|
|
278
322
|
Both project and per-patch checkJs provide Gecko DOM constructor
|
|
279
323
|
`isInstance(value)` predicates with instance narrowing, plus
|
|
280
324
|
`MouseEvent.MOZ_SOURCE_PEN`. These declarations retain normal DOM member
|
|
@@ -288,8 +332,10 @@ gaps does not move a patch out of the band its category owns.
|
|
|
288
332
|
With `patchPolicy.allowGaps: false`, orders are contiguous within a range:
|
|
289
333
|
a new patch must fill an existing gap or take the number right after the
|
|
290
334
|
range's last patch. A patch that has to leave the queue without opening a
|
|
291
|
-
gap is removed with `patch retire`, which keeps its order as a retired slot
|
|
292
|
-
|
|
335
|
+
gap is removed with `patch retire`, which keeps its order as a retired slot.
|
|
336
|
+
An order a peer has claimed but not exported yet is held with `patch
|
|
337
|
+
reserve`, so a later order can be exported without a gap in between (see
|
|
338
|
+
[`patch-workflow.md`](patch-workflow.md#queue-maintenance)).
|
|
293
339
|
|
|
294
340
|
### Registration-only rules
|
|
295
341
|
|
|
@@ -356,6 +402,18 @@ harness's own busy-port fallback, so sibling checkouts can run browser suites
|
|
|
356
402
|
at once. `--auto-ports` does the same for one invocation. See
|
|
357
403
|
[`testing.md`](testing.md#shared-browsers-ports-and-host-state).
|
|
358
404
|
|
|
405
|
+
`test.lockMode` is `"exclusive"` (default) or `"shared"`. `"shared"` lets a
|
|
406
|
+
build-less run that applies no negative control and uses auto ports hold the
|
|
407
|
+
engine-session lock shared, so peers' build-less runs on the same objdir
|
|
408
|
+
overlap while builds, re-exports and every other writer still hold it alone.
|
|
409
|
+
`--shared-lock` does the same for one invocation. See
|
|
410
|
+
[`testing.md`](testing.md#concurrency).
|
|
411
|
+
|
|
412
|
+
`test.furnaceApply` is `"all"` (default), `"reached"` or `"none"`: which
|
|
413
|
+
components a `test --build` deploys before building. `--furnace-apply` does
|
|
414
|
+
the same for one invocation. See
|
|
415
|
+
[`testing.md`](testing.md#furnace-components-in-a-pre-test-build).
|
|
416
|
+
|
|
359
417
|
## `history`
|
|
360
418
|
|
|
361
419
|
`history.path` is where FireForge appends its patch history log, relative to
|
|
@@ -457,6 +515,24 @@ one that dismissed four unregistered sources.
|
|
|
457
515
|
`/bin/sh -c` (`cmd.exe /c` on Windows) from the project root, or from the
|
|
458
516
|
project-relative `cwd`. `timeout` is in seconds: past it the step's whole
|
|
459
517
|
process tree is killed and the step fails. A step passes when it exits 0.
|
|
518
|
+
`after` lists steps, built-in or extra, that must finish before it starts
|
|
519
|
+
(whatever their outcome); a name that is not a step, or an ordering cycle,
|
|
520
|
+
is refused.
|
|
521
|
+
- `timeout` bounds every built-in step, in seconds, and `timeouts` sets it
|
|
522
|
+
per step (`{ "typecheck": 600 }`). A step past its budget is killed and
|
|
523
|
+
fails. Unset, built-in steps are unbounded.
|
|
524
|
+
- `failOnSkipped: true` fails the check (`reason=skipped-steps`) when a
|
|
525
|
+
built-in step is skipped because the project has nothing for it to run
|
|
526
|
+
(no `typecheck` block, no `furnace.json`). A step named in `skip` is a
|
|
527
|
+
decision and never fails it.
|
|
528
|
+
- `lintReport` is a project-relative path the lint step writes its
|
|
529
|
+
`lint --per-patch --report` JSON to. Every extra step receives the
|
|
530
|
+
absolute path as `FIREFORGE_CHECK_LINT_REPORT`, so an audit that runs
|
|
531
|
+
`after: ["lint"]` can read the run's lint report instead of linting the
|
|
532
|
+
queue a second time.
|
|
533
|
+
|
|
534
|
+
The verdict line names the skipped steps with an additive
|
|
535
|
+
`skipped-steps=<a,b>` key beside `skipped=<n>`.
|
|
460
536
|
|
|
461
537
|
## Design tokens
|
|
462
538
|
|
|
@@ -519,7 +595,16 @@ The dark and variant blocks mirror it and appear in `token show`.
|
|
|
519
595
|
- `token-undeclared`: a `var(--<prefix>…)` in the tokens CSS, or in any CSS
|
|
520
596
|
file a patch in the queue touches, names a token no block of the tokens
|
|
521
597
|
CSS declares. A property declared in the same file, and the `furnace.json`
|
|
522
|
-
`tokenAllowlist` and `runtimeVariables` names, are exempt.
|
|
598
|
+
`tokenAllowlist` and `runtimeVariables` names, are exempt. Since 0.51.0 a
|
|
599
|
+
reference with a fallback (`var(--x, 0)`) is optional and not reported,
|
|
600
|
+
and a token a sibling sheet declares counts as declared. Sheets are
|
|
601
|
+
siblings when one queue document links both (`<link rel="stylesheet">`,
|
|
602
|
+
`<html:link>` or `<?xml-stylesheet?>`, in markup or a Lit template; a
|
|
603
|
+
`chrome://` URL resolves through the queue's jar.mn lines, a relative
|
|
604
|
+
one beside the document), when one `@import`s the other, or when
|
|
605
|
+
`furnace.json` `tokenSiblingSheets` pairs them:
|
|
606
|
+
`{ "browser/themes/**/panel*.css": ["browser/base/content/host.css"] }`
|
|
607
|
+
(a partner is a path or a glob over the queue's sheets).
|
|
523
608
|
|
|
524
609
|
The prefix is `furnace.json` `tokenPrefix`, else `--<binaryName>-`.
|
|
525
610
|
|
|
@@ -585,7 +670,7 @@ Every FireForge command that mutates the engine takes the engine-session
|
|
|
585
670
|
lock, and some take a second subsystem lock as well. Contention fails fast
|
|
586
671
|
after about a second by default.
|
|
587
672
|
|
|
588
|
-
`--wait-lock [seconds]` (bare flag means 60, valid range 1 to
|
|
673
|
+
`--wait-lock [seconds]` (bare flag means 60, valid range 1 to 86400, a day) replaces
|
|
589
674
|
that with a bounded wait, and the budget covers every lock the command takes.
|
|
590
675
|
For `furnace apply`, `deploy` and `sync` that means the furnace lock as well
|
|
591
676
|
as the engine-session lock. The furnace leaves that take only the furnace lock
|
|
@@ -614,7 +699,7 @@ instead of blocking it.
|
|
|
614
699
|
|
|
615
700
|
| Variable | Effect |
|
|
616
701
|
| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
617
|
-
| `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1 to
|
|
702
|
+
| `FIREFORGE_WAIT_LOCK` | Session-wide lock wait budget in seconds (1 to 86400). See above. |
|
|
618
703
|
| `FIREFORGE_SESSION_ID` | Recorded as `sessionId` on every patch history log record this process writes. See `history` above. |
|
|
619
704
|
| `FIREFORGE_LOG_KEEP` | Also write every `test`/`build` run log here, outside retention (a directory collects one file per run). See `run-logs.md`. |
|
|
620
705
|
| `FIREFORGE_MAX_UNTRACKED_FILES` | Per-directory cap when expanding collapsed untracked directories in `status` (default 5000). A non-positive value warns and is ignored. |
|
package/docs/furnace.md
CHANGED
|
@@ -47,7 +47,10 @@ in `toolkit/content/jar.mn`, including extra modules beside the main one. Add
|
|
|
47
47
|
the file to the directory and deploy instead of writing the jar line by hand.
|
|
48
48
|
A line that already registers the file anywhere in the jar (same target, or
|
|
49
49
|
same `(widgets/<tag>/<file>)` source) is kept and never duplicated, so mach
|
|
50
|
-
does not fail with "Item already in manifest".
|
|
50
|
+
does not fail with "Item already in manifest". Removing a file from the
|
|
51
|
+
directory drops only its line, and `furnace rename` rewrites the widget's
|
|
52
|
+
lines where they stand, so the rest of the block keeps its order and the
|
|
53
|
+
owning patch carries no reorder hunks.
|
|
51
54
|
|
|
52
55
|
The apply and deploy summaries name why each component was skipped, for
|
|
53
56
|
example `Applied 0, skipped 1 (1 already current)`. "Already current" means
|
|
@@ -112,6 +115,45 @@ warning asking for the entry to be deleted. A run over one component judges
|
|
|
112
115
|
only that component's entries. `deploy` honours the same entries when it
|
|
113
116
|
validates, but leaves the staleness report to `validate`.
|
|
114
117
|
|
|
118
|
+
An entry never suppresses an error (since 0.51.0): an error blocks apply,
|
|
119
|
+
and a review record cannot make a broken component deployable. The error
|
|
120
|
+
stays counted, and the entry is reported as a
|
|
121
|
+
`validation-exception-on-error` error until the finding is fixed and the
|
|
122
|
+
entry deleted.
|
|
123
|
+
|
|
124
|
+
An optional `tag` narrows an entry to findings about one element tag, so a
|
|
125
|
+
reviewed `<panel-list>` menu does not mute `no-keyboard-handler` for the
|
|
126
|
+
rest of the component. A finding that names several tags (`no-keyboard-handler`
|
|
127
|
+
names every synthetic element with an `@click`) is suppressed only when
|
|
128
|
+
entries cover all of them:
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"component": "moz-vault",
|
|
133
|
+
"check": "no-keyboard-handler",
|
|
134
|
+
"tag": "li",
|
|
135
|
+
"reason": "Rows are reached through the list's roving focus."
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Accessibility checks judge the composed component: the host
|
|
140
|
+
`<tag>.mjs` and its companion modules (`<tag>-*.mjs`, tests and stories
|
|
141
|
+
left out) read as one source. Moving a template between the component's
|
|
142
|
+
modules therefore no longer changes its findings: a keyboard handler in a
|
|
143
|
+
companion covers an `@click` in the host, and an `@click` in a companion
|
|
144
|
+
is judged too. Toolkit's `panel-item` counts as natively
|
|
145
|
+
keyboard-activated, beside `button`, form controls and the `moz-*` buttons.
|
|
146
|
+
|
|
147
|
+
`minComponents` sets the fewest components a full `furnace validate` must
|
|
148
|
+
judge. A run under it, an empty tree included, fails with a
|
|
149
|
+
`component-floor` error on `furnace.json`, so a moved or emptied
|
|
150
|
+
components tree cannot pass by validating nothing. A run naming one
|
|
151
|
+
component is not held to it.
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{ "minComponents": 40 }
|
|
155
|
+
```
|
|
156
|
+
|
|
115
157
|
`optInChecks` turns on checks that are off by default:
|
|
116
158
|
|
|
117
159
|
```json
|