@opensip-cli/checks-typescript 0.1.4 β 0.1.6
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__/host-tool-runtime-import-boundary.test.d.ts +2 -0
- package/dist/__tests__/host-tool-runtime-import-boundary.test.d.ts.map +1 -0
- package/dist/__tests__/host-tool-runtime-import-boundary.test.js +83 -0
- package/dist/__tests__/host-tool-runtime-import-boundary.test.js.map +1 -0
- package/dist/checks/architecture/host-tool-runtime-import-boundary.d.ts +15 -0
- package/dist/checks/architecture/host-tool-runtime-import-boundary.d.ts.map +1 -0
- package/dist/checks/architecture/host-tool-runtime-import-boundary.js +138 -0
- package/dist/checks/architecture/host-tool-runtime-import-boundary.js.map +1 -0
- package/dist/checks/architecture/index.d.ts +1 -0
- package/dist/checks/architecture/index.d.ts.map +1 -1
- package/dist/checks/architecture/index.js +1 -0
- package/dist/checks/architecture/index.js.map +1 -1
- package/dist/display/architecture.d.ts.map +1 -1
- package/dist/display/architecture.js +1 -0
- package/dist/display/architecture.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -23,8 +23,8 @@ This package is published for the CLI and advanced plugin authors; most users sh
|
|
|
23
23
|
## Documentation
|
|
24
24
|
|
|
25
25
|
- π Project docs: https://opensip.ai/docs/opensip-cli/
|
|
26
|
-
- π§ Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.
|
|
27
|
-
- π¦ Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.
|
|
26
|
+
- π§ Package catalog (what every package does): https://github.com/opensip-ai/opensip-cli/blob/v0.1.6/docs/public/70-reference/02-package-catalog.md
|
|
27
|
+
- π¦ Source: https://github.com/opensip-ai/opensip-cli/tree/v0.1.6/packages/fitness/checks-typescript
|
|
28
28
|
|
|
29
29
|
## License
|
|
30
30
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-tool-runtime-import-boundary.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/host-tool-runtime-import-boundary.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Behaviour tests for the ADR-0054 host-process tool runtime
|
|
3
|
+
* import boundary check.
|
|
4
|
+
*/
|
|
5
|
+
import { runCheckOnFixture } from '@opensip-cli/test-support';
|
|
6
|
+
import { describe, expect, it } from 'vitest';
|
|
7
|
+
import { analyzeHostToolRuntimeImportBoundary } from '../checks/architecture/host-tool-runtime-import-boundary.js';
|
|
8
|
+
import { checks } from '../index.js';
|
|
9
|
+
const DISCOVERY_PATH = 'packages/cli/src/bootstrap/register-tools-discovery.ts';
|
|
10
|
+
const ADMISSION_PATH = 'packages/cli/src/bootstrap/admit-tool-package.ts';
|
|
11
|
+
const OTHER_CLI_PATH = 'packages/cli/src/commands/plugin.ts';
|
|
12
|
+
function check() {
|
|
13
|
+
const c = checks.find((x) => x.config.slug === 'host-tool-runtime-import-boundary');
|
|
14
|
+
if (!c)
|
|
15
|
+
throw new Error('check not found: host-tool-runtime-import-boundary');
|
|
16
|
+
return c;
|
|
17
|
+
}
|
|
18
|
+
async function findingsFor(file) {
|
|
19
|
+
const run = await runCheckOnFixture(check(), { files: [file] });
|
|
20
|
+
return run.findings.length;
|
|
21
|
+
}
|
|
22
|
+
describe('analyzeHostToolRuntimeImportBoundary (AST)', () => {
|
|
23
|
+
it('allows the discovery boundary when a policy helper is present', () => {
|
|
24
|
+
const v = analyzeHostToolRuntimeImportBoundary([
|
|
25
|
+
"import { hostRuntimeImportPolicyFor, importToolRuntime } from './admit-tool-package.js';",
|
|
26
|
+
'export async function load(dir: string) {',
|
|
27
|
+
" return importToolRuntime(dir, hostRuntimeImportPolicyFor('installed'));",
|
|
28
|
+
'}',
|
|
29
|
+
].join('\n'), DISCOVERY_PATH);
|
|
30
|
+
expect(v).toEqual([]);
|
|
31
|
+
});
|
|
32
|
+
it('flags missing policy even in the admitted boundary files', () => {
|
|
33
|
+
const v = analyzeHostToolRuntimeImportBoundary([
|
|
34
|
+
"import { importToolRuntime } from './admit-tool-package.js';",
|
|
35
|
+
'export async function load(dir: string) {',
|
|
36
|
+
' return importToolRuntime(dir);',
|
|
37
|
+
'}',
|
|
38
|
+
].join('\n'), DISCOVERY_PATH);
|
|
39
|
+
expect(v).toHaveLength(1);
|
|
40
|
+
expect(v[0]?.message).toContain('explicit source policy');
|
|
41
|
+
});
|
|
42
|
+
it('flags any new callsite outside admission/discovery', () => {
|
|
43
|
+
const v = analyzeHostToolRuntimeImportBoundary([
|
|
44
|
+
"import { hostRuntimeImportPolicyFor, importToolRuntime } from '../bootstrap/admit-tool-package.js';",
|
|
45
|
+
'export async function load(dir: string) {',
|
|
46
|
+
" return importToolRuntime(dir, hostRuntimeImportPolicyFor('installed'));",
|
|
47
|
+
'}',
|
|
48
|
+
].join('\n'), OTHER_CLI_PATH);
|
|
49
|
+
expect(v).toHaveLength(1);
|
|
50
|
+
expect(v[0]?.message).toContain('admission/discovery boundary');
|
|
51
|
+
});
|
|
52
|
+
it('allows the defining module to call its local function with policy', () => {
|
|
53
|
+
const v = analyzeHostToolRuntimeImportBoundary([
|
|
54
|
+
'export async function admit(dir: string, source: ToolSource) {',
|
|
55
|
+
' return importToolRuntime(dir, hostRuntimeImportPolicyFor(source));',
|
|
56
|
+
'}',
|
|
57
|
+
].join('\n'), ADMISSION_PATH);
|
|
58
|
+
expect(v).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('host-tool-runtime-import-boundary (gate)', () => {
|
|
62
|
+
it('flags an out-of-boundary CLI runtime import', async () => {
|
|
63
|
+
expect(await findingsFor({
|
|
64
|
+
path: OTHER_CLI_PATH,
|
|
65
|
+
content: [
|
|
66
|
+
"import { hostRuntimeImportPolicyFor, importToolRuntime } from '../bootstrap/admit-tool-package.js';",
|
|
67
|
+
'export async function load(dir: string) {',
|
|
68
|
+
" return importToolRuntime(dir, hostRuntimeImportPolicyFor('installed'));",
|
|
69
|
+
'}',
|
|
70
|
+
].join('\n'),
|
|
71
|
+
})).toBeGreaterThanOrEqual(1);
|
|
72
|
+
});
|
|
73
|
+
it('does NOT flag non-CLI paths', async () => {
|
|
74
|
+
expect(await findingsFor({
|
|
75
|
+
path: 'packages/fitness/engine/src/tool.ts',
|
|
76
|
+
content: [
|
|
77
|
+
"import { importToolRuntime } from 'opensip-cli/bootstrap/admit-tool-package.js';",
|
|
78
|
+
'export const x = importToolRuntime;',
|
|
79
|
+
].join('\n'),
|
|
80
|
+
})).toBe(0);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=host-tool-runtime-import-boundary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-tool-runtime-import-boundary.test.js","sourceRoot":"","sources":["../../src/__tests__/host-tool-runtime-import-boundary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Keep ADR-0054's host-process runtime import exception narrow.
|
|
3
|
+
*
|
|
4
|
+
* External Tool runtimes still execute in the host process during the
|
|
5
|
+
* ADR-0054 migration because the current manifest only carries command
|
|
6
|
+
* metadata, not executable CommandSpec/RPC descriptors. That exception must
|
|
7
|
+
* remain explicit: every importToolRuntime call needs a source policy, and no
|
|
8
|
+
* new production call sites should appear outside the admission/discovery
|
|
9
|
+
* boundary.
|
|
10
|
+
*/
|
|
11
|
+
import { type CheckViolation } from '@opensip-cli/fitness';
|
|
12
|
+
/** Pure analysis over a parsed source file. Exported for unit tests. */
|
|
13
|
+
export declare function analyzeHostToolRuntimeImportBoundary(content: string, filePath: string): CheckViolation[];
|
|
14
|
+
export declare const hostToolRuntimeImportBoundary: import("@opensip-cli/fitness").Check;
|
|
15
|
+
//# sourceMappingURL=host-tool-runtime-import-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-tool-runtime-import-boundary.d.ts","sourceRoot":"","sources":["../../../src/checks/architecture/host-tool-runtime-import-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA2EpF,wEAAwE;AACxE,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,cAAc,EAAE,CAyClB;AAED,eAAO,MAAM,6BAA6B,sCAYxC,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Keep ADR-0054's host-process runtime import exception narrow.
|
|
3
|
+
*
|
|
4
|
+
* External Tool runtimes still execute in the host process during the
|
|
5
|
+
* ADR-0054 migration because the current manifest only carries command
|
|
6
|
+
* metadata, not executable CommandSpec/RPC descriptors. That exception must
|
|
7
|
+
* remain explicit: every importToolRuntime call needs a source policy, and no
|
|
8
|
+
* new production call sites should appear outside the admission/discovery
|
|
9
|
+
* boundary.
|
|
10
|
+
*/
|
|
11
|
+
// @fitness-ignore-file shipped-checks-must-be-generic -- dogfood check for this repo's ADR-0054 migration boundary; AST precision keeps the temporary import exception mechanically narrow.
|
|
12
|
+
import { defineCheck, isTestFile } from '@opensip-cli/fitness';
|
|
13
|
+
import { getSharedSourceFile } from '@opensip-cli/lang-typescript';
|
|
14
|
+
import * as ts from 'typescript';
|
|
15
|
+
const CLI_HOST_PATH = 'packages/cli/src/';
|
|
16
|
+
const IMPORT_RUNTIME = 'importToolRuntime';
|
|
17
|
+
const POLICY_HELPER = 'hostRuntimeImportPolicyFor';
|
|
18
|
+
const ALLOWED_CALLSITE_SUFFIXES = new Set([
|
|
19
|
+
'packages/cli/src/bootstrap/admit-tool-package.ts',
|
|
20
|
+
'packages/cli/src/bootstrap/register-tools-discovery.ts',
|
|
21
|
+
]);
|
|
22
|
+
function normalized(path) {
|
|
23
|
+
return path.replaceAll('\\', '/');
|
|
24
|
+
}
|
|
25
|
+
function isAllowedCallsite(filePath) {
|
|
26
|
+
const p = normalized(filePath);
|
|
27
|
+
for (const suffix of ALLOWED_CALLSITE_SUFFIXES) {
|
|
28
|
+
if (p.endsWith(suffix))
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
function propertyNameText(name) {
|
|
34
|
+
if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {
|
|
35
|
+
return name.text;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
function isTrueLiteral(node) {
|
|
40
|
+
return node.kind === ts.SyntaxKind.TrueKeyword;
|
|
41
|
+
}
|
|
42
|
+
function isPolicyArg(arg) {
|
|
43
|
+
if (ts.isCallExpression(arg) && ts.isIdentifier(arg.expression)) {
|
|
44
|
+
return arg.expression.text === POLICY_HELPER;
|
|
45
|
+
}
|
|
46
|
+
if (!ts.isObjectLiteralExpression(arg))
|
|
47
|
+
return false;
|
|
48
|
+
let hasSource = false;
|
|
49
|
+
let hasTransition = false;
|
|
50
|
+
for (const prop of arg.properties) {
|
|
51
|
+
if (!ts.isPropertyAssignment(prop))
|
|
52
|
+
continue;
|
|
53
|
+
const name = propertyNameText(prop.name);
|
|
54
|
+
if (name === 'source')
|
|
55
|
+
hasSource = true;
|
|
56
|
+
if (name === 'adr0054Transition' && isTrueLiteral(prop.initializer)) {
|
|
57
|
+
hasTransition = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return hasSource && (hasTransition || arg.getText().includes("'bundled'"));
|
|
61
|
+
}
|
|
62
|
+
function localRuntimeImportNames(sourceFile) {
|
|
63
|
+
const names = new Set();
|
|
64
|
+
for (const stmt of sourceFile.statements) {
|
|
65
|
+
if (!ts.isImportDeclaration(stmt) || !ts.isStringLiteral(stmt.moduleSpecifier))
|
|
66
|
+
continue;
|
|
67
|
+
const module = stmt.moduleSpecifier.text;
|
|
68
|
+
if (!module.endsWith('/admit-tool-package.js') && module !== './admit-tool-package.js') {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const named = stmt.importClause?.namedBindings;
|
|
72
|
+
if (named === undefined || !ts.isNamedImports(named))
|
|
73
|
+
continue;
|
|
74
|
+
for (const element of named.elements) {
|
|
75
|
+
const imported = (element.propertyName ?? element.name).text;
|
|
76
|
+
if (imported === IMPORT_RUNTIME)
|
|
77
|
+
names.add(element.name.text);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// The defining module calls its own exported function by name.
|
|
81
|
+
if (isAllowedCallsite(sourceFile.fileName))
|
|
82
|
+
names.add(IMPORT_RUNTIME);
|
|
83
|
+
return names;
|
|
84
|
+
}
|
|
85
|
+
/** Pure analysis over a parsed source file. Exported for unit tests. */
|
|
86
|
+
export function analyzeHostToolRuntimeImportBoundary(content, filePath) {
|
|
87
|
+
const violations = [];
|
|
88
|
+
const sourceFile = getSharedSourceFile(filePath, content);
|
|
89
|
+
if (!sourceFile)
|
|
90
|
+
return violations;
|
|
91
|
+
const runtimeNames = localRuntimeImportNames(sourceFile);
|
|
92
|
+
if (runtimeNames.size === 0)
|
|
93
|
+
return violations;
|
|
94
|
+
const allowedFile = isAllowedCallsite(filePath);
|
|
95
|
+
const visit = (node) => {
|
|
96
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
|
|
97
|
+
const callee = node.expression.text;
|
|
98
|
+
if (runtimeNames.has(callee)) {
|
|
99
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
|
|
100
|
+
if (!allowedFile) {
|
|
101
|
+
violations.push({
|
|
102
|
+
message: `importToolRuntime may only be called from the tool admission/discovery boundary ` +
|
|
103
|
+
`(ADR-0054 transition). Found host-process runtime import in ${normalized(filePath)}.`,
|
|
104
|
+
severity: 'error',
|
|
105
|
+
line,
|
|
106
|
+
suggestion: 'Route tool runtime loading through admit-tool-package/register-tools-discovery, or the ADR-0054 worker boundary.',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else if (node.arguments.length < 2 || !isPolicyArg(node.arguments[1])) {
|
|
110
|
+
violations.push({
|
|
111
|
+
message: 'importToolRuntime host-process imports must pass an explicit source policy ' +
|
|
112
|
+
'(bundled or adr0054Transition) so external runtime execution remains visible.',
|
|
113
|
+
severity: 'error',
|
|
114
|
+
line,
|
|
115
|
+
suggestion: 'Pass hostRuntimeImportPolicyFor(source), or an explicit policy object for bundled/ADR-0054 transition imports.',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
ts.forEachChild(node, visit);
|
|
121
|
+
};
|
|
122
|
+
visit(sourceFile);
|
|
123
|
+
return violations;
|
|
124
|
+
}
|
|
125
|
+
export const hostToolRuntimeImportBoundary = defineCheck({
|
|
126
|
+
id: 'b7554963-e24e-4d80-b3e0-edbb97bbdba3',
|
|
127
|
+
slug: 'host-tool-runtime-import-boundary',
|
|
128
|
+
description: 'Host-process tool runtime imports must stay in the admission boundary and carry an explicit ADR-0054 transition policy',
|
|
129
|
+
scope: { languages: ['typescript'], concerns: ['backend'] },
|
|
130
|
+
tags: ['architecture'],
|
|
131
|
+
fileTypes: ['ts', 'tsx'],
|
|
132
|
+
analyze: (content, filePath) => {
|
|
133
|
+
if (!normalized(filePath).includes(CLI_HOST_PATH) || isTestFile(filePath))
|
|
134
|
+
return [];
|
|
135
|
+
return analyzeHostToolRuntimeImportBoundary(content, filePath);
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=host-tool-runtime-import-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-tool-runtime-import-boundary.js","sourceRoot":"","sources":["../../../src/checks/architecture/host-tool-runtime-import-boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,4LAA4L;AAC5L,OAAO,EAAE,WAAW,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAC1C,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAC3C,MAAM,aAAa,GAAG,4BAA4B,CAAC;AAEnD,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,kDAAkD;IAClD,wDAAwD;CACzD,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,yBAAyB,EAAE,CAAC;QAC/C,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAqB;IAC7C,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB;IACxC,OAAO,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,GAAkB;IACrC,IAAI,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAErD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS,GAAG,IAAI,CAAC;QACxC,IAAI,IAAI,KAAK,mBAAmB,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACpE,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAyB;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;YAAE,SAAS;QACzF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,MAAM,KAAK,yBAAyB,EAAE,CAAC;YACvF,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/D,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YAC7D,IAAI,QAAQ,KAAK,cAAc;gBAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,+DAA+D;IAC/D,IAAI,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,oCAAoC,CAClD,OAAe,EACf,QAAgB;IAEhB,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEnC,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAE/C,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACpC,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC1F,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,UAAU,CAAC,IAAI,CAAC;wBACd,OAAO,EACL,kFAAkF;4BAClF,+DAA+D,UAAU,CAAC,QAAQ,CAAC,GAAG;wBACxF,QAAQ,EAAE,OAAO;wBACjB,IAAI;wBACJ,UAAU,EACR,kHAAkH;qBACrH,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxE,UAAU,CAAC,IAAI,CAAC;wBACd,OAAO,EACL,6EAA6E;4BAC7E,+EAA+E;wBACjF,QAAQ,EAAE,OAAO;wBACjB,IAAI;wBACJ,UAAU,EACR,gHAAgH;qBACnH,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,WAAW,CAAC;IACvD,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,mCAAmC;IACzC,WAAW,EACT,wHAAwH;IAC1H,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;IAC3D,IAAI,EAAE,CAAC,cAAc,CAAC;IACtB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC7B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACrF,OAAO,oCAAoC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './circular-import-detection.js';
|
|
2
2
|
export * from './contracts-schema-consistency.js';
|
|
3
3
|
export * from './drizzle-orm-migration-guardrails.js';
|
|
4
|
+
export * from './host-tool-runtime-import-boundary.js';
|
|
4
5
|
export * from './missing-type-exports.js';
|
|
5
6
|
export * from './module-coupling-fan-out.js';
|
|
6
7
|
export * from './no-bootstrap-tool-import.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checks/architecture/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checks/architecture/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './circular-import-detection.js';
|
|
2
2
|
export * from './contracts-schema-consistency.js';
|
|
3
3
|
export * from './drizzle-orm-migration-guardrails.js';
|
|
4
|
+
export * from './host-tool-runtime-import-boundary.js';
|
|
4
5
|
export * from './missing-type-exports.js';
|
|
5
6
|
export * from './module-coupling-fan-out.js';
|
|
6
7
|
export * from './no-bootstrap-tool-import.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/architecture/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/architecture/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kCAAkC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/display/architecture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/display/architecture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,6CAW/B,CAAC;AAEH,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,6CAAuD,CAAC"}
|
|
@@ -6,6 +6,7 @@ export const ARCHITECTURE_DISPLAY = Object.freeze({
|
|
|
6
6
|
'circular-import-detection': ['π', 'Circular Import Detection'],
|
|
7
7
|
'contracts-schema-consistency': ['π', 'Contracts Schema Consistency'],
|
|
8
8
|
'drizzle-orm-migration-guardrails': ['π‘οΈ', 'Drizzle ORM Migration Guardrails'],
|
|
9
|
+
'host-tool-runtime-import-boundary': ['π§±', 'Host Tool Runtime Import Boundary'],
|
|
9
10
|
'missing-type-exports': ['π€', 'Missing Type Exports'],
|
|
10
11
|
'module-coupling-fan-out': ['πΈοΈ', 'Module Coupling Fan-Out'],
|
|
11
12
|
'no-bootstrap-tool-import': ['π', 'No Bootstrap Tool Import'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/display/architecture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAoC;IACnF,2BAA2B,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAChE,8BAA8B,EAAE,CAAC,IAAI,EAAE,8BAA8B,CAAC;IACtE,kCAAkC,EAAE,CAAC,KAAK,EAAE,kCAAkC,CAAC;IAC/E,sBAAsB,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtD,yBAAyB,EAAE,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC7D,0BAA0B,EAAE,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC9D,4BAA4B,EAAE,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAClE,8BAA8B,EAAE,CAAC,IAAI,EAAE,8BAA8B,CAAC;IACtE,6BAA6B,EAAE,CAAC,IAAI,EAAE,6BAA6B,CAAC;CACrE,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAoC,EAAE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"architecture.js","sourceRoot":"","sources":["../../src/display/architecture.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAoC;IACnF,2BAA2B,EAAE,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAChE,8BAA8B,EAAE,CAAC,IAAI,EAAE,8BAA8B,CAAC;IACtE,kCAAkC,EAAE,CAAC,KAAK,EAAE,kCAAkC,CAAC;IAC/E,mCAAmC,EAAE,CAAC,IAAI,EAAE,mCAAmC,CAAC;IAChF,sBAAsB,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtD,yBAAyB,EAAE,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC7D,0BAA0B,EAAE,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAC9D,4BAA4B,EAAE,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAClE,8BAA8B,EAAE,CAAC,IAAI,EAAE,8BAA8B,CAAC;IACtE,6BAA6B,EAAE,CAAC,IAAI,EAAE,6BAA6B,CAAC;CACrE,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAoC,EAAE,CAAC,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.6",
|
|
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/core": "0.1.
|
|
41
|
-
"@opensip-cli/
|
|
42
|
-
"@opensip-cli/
|
|
40
|
+
"@opensip-cli/core": "0.1.6",
|
|
41
|
+
"@opensip-cli/lang-typescript": "0.1.6",
|
|
42
|
+
"@opensip-cli/fitness": "0.1.6"
|
|
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.6"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsc",
|