obsidian-dev-utils 101.4.1 → 101.5.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 (41) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/integration-test-plugin/main.js +104 -9
  3. package/dist/lib/cjs/__merged.cjs +7 -1
  4. package/dist/lib/cjs/__merged.d.cts +2 -2
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/html-element.cjs +14 -3
  7. package/dist/lib/cjs/obsidian/html-element.d.cts +46 -2
  8. package/dist/lib/cjs/obsidian/link.cjs +50 -8
  9. package/dist/lib/cjs/obsidian/link.d.cts +289 -1
  10. package/dist/lib/cjs/obsidian/modals/prompt.cjs +9 -2
  11. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +12 -0
  12. package/dist/lib/cjs/obsidian/modals/select-item.cjs +13 -1
  13. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +14 -0
  14. package/dist/lib/cjs/obsidian/obsidian-settings.cjs +28 -1
  15. package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +30 -0
  16. package/dist/lib/cjs/script-utils/gate.cjs +195 -0
  17. package/dist/lib/cjs/script-utils/gate.d.cts +78 -0
  18. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  19. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  20. package/dist/lib/cjs/script-utils/version.cjs +7 -15
  21. package/dist/lib/esm/__merged.d.mts +2 -2
  22. package/dist/lib/esm/__merged.mjs +11 -3
  23. package/dist/lib/esm/generated-during-build.mjs +1 -1
  24. package/dist/lib/esm/obsidian/html-element.d.mts +46 -2
  25. package/dist/lib/esm/obsidian/html-element.mjs +15 -2
  26. package/dist/lib/esm/obsidian/link.d.mts +289 -1
  27. package/dist/lib/esm/obsidian/link.mjs +54 -9
  28. package/dist/lib/esm/obsidian/modals/prompt.d.mts +12 -0
  29. package/dist/lib/esm/obsidian/modals/prompt.mjs +10 -3
  30. package/dist/lib/esm/obsidian/modals/select-item.d.mts +14 -0
  31. package/dist/lib/esm/obsidian/modals/select-item.mjs +13 -1
  32. package/dist/lib/esm/obsidian/obsidian-settings.d.mts +30 -0
  33. package/dist/lib/esm/obsidian/obsidian-settings.mjs +26 -1
  34. package/dist/lib/esm/script-utils/gate.d.mts +78 -0
  35. package/dist/lib/esm/script-utils/gate.mjs +93 -0
  36. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  37. package/dist/lib/esm/script-utils/index.mjs +3 -1
  38. package/dist/lib/esm/script-utils/version.mjs +7 -18
  39. package/dist/templates/scripts/gate/gate.ts +10 -0
  40. package/package.json +2 -1
  41. package/script-utils/gate/package.json +6 -0
@@ -5,6 +5,28 @@
5
5
  * This module provides utility functions for working with Obsidian settings.
6
6
  */
7
7
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
8
+ /**
9
+ * A way an input decides whether it is spell-checked.
10
+ *
11
+ * The `spellcheck` attribute is the whole mechanism: Obsidian never calls Electron's
12
+ * `setSpellCheckerEnabled`, it only sets the attribute per element. So `AlwaysOn` really does spell-check
13
+ * with `Editor > Spellcheck` off, and what it invokes is Chromium's built-in checker.
14
+ */
15
+ export declare enum SpellcheckMode {
16
+ /**
17
+ * Always spell-check the input, whatever `Editor > Spellcheck` says.
18
+ */
19
+ AlwaysOn = "AlwaysOn",
20
+ /**
21
+ * Follow `Editor > Spellcheck`, the way Obsidian's own name-entry surfaces do — the inline note title,
22
+ * the file explorer's inline rename, the properties fields.
23
+ */
24
+ FollowObsidianSetting = "FollowObsidianSetting",
25
+ /**
26
+ * Never spell-check the input, whatever `Editor > Spellcheck` says.
27
+ */
28
+ Off = "Off"
29
+ }
8
30
  /**
9
31
  * A format of the new link.
10
32
  */
@@ -23,6 +45,14 @@ export declare function getNewLinkFormat(app: App): NewLinkFormat;
23
45
  * @returns Whether the spellcheck is enabled.
24
46
  */
25
47
  export declare function isSpellcheckEnabled(app: App): boolean;
48
+ /**
49
+ * Resolves a {@link SpellcheckMode} against the Obsidian settings.
50
+ *
51
+ * @param app - The Obsidian app instance.
52
+ * @param spellcheckMode - The mode to resolve.
53
+ * @returns Whether the input should be spell-checked.
54
+ */
55
+ export declare function isSpellcheckEnabledForMode(app: App, spellcheckMode: SpellcheckMode): boolean;
26
56
  /**
27
57
  * Retrieves whether to use wikilinks based on the Obsidian settings.
28
58
  *
@@ -0,0 +1,195 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var gate_exports = {};
144
+ __export(gate_exports, {
145
+ gate: () => gate,
146
+ parseGateArguments: () => parseGateArguments
147
+ });
148
+ module.exports = __toCommonJS(gate_exports);
149
+ var import_node_util = require('node:util');
150
+ var import_npm_run = require('./npm-run.cjs');
151
+ async function gate(options = {}) {
152
+ const {
153
+ shouldBuild = true,
154
+ shouldRunChecks = true,
155
+ shouldRunIntegrationTests = false
156
+ } = options;
157
+ if (shouldRunChecks) {
158
+ await (0, import_npm_run.npmRun)("format:check");
159
+ await (0, import_npm_run.npmRun)("spellcheck");
160
+ await (0, import_npm_run.npmRun)("lint:md");
161
+ }
162
+ if (shouldBuild) {
163
+ await (0, import_npm_run.npmRun)("build");
164
+ }
165
+ if (shouldRunChecks) {
166
+ await (0, import_npm_run.npmRun)("lint");
167
+ await (0, import_npm_run.npmRunOptional)("find-overexposed");
168
+ if (await (0, import_npm_run.npmRunOptional)("test:coverage") === import_npm_run.NpmRunOptionalResult.Skipped) {
169
+ await (0, import_npm_run.npmRunOptional)("test");
170
+ }
171
+ if (shouldRunIntegrationTests) {
172
+ await (0, import_npm_run.npmRunOptional)("test:integration");
173
+ }
174
+ }
175
+ }
176
+ function parseGateArguments($arguments) {
177
+ const { values } = (0, import_node_util.parseArgs)({
178
+ // eslint-disable-next-line unicorn/name-replacements -- `args` is the option name Node's `parseArgs` reads.
179
+ args: $arguments,
180
+ options: {
181
+ "no-build": { type: "boolean" },
182
+ "no-checks": { type: "boolean" }
183
+ }
184
+ });
185
+ return {
186
+ shouldBuild: !(values["no-build"] ?? false),
187
+ shouldRunChecks: !(values["no-checks"] ?? false)
188
+ };
189
+ }
190
+ // Annotate the CommonJS export names for ESM import in node:
191
+ 0 && (module.exports = {
192
+ gate,
193
+ parseGateArguments
194
+ });
195
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9nYXRlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGJyYW5jaCBnYXRlOiB0aGUgdmVyaWZpY2F0aW9uIHNlcXVlbmNlIHRoYXQgYHVwZGF0ZVZlcnNpb25gIHJ1bnMgYXMgaXRzIHJlbGVhc2UgcHJlZmxpZ2h0LCBhdmFpbGFibGVcbiAqIGFzIGEgY29tbWFuZCBvZiBpdHMgb3duLlxuICpcbiAqIEZvdXIgb2YgdGhlIHByZWZsaWdodCdzIGNoZWNrcyBcdTIwMTQgYGZvcm1hdDpjaGVja2AsIGBzcGVsbGNoZWNrYCwgYGZpbmQtb3ZlcmV4cG9zZWRgIGFuZCBgdGVzdDpjb3ZlcmFnZWAgXHUyMDE0XG4gKiBhcmUgcmVhY2hhYmxlIGJ5IG5vIG90aGVyIHJvdXRpbmUgY29tbWFuZC4gU28gdGhlIG5hdHVyYWwgYnJhbmNoIGdhdGUgKGJ1aWxkLCBsaW50LCB0ZXN0KSBjYW4gYmUgZ3JlZW5cbiAqIHdoaWxlIHRoZSByZWxlYXNlIGlzIHN0aWxsIGdvaW5nIHRvIGZhaWwsIGFuZCB0aGUgZmFpbHVyZSBhcnJpdmVzIGF0IHJlbGVhc2UgdGltZSByYXRoZXIgdGhhbiBpbiBzZWNvbmRzXG4gKiBvbiB0aGUgYnJhbmNoLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyBzbyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBjb2RlIHJhdGhlciB0aGFuIHR3byBsaXN0cyB0aGF0IGFncmVlIHRvZGF5OiBgdXBkYXRlVmVyc2lvbmBcbiAqIGNhbGxzIHtAbGluayBnYXRlfSwgYW5kIGEgY2hlY2sgYWRkZWQgaGVyZSBpcyByZWFjaGFibGUgZnJvbSBib3RoLiBXaGF0IHRoZSBnYXRlIGRlbGliZXJhdGVseSBsZWF2ZXMgdG9cbiAqIHRoZSByZWxlYXNlIHBhdGggaXMgdGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIFx1MjAxNCBhIGJyYW5jaCBnYXRlIGlzIHJ1biBvbiBhIGRpcnR5IHRyZWUsIHdoaWNoIGlzIHRoZSB3aG9sZVxuICogcG9pbnQgb2YgcnVubmluZyBpdCBiZWZvcmUgY29tbWl0dGluZyBcdTIwMTQgYW5kIHRoZSBpbnRlZ3JhdGlvbiBzdWl0ZSwgd2hpY2ggaGFzIHRvIHJ1biBpbiBzZXF1ZW5jZSBhY3Jvc3NcbiAqIHRoZSB3aG9sZSBmbGVldCBhbmQgc28gY2Fubm90IGJlIHBhcnQgb2YgYSBjb21tYW5kIHJ1biBjYXN1YWxseS5cbiAqXG4gKiBUaGUgdGVzdHMgcnVuIE9OQ0UsIHRocm91Z2ggYHRlc3Q6Y292ZXJhZ2VgIHdoZXJlIHRoZSBwcm9qZWN0IGRlZmluZXMgaXQgYW5kIHRocm91Z2ggYHRlc3RgIG90aGVyd2lzZS5cbiAqIFJ1bm5pbmcgYm90aCwgYXMgdGhpcyBkaWQgdW50aWwgMjAyNi0wOS0wNSwgd2FzIGEgZHVwbGljYXRlIGV2ZXJ5d2hlcmUgaXQgbWF0dGVyZWQ6IGEgcHJvamVjdCBzY29wZXMgaXRzXG4gKiB0d28gdGVzdCBzY3JpcHRzIHRvIHRoZSBzYW1lIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgZXZlcnkgcmVwbyBpbiB0aGlzIHdvcmtzcGFjZSBwYXNzZXMgdGhlIHNhbWUgYHByb2plY3RzYFxuICogYXJyYXkgdG8gYm90aCBcdTIwMTQgc28gYHRlc3Q6Y292ZXJhZ2VgIGlzIGB0ZXN0YCBwbHVzIHRoZSB0aHJlc2hvbGQgZmxhZ3MsIG92ZXIgdGhlIGlkZW50aWNhbCBmaWxlcy4gSXQgYnV5c1xuICogbm8gZmFpbC1mYXN0IGVpdGhlciwgYmVjYXVzZSB0aGUgY292ZXJhZ2UgcnVuIGZhaWxzIG9uIGV4YWN0bHkgdGhlIGZhaWx1cmVzIHRoZSBwbGFpbiBydW4gd291bGQgaGF2ZVxuICogY2F1Z2h0LiBUaGUgb25lIHRoaW5nIGxvc3QgaXMgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIG9mZiBvbmx5IHRoZSBjb3ZlcmFnZSBoYWxmOiBgVEVTVF9DT1ZFUkFHRT0wYCBub3dcbiAqIHR1cm5zIG9mZiB0aGUgZ2F0ZSdzIHdob2xlIHRlc3Qgc3RlcCByYXRoZXIgdGhhbiBkZW1vdGluZyBpdCB0byBgdGVzdGAuXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcblxuaW1wb3J0IHtcbiAgbnBtUnVuLFxuICBucG1SdW5PcHRpb25hbCxcbiAgTnBtUnVuT3B0aW9uYWxSZXN1bHRcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2F0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGJ1aWxkLiBUaGUgYnVpbGQgaXMgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrIFx1MjAxNCBpdCBpcyBrZXB0IGluIHRoZSBnYXRlIGJlY2F1c2UgaXQgaXNcbiAgICogdGhlIG9ubHkgc3RlcCB0aGF0IHR5cGUtY2hlY2tzIHRoZSBwcm9qZWN0LCBhbmQgYSBncmVlbiBsaW50IGlzIG5vdCBhIHR5cGUtY2hlY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgdmVyaWZpY2F0aW9uIGNoZWNrcy4gV2hlbiBgZmFsc2VgLCBvbmx5IHRoZSBidWlsZCBydW5zLCB3aGljaCBpcyB3aGF0XG4gICAqIGBucG0gcnVuIHZlcnNpb24gLS0gLS1uby1jaGVja3NgIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGludGVncmF0aW9uIHRlc3Qgc3VpdGUuIE9mZiBieSBkZWZhdWx0OiBpbnRlZ3JhdGlvbiBydW5zIGhhdmUgdG8gYmUgc2VyaWFsaXplZFxuICAgKiBhY3Jvc3MgdGhlIHdob2xlIHNldCBvZiBzaWJsaW5nIHJlcG9zaXRvcmllcywgc28gYSBnYXRlIHRoYXQgYWx3YXlzIHJhbiB0aGVtIHdvdWxkIGNvbGxpZGUgd2l0aFxuICAgKiBhbm90aGVyIHNlc3Npb24ncyBydW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHZlcmlmaWNhdGlvbiBzZXF1ZW5jZSB0aGF0IGBucG0gcnVuIHZlcnNpb25gIHJ1bnMgYXMgaXRzIHByZWZsaWdodC5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgZGVsaWJlcmF0ZTogdGhlIGNoZWNrcyB0aGF0IGZpbmlzaCBpbiBzZWNvbmRzIChgZm9ybWF0OmNoZWNrYCwgYHNwZWxsY2hlY2tgLCBgbGludDptZGApIHJ1blxuICogZmlyc3QsIHNvIGEgdHlwbyBmYWlscyB0aGUgZ2F0ZSBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGFmdGVyIHRoZSBjb3ZlcmFnZSBydW4uIEVhY2ggc3RlcCBpcyBkaXNwYXRjaGVkXG4gKiB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIsIHNvIGEgcHJvamVjdCBvdmVycmlkaW5nIG9uZSBvZiB0aGVzZSBzY3JpcHRzIGdldHMgaXRzIG93biB2ZXJzaW9uLCBhbmQgZWFjaFxuICogc3RlcCBjYXJyaWVzIGl0cyBvd24gZW52aXJvbm1lbnQgb2ZmIHN3aXRjaC5cbiAqXG4gKiBUaGUgc3RlcHMgdGhhdCBhcmUgcnVuIHdpdGgge0BsaW5rIG5wbVJ1bk9wdGlvbmFsfSBhcmUgc2tpcHBlZCB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGRlZmluZSB0aGVtOyB0aGVcbiAqIHJlc3QgYXJlIHJlcXVpcmVkLiBUaGUgdGVzdCBzdGVwIGlzIHRoZSBvbmUgcGxhY2UgdGhhdCByZWFkcyB0aGF0IHNraXA6IGB0ZXN0OmNvdmVyYWdlYCBpcyBwcmVmZXJyZWQsIGFuZFxuICogYHRlc3RgIHJ1bnMgb25seSBhcyBpdHMgZmFsbGJhY2ssIHNvIHRoZSBzdWl0ZSBpcyBuZXZlciBydW4gdHdpY2UuIFRoZSB1bml0IHRlc3RzIHN0YXkgYWhlYWQgb2ZcbiAqIGB0ZXN0OmludGVncmF0aW9uYCBmb3IgdGhlIHNhbWUgZmFzdGVzdC1maXJzdCByZWFzb24gXHUyMDE0IGEgYnJva2VuIHVuaXQgdGVzdCBzaG91bGQgZmFpbCBiZWZvcmUgYW5cbiAqIGludGVncmF0aW9uIHN1aXRlIGlzIHN0YXJ0ZWQsIG5vdCBhZnRlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2F0ZU9wdGlvbnN9IGNvbnRyb2xsaW5nIHdoaWNoIHN0ZXBzIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBwYXNzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnYXRlKG9wdGlvbnM6IEdhdGVPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMgPSBmYWxzZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRCdWlsZCkge1xuICAgIGF3YWl0IG5wbVJ1bignYnVpbGQnKTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgnZmluZC1vdmVyZXhwb3NlZCcpO1xuXG4gICAgaWYgKGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmNvdmVyYWdlJykgPT09IE5wbVJ1bk9wdGlvbmFsUmVzdWx0LlNraXBwZWQpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHMpIHtcbiAgICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciB0aGUgZ2F0ZSBzY3JpcHQuXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEdhdGVPcHRpb25zfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2F0ZUFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IEdhdGVPcHRpb25zIHtcbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGFyZ3NgIGlzIHRoZSBvcHRpb24gbmFtZSBOb2RlJ3MgYHBhcnNlQXJnc2AgcmVhZHMuXG4gICAgYXJnczogJGFyZ3VtZW50cyxcbiAgICBvcHRpb25zOiB7XG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkQnVpbGQ6ICEodmFsdWVzWyduby1idWlsZCddID8/IGZhbHNlKSxcbiAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwQkEsdUJBQTBCO0FBRTFCLHFCQUlPO0FBaURQLGVBQXNCLEtBQUssVUFBdUIsQ0FBQyxHQUFrQjtBQUNuRSxRQUFNO0FBQUEsSUFDSixjQUFjO0FBQUEsSUFDZCxrQkFBa0I7QUFBQSxJQUNsQiw0QkFBNEI7QUFBQSxFQUM5QixJQUFJO0FBRUosTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxjQUFjO0FBQzNCLGNBQU0sdUJBQU8sWUFBWTtBQUN6QixjQUFNLHVCQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUVBLE1BQUksYUFBYTtBQUNmLGNBQU0sdUJBQU8sT0FBTztBQUFBLEVBQ3RCO0FBRUEsTUFBSSxpQkFBaUI7QUFDbkIsY0FBTSx1QkFBTyxNQUFNO0FBQ25CLGNBQU0sK0JBQWUsa0JBQWtCO0FBRXZDLFFBQUksVUFBTSwrQkFBZSxlQUFlLE1BQU0sb0NBQXFCLFNBQVM7QUFDMUUsZ0JBQU0sK0JBQWUsTUFBTTtBQUFBLElBQzdCO0FBRUEsUUFBSSwyQkFBMkI7QUFDN0IsZ0JBQU0sK0JBQWUsa0JBQWtCO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLG1CQUFtQixZQUFtQztBQUNwRSxRQUFNLEVBQUUsT0FBTyxRQUFJLDRCQUFVO0FBQUE7QUFBQSxJQUUzQixNQUFNO0FBQUEsSUFDTixTQUFTO0FBQUEsTUFDUCxZQUFZLEVBQUUsTUFBTSxVQUFVO0FBQUEsTUFDOUIsYUFBYSxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTztBQUFBLElBQ0wsYUFBYSxFQUFFLE9BQU8sVUFBVSxLQUFLO0FBQUEsSUFDckMsaUJBQWlCLEVBQUUsT0FBTyxXQUFXLEtBQUs7QUFBQSxFQUM1QztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,78 @@
1
+ /// <reference path="../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The branch gate: the verification sequence that `updateVersion` runs as its release preflight, available
6
+ * as a command of its own.
7
+ *
8
+ * Four of the preflight's checks — `format:check`, `spellcheck`, `find-overexposed` and `test:coverage` —
9
+ * are reachable by no other routine command. So the natural branch gate (build, lint, test) can be green
10
+ * while the release is still going to fail, and the failure arrives at release time rather than in seconds
11
+ * on the branch.
12
+ *
13
+ * This module exists so the two are the same code rather than two lists that agree today: `updateVersion`
14
+ * calls {@link gate}, and a check added here is reachable from both. What the gate deliberately leaves to
15
+ * the release path is the clean-repo assertion — a branch gate is run on a dirty tree, which is the whole
16
+ * point of running it before committing — and the integration suite, which has to run in sequence across
17
+ * the whole fleet and so cannot be part of a command run casually.
18
+ *
19
+ * The tests run ONCE, through `test:coverage` where the project defines it and through `test` otherwise.
20
+ * Running both, as this did until 2026-09-05, was a duplicate everywhere it mattered: a project scopes its
21
+ * two test scripts to the same vitest projects — every repo in this workspace passes the same `projects`
22
+ * array to both — so `test:coverage` is `test` plus the threshold flags, over the identical files. It buys
23
+ * no fail-fast either, because the coverage run fails on exactly the failures the plain run would have
24
+ * caught. The one thing lost is the ability to switch off only the coverage half: `TEST_COVERAGE=0` now
25
+ * turns off the gate's whole test step rather than demoting it to `test`.
26
+ */
27
+ /**
28
+ * Options for {@link gate}.
29
+ */
30
+ export interface GateOptions {
31
+ /**
32
+ * Whether to run the build. The build is not a verification check — it is kept in the gate because it is
33
+ * the only step that type-checks the project, and a green lint is not a type-check.
34
+ *
35
+ * @default `true`
36
+ */
37
+ readonly shouldBuild?: boolean;
38
+ /**
39
+ * Whether to run the verification checks. When `false`, only the build runs, which is what
40
+ * `npm run version -- --no-checks` does.
41
+ *
42
+ * @default `true`
43
+ */
44
+ readonly shouldRunChecks?: boolean;
45
+ /**
46
+ * Whether to run the integration test suite. Off by default: integration runs have to be serialized
47
+ * across the whole set of sibling repositories, so a gate that always ran them would collide with
48
+ * another session's run.
49
+ *
50
+ * @default `false`
51
+ */
52
+ readonly shouldRunIntegrationTests?: boolean;
53
+ }
54
+ /**
55
+ * Runs the verification sequence that `npm run version` runs as its preflight.
56
+ *
57
+ * The order is deliberate: the checks that finish in seconds (`format:check`, `spellcheck`, `lint:md`) run
58
+ * first, so a typo fails the gate immediately instead of after the coverage run. Each step is dispatched
59
+ * through the package manager, so a project overriding one of these scripts gets its own version, and each
60
+ * step carries its own environment off switch.
61
+ *
62
+ * The steps that are run with {@link npmRunOptional} are skipped when the project does not define them; the
63
+ * rest are required. The test step is the one place that reads that skip: `test:coverage` is preferred, and
64
+ * `test` runs only as its fallback, so the suite is never run twice. The unit tests stay ahead of
65
+ * `test:integration` for the same fastest-first reason — a broken unit test should fail before an
66
+ * integration suite is started, not after.
67
+ *
68
+ * @param options - The {@link GateOptions} controlling which steps run.
69
+ * @returns A {@link Promise} that resolves when every step has passed.
70
+ */
71
+ export declare function gate(options?: GateOptions): Promise<void>;
72
+ /**
73
+ * Parses the command-line arguments for the gate script.
74
+ *
75
+ * @param $arguments - The command-line arguments to parse.
76
+ * @returns The parsed {@link GateOptions}.
77
+ */
78
+ export declare function parseGateArguments($arguments: string[]): GateOptions;
@@ -166,6 +166,7 @@ __export(script_utils_exports, {
166
166
  exec: () => exec,
167
167
  formatters: () => formatters,
168
168
  fs: () => fs,
169
+ gate: () => gate,
169
170
  git: () => git,
170
171
  json: () => json,
171
172
  linters: () => linters,
@@ -196,6 +197,7 @@ var env_toggle = __toESM(__extractDefault(require('./env-toggle.cjs')), 1);
196
197
  var exec = __toESM(__extractDefault(require('./exec.cjs')), 1);
197
198
  var formatters = __toESM(__extractDefault(require('./formatters/index.cjs')), 1);
198
199
  var fs = __toESM(__extractDefault(require('./fs.cjs')), 1);
200
+ var gate = __toESM(__extractDefault(require('./gate.cjs')), 1);
199
201
  var git = __toESM(__extractDefault(require('./git.cjs')), 1);
200
202
  var json = __toESM(__extractDefault(require('./json.cjs')), 1);
201
203
  var linters = __toESM(__extractDefault(require('./linters/index.cjs')), 1);
@@ -226,6 +228,7 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
226
228
  exec,
227
229
  formatters,
228
230
  fs,
231
+ gate,
229
232
  git,
230
233
  json,
231
234
  linters,
@@ -241,4 +244,4 @@ var warnings_as_errors = __toESM(__extractDefault(require('./warnings-as-errors.
241
244
  version,
242
245
  "warnings-as-errors": null
243
246
  });
244
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWFwcC1qc29uJyBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtYnV0dG9ucycgZnJvbSAnLi9kZW1vLXZhdWx0LWJ1dHRvbnMudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtY292ZXJhZ2UnIGZyb20gJy4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyc7XG5leHBvcnQgKiBhcyAnZGVtby12YXVsdCcgZnJvbSAnLi9kZW1vLXZhdWx0LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2l0JyBmcm9tICcuL2dpdC50cyc7XG5leHBvcnQgKiBhcyAnanNvbicgZnJvbSAnLi9qc29uLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzJyBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLW1hbmFnZXInIGZyb20gJy4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG5leHBvcnQgKiBhcyAnd2FybmluZ3MtYXMtZXJyb3JzJyBmcm9tICcuL3dhcm5pbmdzLWFzLWVycm9ycy50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFBO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSw2QkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsaUJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUE7QUFBQSx3QkFBQUM7QUFBQSxFQUFBLCtCQUFBQztBQUFBLEVBQUE7QUFBQSw4QkFBQUM7QUFBQTtBQUFBO0FBRUEsWUFBeUI7QUFDekIsZUFBNEI7QUFDNUIsSUFBQWhCLHNCQUF1QztBQUN2QyxJQUFBQyxZQUE2QjtBQUM3QixJQUFBQyxpQkFBa0M7QUFDbEMsSUFBQUMsb0JBQXFDO0FBQ3JDLElBQUFFLHNCQUF1QztBQUN2QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsc0JBQXVDO0FBQ3ZDLElBQUFILGFBQThCO0FBQzlCLElBQUFJLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLGlCQUE4QjtBQUM5QixTQUFzQjtBQUN0QixVQUF1QjtBQUN2QixXQUF3QjtBQUN4QixjQUEyQjtBQUMzQixJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsVUFBMkI7QUFDM0IsVUFBdUI7QUFDdkIsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLGtCQUFtQztBQUNuQyxXQUF3QjtBQUN4QixJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyx3QkFBeUM7QUFDekMsY0FBMkI7QUFDM0IsSUFBQUMscUJBQXNDOyIsCiAgIm5hbWVzIjogWyJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJkZW1vLXZhdWx0IiwgImRlbW8tdmF1bHQtYXBwLWpzb24iLCAiZGVtby12YXVsdC1idXR0b25zIiwgImRlbW8tdmF1bHQtY292ZXJhZ2UiLCAiZW52LXRvZ2dsZSIsICJuYW5vLXN0YWdlZC1jb25maWciLCAibnBtLXB1Ymxpc2giLCAibnBtLXJ1biIsICJvYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocyIsICJwYWNrYWdlLW1hbmFnZXIiLCAidGVzdC1ydW5uZXJzIiwgInZhbGlkYXRlLWRlY2xhcmF0aW9ucyIsICJ3YXJuaW5ncy1hcy1lcnJvcnMiXQp9Cg==
247
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdidWlsZCcgZnJvbSAnLi9idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnYnVuZGxlcnMnIGZyb20gJy4vYnVuZGxlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2NoZWNrLXByb2plY3QtdHlwZXMnIGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5leHBvcnQgKiBhcyAnY2xpLXV0aWxzJyBmcm9tICcuL2NsaS11dGlscy50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1nZW5lcmF0b3InIGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtY29uZmlnJyBmcm9tICcuL2NvbW1pdGxpbnQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdkZW1vLXZhdWx0LWFwcC1qc29uJyBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtYnV0dG9ucycgZnJvbSAnLi9kZW1vLXZhdWx0LWJ1dHRvbnMudHMnO1xuZXhwb3J0ICogYXMgJ2RlbW8tdmF1bHQtY292ZXJhZ2UnIGZyb20gJy4vZGVtby12YXVsdC1jb3ZlcmFnZS50cyc7XG5leHBvcnQgKiBhcyAnZGVtby12YXVsdCcgZnJvbSAnLi9kZW1vLXZhdWx0LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpbnRlcnMnIGZyb20gJy4vbGludGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnbmFuby1zdGFnZWQtY29uZmlnJyBmcm9tICcuL25hbm8tc3RhZ2VkLWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXB1Ymxpc2gnIGZyb20gJy4vbnBtLXB1Ymxpc2gudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1ydW4nIGZyb20gJy4vbnBtLXJ1bi50cyc7XG5leHBvcnQgKiBhcyAnbnBtJyBmcm9tICcuL25wbS50cyc7XG5leHBvcnQgKiBhcyAnb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMnIGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3Jvb3QnIGZyb20gJy4vcm9vdC50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbmV4cG9ydCAqIGFzICd3YXJuaW5ncy1hcy1lcnJvcnMnIGZyb20gJy4vd2FybmluZ3MtYXMtZXJyb3JzLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSwrQkFBQUE7QUFBQSxFQUFBLG1CQUFBQztBQUFBLEVBQUEsd0JBQUFDO0FBQUEsRUFBQSwyQkFBQUM7QUFBQSxFQUFBLG9CQUFBQztBQUFBLEVBQUEsNkJBQUFDO0FBQUEsRUFBQSw0QkFBQUM7QUFBQSxFQUFBLDZCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBO0FBQUEsd0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGVBQTRCO0FBQzVCLElBQUFoQixzQkFBdUM7QUFDdkMsSUFBQUMsWUFBNkI7QUFDN0IsSUFBQUMsaUJBQWtDO0FBQ2xDLElBQUFDLG9CQUFxQztBQUNyQyxJQUFBRSxzQkFBdUM7QUFDdkMsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLHNCQUF1QztBQUN2QyxJQUFBSCxhQUE4QjtBQUM5QixJQUFBSSxhQUE4QjtBQUM5QixXQUF3QjtBQUN4QixpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsY0FBMkI7QUFDM0IsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLGNBQStCO0FBQy9CLElBQUFDLFVBQTJCO0FBQzNCLFVBQXVCO0FBQ3ZCLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyxrQkFBbUM7QUFDbkMsV0FBd0I7QUFDeEIsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUMsd0JBQXlDO0FBQ3pDLGNBQTJCO0FBQzNCLElBQUFDLHFCQUFzQzsiLAogICJuYW1lcyI6IFsiY2hlY2stcHJvamVjdC10eXBlcyIsICJjbGktdXRpbHMiLCAiY29kZS1nZW5lcmF0b3IiLCAiY29tbWl0bGludC1jb25maWciLCAiZGVtby12YXVsdCIsICJkZW1vLXZhdWx0LWFwcC1qc29uIiwgImRlbW8tdmF1bHQtYnV0dG9ucyIsICJkZW1vLXZhdWx0LWNvdmVyYWdlIiwgImVudi10b2dnbGUiLCAibmFuby1zdGFnZWQtY29uZmlnIiwgIm5wbS1wdWJsaXNoIiwgIm5wbS1ydW4iLCAib2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMiLCAicGFja2FnZS1tYW5hZ2VyIiwgInRlc3QtcnVubmVycyIsICJ2YWxpZGF0ZS1kZWNsYXJhdGlvbnMiLCAid2FybmluZ3MtYXMtZXJyb3JzIl0KfQo=
@@ -13,6 +13,7 @@ export * as 'env-toggle' from './env-toggle.cjs';
13
13
  export * as 'exec' from './exec.cjs';
14
14
  export * as 'formatters' from './formatters/index.cjs';
15
15
  export * as 'fs' from './fs.cjs';
16
+ export * as 'gate' from './gate.cjs';
16
17
  export * as 'git' from './git.cjs';
17
18
  export * as 'json' from './json.cjs';
18
19
  export * as 'linters' from './linters/index.cjs';