@ydtb/eslint-plugin 0.16.2

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present Your Digital Toolbox
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,32 @@
1
+ import { noAsUnknownAs } from "./rules/no-as-unknown-as.ts";
2
+ import { noIsRealDbDispatch } from "./rules/no-isRealDb-dispatch.ts";
3
+ import { noModuleMutableState } from "./rules/no-module-mutable-state.ts";
4
+ import { noViFnSpy } from "./rules/no-vi-fn-spy.ts";
5
+ import { requireTestHarness } from "./rules/require-test-harness.ts";
6
+ declare const plugin: {
7
+ meta: {
8
+ name: string;
9
+ version: string;
10
+ };
11
+ rules: {
12
+ "no-as-unknown-as": import("@typescript-eslint/utils/ts-eslint").RuleModule<"doubleAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
13
+ name: string;
14
+ };
15
+ "no-isRealDb-dispatch": import("@typescript-eslint/utils/ts-eslint").RuleModule<"isRealDbFn" | "memPatchedAccess", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
16
+ name: string;
17
+ };
18
+ "no-module-mutable-state": import("@typescript-eslint/utils/ts-eslint").RuleModule<"moduleLet" | "mutableCtor" | "globalMutation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
19
+ name: string;
20
+ };
21
+ "no-vi-fn-spy": import("@typescript-eslint/utils/ts-eslint").RuleModule<"spyAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
22
+ name: string;
23
+ };
24
+ "require-test-harness": import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingHarness", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
25
+ name: string;
26
+ };
27
+ };
28
+ configs: Record<string, unknown>;
29
+ };
30
+ export default plugin;
31
+ export { noAsUnknownAs, noIsRealDbDispatch, noModuleMutableState, noViFnSpy, requireTestHarness, };
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAUpE,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;aAGK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CACvC,CAAA;AAsCD,eAAe,MAAM,CAAA;AACrB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,kBAAkB,GACnB,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { noAsUnknownAs } from "./rules/no-as-unknown-as.js";
2
+ import { noIsRealDbDispatch } from "./rules/no-isRealDb-dispatch.js";
3
+ import { noModuleMutableState } from "./rules/no-module-mutable-state.js";
4
+ import { noViFnSpy } from "./rules/no-vi-fn-spy.js";
5
+ import { requireTestHarness } from "./rules/require-test-harness.js";
6
+ const rules = {
7
+ "no-as-unknown-as": noAsUnknownAs,
8
+ "no-isRealDb-dispatch": noIsRealDbDispatch,
9
+ "no-module-mutable-state": noModuleMutableState,
10
+ "no-vi-fn-spy": noViFnSpy,
11
+ "require-test-harness": requireTestHarness,
12
+ };
13
+ const plugin = {
14
+ meta: { name: "@ydtb/eslint-plugin", version: "0.17.0" },
15
+ rules,
16
+ configs: {},
17
+ };
18
+ // Globs that match every test file in the polyrepo. Wave 2 rules that only
19
+ // make sense for test code (e.g. require-test-harness) are scoped to these.
20
+ const TEST_FILE_GLOBS = [
21
+ "**/*.test.ts",
22
+ "**/*.test.tsx",
23
+ "**/*.spec.ts",
24
+ "**/*.spec.tsx",
25
+ "**/__tests__/**/*.ts",
26
+ "**/__tests__/**/*.tsx",
27
+ ];
28
+ plugin.configs = {
29
+ // Production-source rules. Apply to every file the consumer lints.
30
+ recommended: {
31
+ plugins: { "@ydtb": plugin },
32
+ rules: {
33
+ "@ydtb/no-as-unknown-as": "error",
34
+ "@ydtb/no-isRealDb-dispatch": "error",
35
+ "@ydtb/no-module-mutable-state": "error",
36
+ },
37
+ },
38
+ // Test-only rules. Consumer adds this AFTER `recommended` so file-scoped
39
+ // overrides win over the global block.
40
+ tests: {
41
+ plugins: { "@ydtb": plugin },
42
+ files: TEST_FILE_GLOBS,
43
+ rules: {
44
+ "@ydtb/require-test-harness": "error",
45
+ // Ships at `warn` per plans/testing/README.md — heuristic with
46
+ // possible false positives. Promote to `error` once the audit shows
47
+ // the rate is acceptable and the suppression queue is manageable.
48
+ "@ydtb/no-vi-fn-spy": "warn",
49
+ },
50
+ },
51
+ };
52
+ export default plugin;
53
+ export { noAsUnknownAs, noIsRealDbDispatch, noModuleMutableState, noViFnSpy, requireTestHarness, };
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,MAAM,KAAK,GAAG;IACZ,kBAAkB,EAAE,aAAa;IACjC,sBAAsB,EAAE,kBAAkB;IAC1C,yBAAyB,EAAE,oBAAoB;IAC/C,cAAc,EAAE,SAAS;IACzB,sBAAsB,EAAE,kBAAkB;CAC3C,CAAA;AAED,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACxD,KAAK;IACL,OAAO,EAAE,EAA6B;CACvC,CAAA;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,MAAM,eAAe,GAAG;IACtB,cAAc;IACd,eAAe;IACf,cAAc;IACd,eAAe;IACf,sBAAsB;IACtB,uBAAuB;CACxB,CAAA;AAED,MAAM,CAAC,OAAO,GAAG;IACf,mEAAmE;IACnE,WAAW,EAAE;QACX,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;QAC5B,KAAK,EAAE;YACL,wBAAwB,EAAE,OAAO;YACjC,4BAA4B,EAAE,OAAO;YACrC,+BAA+B,EAAE,OAAO;SACzC;KACF;IACD,yEAAyE;IACzE,uCAAuC;IACvC,KAAK,EAAE;QACL,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;QAC5B,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE;YACL,4BAA4B,EAAE,OAAO;YACrC,+DAA+D;YAC/D,oEAAoE;YACpE,kEAAkE;YAClE,oBAAoB,EAAE,MAAM;SAC7B;KACF;CACF,CAAA;AAED,eAAe,MAAM,CAAA;AACrB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,SAAS,EACT,kBAAkB,GACnB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noAsUnknownAs: ESLintUtils.RuleModule<"doubleAssertion", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-as-unknown-as.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-as-unknown-as.d.ts","sourceRoot":"","sources":["../../../src/rules/no-as-unknown-as.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,0BAA0B,CAAA;AA8BrF,eAAO,MAAM,aAAa;;CA+BxB,CAAA"}
@@ -0,0 +1,56 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/yourdigitaltoolbox/your-digital-toolbox/blob/main/issues/${name}.md`);
3
+ /**
4
+ * Detect the `<expr> as unknown as <T>` double-assertion pattern.
5
+ *
6
+ * AST shape:
7
+ * TSAsExpression {
8
+ * expression: TSAsExpression {
9
+ * expression: <expr>,
10
+ * typeAnnotation: TSUnknownKeyword,
11
+ * },
12
+ * typeAnnotation: <target type>,
13
+ * }
14
+ *
15
+ * Per the doctrine at /issues/as unknown.md, this pattern silences the
16
+ * compiler instead of describing the data. The fix is to tighten the
17
+ * source type, not to bridge through `unknown`.
18
+ */
19
+ function isAsUnknownAs(node) {
20
+ if (node.type !== AST_NODE_TYPES.TSAsExpression)
21
+ return false;
22
+ const inner = node.expression;
23
+ if (inner.type !== AST_NODE_TYPES.TSAsExpression)
24
+ return false;
25
+ return inner.typeAnnotation.type === AST_NODE_TYPES.TSUnknownKeyword;
26
+ }
27
+ export const noAsUnknownAs = createRule({
28
+ name: "no-as-unknown-as",
29
+ meta: {
30
+ type: "problem",
31
+ docs: {
32
+ description: "Disallow `expr as unknown as <T>` double-assertion. The pattern silences the compiler instead of describing the data — fix the source type instead. See /issues/as unknown.md.",
33
+ },
34
+ schema: [],
35
+ messages: {
36
+ doubleAssertion: "Don't assert through `unknown`. The compiler is telling you the source type is wrong — fix the source type instead of bridging with `as unknown as {{ targetType }}`. See /issues/as unknown.md for the recipe.",
37
+ },
38
+ },
39
+ defaultOptions: [],
40
+ create(context) {
41
+ return {
42
+ TSAsExpression(node) {
43
+ if (!isAsUnknownAs(node))
44
+ return;
45
+ const sourceCode = context.sourceCode;
46
+ const targetType = sourceCode.getText(node.typeAnnotation);
47
+ context.report({
48
+ node,
49
+ messageId: "doubleAssertion",
50
+ data: { targetType },
51
+ });
52
+ },
53
+ };
54
+ },
55
+ });
56
+ //# sourceMappingURL=no-as-unknown-as.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-as-unknown-as.js","sourceRoot":"","sources":["../../../src/rules/no-as-unknown-as.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAErF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,+EAA+E,IAAI,KAAK,CAC3F,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,aAAa,CAAC,IAAmB;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAA;IAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;QAAE,OAAO,KAAK,CAAA;IAC9D,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,CAAA;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,gLAAgL;SACnL;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EACb,iNAAiN;SACpN;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAA6B;gBAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBAAE,OAAM;gBAEhC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAA;gBACrC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;gBAE1D,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI;oBACJ,SAAS,EAAE,iBAAiB;oBAC5B,IAAI,EAAE,EAAE,UAAU,EAAE;iBACrB,CAAC,CAAA;YACJ,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noIsRealDbDispatch: ESLintUtils.RuleModule<"isRealDbFn" | "memPatchedAccess", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-isRealDb-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-isRealDb-dispatch.d.ts","sourceRoot":"","sources":["../../../src/rules/no-isRealDb-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,0BAA0B,CAAA;AAOrE,eAAO,MAAM,kBAAkB;;CA8B7B,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/yourdigitaltoolbox/your-digital-toolbox/blob/main/plans/testing/README.md#${name}`);
3
+ export const noIsRealDbDispatch = createRule({
4
+ name: "no-isRealDb-dispatch",
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Disallow the isRealDb(db) dispatch pattern. Production code must not branch on whether the db is real or mocked.",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ isRealDbFn: "Do not define `isRealDb()`. Production code must not dispatch on db shape; tests use createMockDrizzleDb / createTestDb from @ydtb/tk-scope-test-harness instead.",
13
+ memPatchedAccess: "Do not access `__memPatched`. Production code must not branch on whether the db is mocked.",
14
+ },
15
+ },
16
+ defaultOptions: [],
17
+ create(context) {
18
+ return {
19
+ "FunctionDeclaration[id.name='isRealDb']"(node) {
20
+ context.report({ node, messageId: "isRealDbFn" });
21
+ },
22
+ "VariableDeclarator[id.name='isRealDb']"(node) {
23
+ context.report({ node, messageId: "isRealDbFn" });
24
+ },
25
+ "MemberExpression[property.name='__memPatched']"(node) {
26
+ context.report({ node, messageId: "memPatchedAccess" });
27
+ },
28
+ };
29
+ },
30
+ });
31
+ //# sourceMappingURL=no-isRealDb-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-isRealDb-dispatch.js","sourceRoot":"","sources":["../../../src/rules/no-isRealDb-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,0BAA0B,CAAA;AAErE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,gGAAgG,IAAI,EAAE,CACzG,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,kHAAkH;SACrH;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,UAAU,EACR,mKAAmK;YACrK,gBAAgB,EACd,4FAA4F;SAC/F;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,yCAAyC,CAAC,IAAkC;gBAC1E,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;YACnD,CAAC;YACD,wCAAwC,CAAC,IAAiC;gBACxE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;YACnD,CAAC;YACD,gDAAgD,CAAC,IAA+B;gBAC9E,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAA;YACzD,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noModuleMutableState: ESLintUtils.RuleModule<"moduleLet" | "mutableCtor" | "globalMutation", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-module-mutable-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-module-mutable-state.d.ts","sourceRoot":"","sources":["../../../src/rules/no-module-mutable-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,0BAA0B,CAAA;AAiIrF,eAAO,MAAM,oBAAoB;;CAiE/B,CAAA"}
@@ -0,0 +1,179 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/yourdigitaltoolbox/your-digital-toolbox/blob/main/plans/testing/README.md#${name}`);
3
+ // Plain array (not a Set) so this rule's own source doesn't flag itself.
4
+ // Lookup is O(n) but n=6 — fine for a per-AST-node hot path.
5
+ const MUTABLE_CTORS = [
6
+ "Map",
7
+ "Set",
8
+ "Array",
9
+ "WeakMap",
10
+ "WeakSet",
11
+ "LRUCache",
12
+ ];
13
+ // Constructors that are allowed at module scope when initialized purely from
14
+ // literals — they're effectively constant lookup tables, not mutable state.
15
+ // `Array` and `LRUCache` are deliberately excluded:
16
+ // - `new Array(N)` returns an empty mutable buffer; `[...]` is the constant form.
17
+ // - `LRUCache` is always a stateful cache; the whole point is mutation.
18
+ const LITERAL_ALLOW_CTORS = ["Set", "Map", "WeakSet", "WeakMap"];
19
+ // `Object.keys(IDENT)` / `Object.values(IDENT)` / `Object.entries(IDENT)`
20
+ // are heuristically treated as constant for allow-list purposes. The
21
+ // resulting array reflects the object's keys at construction time; later
22
+ // mutations of IDENT don't affect it. False positives are theoretically
23
+ // possible (someone calls `.add()` on the resulting Set) but no more so
24
+ // than for any literal-init constant Set.
25
+ function isObjectKeysCall(node) {
26
+ if (node.type !== AST_NODE_TYPES.CallExpression)
27
+ return false;
28
+ const callee = node.callee;
29
+ if (callee.type !== AST_NODE_TYPES.MemberExpression)
30
+ return false;
31
+ if (callee.object.type !== AST_NODE_TYPES.Identifier ||
32
+ callee.object.name !== "Object") {
33
+ return false;
34
+ }
35
+ if (callee.property.type !== AST_NODE_TYPES.Identifier)
36
+ return false;
37
+ if (!["keys", "values", "entries"].includes(callee.property.name))
38
+ return false;
39
+ if (node.arguments.length !== 1)
40
+ return false;
41
+ const arg = node.arguments[0];
42
+ return arg !== undefined && arg.type === AST_NODE_TYPES.Identifier;
43
+ }
44
+ function isLiteralValue(node) {
45
+ if (node === null)
46
+ return false;
47
+ switch (node.type) {
48
+ case AST_NODE_TYPES.Literal:
49
+ return true;
50
+ case AST_NODE_TYPES.TemplateLiteral:
51
+ return node.expressions.length === 0;
52
+ case AST_NODE_TYPES.TSAsExpression:
53
+ case AST_NODE_TYPES.TSSatisfiesExpression:
54
+ // `[...] as const`, `{ ... } satisfies SomeType` — the type assertion
55
+ // doesn't change literalness; recurse into the inner expression.
56
+ return isLiteralValue(node.expression);
57
+ case AST_NODE_TYPES.UnaryExpression:
58
+ // `-1`, `+5`, `!true` on literals are still literal-valued.
59
+ return ((node.operator === "-" || node.operator === "+" || node.operator === "!") &&
60
+ isLiteralValue(node.argument));
61
+ case AST_NODE_TYPES.ArrayExpression:
62
+ // Empty arrays inside object/array literals are fine; only the OUTER
63
+ // construction-arg array is required to be non-empty (see isConstantInit).
64
+ return node.elements.every((el) => el === null || isLiteralValue(el));
65
+ case AST_NODE_TYPES.ObjectExpression:
66
+ return node.properties.every((prop) => prop.type === AST_NODE_TYPES.Property &&
67
+ !prop.computed &&
68
+ isLiteralValue(prop.value));
69
+ default:
70
+ return false;
71
+ }
72
+ }
73
+ // True when `new Set/Map/WeakSet/WeakMap(arg)` is initialized from a
74
+ // non-empty array literal whose elements are all literal-valued. Such
75
+ // constructions are constant lookup tables in practice, so we don't treat
76
+ // them as module-mutable state.
77
+ //
78
+ // Empty Set/Map (`new Set()`, `new Set([])`) is NOT allowed — the typical
79
+ // pattern is to populate it later via `.add()`, which is exactly the
80
+ // mutable-state shape this rule is meant to catch.
81
+ function isConstantInit(init) {
82
+ if (init.callee.type !== AST_NODE_TYPES.Identifier)
83
+ return false;
84
+ if (!LITERAL_ALLOW_CTORS.includes(init.callee.name))
85
+ return false;
86
+ if (init.arguments.length !== 1)
87
+ return false;
88
+ let arg = init.arguments[0];
89
+ if (arg === undefined)
90
+ return false;
91
+ // Unwrap `[...] as const` / `[...] satisfies Type` wrappers before checking.
92
+ while (arg.type === AST_NODE_TYPES.TSAsExpression ||
93
+ arg.type === AST_NODE_TYPES.TSSatisfiesExpression) {
94
+ arg = arg.expression;
95
+ }
96
+ // Allow `new Set(Object.keys(X))` and friends — see isObjectKeysCall.
97
+ if (isObjectKeysCall(arg))
98
+ return true;
99
+ if (arg.type !== AST_NODE_TYPES.ArrayExpression)
100
+ return false;
101
+ if (arg.elements.length === 0)
102
+ return false;
103
+ return arg.elements.every((el) => el !== null && isLiteralValue(el));
104
+ }
105
+ function isModuleScope(node) {
106
+ const parent = node.parent;
107
+ if (!parent)
108
+ return false;
109
+ if (parent.type === AST_NODE_TYPES.Program)
110
+ return true;
111
+ if (parent.type === AST_NODE_TYPES.ExportNamedDeclaration &&
112
+ parent.parent?.type === AST_NODE_TYPES.Program) {
113
+ return true;
114
+ }
115
+ if (parent.type === AST_NODE_TYPES.ExportDefaultDeclaration &&
116
+ parent.parent?.type === AST_NODE_TYPES.Program) {
117
+ return true;
118
+ }
119
+ return false;
120
+ }
121
+ export const noModuleMutableState = createRule({
122
+ name: "no-module-mutable-state",
123
+ meta: {
124
+ type: "problem",
125
+ docs: {
126
+ description: "Disallow mutable state at module scope. Module-level let, exported let, and module-level new Map/Set/Array/WeakMap/WeakSet/LRUCache are banned. globalThis/global mutation is banned anywhere.",
127
+ },
128
+ schema: [],
129
+ messages: {
130
+ moduleLet: "Do not declare `let` at module scope. Wrap in a factory function (e.g. createX()) and provide via getLayer/Provider so each request, test, and HMR cycle gets a fresh instance.",
131
+ mutableCtor: "Do not construct mutable collections (Map, Set, Array, WeakMap, WeakSet, LRUCache) at module scope. Wrap in a factory function and own via getLayer or React context so state doesn't leak across requests / tests / HMR cycles.",
132
+ globalMutation: "Do not mutate globalThis or global. Use parameter injection (for plain functions) or Layer substitution (for Effect code). See plans/testing/README.md.",
133
+ },
134
+ },
135
+ defaultOptions: [],
136
+ create(context) {
137
+ return {
138
+ VariableDeclaration(node) {
139
+ if (!isModuleScope(node))
140
+ return;
141
+ if (node.kind === "let") {
142
+ // Allow `let X` (no initializer) at module scope — the canonical
143
+ // deferred-init pattern (e.g. `let testDb: TestDbResult` in vitest
144
+ // integration tests, populated in beforeAll). The dangerous case
145
+ // is `let X = mutableState`, which IS still flagged by virtue of
146
+ // having an init on the declarator.
147
+ for (const declarator of node.declarations) {
148
+ if (declarator.init !== null) {
149
+ context.report({ node, messageId: "moduleLet" });
150
+ return;
151
+ }
152
+ }
153
+ return;
154
+ }
155
+ if (node.kind === "const") {
156
+ for (const declarator of node.declarations) {
157
+ const init = declarator.init;
158
+ if (init?.type === AST_NODE_TYPES.NewExpression &&
159
+ init.callee.type === AST_NODE_TYPES.Identifier &&
160
+ MUTABLE_CTORS.includes(init.callee.name) &&
161
+ !isConstantInit(init)) {
162
+ context.report({ node: declarator, messageId: "mutableCtor" });
163
+ }
164
+ }
165
+ }
166
+ },
167
+ AssignmentExpression(node) {
168
+ if (node.left.type !== AST_NODE_TYPES.MemberExpression)
169
+ return;
170
+ const obj = node.left.object;
171
+ if (obj.type === AST_NODE_TYPES.Identifier &&
172
+ (obj.name === "globalThis" || obj.name === "global")) {
173
+ context.report({ node, messageId: "globalMutation" });
174
+ }
175
+ },
176
+ };
177
+ },
178
+ });
179
+ //# sourceMappingURL=no-module-mutable-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-module-mutable-state.js","sourceRoot":"","sources":["../../../src/rules/no-module-mutable-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noViFnSpy: ESLintUtils.RuleModule<"spyAssertion", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-vi-fn-spy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-vi-fn-spy.d.ts","sourceRoot":"","sources":["../../../src/rules/no-vi-fn-spy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,0BAA0B,CAAA;AAwCrF,eAAO,MAAM,SAAS;;CA2DpB,CAAA"}
@@ -0,0 +1,93 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/yourdigitaltoolbox/your-digital-toolbox/blob/main/plans/testing/README.md#${name}`);
3
+ // Vitest matchers that assert on call history of a spy. Hitting any of these
4
+ // on a vi.fn() spy is the smell — a recording test Layer captures the same
5
+ // signal without the test/prod-divergence risk that comes with a hand-rolled
6
+ // behavioral spy.
7
+ const SPY_MATCHERS = [
8
+ "toHaveBeenCalled",
9
+ "toHaveBeenCalledWith",
10
+ "toHaveBeenCalledTimes",
11
+ "toHaveBeenCalledOnce",
12
+ "toHaveBeenCalledExactlyOnceWith",
13
+ "toHaveBeenLastCalledWith",
14
+ "toHaveBeenNthCalledWith",
15
+ ];
16
+ function isViFnCall(node) {
17
+ if (!node || node.type !== AST_NODE_TYPES.CallExpression)
18
+ return false;
19
+ const callee = node.callee;
20
+ if (callee.type !== AST_NODE_TYPES.MemberExpression)
21
+ return false;
22
+ if (callee.object.type !== AST_NODE_TYPES.Identifier ||
23
+ callee.object.name !== "vi") {
24
+ return false;
25
+ }
26
+ if (callee.property.type !== AST_NODE_TYPES.Identifier ||
27
+ callee.property.name !== "fn") {
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ export const noViFnSpy = createRule({
33
+ name: "no-vi-fn-spy",
34
+ meta: {
35
+ type: "suggestion",
36
+ docs: {
37
+ description: "Disallow asserting on vi.fn() spies via toHaveBeenCalled* matchers. Behavioral spies cause test-vs-prod drift; use a recording test Layer (createMockHooks, createTestLayerContext) that captures calls in an array, then assert on the array.",
38
+ },
39
+ schema: [],
40
+ messages: {
41
+ spyAssertion: "Don't assert on a vi.fn() spy via `{{ matcher }}`. Use a recording test Layer (e.g. createMockHooks or createTestLayerContext from @ydtb/tk-scope-test-harness) that captures calls in an array, then assert on the array. See plans/testing/README.md.",
42
+ },
43
+ },
44
+ defaultOptions: [],
45
+ create(context) {
46
+ // Heuristic: track every variable initialized to `vi.fn(...)`. False
47
+ // negatives accepted (destructured spies, spy stored in a Map, spy
48
+ // returned from a helper) — the rule is heuristic by design and ships
49
+ // at `warn` until a future audit promotes it to `error`.
50
+ const spyVars = new Set();
51
+ return {
52
+ VariableDeclarator(node) {
53
+ if (node.id.type !== AST_NODE_TYPES.Identifier)
54
+ return;
55
+ if (isViFnCall(node.init)) {
56
+ spyVars.add(node.id.name);
57
+ }
58
+ },
59
+ CallExpression(node) {
60
+ if (node.callee.type !== AST_NODE_TYPES.MemberExpression)
61
+ return;
62
+ if (node.callee.property.type !== AST_NODE_TYPES.Identifier)
63
+ return;
64
+ const matcher = node.callee.property.name;
65
+ if (!SPY_MATCHERS.includes(matcher))
66
+ return;
67
+ // Walk back through chained MemberExpressions (`.not`, `.resolves`,
68
+ // etc.) to find the root CallExpression that should be `expect(X)`.
69
+ let current = node.callee.object;
70
+ while (current.type === AST_NODE_TYPES.MemberExpression) {
71
+ current = current.object;
72
+ }
73
+ if (current.type !== AST_NODE_TYPES.CallExpression)
74
+ return;
75
+ if (current.callee.type !== AST_NODE_TYPES.Identifier)
76
+ return;
77
+ if (current.callee.name !== "expect")
78
+ return;
79
+ const arg = current.arguments[0];
80
+ if (!arg || arg.type !== AST_NODE_TYPES.Identifier)
81
+ return;
82
+ if (spyVars.has(arg.name)) {
83
+ context.report({
84
+ node,
85
+ messageId: "spyAssertion",
86
+ data: { matcher },
87
+ });
88
+ }
89
+ },
90
+ };
91
+ },
92
+ });
93
+ //# sourceMappingURL=no-vi-fn-spy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-vi-fn-spy.js","sourceRoot":"","sources":["../../../src/rules/no-vi-fn-spy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const requireTestHarness: ESLintUtils.RuleModule<"missingHarness", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=require-test-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-test-harness.d.ts","sourceRoot":"","sources":["../../../src/rules/require-test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiC,MAAM,0BAA0B,CAAA;AAgBrF,eAAO,MAAM,kBAAkB;;CAoD7B,CAAA"}
@@ -0,0 +1,65 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/yourdigitaltoolbox/your-digital-toolbox/blob/main/plans/testing/README.md#${name}`);
3
+ const HARNESS_PACKAGE = "@ydtb/tk-scope-test-harness";
4
+ const HARNESS_FACTORIES = [
5
+ "createMockDrizzleDb",
6
+ "createTestDb",
7
+ "createTestApp",
8
+ "createRouterTestClient",
9
+ ];
10
+ const DRIZZLE_METHODS = ["select", "insert", "update", "delete"];
11
+ export const requireTestHarness = createRule({
12
+ name: "require-test-harness",
13
+ meta: {
14
+ type: "problem",
15
+ docs: {
16
+ description: "Test files that call db.select/insert/update/delete must construct the db via a harness factory (createMockDrizzleDb / createTestDb / createTestApp / createRouterTestClient) from @ydtb/tk-scope-test-harness — not via a hand-rolled mock.",
17
+ },
18
+ schema: [],
19
+ messages: {
20
+ missingHarness: "This file calls `db.{select|insert|update|delete}` but does not import any harness factory ({createMockDrizzleDb, createTestDb, createTestApp, createRouterTestClient}) from @ydtb/tk-scope-test-harness. Hand-rolled DB mocks bypass the Drizzle contract; use the harness so test and prod see the same shape.",
21
+ },
22
+ },
23
+ defaultOptions: [],
24
+ create(context) {
25
+ let hasHarnessImport = false;
26
+ const drizzleCalls = [];
27
+ return {
28
+ ImportDeclaration(node) {
29
+ if (typeof node.source.value !== "string")
30
+ return;
31
+ const source = node.source.value;
32
+ // Match the package itself and any subpath export (e.g. /test-db, /router-client).
33
+ if (source !== HARNESS_PACKAGE && !source.startsWith(`${HARNESS_PACKAGE}/`)) {
34
+ return;
35
+ }
36
+ for (const spec of node.specifiers) {
37
+ if (spec.type !== AST_NODE_TYPES.ImportSpecifier)
38
+ continue;
39
+ const imported = spec.imported;
40
+ if (imported.type !== AST_NODE_TYPES.Identifier)
41
+ continue;
42
+ if (HARNESS_FACTORIES.includes(imported.name)) {
43
+ hasHarnessImport = true;
44
+ return;
45
+ }
46
+ }
47
+ },
48
+ "MemberExpression[object.type='Identifier'][object.name='db'][property.type='Identifier']"(node) {
49
+ if (node.property.type !== AST_NODE_TYPES.Identifier)
50
+ return;
51
+ if (!DRIZZLE_METHODS.includes(node.property.name))
52
+ return;
53
+ drizzleCalls.push(node);
54
+ },
55
+ "Program:exit"() {
56
+ if (hasHarnessImport || drizzleCalls.length === 0)
57
+ return;
58
+ for (const node of drizzleCalls) {
59
+ context.report({ node, messageId: "missingHarness" });
60
+ }
61
+ },
62
+ };
63
+ },
64
+ });
65
+ //# sourceMappingURL=require-test-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-test-harness.js","sourceRoot":"","sources":["../../../src/rules/require-test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAErF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,gGAAgG,IAAI,EAAE,CACzG,CAAA;AAED,MAAM,eAAe,GAAG,6BAA6B,CAAA;AACrD,MAAM,iBAAiB,GAAsB;IAC3C,qBAAqB;IACrB,cAAc;IACd,eAAe;IACf,wBAAwB;CACzB,CAAA;AACD,MAAM,eAAe,GAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAEnF,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;IAC3C,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,8OAA8O;SACjP;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,cAAc,EACZ,kTAAkT;SACrT;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,IAAI,gBAAgB,GAAG,KAAK,CAAA;QAC5B,MAAM,YAAY,GAAgC,EAAE,CAAA;QAEpD,OAAO;YACL,iBAAiB,CAAC,IAAgC;gBAChD,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAM;gBACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;gBAChC,mFAAmF;gBACnF,IAAI,MAAM,KAAK,eAAe,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC;oBAC5E,OAAM;gBACR,CAAC;gBACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,eAAe;wBAAE,SAAQ;oBAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;oBAC9B,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;wBAAE,SAAQ;oBACzD,IAAI,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC9C,gBAAgB,GAAG,IAAI,CAAA;wBACvB,OAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YACD,0FAA0F,CACxF,IAA+B;gBAE/B,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAAE,OAAM;gBAC5D,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAM;gBACzD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,CAAC;YACD,cAAc;gBACZ,IAAI,gBAAgB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBACzD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;gBACvD,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/typescript.d.ts","../../../node_modules/.pnpm/@typescript-eslint+types@8.59.1/node_modules/@typescript-eslint/types/dist/generated/ast-spec.d.ts","../../../node_modules/.pnpm/@typescript-eslint+types@8.59.1/node_modules/@typescript-eslint/types/dist/lib.d.ts","../../../node_modules/.pnpm/@typescript-eslint+types@8.59.1/node_modules/@typescript-eslint/types/dist/parser-options.d.ts","../../../node_modules/.pnpm/@typescript-eslint+types@8.59.1/node_modules/@typescript-eslint/types/dist/ts-estree.d.ts","../../../node_modules/.pnpm/@typescript-eslint+types@8.59.1/node_modules/@typescript-eslint/types/dist/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/clear-caches.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/typescript.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/create-program/getscriptkind.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/tsserverlibrary.d.ts","../../../node_modules/.pnpm/@typescript-eslint+project-service@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/project-service/dist/createprojectservice.d.ts","../../../node_modules/.pnpm/@typescript-eslint+project-service@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/project-service/dist/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/ts-nodes.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/estree-to-ts-node-types.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/ts-estree/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/parsesettings/expiringcache.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/parsesettings/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/create-program/useprovidedprograms.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/getmodifiers.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/node-utils.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/parser-options.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/parser.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/parsesettings/candidatetsconfigrootdirs.d.ts","../../../node_modules/.pnpm/@typescript-eslint+visitor-keys@8.59.1/node_modules/@typescript-eslint/visitor-keys/dist/get-keys.d.ts","../../../node_modules/.pnpm/@typescript-eslint+visitor-keys@8.59.1/node_modules/@typescript-eslint/visitor-keys/dist/visitor-keys.d.ts","../../../node_modules/.pnpm/@typescript-eslint+visitor-keys@8.59.1/node_modules/@typescript-eslint/visitor-keys/dist/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/simple-traverse.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/version-check.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/version.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/withoutprojectparseroptions.d.ts","../../../node_modules/.pnpm/@typescript-eslint+typescript-estree@8.59.1_typescript@5.9.3/node_modules/@typescript-eslint/typescript-estree/dist/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-estree.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/ast.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/parseroptions.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/definitiontype.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/definitionbase.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/catchclausedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/classnamedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/functionnamedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/implicitglobalvariabledefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/importbindingdefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/parameterdefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/tsenummemberdefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/tsenumnamedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/tsmodulenamedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/typedefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/variabledefinition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/definition.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/definition/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/reference.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/variable/variablebase.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/variable/eslintscopevariable.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/variable/variable.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/variable/implicitlibvariable.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/variable/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/scopetype.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/functionscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/globalscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/modulescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/tsmodulescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/scopebase.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/catchscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/classscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/classstaticblockscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/conditionaltypescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/forscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/functionexpressionnamescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/functiontypescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/mappedtypescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/switchscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/tsenumscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/typescope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/withscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/scope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/classfieldinitializerscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scopemanager.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/blockscope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/scope/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/visitorbase.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/patternvisitor.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/visitor.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/referencer.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/referencer/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/analyze.d.ts","../../../node_modules/.pnpm/@typescript-eslint+scope-manager@8.59.1/node_modules/@typescript-eslint/scope-manager/dist/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/scope.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/parser.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/json-schema.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/sourcecode.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/rule.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/linter.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/processor.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/config.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/eslint/eslintshared.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/eslint/flateslint.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/eslint/legacyeslint.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/eslint.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/ruletester.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-eslint/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/astutilities.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/patternmatcher.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/predicates.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/referencetracker.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/scopeanalysis.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/eslint-utils/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/helpers.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/misc.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/predicates.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ast-utils/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/applydefault.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/deepmerge.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/getparserservices.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/infertypesfromrule.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/nullthrows.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/rulecreator.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/eslint-utils/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-utils/isarray.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-utils/noinfer.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/ts-utils/index.d.ts","../../../node_modules/.pnpm/@typescript-eslint+utils@8.59.1_eslint@10.2.1_typescript@5.9.3/node_modules/@typescript-eslint/utils/dist/index.d.ts","../src/rules/no-as-unknown-as.ts","../src/rules/no-isrealdb-dispatch.ts","../src/rules/no-module-mutable-state.ts","../src/rules/no-vi-fn-spy.ts","../src/rules/require-test-harness.ts","../src/index.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.19.17/node_modules/@types/node/index.d.ts"],"fileIdsList":[[192,237,238,240,257,258],[192,239,240,257,258],[240,257,258],[192,240,245,257,258,275],[192,240,241,246,251,257,258,260,272,283],[192,240,241,242,251,257,258,260],[192,240,257,258],[187,188,189,192,240,257,258],[192,240,243,257,258,284],[192,240,244,245,252,257,258,261],[192,240,245,257,258,272,280],[192,240,246,248,251,257,258,260],[192,239,240,247,257,258],[192,240,248,249,257,258],[192,240,250,251,257,258],[192,239,240,251,257,258],[192,240,251,252,253,257,258,272,283],[192,240,251,252,253,257,258,267,272,275],[192,233,240,248,251,254,257,258,260,272,283],[192,240,251,252,254,255,257,258,260,272,280,283],[192,240,254,256,257,258,272,280,283],[190,191,192,193,194,195,196,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289],[192,240,251,257,258],[192,240,257,258,259,283],[192,240,248,251,257,258,260,272],[192,240,257,258,261],[192,240,257,258,262],[192,239,240,257,258,263],[192,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289],[192,240,257,258,265],[192,240,257,258,266],[192,240,251,257,258,267,268],[192,240,257,258,267,269,284,286],[192,240,252,257,258],[192,240,251,257,258,272,273,275],[192,240,257,258,274,275],[192,240,257,258,272,273],[192,240,257,258,275],[192,240,257,258,276],[192,237,240,257,258,272,277,283],[192,240,251,257,258,278,279],[192,240,257,258,278,279],[192,240,245,257,258,260,272,280],[192,240,257,258,281],[192,240,257,258,260,282],[192,240,254,257,258,266,283],[192,240,245,257,258,284],[192,240,257,258,272,285],[192,240,257,258,259,286],[192,240,257,258,287],[192,233,240,257,258],[192,233,240,251,253,257,258,263,272,275,283,285,286,288],[192,240,257,258,272,289],[65,69,192,240,257,258],[70,192,240,257,258],[65,136,143,192,240,257,258],[65,95,96,192,240,257,258],[97,98,99,100,101,102,103,104,105,106,107,192,240,257,258],[65,95,192,240,257,258],[95,97,98,99,100,101,102,103,104,105,106,107,108,192,240,257,258],[109,110,115,136,138,140,141,144,192,240,257,258],[142,192,240,257,258],[65,139,192,240,257,258],[65,115,138,192,240,257,258],[65,110,136,138,141,192,240,257,258],[65,139,140,192,240,257,258],[65,86,192,240,257,258],[65,116,121,134,136,192,240,257,258],[65,110,115,116,121,134,136,192,240,257,258],[65,115,116,121,134,136,192,240,257,258],[116,117,118,119,120,122,123,125,126,127,128,129,130,131,132,133,134,135,137,192,240,257,258],[117,118,119,120,122,123,124,125,126,127,128,129,130,131,132,133,135,137,192,240,257,258],[65,109,110,115,116,117,118,119,120,134,136,192,240,257,258],[65,115,124,135,138,192,240,257,258],[65,111,192,240,257,258],[112,113,138,192,240,257,258],[112,113,114,192,240,257,258],[111,192,240,257,258],[65,109,110,138,192,240,257,258],[60,192,240,257,258],[61,62,63,64,192,240,257,258],[60,62,192,240,257,258],[61,64,192,240,257,258],[67,192,240,257,258],[67,76,192,240,257,258],[67,76,77,192,240,257,258],[66,68,74,77,78,79,80,81,82,83,87,88,89,90,192,240,257,258],[67,74,192,240,257,258],[65,67,74,192,240,257,258],[67,74,81,192,240,257,258],[65,192,240,257,258],[67,71,72,74,75,77,192,240,257,258],[74,86,192,240,257,258],[65,67,72,192,240,257,258],[65,72,73,192,240,257,258],[92,159,192,240,257,258],[160,161,162,163,164,192,240,257,258],[92,192,240,257,258],[165,166,167,168,192,240,257,258],[170,171,172,173,174,175,192,240,257,258],[159,192,240,257,258],[150,192,240,257,258],[92,148,159,169,176,179,192,240,257,258],[94,147,150,152,192,240,257,258],[155,156,192,240,257,258],[150,151,192,240,257,258],[153,154,192,240,257,258],[151,153,154,192,240,257,258],[93,94,146,147,149,150,151,152,153,157,158,192,240,257,258],[147,149,150,152,153,192,240,257,258],[92,94,146,192,240,257,258],[151,192,240,257,258],[92,93,146,148,149,151,153,192,240,257,258],[92,94,150,151,153,192,240,257,258],[145,192,240,257,258],[92,146,147,192,240,257,258],[65,91,192,240,257,258],[177,178,192,240,257,258],[84,85,192,240,257,258],[192,205,209,240,257,258,283],[192,205,240,257,258,272,283],[192,200,240,257,258],[192,202,205,240,257,258,280,283],[192,240,257,258,260,280],[192,240,257,258,290],[192,200,240,257,258,290],[192,202,205,240,257,258,260,283],[192,197,198,201,204,240,251,257,258,272,283],[192,205,212,240,257,258],[192,197,203,240,257,258],[192,205,226,227,240,257,258],[192,201,205,240,257,258,275,283,290],[192,226,240,257,258,290],[192,199,200,240,257,258,290],[192,205,240,257,258],[192,199,200,201,202,203,204,205,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,227,228,229,230,231,232,240,257,258],[192,205,220,240,257,258],[192,205,212,213,240,257,258],[192,203,205,213,214,240,257,258],[192,204,240,257,258],[192,197,200,205,240,257,258],[192,205,209,213,214,240,257,258],[192,209,240,257,258],[192,203,205,208,240,257,258,283],[192,197,202,205,212,240,257,258],[192,240,257,258,272],[192,200,205,226,240,257,258,288,290],[181,182,183,184,185,192,240,257,258],[180,192,240,257,258]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f9c8c4fd31e6e0f137ded52f026f97934abcc4624db1c9c8120b91a170798e0","impliedFormat":1},{"version":"33a1caf57a6f7318c7ce2c8a8a35137bd7c064d140f324e8f47b94cd129305b5","impliedFormat":1},{"version":"c86a92cecb2e497a418b41a0a76f60e1306797f86db40e5261ef46a35ffa2f23","impliedFormat":1},{"version":"12bffdbf179bfe787334d1aa31393bac5b79a84d2285ad94bcf36c1cce9eed57","impliedFormat":1},{"version":"e81484fc62d5e6add90882339bb2cdba0c87b85ca4002add438d0771ce2fdfa7","impliedFormat":1},{"version":"92ebc3261b20037c4e078cd3d26bccedb719b3eec653925e103b6ced4a936c0d","impliedFormat":1},{"version":"9acc441d14a127dea0228cd2645203c3285b296f452f723f850dc2941d2b9c7e","impliedFormat":1},{"version":"e134052a6b1ded61693b4037f615dc72f14e2881e79c1ddbff6c514c8a516b05","impliedFormat":1},{"version":"a4075b7a8211620f01d7a0cffb2d31fde9a2a6a108dec4cbaa3856b6a8e8864a","impliedFormat":1},{"version":"73b15a0b7cf5c6df9076b9408c5ce682f11813453bf54c54cb284f075b5224cf","impliedFormat":1},{"version":"4bcfacf07ad3f040599fdede3807254c11c27d28f740206419c2d5354a571c72","impliedFormat":1},{"version":"7eb92baa673b920122e72e714caf84b78323758a3a214fb6383d717948143668","impliedFormat":1},{"version":"f37616d5f3b755ef9d2765218b06b933faf05cf094d18107cf4c50d81b44b6b0","impliedFormat":1},{"version":"c61e09e2a01aacd789fbcdbea4d386701422b8539ddc0285203d2a6bd0c4c1b5","impliedFormat":1},{"version":"3b78a632fd8d0490bf0eb5f8df1455e6f33028fb7c373d3d75275d06bfb6a7d9","impliedFormat":1},{"version":"d923dc7686f8a0bdabdbb0e8e61e6a95c403a3d6bc6f303af5381c9cd973ee43","impliedFormat":1},{"version":"da633553c8248c6ee21fd93a667d71ba4dcefc64f33632e3dc20ded5cbdd317c","impliedFormat":1},{"version":"050e8efc9defdf21d4c12a2ec280758c13ce66303d3e4e591d003089d99cbe4b","impliedFormat":1},{"version":"d924e653afba6a341ad72c3cbcc62a9c1206d5fcdf02db13fded64bfbca27e87","impliedFormat":1},{"version":"5d1201e776c3167527653c835035e4ad29cd79e0d6b139aa250ca74899e0741e","impliedFormat":1},{"version":"2cb6713aff9ae0ff160ea7cf286806b6a4400f40aac4ae675fa3079b0e60a9c3","impliedFormat":1},{"version":"35e08a4f4dd14289e57a3233276cecaa592ce04f6d7449ed1d3229ba0e76a2e1","impliedFormat":1},{"version":"1fdf5c750e4164249aaa3095803330eae7cc9fb2523535811800460b98f8e7ed","impliedFormat":1},{"version":"8674e77147967c8f75aaa22923ebc836dd7620ee0cf52bbe91b89114f8d91413","impliedFormat":1},{"version":"9f4ef6fd452db4c4d5f96293732ee29c03f54755744342809dea96f63fd7227b","impliedFormat":1},{"version":"57cdb6dba0f7f107cd3ec872e52916ea2901c9a80611e7e669c2ccf3a2219f17","impliedFormat":1},{"version":"20d246417a79b06bca6fe01426258a3408068442899b990472e521eafd6ac5b4","impliedFormat":1},{"version":"c3f937028caf49d383b109a93128164de319c1a5ec3796c02da60acb580e1e9a","impliedFormat":1},{"version":"075e432d493af2ed5ebcd0b99237f584b87461398cf30b569a7587db01157a8c","impliedFormat":1},{"version":"8a60ed93d81f472e270e213c5da23bdfc2a87b6616031f4d397aced25f727217","impliedFormat":1},{"version":"5f2b95921cc6b959e8ca7abc17943382f7e5fe0ea6ef36c5b8dc383def96b1f8","impliedFormat":1},{"version":"43006ce2de2caf33f0e26d937195d197e8b91af1222a1b24532daa3915446c86","impliedFormat":1},{"version":"006577276d8f3b0012b4f856662618082910ed31a71464a42753692be92e4a2a","impliedFormat":1},{"version":"58004a9240ee74db43ce3ab2343cc29473e969adcd592c6fce46939d94512d93","impliedFormat":1},{"version":"492409753b45983851b6d66272f384bcb2dfc045d48eb07e8c8998a571495e63","impliedFormat":1},{"version":"2db60104bde79eac5c47dcfa9738246190173cb76966d88e42959ca8d1ea7e27","impliedFormat":1},{"version":"1fa946b4013f86f5a90107c6cf08850edd290a11b8b400fe3a4c7c24bc800785","impliedFormat":1},{"version":"2105f9dfb4de768168ca5234b185aa508f4a9e9ecdd937400e05fb52734e49c5","impliedFormat":1},{"version":"9e0b7af2247ab847874dc5ca0a92c4f28f55332b8241591bd06fafd3d184f605","impliedFormat":1},{"version":"39bff71bf16f3a020c438f5ddc1a24ab26c28dad91d324372eabbce88abaec74","impliedFormat":1},{"version":"5a395ff9e24f89cc08679e731889b2ed1bfe451ba76f16184ccef0b742589d13","impliedFormat":1},{"version":"0651a8dd2c6446154e0994391f7bdebbde389dc7ec75ac4a0f727fff5255143c","impliedFormat":1},{"version":"2088a7c3bf5a885904de841f5fa6103d8689e439a3cb3273f3bac69c1b3a3b1b","impliedFormat":1},{"version":"6dbc5313fe49ecbab3215f1cb1733d7348b392f1ca12c331c5720f4ea0036f47","impliedFormat":1},{"version":"3ed4ef1f210705e2c320e5b05787d7b6e74b7920492a76bb8712857bb22fc915","impliedFormat":1},{"version":"6fca2337de679c9c118e9005f3ee7f41725690a923bbff4ee20401e879471acd","impliedFormat":1},{"version":"58f59363f3c50919bdc19c44e68b35bb471548486ca98f6e757de252d5d1e856","impliedFormat":1},{"version":"109381191d7b0beb0de64a68ce3735fff9c91944180bfb6abfe42080b116689b","impliedFormat":1},{"version":"b04f68c5b937801cebf5264072a6f4a1f76050a75fd0830d65ae0bf0275ed1fc","impliedFormat":1},{"version":"ad42060f3e0f92a294748f19d9490a8a6a980fb40dda0fd4627991d1361862cc","impliedFormat":1},{"version":"8c00c7abd1e6e594cb9726674fdc65e4d9681d1e4c890bdbd602096e3b48f917","impliedFormat":1},{"version":"ce6b390be6cdd541f54e393b87ce72b0d1171732f9e93c59716e622a5b2e3be5","impliedFormat":1},{"version":"5aa50acb079a18441d0984acda7d3dbbc66a326fccacb20a75d836e797bc8b80","impliedFormat":1},{"version":"6735eae673357ba7f9fc7e55af3b00e1415b32d3b639c38fb936151f336a5978","impliedFormat":1},{"version":"386ff073cfe770b93867e65c26e969d672aeb42fc5506279c71a0185fd653539","impliedFormat":1},{"version":"e967582e89f2a455eafd8bf1232dd81ee207709a48c07322e996ecb0672148bb","impliedFormat":1},{"version":"25528369e718c89acd957ae0e72b1b5105b1111329d31442d8d639ee020b3fce","impliedFormat":1},{"version":"8764a0ff3269684a2c85a54acd7e90d33876927140e28880b8a4c95e8ca63bd6","impliedFormat":1},{"version":"e4ff6f622aea4c2bd44136810e979cd2b8ae41fb94b8d72246a1a449a0146266","impliedFormat":1},{"version":"ea09e3f830cb4da7a144e49803ebd79ad7871e21763fd0a0072ab8fb4aee43b5","impliedFormat":1},{"version":"02cbdc4c83ba725dfb0b9a230d9514eca2769190ea7ef6e6f29816e7ad21ea98","impliedFormat":1},{"version":"228eca402015a3ac3ee5b0726de796244ab2b4db866c2294983b8027ade23338","impliedFormat":1},{"version":"f1e533f10851941ccd2ee623988b26b07aecb84a290eb56627182bc4ca96d1a8","impliedFormat":1},{"version":"5d89916c41cc7051b9c83148d704c4e5aa20343a07efd14b953d16c693eda3ee","impliedFormat":1},{"version":"06124be387e6fc43c6a5727ecb8d6f5380c52878341a2cd065dc968e203029e0","impliedFormat":1},{"version":"44c575e350e5b2c7771137b2797eb3d755b67dd286622158a3855487a6182253","impliedFormat":1},{"version":"a088d5ba9a4fa3a96bcda498268269d163348229c43187950a9b2b7503d46813","impliedFormat":1},{"version":"cf5408ade74fb2ec127a10bb3b1079a386131818bc7ac67a002c4a6c3ec81b62","impliedFormat":1},{"version":"6cf129a29ce866e432f575c5e4c90f44f2fb72d070b9c3901acdb3cbb56fa46d","impliedFormat":1},{"version":"8af2fead6dd3a9cd0471d27018dd49f65f5cc264c4604a11aba4e46b2252eb89","impliedFormat":1},{"version":"677c78ed184c32e4ff0be1e4baf0fbf1a0cccd4f41532527735a2c43edd58a87","impliedFormat":1},{"version":"70415c6e264d10d01f7438d40e1a85b815ace6598e4a73f491b33db7820e1469","impliedFormat":1},{"version":"38fa05ec45e9bddcb55c47b437330c229655e3b0325b07dd72206a10bf329a05","impliedFormat":1},{"version":"8b11a987390721ea4930dcc7aca1dec606a2cd1b03fb27d05e4c995875ee54bb","impliedFormat":1},{"version":"3b05973f4a6dc88d28c125b744dc99d2a527bdb3c567eda1b439d10ce70246f5","impliedFormat":1},{"version":"2ee3f52f480021bd7d23fe72e66ba0ec8d0a464d2295ab612d409d45a3f9d7ae","impliedFormat":1},{"version":"06e13dc31517e5123765206ad170f0625b8a1a1321f702598a0563a9ac7d68c3","impliedFormat":1},{"version":"c56439d9bf05c500219f2db6e49cd4b418f2f9fb14043dee96b2d115276012b8","impliedFormat":1},{"version":"55fa234a04eacdf253e0b46d72f6e3bd8a044339c43547a29cf3b9f29ccd050d","impliedFormat":1},{"version":"9811146d06f6b7615165f0dcd3d2aaea72adb260c8e747449b7a87c4c44f7ff1","impliedFormat":1},{"version":"b4e618b2d4422fa5fae63e999dccb69736b03ec7b0c6fd2d4dc833263d40921c","impliedFormat":1},{"version":"21a06a5d3e4f859723386772d4c481ed5b40f883ecd4ed9a8ec8bcb54a10e542","impliedFormat":1},{"version":"55f4ba9c75263294a97f3d253bf295ae94fd519f544eda4af3cc12b19bc75a66","impliedFormat":1},{"version":"5ef6b0404100d30e3b47c73021f2da740d1fa8088fda5adc741706cb3e73cf13","impliedFormat":1},{"version":"24081c38e738a14e6d002c166ba297a9656cd8b18475b36bc7c99bb55c7d5cca","impliedFormat":1},{"version":"d1342658b16b92d24b961db5c1779dc03fe30194fd6fea0d15dc8e946f82d83f","impliedFormat":1},{"version":"cbd4ff12f799a44b629643edc686aeec830fbb867c69cb6609da57d205057717","impliedFormat":1},{"version":"4f4d1284bc93168a1a0b2888f528aa689828917cdc547802ab29c0d1f553be40","impliedFormat":1},{"version":"fd15b208613892273f0675f55b31c878e22a28d62d306e589867009592f67166","impliedFormat":1},{"version":"ef5bc836c5c0886cd8c9cf1cff6192f4f1e82ef1f8088c9f136586b9860051e0","impliedFormat":1},{"version":"7fccf3bf47055503c751dac14156f9ea815a8c46c96c2e1ddf6b3b586694fc7f","impliedFormat":1},{"version":"001fc9e5e2a353521cc0807e759f7c5a88cc18a8389568cf94b8809c38f00cd4","impliedFormat":1},{"version":"d14cd6c9001dfa6f96660952945c344370109247764ab42b47d110fcbff678e7","impliedFormat":1},{"version":"282c7f230b9d2fda119b5b4a9567fae09ea09ea1bbacaa2085ef622d217979d8","impliedFormat":1},{"version":"4db00e3ce9cd4d68249907352b1f6c41c687b58f088bc2c8bff1bc41800bb732","impliedFormat":1},{"version":"316b2ea3cb57f2ccf86a19c4016eebb97eb177f3d5b5dc4b3d0508439afffff0","impliedFormat":1},{"version":"71de65e470fb5a0920472a8b13d37fff8960822e34d709aee14599802c15770c","impliedFormat":1},{"version":"c0cbe98c4e104042383444c718d2ce2d0dd602e6b7d52dc3185bbdf289da1128","impliedFormat":1},{"version":"c3c8297d66976e60076da541ec418590bf26d1056980b9adfea2c14baaf2089e","impliedFormat":1},{"version":"17ec351733c9b9a5de7d0aee5f710ca792a19efc365bed93ec045b885c309fde","impliedFormat":1},{"version":"8bb061c812d97dedb8549ca46cd3b8bae3f2494ef681d9712c64c1b933801ebf","impliedFormat":1},{"version":"969ab03feed7516ece5c6c0468e6c39391ed75317dd641d5600736b131559ad6","impliedFormat":1},{"version":"54e989ecd24eec06935b7770caee22386e9b7cdc47aca29bb2be83080460db36","impliedFormat":1},{"version":"ef4529c51657c83eabdda0b7818c25b6c7d827bfd7a49f38553f7fd3deba94e3","impliedFormat":1},{"version":"89c710eef54f9726d13eb123a800285d9b5cf2eb64d98f4c3a7b0e5a162ad24f","impliedFormat":1},{"version":"a97990e77a23aea39060610aef4b4bb92154d5330ecb0b557324ba4c14a1db41","impliedFormat":1},{"version":"d2b89296b175b0a1a11ce09cc682e6f86b24d34abd1bdf8c932a82c4e99b551a","impliedFormat":1},{"version":"3c85c2b16d0a1fa45095793b90467bcef3bfeaa85b3fdc00ff1eb3c32ca97cb2","impliedFormat":1},{"version":"8cdd09ab2d9fe19d5cb3ca1dcb6c6437d6164a9de46405afe1954e533a77120e","impliedFormat":1},{"version":"b90283ab6c36fc580b06cb293629a9b37eaba24e17ff9ae2f0d874a3f3a962a1","impliedFormat":1},{"version":"c1425155d2396f10be607f43392284b6bfc98b542bb49c611eaa2038b6a72112","impliedFormat":1},{"version":"30e0e58b2b36491323f748cc938b93eba059d354abecee659ba0e9312a842a5d","impliedFormat":1},{"version":"c2d8eccfe4adada4730bbd4f2568627d5d4aeb27cfbc8d39aa974ce33e855977","impliedFormat":1},{"version":"21d0cc7ad656b0348bfd745fb598399c6f9531ffef6ff1b8996fe42c5f185f0a","impliedFormat":1},{"version":"d29d2e64870b453a96329bf0f88eccf270812fb1989e853588fd5f3b0bc94919","impliedFormat":1},{"version":"b5bbf77bea59350deb48316308ae673afa70a77ffc86edc1e707af94a4b2a1d2","impliedFormat":1},{"version":"6eddc1432777582b4797eb53c43b9917b1ba8908a737f7823a7049620f98588b","impliedFormat":1},{"version":"79e7eb72b4d9ca2d268460d35fa7bfe01db96e93659752bd5fc5cbf5c5be8294","impliedFormat":1},{"version":"10ad4c890e509380deb83c8bec650899df9bd70ee20238f2221d6bdc36043a0e","impliedFormat":1},{"version":"1a3b837513da5afd3bb0b228dab3a089fce405344243e372672f641ededf9b48","impliedFormat":1},{"version":"901f6b020440eac80a83a7ca248ca244e2a296be6b1ed8645a884a4509e11fc7","impliedFormat":1},{"version":"103a338ab32a9207ccf5e8bc2413bd06751fd300975e6d70e90afe1e7c116203","signature":"1621db59f1e7aa119db32362434fd1c7a2fcdb91370b5842dc7a74ad26c22fa7"},{"version":"e15edbd110774f7f30e25e6858a51c2aaa9c808e95132bddedcb390cc5c0bbec","signature":"742bfb5c92e6d0f62005e79b647c3e966015f301f2b1f0607e04f5adb447f4df"},{"version":"860214c7a8a5a517ff7ff30928755f81bd0e8f78c8c7008e99e432f9344dc4f0","signature":"5ca59566431ea44e2b4b24e5183c616629cc4e43188ae8890ab7591f79723829"},{"version":"74f508701535ccaf082810d2da869c9690c18089628aba595a777e607601b6df","signature":"95c80cfe40a69a2a3d2807a4494a76b795169ec8f67f6cd59ce344dff4f69ed0"},{"version":"413e9fc110335fd5bfa2fd975837d2b03eeeca560b62432522a999d91128a8a9","signature":"c923a0078ae2879afa5ff4efaea1604053bd8be269b2f376f9e6012bceeaf415"},{"version":"f1dbf3effea5a27d3b70b32d899904a73c2bb46652efd8ca82612211b09679a9","signature":"618c6f0bca45170b18e23e6a6891e2954c1a870ff2a369df00d072751cb14956"},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"c906fb15bd2aabc9ed1e3f44eb6a8661199d6c320b3aa196b826121552cb3695","impliedFormat":1},{"version":"22295e8103f1d6d8ea4b5d6211e43421fe4564e34d0dd8e09e520e452d89e659","impliedFormat":1},{"version":"58647d85d0f722a1ce9de50955df60a7489f0593bf1a7015521efe901c06d770","impliedFormat":1},{"version":"6b4e081d55ac24fc8a4631d5dd77fe249fa25900abd7d046abb87d90e3b45645","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"a3fc63c0d7b031693f665f5494412ba4b551fe644ededccc0ab5922401079c95","impliedFormat":1},{"version":"80523c00b8544a2000ae0143e4a90a00b47f99823eb7926c1e03c494216fc363","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"746911b62b329587939560deb5c036aca48aece03147b021fa680223255d5183","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"c8d3e5a18ba35629954e48c4cc8f11dc88224650067a172685c736b27a34a4dc","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2b55d426ff2b9087485e52ac4bc7cfafe1dc420fc76dad926cd46526567c501a","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"47613031a5a31510831304405af561b0ffaedb734437c595256bb61a90f9311b","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"8a1a0d0a4a06a8d278947fcb66bf684f117bf147f89b06e50662d79a53be3e9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"9f55299850d4f0921e79b6bf344b47c420ce0f507b9dcf593e532b09ea7eeea1","impliedFormat":1}],"root":[[181,186]],"options":{"allowImportingTsExtensions":true,"composite":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rewriteRelativeImportExtensions":true,"rootDir":"..","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"referencedMap":[[237,1],[238,1],[239,2],[192,3],[240,4],[241,5],[242,6],[187,7],[190,8],[188,7],[189,7],[243,9],[244,10],[245,11],[246,12],[247,13],[248,14],[249,14],[250,15],[251,16],[252,17],[253,18],[193,7],[191,7],[254,19],[255,20],[256,21],[290,22],[257,23],[258,7],[259,24],[260,25],[261,26],[262,27],[263,28],[264,29],[265,30],[266,31],[267,32],[268,32],[269,33],[270,7],[271,34],[272,35],[274,36],[273,37],[275,38],[276,39],[277,40],[278,41],[279,42],[280,43],[281,44],[282,45],[283,46],[284,47],[285,48],[286,49],[287,50],[194,7],[195,7],[196,7],[234,51],[235,7],[236,7],[288,52],[289,53],[70,54],[71,55],[144,56],[97,57],[98,57],[108,58],[96,59],[95,7],[99,57],[100,57],[101,57],[109,60],[102,57],[103,57],[104,57],[105,57],[106,57],[107,57],[145,61],[143,62],[140,63],[110,64],[142,65],[141,66],[139,67],[137,68],[122,68],[135,68],[123,68],[124,68],[125,68],[126,68],[127,68],[117,69],[128,68],[118,70],[138,71],[129,68],[119,68],[134,72],[121,73],[116,7],[130,68],[131,68],[120,68],[132,68],[133,68],[136,74],[112,75],[114,76],[115,77],[113,78],[111,79],[61,80],[65,81],[62,7],[63,82],[64,83],[66,7],[68,84],[77,85],[78,86],[79,84],[91,87],[80,88],[81,89],[82,90],[83,7],[75,91],[76,92],[87,93],[73,94],[74,95],[72,85],[88,7],[89,7],[90,7],[160,96],[165,97],[161,7],[162,98],[163,96],[164,96],[166,98],[169,99],[167,98],[168,98],[170,7],[171,7],[172,96],[176,100],[173,101],[174,7],[175,102],[180,103],[148,7],[93,98],[153,104],[157,105],[154,106],[155,107],[156,108],[159,109],[151,110],[147,111],[94,91],[152,112],[150,113],[158,114],[146,115],[149,116],[92,117],[179,118],[177,7],[178,7],[84,91],[86,119],[85,7],[60,7],[58,7],[59,7],[10,7],[11,7],[13,7],[12,7],[2,7],[14,7],[15,7],[16,7],[17,7],[18,7],[19,7],[20,7],[21,7],[3,7],[22,7],[23,7],[4,7],[24,7],[28,7],[25,7],[26,7],[27,7],[29,7],[30,7],[31,7],[5,7],[32,7],[33,7],[34,7],[35,7],[6,7],[39,7],[36,7],[37,7],[38,7],[40,7],[7,7],[41,7],[46,7],[47,7],[42,7],[43,7],[44,7],[45,7],[8,7],[51,7],[48,7],[49,7],[50,7],[52,7],[9,7],[53,7],[54,7],[55,7],[57,7],[56,7],[1,7],[69,84],[67,7],[212,120],[222,121],[211,120],[232,122],[203,123],[202,124],[231,125],[225,126],[230,127],[205,128],[219,129],[204,130],[228,131],[200,132],[199,125],[229,133],[201,134],[206,135],[207,7],[210,135],[197,7],[233,136],[223,137],[214,138],[215,139],[217,140],[213,141],[216,142],[226,125],[208,143],[209,144],[218,145],[198,146],[221,137],[220,135],[224,7],[227,147],[186,148],[181,149],[182,149],[183,149],[184,149],[185,149]],"latestChangedDtsFile":"./src/index.d.ts","version":"5.9.3"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@ydtb/eslint-plugin",
3
+ "version": "0.16.2",
4
+ "private": false,
5
+ "description": "Custom ESLint rules enforcing YDTB quality patterns. See plans/testing/README.md in the orchestrator for the full rationale.",
6
+ "type": "module",
7
+ "license": "UNLICENSED",
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "registry": "https://registry.npmjs.org/"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "dev-src": "./src/index.ts",
15
+ "types": "./dist/src/index.d.ts",
16
+ "default": "./dist/src/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "dependencies": {
24
+ "@typescript-eslint/utils": "^8.59.0"
25
+ },
26
+ "peerDependencies": {
27
+ "eslint": ">=9.0.0"
28
+ },
29
+ "devDependencies": {
30
+ "@typescript-eslint/rule-tester": "^8.59.0",
31
+ "@types/node": "^22.0.0",
32
+ "eslint": "^10.2.1",
33
+ "typescript": "^5.7.0",
34
+ "vitest": "^4.1.3"
35
+ },
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/yourdigitaltoolbox/tk-scope.git"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -b",
42
+ "typecheck": "tsc -b --noEmit",
43
+ "lint": "eslint .",
44
+ "test": "vitest run",
45
+ "clean": "rm -rf dist *.tsbuildinfo"
46
+ }
47
+ }