@opensip-cli/checks-typescript 0.1.7 → 0.1.8
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/README.md +2 -2
- package/dist/__tests__/branch-fixtures-3.test.js +41 -0
- package/dist/__tests__/branch-fixtures-3.test.js.map +1 -1
- package/dist/__tests__/branch-fixtures.test.js +1 -3
- package/dist/__tests__/branch-fixtures.test.js.map +1 -1
- package/dist/__tests__/null-safety-typed.test.d.ts +2 -0
- package/dist/__tests__/null-safety-typed.test.d.ts.map +1 -0
- package/dist/__tests__/null-safety-typed.test.js +112 -0
- package/dist/__tests__/null-safety-typed.test.js.map +1 -0
- package/dist/__tests__/shared-program.test.d.ts +2 -0
- package/dist/__tests__/shared-program.test.d.ts.map +1 -0
- package/dist/__tests__/shared-program.test.js +41 -0
- package/dist/__tests__/shared-program.test.js.map +1 -0
- package/dist/__tests__/shipped-allowlists-are-generic.test.d.ts +2 -0
- package/dist/__tests__/shipped-allowlists-are-generic.test.d.ts.map +1 -0
- package/dist/__tests__/shipped-allowlists-are-generic.test.js +64 -0
- package/dist/__tests__/shipped-allowlists-are-generic.test.js.map +1 -0
- package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts +13 -1
- package/dist/checks/quality/code-structure/duplicate-utility-functions.d.ts.map +1 -1
- package/dist/checks/quality/code-structure/duplicate-utility-functions.js +7 -3
- package/dist/checks/quality/code-structure/duplicate-utility-functions.js.map +1 -1
- package/dist/checks/quality/data-integrity/null-safety.d.ts +63 -2
- package/dist/checks/quality/data-integrity/null-safety.d.ts.map +1 -1
- package/dist/checks/quality/data-integrity/null-safety.js +191 -102
- package/dist/checks/quality/data-integrity/null-safety.js.map +1 -1
- package/dist/checks/quality/patterns/result-pattern-consistency.d.ts +21 -0
- package/dist/checks/quality/patterns/result-pattern-consistency.d.ts.map +1 -1
- package/dist/checks/quality/patterns/result-pattern-consistency.js +16 -15
- package/dist/checks/quality/patterns/result-pattern-consistency.js.map +1 -1
- package/dist/checks/resilience/no-raw-fetch.d.ts +14 -0
- package/dist/checks/resilience/no-raw-fetch.d.ts.map +1 -1
- package/dist/checks/resilience/no-raw-fetch.js +7 -7
- package/dist/checks/resilience/no-raw-fetch.js.map +1 -1
- package/dist/shared/type-program.d.ts +23 -0
- package/dist/shared/type-program.d.ts.map +1 -0
- package/dist/shared/type-program.js +35 -0
- package/dist/shared/type-program.js.map +1 -0
- package/package.json +5 -5
|
@@ -7,6 +7,27 @@
|
|
|
7
7
|
*
|
|
8
8
|
* @see CLAUDE.md Error Handling Policy
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Recipe-config shape for result-pattern-consistency. Project-specific boundary
|
|
12
|
+
* directories (where throwing is the intended pattern) belong in a recipe's
|
|
13
|
+
* `checks.config['result-pattern-consistency']` block, not in the check's
|
|
14
|
+
* built-in defaults — hardcoding one codebase's layout into a generic check
|
|
15
|
+
* either leaks that layout or misclassifies another codebase's files.
|
|
16
|
+
*/
|
|
17
|
+
export interface ResultPatternConsistencyConfig extends Record<string, unknown> {
|
|
18
|
+
/**
|
|
19
|
+
* Additional path patterns where `throw` is allowed (treated as an
|
|
20
|
+
* infrastructure/edge boundary). Each entry compiles to a RegExp via
|
|
21
|
+
* `new RegExp(entry)` and is matched against the file path.
|
|
22
|
+
*/
|
|
23
|
+
additionalThrowAllowedPaths?: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Paths where throwing is expected (infrastructure boundaries per DEC-015).
|
|
27
|
+
* These are entry points that bridge external systems, CLI, or pipeline layers
|
|
28
|
+
* where callers can't meaningfully recover — throw is the correct pattern.
|
|
29
|
+
*/
|
|
30
|
+
export declare const THROW_ALLOWED_PATHS: RegExp[];
|
|
10
31
|
/**
|
|
11
32
|
* Check: quality/result-pattern-consistency
|
|
12
33
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-pattern-consistency.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/result-pattern-consistency.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"result-pattern-consistency.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/result-pattern-consistency.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAMH;;;;;;GAMG;AACH,MAAM,WAAW,8BAA+B,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7E;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AA2CD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,UAsB/B,CAAC;AAsOF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,sCAsEnC,CAAC"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @see CLAUDE.md Error Handling Policy
|
|
10
10
|
*/
|
|
11
|
-
import { defineCheck } from '@opensip-cli/fitness';
|
|
11
|
+
import { defineCheck, getCheckConfig } from '@opensip-cli/fitness';
|
|
12
12
|
import { getSharedSourceFile } from '@opensip-cli/lang-typescript';
|
|
13
13
|
import * as ts from 'typescript';
|
|
14
14
|
/**
|
|
@@ -55,7 +55,9 @@ const LEGITIMATE_THROW_FUNCTION_PATTERNS = [
|
|
|
55
55
|
* These are entry points that bridge external systems, CLI, or pipeline layers
|
|
56
56
|
* where callers can't meaningfully recover — throw is the correct pattern.
|
|
57
57
|
*/
|
|
58
|
-
const THROW_ALLOWED_PATHS = [
|
|
58
|
+
export const THROW_ALLOWED_PATHS = [
|
|
59
|
+
// Generic architectural boundaries that bridge external systems, CLI, or
|
|
60
|
+
// entry/edge layers where callers can't meaningfully recover.
|
|
59
61
|
/\/routes\//,
|
|
60
62
|
/\/handlers\//,
|
|
61
63
|
/\/controllers\//,
|
|
@@ -63,25 +65,18 @@ const THROW_ALLOWED_PATHS = [
|
|
|
63
65
|
/\/plugins?\//,
|
|
64
66
|
/\/bootstrap/,
|
|
65
67
|
/\/providers\//,
|
|
66
|
-
// Internal services
|
|
67
|
-
/\/services\/internal\//,
|
|
68
|
-
// Validation utilities
|
|
69
|
-
/\/utils\/validation/,
|
|
70
|
-
// LLM and external API adapters (bridge external services)
|
|
71
|
-
/\/llm\//,
|
|
72
68
|
/\/adapters\//,
|
|
73
|
-
/\/
|
|
69
|
+
/\/utils\/validation/,
|
|
74
70
|
// CLI command entry points (bridge CLI to domain)
|
|
75
71
|
/\/commands\//,
|
|
76
|
-
// Pipeline governance and orchestration boundaries
|
|
77
|
-
/\/governor\//,
|
|
78
|
-
/\/prompt\//,
|
|
79
72
|
// ID parsing/validation (infrastructure boundary for data integrity)
|
|
80
73
|
/\/ids\//,
|
|
81
|
-
// Infrastructure boundary packages and patterns (DEC-015: throw is correct)
|
|
82
|
-
/packages\/infrastructure\//,
|
|
83
74
|
/\/stores\//,
|
|
84
75
|
/\/registry\//,
|
|
76
|
+
// NOTE: project-specific boundary directories (e.g. `/llm/`, `/embeddings/`,
|
|
77
|
+
// a bespoke `/governor/` or `packages/infrastructure/` layout) are NOT
|
|
78
|
+
// hardcoded here — add them via the `additionalThrowAllowedPaths`
|
|
79
|
+
// recipe-config key (see buildEffectiveThrowAllowedPaths).
|
|
85
80
|
];
|
|
86
81
|
/**
|
|
87
82
|
* File name patterns where throwing is legitimate (infrastructure boundary classes)
|
|
@@ -90,8 +85,14 @@ const INFRASTRUCTURE_FILE_PATTERNS = [/registry/i, /-registry/i, /store/i, /-sto
|
|
|
90
85
|
/**
|
|
91
86
|
* Check if a file path is in a throw-allowed context
|
|
92
87
|
*/
|
|
88
|
+
/** Merge built-in (generic) throw-allowed paths with the recipe-config slice. */
|
|
89
|
+
function buildEffectiveThrowAllowedPaths() {
|
|
90
|
+
const cfg = getCheckConfig('result-pattern-consistency');
|
|
91
|
+
const extra = (cfg.additionalThrowAllowedPaths ?? []).map((src) => new RegExp(src));
|
|
92
|
+
return [...THROW_ALLOWED_PATHS, ...extra];
|
|
93
|
+
}
|
|
93
94
|
function isThrowAllowedPath(filePath) {
|
|
94
|
-
if (
|
|
95
|
+
if (buildEffectiveThrowAllowedPaths().some((pattern) => pattern.test(filePath))) {
|
|
95
96
|
return true;
|
|
96
97
|
}
|
|
97
98
|
// Check file name against infrastructure patterns (registries, stores, adapters)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-pattern-consistency.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/result-pattern-consistency.ts"],"names":[],"mappings":"AAAA,qIAAqI;AACrI;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"result-pattern-consistency.js","sourceRoot":"","sources":["../../../../src/checks/quality/patterns/result-pattern-consistency.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
* @fileoverview No raw fetch check — flags direct `fetch()` calls that should
|
|
3
3
|
* use a wrapped HTTP client.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Recipe-config shape for no-raw-fetch. Infrastructure/adapter directories that
|
|
7
|
+
* legitimately call `fetch` directly are PROJECT-SPECIFIC and belong in a
|
|
8
|
+
* recipe's `checks.config['no-raw-fetch']` block, not hardcoded into this
|
|
9
|
+
* generic check.
|
|
10
|
+
*/
|
|
11
|
+
export interface NoRawFetchConfig extends Record<string, unknown> {
|
|
12
|
+
/**
|
|
13
|
+
* Path substrings whose files are exempt from the raw-fetch rule (e.g. an
|
|
14
|
+
* infrastructure/adapter boundary that wraps `fetch` itself). Matched via
|
|
15
|
+
* `String.prototype.includes` against the file path.
|
|
16
|
+
*/
|
|
17
|
+
skipPaths?: readonly string[];
|
|
18
|
+
}
|
|
5
19
|
/**
|
|
6
20
|
* Check: resilience/no-raw-fetch
|
|
7
21
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-fetch.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"no-raw-fetch.d.ts","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAkBD;;;;GAIG;AACH,eAAO,MAAM,UAAU,sCAmGrB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @fileoverview No raw fetch check — flags direct `fetch()` calls that should
|
|
3
3
|
* use a wrapped HTTP client.
|
|
4
4
|
*/
|
|
5
|
-
import { defineCheck, isCommentLine, isTestFile } from '@opensip-cli/fitness';
|
|
5
|
+
import { defineCheck, getCheckConfig, isCommentLine, isTestFile, } from '@opensip-cli/fitness';
|
|
6
6
|
/**
|
|
7
7
|
* Pattern for detecting raw fetch() calls.
|
|
8
8
|
*
|
|
@@ -54,12 +54,12 @@ export const noRawFetch = defineCheck({
|
|
|
54
54
|
if (isTestFile(filePath)) {
|
|
55
55
|
return violations;
|
|
56
56
|
}
|
|
57
|
-
// Skip
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (
|
|
57
|
+
// Skip caller-configured infrastructure/adapter boundaries that legitimately
|
|
58
|
+
// call fetch directly. These are PROJECT-SPECIFIC (e.g. an `/llm/` adapter
|
|
59
|
+
// layer) and supplied via the `skipPaths` recipe-config key — not hardcoded
|
|
60
|
+
// into this generic check.
|
|
61
|
+
const cfg = getCheckConfig('no-raw-fetch');
|
|
62
|
+
if ((cfg.skipPaths ?? []).some((p) => filePath.includes(p))) {
|
|
63
63
|
return violations;
|
|
64
64
|
}
|
|
65
65
|
// Skip SSE/streaming implementations that require raw fetch for stream parsing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-raw-fetch.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"no-raw-fetch.js","sourceRoot":"","sources":["../../../src/checks/resilience/no-raw-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAiB9B;;;;;;;;;;;;;GAaG;AACH,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;IACpC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;IACrC,WAAW,EAAE,kEAAkE;IAC/E,eAAe,EAAE;;;;;;;;oFAQiE;IAClF,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC;IAErC,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,mDAAmD;QACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,iFAAiF;QACjF,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjF,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,mEAAmE;QACnE,iEAAiE;QACjE,mEAAmE;QACnE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,6EAA6E;QAC7E,2EAA2E;QAC3E,4EAA4E;QAC5E,2BAA2B;QAC3B,MAAM,GAAG,GAAG,cAAc,CAAmB,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,+EAA+E;QAC/E,IACE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC/B,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,kEAAkE;QAClE,iEAAiE;QACjE,qEAAqE;QACrE,mEAAmE;QACnE,+DAA+D;QAC/D,iCAAiC;QACjC,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACnF,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,gBAAgB,GACpB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,gBAAgB,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YACtD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAEzB,qBAAqB;YACrB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,iBAAiB,CAAC,SAAS,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC;YACV,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACvD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,OAAO,GAAG,CAAC;oBACjB,MAAM,EAAE,KAAK,CAAC,KAAK;oBACnB,OAAO,EAAE,4BAA4B;oBACrC,QAAQ,EAAE,SAAS;oBACnB,UAAU,EACR,0GAA0G;oBAC5G,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;oBACf,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared per-run TypeScript Program accessor for type-aware checks.
|
|
3
|
+
*
|
|
4
|
+
* Builds ONE `ts.Program` + bound `TypeChecker` per fit run (the expensive
|
|
5
|
+
* part: ~1s / ~0.6 GB on a ~900-file corpus) and reuses it across every
|
|
6
|
+
* type-aware TS check, via the per-run cell the fitness tool hangs on
|
|
7
|
+
* `scope.fitness.tsProgram`.
|
|
8
|
+
*
|
|
9
|
+
* The build logic lives HERE, not in the fitness engine, because only this
|
|
10
|
+
* pack carries the `lang-typescript` / `typescript` runtime dependency — the
|
|
11
|
+
* engine's cell stays a generic, opaque holder so the heavy `typescript` dep
|
|
12
|
+
* never enters the engine (or non-TS check runs).
|
|
13
|
+
*/
|
|
14
|
+
import { type TypeCheckedProgram } from '@opensip-cli/lang-typescript';
|
|
15
|
+
/**
|
|
16
|
+
* Return the run's shared type-checked Program over `rootFiles`, building it on
|
|
17
|
+
* the first call and memoizing it on the fitness subscope cell so subsequent
|
|
18
|
+
* type-aware checks in the same run reuse it. When no scope/subscope is active
|
|
19
|
+
* (e.g. a unit test that does not enter a RunScope), builds a fresh, uncached
|
|
20
|
+
* Program so the caller still works.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getSharedTypeCheckedProgram(rootFiles: readonly string[]): TypeCheckedProgram;
|
|
23
|
+
//# sourceMappingURL=type-program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-program.d.ts","sourceRoot":"","sources":["../../src/shared/type-program.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEjG;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,kBAAkB,CAW5F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared per-run TypeScript Program accessor for type-aware checks.
|
|
3
|
+
*
|
|
4
|
+
* Builds ONE `ts.Program` + bound `TypeChecker` per fit run (the expensive
|
|
5
|
+
* part: ~1s / ~0.6 GB on a ~900-file corpus) and reuses it across every
|
|
6
|
+
* type-aware TS check, via the per-run cell the fitness tool hangs on
|
|
7
|
+
* `scope.fitness.tsProgram`.
|
|
8
|
+
*
|
|
9
|
+
* The build logic lives HERE, not in the fitness engine, because only this
|
|
10
|
+
* pack carries the `lang-typescript` / `typescript` runtime dependency — the
|
|
11
|
+
* engine's cell stays a generic, opaque holder so the heavy `typescript` dep
|
|
12
|
+
* never enters the engine (or non-TS check runs).
|
|
13
|
+
*/
|
|
14
|
+
import { currentScope } from '@opensip-cli/core';
|
|
15
|
+
import { createTypeCheckedProgram } from '@opensip-cli/lang-typescript';
|
|
16
|
+
/**
|
|
17
|
+
* Return the run's shared type-checked Program over `rootFiles`, building it on
|
|
18
|
+
* the first call and memoizing it on the fitness subscope cell so subsequent
|
|
19
|
+
* type-aware checks in the same run reuse it. When no scope/subscope is active
|
|
20
|
+
* (e.g. a unit test that does not enter a RunScope), builds a fresh, uncached
|
|
21
|
+
* Program so the caller still works.
|
|
22
|
+
*/
|
|
23
|
+
export function getSharedTypeCheckedProgram(rootFiles) {
|
|
24
|
+
const scope = currentScope();
|
|
25
|
+
const projectRoot = scope?.projectContext?.projectRoot ?? process.cwd();
|
|
26
|
+
const cell = scope?.fitness?.tsProgram;
|
|
27
|
+
if (!cell) {
|
|
28
|
+
return createTypeCheckedProgram(rootFiles, { projectRoot });
|
|
29
|
+
}
|
|
30
|
+
if (cell.value === undefined) {
|
|
31
|
+
cell.value = createTypeCheckedProgram(rootFiles, { projectRoot });
|
|
32
|
+
}
|
|
33
|
+
return cell.value;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=type-program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-program.js","sourceRoot":"","sources":["../../src/shared/type-program.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAA2B,MAAM,8BAA8B,CAAC;AAEjG;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,SAA4B;IACtE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,KAAK,EAAE,cAAc,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACxE,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,wBAAwB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC,KAA2B,CAAC;AAC1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensip-cli/checks-typescript",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "TypeScript/Node.js fitness checks for opensip-cli",
|
|
6
6
|
"keywords": [
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"typescript": "~6.0.3",
|
|
40
|
-
"@opensip-cli/
|
|
41
|
-
"@opensip-cli/
|
|
42
|
-
"@opensip-cli/
|
|
40
|
+
"@opensip-cli/core": "0.1.8",
|
|
41
|
+
"@opensip-cli/fitness": "0.1.8",
|
|
42
|
+
"@opensip-cli/lang-typescript": "0.1.8"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^24.13.2",
|
|
46
46
|
"vitest": "^4.1.8",
|
|
47
|
-
"@opensip-cli/test-support": "0.1.
|
|
47
|
+
"@opensip-cli/test-support": "0.1.8"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsc",
|