@wirecat/cli-base 0.0.0-stage → 0.22.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/LICENSE +204 -0
- package/README.md +390 -2
- package/config/biome.base.json +56 -0
- package/config/cspell.json +57 -0
- package/config/lefthook.yml +34 -0
- package/config/rumdl.toml +9 -0
- package/config/tsconfig.base.json +21 -0
- package/config/tsconfig.scripts.json +13 -0
- package/config/tsconfig.test.json +11 -0
- package/config/vale/CliDocs/Filler.yml +9 -0
- package/config/vale/CliDocs/SentenceLength.yml +6 -0
- package/config/vale/Tg/Tone.yml +7 -0
- package/config/wirecat/LICENSE +204 -0
- package/config/wirecat/biome.base.json +56 -0
- package/config/wirecat/check.mjs +41 -0
- package/config/wirecat/cspell.json +80 -0
- package/config/wirecat/lefthook.yml +26 -0
- package/config/wirecat/manifest.json +23 -0
- package/config/wirecat/markdownlint.json +10 -0
- package/config/wirecat/rumdl.toml +9 -0
- package/dist/codegen/index.d.ts +12 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +11 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/manifest.d.ts +47 -0
- package/dist/codegen/manifest.d.ts.map +1 -0
- package/dist/codegen/manifest.js +73 -0
- package/dist/codegen/manifest.js.map +1 -0
- package/dist/codegen/model.d.ts +146 -0
- package/dist/codegen/model.d.ts.map +1 -0
- package/dist/codegen/model.js +7 -0
- package/dist/codegen/model.js.map +1 -0
- package/dist/codegen/names.d.ts +4 -0
- package/dist/codegen/names.d.ts.map +1 -0
- package/dist/codegen/names.js +46 -0
- package/dist/codegen/names.js.map +1 -0
- package/dist/codegen/pipeline.d.ts +24 -0
- package/dist/codegen/pipeline.d.ts.map +1 -0
- package/dist/codegen/pipeline.js +193 -0
- package/dist/codegen/pipeline.js.map +1 -0
- package/dist/codegen/runtime.d.ts +24 -0
- package/dist/codegen/runtime.d.ts.map +1 -0
- package/dist/codegen/runtime.js +38 -0
- package/dist/codegen/runtime.js.map +1 -0
- package/dist/codegen/tree.d.ts +29 -0
- package/dist/codegen/tree.d.ts.map +1 -0
- package/dist/codegen/tree.js +87 -0
- package/dist/codegen/tree.js.map +1 -0
- package/dist/codegen/typescript.d.ts +6 -0
- package/dist/codegen/typescript.d.ts.map +1 -0
- package/dist/codegen/typescript.js +78 -0
- package/dist/codegen/typescript.js.map +1 -0
- package/dist/codegen/valibot.d.ts +10 -0
- package/dist/codegen/valibot.d.ts.map +1 -0
- package/dist/codegen/valibot.js +132 -0
- package/dist/codegen/valibot.js.map +1 -0
- package/dist/commands/document.d.ts +72 -0
- package/dist/commands/document.d.ts.map +1 -0
- package/dist/commands/document.js +71 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/index.d.ts +83 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +85 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/page.d.ts +80 -0
- package/dist/commands/page.d.ts.map +1 -0
- package/dist/commands/page.js +100 -0
- package/dist/commands/page.js.map +1 -0
- package/dist/completion/index.d.ts +37 -0
- package/dist/completion/index.d.ts.map +1 -0
- package/dist/completion/index.js +87 -0
- package/dist/completion/index.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +48 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +120 -0
- package/dist/credentials.js.map +1 -0
- package/dist/deadline.d.ts +14 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +88 -0
- package/dist/deadline.js.map +1 -0
- package/dist/dev/bin.d.ts +3 -0
- package/dist/dev/bin.d.ts.map +1 -0
- package/dist/dev/bin.js +8 -0
- package/dist/dev/bin.js.map +1 -0
- package/dist/dev/lint.d.ts +31 -0
- package/dist/dev/lint.d.ts.map +1 -0
- package/dist/dev/lint.js +148 -0
- package/dist/dev/lint.js.map +1 -0
- package/dist/dev/main.d.ts +7 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/dev/main.js +279 -0
- package/dist/dev/main.js.map +1 -0
- package/dist/dev/next-version.d.ts +11 -0
- package/dist/dev/next-version.d.ts.map +1 -0
- package/dist/dev/next-version.js +33 -0
- package/dist/dev/next-version.js.map +1 -0
- package/dist/dev/slow-tests.d.ts +14 -0
- package/dist/dev/slow-tests.d.ts.map +1 -0
- package/dist/dev/slow-tests.js +17 -0
- package/dist/dev/slow-tests.js.map +1 -0
- package/dist/dev/test-matrix.d.ts +35 -0
- package/dist/dev/test-matrix.d.ts.map +1 -0
- package/dist/dev/test-matrix.js +93 -0
- package/dist/dev/test-matrix.js.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/executable.d.ts +3 -0
- package/dist/executable.d.ts.map +1 -0
- package/dist/executable.js +41 -0
- package/dist/executable.js.map +1 -0
- package/dist/exit-codes.d.ts +11 -0
- package/dist/exit-codes.d.ts.map +1 -0
- package/dist/exit-codes.js +25 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/http/index.d.ts +20 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +46 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/keyring.d.ts +27 -0
- package/dist/keyring.d.ts.map +1 -0
- package/dist/keyring.js +45 -0
- package/dist/keyring.js.map +1 -0
- package/dist/legacy-paths.d.ts +33 -0
- package/dist/legacy-paths.d.ts.map +1 -0
- package/dist/legacy-paths.js +128 -0
- package/dist/legacy-paths.js.map +1 -0
- package/dist/logger.d.ts +12 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +7 -0
- package/dist/logger.js.map +1 -0
- package/dist/logging.d.ts +31 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +58 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/index.d.ts +32 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +113 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/output-buffer.d.ts +16 -0
- package/dist/output-buffer.d.ts.map +1 -0
- package/dist/output-buffer.js +69 -0
- package/dist/output-buffer.js.map +1 -0
- package/dist/paths.d.ts +35 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +45 -0
- package/dist/paths.js.map +1 -0
- package/dist/pretty.d.ts +12 -0
- package/dist/pretty.d.ts.map +1 -0
- package/dist/pretty.js +83 -0
- package/dist/pretty.js.map +1 -0
- package/dist/release/index.d.ts +38 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +91 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/markdown.d.ts +36 -0
- package/dist/release/markdown.d.ts.map +1 -0
- package/dist/release/markdown.js +153 -0
- package/dist/release/markdown.js.map +1 -0
- package/dist/release/structure.d.ts +16 -0
- package/dist/release/structure.d.ts.map +1 -0
- package/dist/release/structure.js +74 -0
- package/dist/release/structure.js.map +1 -0
- package/dist/renderer.d.ts +34 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +55 -0
- package/dist/renderer.js.map +1 -0
- package/dist/result-fields.d.ts +4 -0
- package/dist/result-fields.d.ts.map +1 -0
- package/dist/result-fields.js +56 -0
- package/dist/result-fields.js.map +1 -0
- package/dist/retry.d.ts +27 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +26 -0
- package/dist/retry.js.map +1 -0
- package/dist/sanitize.d.ts +25 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +52 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/skill/index.d.ts +78 -0
- package/dist/skill/index.d.ts.map +1 -0
- package/dist/skill/index.js +190 -0
- package/dist/skill/index.js.map +1 -0
- package/dist/standards/errors.d.ts +40 -0
- package/dist/standards/errors.d.ts.map +1 -0
- package/dist/standards/errors.js +33 -0
- package/dist/standards/errors.js.map +1 -0
- package/dist/standards/index.d.ts +8 -0
- package/dist/standards/index.d.ts.map +1 -0
- package/dist/standards/index.js +8 -0
- package/dist/standards/index.js.map +1 -0
- package/dist/standards/lint.d.ts +29 -0
- package/dist/standards/lint.d.ts.map +1 -0
- package/dist/standards/lint.js +50 -0
- package/dist/standards/lint.js.map +1 -0
- package/dist/standards/log.d.ts +21 -0
- package/dist/standards/log.d.ts.map +1 -0
- package/dist/standards/log.js +18 -0
- package/dist/standards/log.js.map +1 -0
- package/dist/standards/output.d.ts +126 -0
- package/dist/standards/output.d.ts.map +1 -0
- package/dist/standards/output.js +54 -0
- package/dist/standards/output.js.map +1 -0
- package/dist/standards/registry.d.ts +18 -0
- package/dist/standards/registry.d.ts.map +1 -0
- package/dist/standards/registry.js +41 -0
- package/dist/standards/registry.js.map +1 -0
- package/dist/standards/steps.d.ts +28 -0
- package/dist/standards/steps.d.ts.map +1 -0
- package/dist/standards/steps.js +56 -0
- package/dist/standards/steps.js.map +1 -0
- package/dist/standards/vocabulary.d.ts +40 -0
- package/dist/standards/vocabulary.d.ts.map +1 -0
- package/dist/standards/vocabulary.js +242 -0
- package/dist/standards/vocabulary.js.map +1 -0
- package/dist/streams.d.ts +24 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +26 -0
- package/dist/streams.js.map +1 -0
- package/dist/testing/index.d.ts +24 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +29 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/time.d.ts +21 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +19 -0
- package/dist/time.js.map +1 -0
- package/dist/update/index.d.ts +76 -0
- package/dist/update/index.d.ts.map +1 -0
- package/dist/update/index.js +160 -0
- package/dist/update/index.js.map +1 -0
- package/package.json +135 -4
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type KeyringStore } from "./keyring.js";
|
|
2
|
+
export declare const CREDENTIAL_STORAGE: readonly ["auto", "keyring", "file"];
|
|
3
|
+
export type CredentialStorage = (typeof CREDENTIAL_STORAGE)[number];
|
|
4
|
+
export type CredentialSource = "environment" | "keyring" | "file";
|
|
5
|
+
export interface StoredCredential {
|
|
6
|
+
secret: string;
|
|
7
|
+
source: CredentialSource;
|
|
8
|
+
}
|
|
9
|
+
export interface CredentialsOptions {
|
|
10
|
+
/** Where the fallback file lives when the keyring cannot be used. */
|
|
11
|
+
configDir: string;
|
|
12
|
+
/** The keyring service name — the command's name, e.g. `max-cli`. */
|
|
13
|
+
service: string;
|
|
14
|
+
/**
|
|
15
|
+
* **True when the config directory came from the environment rather than the OS convention.**
|
|
16
|
+
*
|
|
17
|
+
* The OS keyring is global: an entry is addressed by service and account and knows nothing about
|
|
18
|
+
* which config directory asked for it. So a throwaway config directory looks isolated and is
|
|
19
|
+
* not — it overwrites the real secret for that account. In `brazecli` that destroyed two working
|
|
20
|
+
* keys on 2026-09-14, and a keyring entry cannot be read back out. Passing `true` here scopes the
|
|
21
|
+
* service name to the directory, making the isolation people already assume they have real.
|
|
22
|
+
*/
|
|
23
|
+
isolated?: boolean;
|
|
24
|
+
/** Read before the keyring, for CI. */
|
|
25
|
+
envVar?: string;
|
|
26
|
+
storage?: CredentialStorage;
|
|
27
|
+
keyring?: KeyringStore;
|
|
28
|
+
env?: NodeJS.ProcessEnv;
|
|
29
|
+
fileName?: string;
|
|
30
|
+
/** Where the one-line warning goes when the keyring is unavailable. Never stdout. */
|
|
31
|
+
warn?: (message: string) => void;
|
|
32
|
+
}
|
|
33
|
+
export declare const keyringService: (service: string, configDir: string, isolated?: boolean) => string;
|
|
34
|
+
/**
|
|
35
|
+
* Environment first, then the OS keyring, then a file.
|
|
36
|
+
*
|
|
37
|
+
* `auto` does not probe whether a keyring exists: it attempts the operation, and on failure warns
|
|
38
|
+
* once and falls through. A probe would touch the user's keychain for nothing and could still
|
|
39
|
+
* succeed where the real operation fails.
|
|
40
|
+
*/
|
|
41
|
+
export declare class Credentials {
|
|
42
|
+
#private;
|
|
43
|
+
constructor(options: CredentialsOptions);
|
|
44
|
+
read(account: string): StoredCredential | undefined;
|
|
45
|
+
write(account: string, secret: string): CredentialSource;
|
|
46
|
+
remove(account: string): CredentialSource[];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,cAAc,CAAA;AAE/D,eAAO,MAAM,kBAAkB,YAAI,MAAM,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AACtE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,CAAA;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,gBAAgB,CAAA;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAA;IACf;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qFAAqF;IACrF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAED,eAAO,MAAM,cAAc,YAAa,MAAM,aAAa,MAAM,yBAAqB,MACtC,CAAA;AAIhD;;;;;;GAMG;AACH,qBAAa,WAAW;;IAWtB,YAAY,OAAO,EAAE,kBAAkB,EAStC;IAED,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAWlD;IAED,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAoBvD;IAED,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAe1C;CA4CF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { writeSecurely } from "./config.js";
|
|
4
|
+
import { CliError } from "./errors.js";
|
|
5
|
+
import { systemKeyring } from "./keyring.js";
|
|
6
|
+
export const CREDENTIAL_STORAGE = ["auto", "keyring", "file"];
|
|
7
|
+
export const keyringService = (service, configDir, isolated = false) => isolated ? `${service}:${configDir}` : service;
|
|
8
|
+
/**
|
|
9
|
+
* Environment first, then the OS keyring, then a file.
|
|
10
|
+
*
|
|
11
|
+
* `auto` does not probe whether a keyring exists: it attempts the operation, and on failure warns
|
|
12
|
+
* once and falls through. A probe would touch the user's keychain for nothing and could still
|
|
13
|
+
* succeed where the real operation fails.
|
|
14
|
+
*/
|
|
15
|
+
export class Credentials {
|
|
16
|
+
#configDir;
|
|
17
|
+
#storage;
|
|
18
|
+
#keyring;
|
|
19
|
+
#env;
|
|
20
|
+
#service;
|
|
21
|
+
#envVar;
|
|
22
|
+
#fileName;
|
|
23
|
+
#warn;
|
|
24
|
+
#warned = false;
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.#configDir = options.configDir;
|
|
27
|
+
this.#storage = options.storage ?? "auto";
|
|
28
|
+
this.#keyring = options.keyring ?? systemKeyring;
|
|
29
|
+
this.#env = options.env ?? process.env;
|
|
30
|
+
this.#envVar = options.envVar;
|
|
31
|
+
this.#fileName = options.fileName ?? "credentials.json";
|
|
32
|
+
this.#warn = options.warn ?? ((message) => process.stderr.write(`${message}\n`));
|
|
33
|
+
this.#service = keyringService(options.service, options.configDir, options.isolated);
|
|
34
|
+
}
|
|
35
|
+
read(account) {
|
|
36
|
+
const fromEnv = this.#envVar ? this.#env[this.#envVar]?.trim() : undefined;
|
|
37
|
+
if (fromEnv)
|
|
38
|
+
return { secret: fromEnv, source: "environment" };
|
|
39
|
+
if (this.#storage !== "file") {
|
|
40
|
+
const fromKeyring = this.#tryKeyring(() => this.#keyring.get(this.#service, account));
|
|
41
|
+
if (fromKeyring)
|
|
42
|
+
return { secret: fromKeyring, source: "keyring" };
|
|
43
|
+
}
|
|
44
|
+
const fromFile = this.#readFile()?.[account]?.secret;
|
|
45
|
+
return fromFile ? { secret: fromFile, source: "file" } : undefined;
|
|
46
|
+
}
|
|
47
|
+
write(account, secret) {
|
|
48
|
+
if (this.#storage !== "file") {
|
|
49
|
+
const stored = this.#tryKeyring(() => {
|
|
50
|
+
this.#keyring.set(this.#service, account, secret);
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
if (stored)
|
|
54
|
+
return "keyring";
|
|
55
|
+
}
|
|
56
|
+
const store = this.#readFile();
|
|
57
|
+
if (!store) {
|
|
58
|
+
throw new CliError("configuration_error", `${this.#path()} cannot be read as a credentials file; storing now would replace every secret in it. ` +
|
|
59
|
+
"Fix the file or move it aside, then try again.");
|
|
60
|
+
}
|
|
61
|
+
store[account] = { secret };
|
|
62
|
+
this.#writeFile(store);
|
|
63
|
+
return "file";
|
|
64
|
+
}
|
|
65
|
+
remove(account) {
|
|
66
|
+
const removed = [];
|
|
67
|
+
if (this.#storage !== "file" && this.#tryKeyring(() => this.#keyring.delete(this.#service, account))) {
|
|
68
|
+
removed.push("keyring");
|
|
69
|
+
}
|
|
70
|
+
const store = this.#readFile();
|
|
71
|
+
if (store?.[account] !== undefined) {
|
|
72
|
+
delete store[account];
|
|
73
|
+
this.#writeFile(store);
|
|
74
|
+
removed.push("file");
|
|
75
|
+
}
|
|
76
|
+
return removed;
|
|
77
|
+
}
|
|
78
|
+
#path() {
|
|
79
|
+
return join(this.#configDir, this.#fileName);
|
|
80
|
+
}
|
|
81
|
+
/** `undefined` when the file exists but is not a store: writing would replace what it holds. */
|
|
82
|
+
#readFile() {
|
|
83
|
+
let text;
|
|
84
|
+
try {
|
|
85
|
+
text = readFileSync(this.#path(), "utf8");
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error.code === "ENOENT")
|
|
89
|
+
return {};
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(text);
|
|
94
|
+
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed : undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// The parser's message quotes the file, and the file holds secrets.
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
#writeFile(store) {
|
|
102
|
+
writeSecurely(this.#path(), `${JSON.stringify(store, null, 2)}\n`, 0o600);
|
|
103
|
+
}
|
|
104
|
+
#tryKeyring(operation) {
|
|
105
|
+
if (this.#storage === "keyring")
|
|
106
|
+
return operation();
|
|
107
|
+
try {
|
|
108
|
+
return operation();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (!this.#warned) {
|
|
112
|
+
this.#warned = true;
|
|
113
|
+
this.#warn(`the OS keyring is unavailable (${error instanceof Error ? error.message : String(error)}); ` +
|
|
114
|
+
`storing in ${this.#path()} instead, readable only by you`);
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type SleepLike } from "./time.js";
|
|
2
|
+
export interface DeadlineOptions {
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
signal?: AbortSignal;
|
|
5
|
+
sleep?: SleepLike;
|
|
6
|
+
}
|
|
7
|
+
export interface Deadline {
|
|
8
|
+
readonly signal: AbortSignal;
|
|
9
|
+
/** On abort, waits for the body to settle before throwing; the body must cooperate to finish promptly. */
|
|
10
|
+
race<T>(body: (signal: AbortSignal) => Promise<T>): Promise<T>;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const createDeadline: ({ timeoutMs, signal, sleep }?: DeadlineOptions) => Deadline;
|
|
14
|
+
//# sourceMappingURL=deadline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AAErD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AACD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,0GAA0G;IAC1G,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC9D,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,eAAO,MAAM,cAAc,kCAA8C,eAAe,KAAQ,QA+E/F,CAAA"}
|
package/dist/deadline.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { CliError, isCliError } from "./errors.js";
|
|
2
|
+
import { realSleep } from "./time.js";
|
|
3
|
+
export const createDeadline = ({ timeoutMs, signal, sleep = realSleep } = {}) => {
|
|
4
|
+
if (timeoutMs !== undefined && (!Number.isSafeInteger(timeoutMs) || timeoutMs < 0 || timeoutMs > 2147483647))
|
|
5
|
+
throw new CliError("validation_error", "timeoutMs must be an integer from zero through 2147483647");
|
|
6
|
+
const controller = new AbortController();
|
|
7
|
+
const timer = new AbortController();
|
|
8
|
+
let disposed = false;
|
|
9
|
+
const abort = (reason) => {
|
|
10
|
+
if (controller.signal.aborted)
|
|
11
|
+
return;
|
|
12
|
+
controller.abort(reason);
|
|
13
|
+
timer.abort();
|
|
14
|
+
signal?.removeEventListener("abort", onAbort);
|
|
15
|
+
};
|
|
16
|
+
const onAbort = () => abort(isCliError(signal?.reason) ? signal.reason : new CliError("cancelled", "command cancelled"));
|
|
17
|
+
if (signal?.aborted)
|
|
18
|
+
onAbort();
|
|
19
|
+
else
|
|
20
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
21
|
+
const expire = () => abort(new CliError("timeout", "the command did not finish before its deadline", {
|
|
22
|
+
reason: "command_timeout",
|
|
23
|
+
timeoutMs,
|
|
24
|
+
retryable: false,
|
|
25
|
+
}));
|
|
26
|
+
if (timeoutMs === 0)
|
|
27
|
+
expire();
|
|
28
|
+
if (timeoutMs !== undefined && timeoutMs > 0 && !controller.signal.aborted) {
|
|
29
|
+
let waiting;
|
|
30
|
+
try {
|
|
31
|
+
waiting = sleep(timeoutMs, timer.signal, "timeout");
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
waiting = Promise.reject(new Error("deadline timer failed"));
|
|
35
|
+
}
|
|
36
|
+
void waiting.then(() => {
|
|
37
|
+
if (!disposed && !timer.signal.aborted)
|
|
38
|
+
expire();
|
|
39
|
+
}, () => {
|
|
40
|
+
if (!disposed && !timer.signal.aborted)
|
|
41
|
+
abort(new CliError("configuration_error", "command deadline timer failed"));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
signal: controller.signal,
|
|
46
|
+
async race(body) {
|
|
47
|
+
if (disposed)
|
|
48
|
+
throw new CliError("validation_error", "deadline is already disposed");
|
|
49
|
+
if (controller.signal.aborted)
|
|
50
|
+
throw controller.signal.reason;
|
|
51
|
+
let interrupt = () => { };
|
|
52
|
+
const interrupted = new Promise((_, reject) => {
|
|
53
|
+
interrupt = () => reject(controller.signal.reason);
|
|
54
|
+
controller.signal.addEventListener("abort", interrupt, { once: true });
|
|
55
|
+
});
|
|
56
|
+
const running = Promise.resolve().then(() => {
|
|
57
|
+
if (controller.signal.aborted)
|
|
58
|
+
throw controller.signal.reason;
|
|
59
|
+
return body(controller.signal);
|
|
60
|
+
});
|
|
61
|
+
try {
|
|
62
|
+
return await Promise.race([running, interrupted]);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (controller.signal.aborted) {
|
|
66
|
+
// A caller may close resources only after its operation can no longer use them.
|
|
67
|
+
let settled;
|
|
68
|
+
await running.catch((reason) => {
|
|
69
|
+
settled = reason;
|
|
70
|
+
});
|
|
71
|
+
if (isCliError(settled) && settled.code === "outcome_unknown")
|
|
72
|
+
throw settled;
|
|
73
|
+
throw controller.signal.reason;
|
|
74
|
+
}
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
controller.signal.removeEventListener("abort", interrupt);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
dispose() {
|
|
82
|
+
disposed = true;
|
|
83
|
+
timer.abort();
|
|
84
|
+
signal?.removeEventListener("abort", onAbort);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=deadline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deadline.js","sourceRoot":"","sources":["../src/deadline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/dev/bin.ts"],"names":[],"mappings":""}
|
package/dist/dev/bin.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { main } from "./main.js";
|
|
3
|
+
process.exitCode = await main(process.argv.slice(2), {
|
|
4
|
+
cwd: process.cwd(),
|
|
5
|
+
out: (text) => process.stdout.write(`${text}\n`),
|
|
6
|
+
err: (text) => process.stderr.write(`${text}\n`),
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/dev/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACnD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;IAChD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;CACjD,CAAC,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { CommandsDocument } from "../commands/document.js";
|
|
2
|
+
import { type LintRule, type Override } from "../standards/lint.js";
|
|
3
|
+
import type { Vocabulary } from "../standards/vocabulary.js";
|
|
4
|
+
export interface Violation {
|
|
5
|
+
rule: string;
|
|
6
|
+
/** What the baseline and overrides name: `chats list`, `chats show <chat>`, `chats list --limit`, `--until`. */
|
|
7
|
+
target: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const lintRuleIds: () => string[];
|
|
11
|
+
/** Every violation, one per rule and target, sorted. Generated commands keep the names of the API they mirror. */
|
|
12
|
+
export declare const lintCommands: (document: CommandsDocument, vocabulary: Vocabulary, rules?: readonly LintRule[]) => Violation[];
|
|
13
|
+
export interface Judgement {
|
|
14
|
+
/** Not in the baseline and not overridden: these fail the run. */
|
|
15
|
+
fresh: Violation[];
|
|
16
|
+
baselined: number;
|
|
17
|
+
overridden: number;
|
|
18
|
+
/** Baseline or override entries with no violation left: the list only shrinks, so these fail too. */
|
|
19
|
+
stale: {
|
|
20
|
+
rule: string;
|
|
21
|
+
target: string;
|
|
22
|
+
in: "baseline" | "overrides";
|
|
23
|
+
}[];
|
|
24
|
+
/** Rule ids named by a baseline file or an override that no rule has. */
|
|
25
|
+
unknownRules: string[];
|
|
26
|
+
overBudget: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare const judge: (violations: readonly Violation[], baseline: Readonly<Record<string, readonly string[]>>, overrides: readonly Override[], budget: number, rules?: readonly LintRule[]) => Judgement;
|
|
29
|
+
/** What `--write-baseline` writes: per rule, the targets no override covers. A rule with none gets no file. */
|
|
30
|
+
export declare const baselineOf: (violations: readonly Violation[], overrides: readonly Override[], rules?: readonly LintRule[]) => Record<string, string[]>;
|
|
31
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/dev/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE/D,OAAO,EAAc,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,gHAAgH;IAChH,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAiHD,eAAO,MAAM,WAAW,QAAO,MAAM,EAAyB,CAAA;AAE9D,kHAAkH;AAClH,eAAO,MAAM,YAAY,aACb,gBAAgB,cACd,UAAU,UACf,SAAS,QAAQ,EAAE,KACzB,SAAS,EAUX,CAAA;AAED,MAAM,WAAW,SAAS;IACxB,kEAAkE;IAClE,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,qGAAqG;IACrG,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,UAAU,GAAG,WAAW,CAAA;KAAE,EAAE,CAAA;IACvE,yEAAyE;IACzE,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,KAAK,eACJ,SAAS,SAAS,EAAE,YACtB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,aAC1C,SAAS,QAAQ,EAAE,UACtB,MAAM,UACP,SAAS,QAAQ,EAAE,KACzB,SA4BF,CAAA;AAED,+GAA+G;AAC/G,eAAO,MAAM,UAAU,eACT,SAAS,SAAS,EAAE,aACrB,SAAS,QAAQ,EAAE,UACvB,SAAS,QAAQ,EAAE,KACzB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAWzB,CAAA"}
|
package/dist/dev/lint.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { LINT_RULES } from "../standards/lint.js";
|
|
2
|
+
const SUMMARY_LIMIT = 80;
|
|
3
|
+
const byText = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
4
|
+
const walk = (commands) => commands.flatMap((one) => [one, ...walk(one.commands)]);
|
|
5
|
+
const longName = (flags) => flags.split(/[ ,|]+/).find((part) => part.startsWith("--")) ?? flags;
|
|
6
|
+
/** A flag's kind of value: its value name, or `switch`. Two kinds under one name are two meanings. */
|
|
7
|
+
const kindOf = (option) => {
|
|
8
|
+
if (!option.takesValue)
|
|
9
|
+
return "switch";
|
|
10
|
+
return option.flags.match(/[<[]([^>\]]+)[>\]]/)?.[1]?.toLowerCase() ?? "value";
|
|
11
|
+
};
|
|
12
|
+
const summaryOf = (command) => (command.summary ?? command.description.split("\n")[0] ?? "").trim();
|
|
13
|
+
const label = (command) => command.path.join(" ");
|
|
14
|
+
const CHECKS = {
|
|
15
|
+
"unknown-verb": (document, vocabulary) => {
|
|
16
|
+
const allowed = new Set([
|
|
17
|
+
...vocabulary.verbs.map((entry) => entry.word),
|
|
18
|
+
...vocabulary.views.map((entry) => entry.word),
|
|
19
|
+
]);
|
|
20
|
+
const roots = new Set(vocabulary.roots.map((entry) => entry.word));
|
|
21
|
+
return walk(document.commands)
|
|
22
|
+
.filter((command) => command.commands.length === 0 && command.origin === "handwritten")
|
|
23
|
+
.filter((command) => !allowed.has(command.name) && !(command.path.length === 1 && roots.has(command.name)))
|
|
24
|
+
.map((command) => ({
|
|
25
|
+
target: label(command),
|
|
26
|
+
message: `"${command.name}" is not a verb or view noun in the vocabulary`,
|
|
27
|
+
}));
|
|
28
|
+
},
|
|
29
|
+
"unknown-resource": (document, vocabulary) => {
|
|
30
|
+
const nouns = new Set(vocabulary.nouns.map((entry) => entry.word));
|
|
31
|
+
const roots = new Set(vocabulary.roots.map((entry) => entry.word));
|
|
32
|
+
const verbs = new Set(vocabulary.verbs.map((entry) => entry.word));
|
|
33
|
+
return walk(document.commands)
|
|
34
|
+
.filter((command) => command.commands.length > 0 && command.origin === "handwritten")
|
|
35
|
+
.filter((command) => !nouns.has(command.name) && !roots.has(command.name))
|
|
36
|
+
.map((command) => ({
|
|
37
|
+
target: label(command),
|
|
38
|
+
message: verbs.has(command.name)
|
|
39
|
+
? `the group "${command.name}" is named with a verb; a group is a resource`
|
|
40
|
+
: `"${command.name}" is not a resource in the vocabulary: a plural, a registered singular, or a root word`,
|
|
41
|
+
}));
|
|
42
|
+
},
|
|
43
|
+
"flag-two-meanings": (document, vocabulary) => {
|
|
44
|
+
const registered = new Map(vocabulary.flags.map((flag) => [flag.name, flag.value?.slice(1, -1).toLowerCase() ?? "switch"]));
|
|
45
|
+
const uses = new Map();
|
|
46
|
+
const note = (option, where) => {
|
|
47
|
+
const name = longName(option.flags);
|
|
48
|
+
const kinds = uses.get(name) ?? new Map();
|
|
49
|
+
kinds.set(kindOf(option), [...(kinds.get(kindOf(option)) ?? []), where]);
|
|
50
|
+
uses.set(name, kinds);
|
|
51
|
+
};
|
|
52
|
+
for (const option of document.globalOptions)
|
|
53
|
+
note(option, "every command");
|
|
54
|
+
for (const command of walk(document.commands))
|
|
55
|
+
if (command.origin === "handwritten")
|
|
56
|
+
for (const option of command.options)
|
|
57
|
+
note(option, label(command));
|
|
58
|
+
const found = [];
|
|
59
|
+
for (const [name, kinds] of [...uses].sort(([a], [b]) => byText(a, b))) {
|
|
60
|
+
const expected = registered.get(name);
|
|
61
|
+
const off = expected === undefined ? [] : [...kinds.keys()].filter((kind) => kind !== expected);
|
|
62
|
+
if (kinds.size < 2 && off.length === 0)
|
|
63
|
+
continue;
|
|
64
|
+
const described = [...kinds]
|
|
65
|
+
.map(([kind, where]) => `${kind === "switch" ? "a switch" : `<${kind}>`} in ${where.slice(0, 3).join(", ")}`)
|
|
66
|
+
.join("; ");
|
|
67
|
+
found.push({
|
|
68
|
+
target: name,
|
|
69
|
+
message: expected === undefined
|
|
70
|
+
? `${name} has ${kinds.size} meanings: ${described}`
|
|
71
|
+
: `${name} is ${expected === "switch" ? "a switch" : `<${expected}>`} in the vocabulary, but: ${described}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return found;
|
|
75
|
+
},
|
|
76
|
+
"missing-command-help": (document) => walk(document.commands)
|
|
77
|
+
.filter((command) => summaryOf(command) === "")
|
|
78
|
+
.map((command) => ({ target: label(command), message: "no summary or description" })),
|
|
79
|
+
"command-help-too-long": (document) => walk(document.commands)
|
|
80
|
+
.filter((command) => command.origin === "handwritten" && summaryOf(command).length > SUMMARY_LIMIT)
|
|
81
|
+
.map((command) => ({
|
|
82
|
+
target: label(command),
|
|
83
|
+
message: `summary is ${summaryOf(command).length} characters; at most ${SUMMARY_LIMIT}`,
|
|
84
|
+
})),
|
|
85
|
+
"missing-argument-help": (document) => walk(document.commands).flatMap((command) => command.arguments
|
|
86
|
+
.filter((argument) => argument.description.trim() === "")
|
|
87
|
+
.map((argument) => ({ target: `${label(command)} <${argument.name}>`, message: "argument not described" }))),
|
|
88
|
+
"missing-option-help": (document) => [
|
|
89
|
+
...document.globalOptions
|
|
90
|
+
.filter((option) => option.description.trim() === "")
|
|
91
|
+
.map((option) => ({ target: longName(option.flags), message: "global option not described" })),
|
|
92
|
+
...walk(document.commands).flatMap((command) => command.options
|
|
93
|
+
.filter((option) => option.description.trim() === "")
|
|
94
|
+
.map((option) => ({ target: `${label(command)} ${longName(option.flags)}`, message: "option not described" }))),
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
export const lintRuleIds = () => Object.keys(CHECKS);
|
|
98
|
+
/** Every violation, one per rule and target, sorted. Generated commands keep the names of the API they mirror. */
|
|
99
|
+
export const lintCommands = (document, vocabulary, rules = LINT_RULES) => {
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
return rules.flatMap((rule) => {
|
|
102
|
+
const check = CHECKS[rule.id];
|
|
103
|
+
if (!check)
|
|
104
|
+
throw new Error(`lint rule "${rule.id}" has no check`);
|
|
105
|
+
return check(document, vocabulary)
|
|
106
|
+
.filter(({ target }) => !seen.has(`${rule.id} ${target}`) && seen.add(`${rule.id} ${target}`))
|
|
107
|
+
.map((found) => ({ rule: rule.id, ...found }))
|
|
108
|
+
.sort((a, b) => byText(a.target, b.target));
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
export const judge = (violations, baseline, overrides, budget, rules = LINT_RULES) => {
|
|
112
|
+
const ids = new Set(rules.map((rule) => rule.id));
|
|
113
|
+
const key = (rule, target) => `${rule} ${target}`;
|
|
114
|
+
const overridden = new Set(overrides.map((entry) => key(entry.rule, entry.target)));
|
|
115
|
+
const baselined = new Set(Object.entries(baseline).flatMap(([rule, targets]) => targets.map((t) => key(rule, t))));
|
|
116
|
+
const found = new Set(violations.map((violation) => key(violation.rule, violation.target)));
|
|
117
|
+
const open = violations.filter((violation) => !overridden.has(key(violation.rule, violation.target)));
|
|
118
|
+
const fresh = open.filter((violation) => !baselined.has(key(violation.rule, violation.target)));
|
|
119
|
+
return {
|
|
120
|
+
fresh,
|
|
121
|
+
baselined: open.length - fresh.length,
|
|
122
|
+
overridden: violations.length - open.length,
|
|
123
|
+
stale: [
|
|
124
|
+
...Object.entries(baseline).flatMap(([rule, targets]) => targets
|
|
125
|
+
.filter((target) => !found.has(key(rule, target)) || overridden.has(key(rule, target)))
|
|
126
|
+
.map((target) => ({ rule, target, in: "baseline" }))),
|
|
127
|
+
...overrides
|
|
128
|
+
.filter((entry) => !found.has(key(entry.rule, entry.target)))
|
|
129
|
+
.map((entry) => ({ rule: entry.rule, target: entry.target, in: "overrides" })),
|
|
130
|
+
],
|
|
131
|
+
unknownRules: [
|
|
132
|
+
...new Set([...Object.keys(baseline), ...overrides.map((entry) => entry.rule)].filter((id) => !ids.has(id))),
|
|
133
|
+
].sort(),
|
|
134
|
+
overBudget: overrides.length > budget,
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
/** What `--write-baseline` writes: per rule, the targets no override covers. A rule with none gets no file. */
|
|
138
|
+
export const baselineOf = (violations, overrides, rules = LINT_RULES) => {
|
|
139
|
+
const overridden = new Set(overrides.map((entry) => `${entry.rule} ${entry.target}`));
|
|
140
|
+
return Object.fromEntries(rules.map((rule) => [
|
|
141
|
+
rule.id,
|
|
142
|
+
violations
|
|
143
|
+
.filter((violation) => violation.rule === rule.id && !overridden.has(`${violation.rule} ${violation.target}`))
|
|
144
|
+
.map((violation) => violation.target)
|
|
145
|
+
.sort(),
|
|
146
|
+
]));
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/dev/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/dev/main.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5B;AAiOD,eAAO,MAAM,IAAI,SAAgB,SAAS,MAAM,EAAE,MAAM,KAAK,KAAG,OAAO,CAAC,MAAM,CA4C7E,CAAA"}
|