@kernlang/review 3.1.6 → 3.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/dist/cache.d.ts +1 -1
- package/dist/cache.js +5 -3
- package/dist/cache.js.map +1 -1
- package/dist/call-graph.d.ts +63 -0
- package/dist/call-graph.js +380 -0
- package/dist/call-graph.js.map +1 -0
- package/dist/concept-rules/boundary-mutation.d.ts +1 -1
- package/dist/concept-rules/boundary-mutation.js.map +1 -1
- package/dist/concept-rules/ignored-error.d.ts +1 -1
- package/dist/concept-rules/ignored-error.js.map +1 -1
- package/dist/concept-rules/illegal-dependency.d.ts +1 -1
- package/dist/concept-rules/illegal-dependency.js.map +1 -1
- package/dist/concept-rules/index.js +1 -6
- package/dist/concept-rules/index.js.map +1 -1
- package/dist/concept-rules/unguarded-effect.d.ts +1 -1
- package/dist/concept-rules/unguarded-effect.js.map +1 -1
- package/dist/concept-rules/unrecovered-effect.d.ts +1 -1
- package/dist/concept-rules/unrecovered-effect.js +2 -1
- package/dist/concept-rules/unrecovered-effect.js.map +1 -1
- package/dist/confidence.js +12 -8
- package/dist/confidence.js.map +1 -1
- package/dist/differ.js +3 -7
- package/dist/differ.js.map +1 -1
- package/dist/external-tools.js +5 -6
- package/dist/external-tools.js.map +1 -1
- package/dist/file-context.d.ts +21 -0
- package/dist/file-context.js +234 -0
- package/dist/file-context.js.map +1 -0
- package/dist/file-role.js +14 -7
- package/dist/file-role.js.map +1 -1
- package/dist/graph.d.ts +1 -1
- package/dist/graph.js +24 -16
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +44 -35
- package/dist/index.js +210 -121
- package/dist/index.js.map +1 -1
- package/dist/inferrer.d.ts +8 -2
- package/dist/inferrer.js +80 -47
- package/dist/inferrer.js.map +1 -1
- package/dist/kern-lint.d.ts +3 -4
- package/dist/kern-lint.js +7 -5
- package/dist/kern-lint.js.map +1 -1
- package/dist/llm-bridge.d.ts +23 -7
- package/dist/llm-bridge.js +267 -31
- package/dist/llm-bridge.js.map +1 -1
- package/dist/llm-review.d.ts +16 -2
- package/dist/llm-review.js +240 -35
- package/dist/llm-review.js.map +1 -1
- package/dist/mappers/ts-concepts.d.ts +1 -1
- package/dist/mappers/ts-concepts.js +303 -32
- package/dist/mappers/ts-concepts.js.map +1 -1
- package/dist/norm-miner.d.ts +31 -0
- package/dist/norm-miner.js +119 -0
- package/dist/norm-miner.js.map +1 -0
- package/dist/obligations.d.ts +63 -0
- package/dist/obligations.js +158 -0
- package/dist/obligations.js.map +1 -0
- package/dist/quality-rules.d.ts +3 -3
- package/dist/quality-rules.js +4 -2
- package/dist/quality-rules.js.map +1 -1
- package/dist/reporter.d.ts +7 -2
- package/dist/reporter.js +82 -51
- package/dist/reporter.js.map +1 -1
- package/dist/rule-eval.d.ts +1 -2
- package/dist/rule-eval.js +5 -9
- package/dist/rule-eval.js.map +1 -1
- package/dist/rule-loader.js +16 -14
- package/dist/rule-loader.js.map +1 -1
- package/dist/rules/base.js +153 -69
- package/dist/rules/base.js.map +1 -1
- package/dist/rules/cli.js +23 -19
- package/dist/rules/cli.js.map +1 -1
- package/dist/rules/confidence.d.ts +1 -1
- package/dist/rules/confidence.js +5 -5
- package/dist/rules/confidence.js.map +1 -1
- package/dist/rules/dead-code.d.ts +10 -0
- package/dist/rules/dead-code.js +75 -0
- package/dist/rules/dead-code.js.map +1 -0
- package/dist/rules/dead-logic.js +35 -31
- package/dist/rules/dead-logic.js.map +1 -1
- package/dist/rules/express.d.ts +2 -1
- package/dist/rules/express.js +380 -126
- package/dist/rules/express.js.map +1 -1
- package/dist/rules/fastapi.js +53 -19
- package/dist/rules/fastapi.js.map +1 -1
- package/dist/rules/ground-layer.js +3 -3
- package/dist/rules/ground-layer.js.map +1 -1
- package/dist/rules/index.js +574 -105
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ink.js +9 -8
- package/dist/rules/ink.js.map +1 -1
- package/dist/rules/kern-source.js +202 -63
- package/dist/rules/kern-source.js.map +1 -1
- package/dist/rules/nextjs.js +88 -33
- package/dist/rules/nextjs.js.map +1 -1
- package/dist/rules/null-safety.js +52 -26
- package/dist/rules/null-safety.js.map +1 -1
- package/dist/rules/nuxt.js +24 -29
- package/dist/rules/nuxt.js.map +1 -1
- package/dist/rules/react.js +355 -69
- package/dist/rules/react.js.map +1 -1
- package/dist/rules/security-v2.js +71 -57
- package/dist/rules/security-v2.js.map +1 -1
- package/dist/rules/security-v3.js.map +1 -1
- package/dist/rules/security-v4.js +54 -27
- package/dist/rules/security-v4.js.map +1 -1
- package/dist/rules/security.js +35 -5
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/terminal.js +17 -5
- package/dist/rules/terminal.js.map +1 -1
- package/dist/rules/vue.js +162 -107
- package/dist/rules/vue.js.map +1 -1
- package/dist/semantic-diff.d.ts +52 -0
- package/dist/semantic-diff.js +342 -0
- package/dist/semantic-diff.js.map +1 -0
- package/dist/spec-checker.js +11 -10
- package/dist/spec-checker.js.map +1 -1
- package/dist/suppression/apply-suppression.d.ts +2 -3
- package/dist/suppression/apply-suppression.js +3 -3
- package/dist/suppression/apply-suppression.js.map +1 -1
- package/dist/suppression/index.d.ts +2 -2
- package/dist/suppression/index.js +1 -1
- package/dist/suppression/index.js.map +1 -1
- package/dist/suppression/parse-directives.d.ts +1 -1
- package/dist/suppression/parse-directives.js +9 -4
- package/dist/suppression/parse-directives.js.map +1 -1
- package/dist/taint-ast.d.ts +20 -0
- package/dist/taint-ast.js +427 -0
- package/dist/taint-ast.js.map +1 -0
- package/dist/taint-crossfile.d.ts +28 -0
- package/dist/taint-crossfile.js +174 -0
- package/dist/taint-crossfile.js.map +1 -0
- package/dist/taint-findings.d.ts +17 -0
- package/dist/taint-findings.js +131 -0
- package/dist/taint-findings.js.map +1 -0
- package/dist/taint-regex.d.ts +61 -0
- package/dist/taint-regex.js +379 -0
- package/dist/taint-regex.js.map +1 -0
- package/dist/taint-types.d.ts +128 -0
- package/dist/taint-types.js +174 -0
- package/dist/taint-types.js.map +1 -0
- package/dist/taint.d.ts +13 -107
- package/dist/taint.js +16 -1067
- package/dist/taint.js.map +1 -1
- package/dist/template-detector.d.ts +2 -2
- package/dist/template-detector.js +11 -16
- package/dist/template-detector.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/confidence.js
CHANGED
|
@@ -18,7 +18,7 @@ function props(node) {
|
|
|
18
18
|
}
|
|
19
19
|
function children(node, type) {
|
|
20
20
|
const c = node.children || [];
|
|
21
|
-
return type ? c.filter(n => n.type === type) : c;
|
|
21
|
+
return type ? c.filter((n) => n.type === type) : c;
|
|
22
22
|
}
|
|
23
23
|
function nodeKey(node) {
|
|
24
24
|
const name = props(node).name;
|
|
@@ -37,7 +37,7 @@ export function parseConfidence(raw) {
|
|
|
37
37
|
return undefined;
|
|
38
38
|
// literal number: "0.7"
|
|
39
39
|
const num = parseFloat(str);
|
|
40
|
-
if (!isNaN(num) && /^[0-9]*\.?[0-9]+$/.test(str)) {
|
|
40
|
+
if (!Number.isNaN(num) && /^[0-9]*\.?[0-9]+$/.test(str)) {
|
|
41
41
|
if (num < 0 || num > 1)
|
|
42
42
|
return undefined;
|
|
43
43
|
return { kind: 'literal', value: num, strategy: 'min' };
|
|
@@ -51,7 +51,11 @@ export function parseConfidence(raw) {
|
|
|
51
51
|
}
|
|
52
52
|
// min:a,b,c — inherits from multiple
|
|
53
53
|
if (str.startsWith('min:')) {
|
|
54
|
-
const sources = str
|
|
54
|
+
const sources = str
|
|
55
|
+
.slice(4)
|
|
56
|
+
.split(',')
|
|
57
|
+
.map((s) => s.trim())
|
|
58
|
+
.filter(Boolean);
|
|
55
59
|
if (sources.length === 0)
|
|
56
60
|
return undefined;
|
|
57
61
|
return { kind: 'inherited', strategy: 'min', sources };
|
|
@@ -80,14 +84,14 @@ function registerNodes(irNodes, nodes, sourceFile) {
|
|
|
80
84
|
// Last-writer-wins (deterministic by file sort order)
|
|
81
85
|
}
|
|
82
86
|
const needsChildren = children(node, 'needs');
|
|
83
|
-
const needsEntries = needsChildren.map(n => {
|
|
87
|
+
const needsEntries = needsChildren.map((n) => {
|
|
84
88
|
const np = props(n);
|
|
85
89
|
const wouldRaise = np['would-raise-to'];
|
|
86
90
|
const parsed = wouldRaise !== undefined ? parseFloat(wouldRaise) : undefined;
|
|
87
91
|
const resolved = np.resolved === 'true' || np.resolved === true;
|
|
88
92
|
return {
|
|
89
93
|
what: np.what || np.description || '',
|
|
90
|
-
wouldRaiseTo:
|
|
94
|
+
wouldRaiseTo: parsed !== undefined && !Number.isNaN(parsed) && parsed >= 0 && parsed <= 1 ? parsed : undefined,
|
|
91
95
|
resolved,
|
|
92
96
|
};
|
|
93
97
|
});
|
|
@@ -124,7 +128,7 @@ function wireEdges(nodes) {
|
|
|
124
128
|
function kahnSort(nodes) {
|
|
125
129
|
const inDegree = new Map();
|
|
126
130
|
for (const [key, cnode] of nodes) {
|
|
127
|
-
const validDeps = cnode.dependsOn.filter(d => nodes.has(d));
|
|
131
|
+
const validDeps = cnode.dependsOn.filter((d) => nodes.has(d));
|
|
128
132
|
inDegree.set(key, validDeps.length);
|
|
129
133
|
}
|
|
130
134
|
const queue = [];
|
|
@@ -147,7 +151,7 @@ function kahnSort(nodes) {
|
|
|
147
151
|
// Detect cycles: any node not in topoOrder is in a cycle
|
|
148
152
|
const cycles = [];
|
|
149
153
|
const inTopo = new Set(topoOrder);
|
|
150
|
-
const cycleNodes = [...nodes.keys()].filter(k => !inTopo.has(k));
|
|
154
|
+
const cycleNodes = [...nodes.keys()].filter((k) => !inTopo.has(k));
|
|
151
155
|
if (cycleNodes.length > 0) {
|
|
152
156
|
for (const cn of cycleNodes) {
|
|
153
157
|
nodes.get(cn).inCycle = true;
|
|
@@ -220,7 +224,7 @@ export function propagateConfidence(graph) {
|
|
|
220
224
|
/** Serialize a confidence graph (strips Map, uses arrays). */
|
|
221
225
|
export function serializeGraph(graph) {
|
|
222
226
|
const isMulti = 'duplicates' in graph;
|
|
223
|
-
const nodes = [...graph.nodes.values()].map(n => ({
|
|
227
|
+
const nodes = [...graph.nodes.values()].map((n) => ({
|
|
224
228
|
name: n.name,
|
|
225
229
|
nodeRef: n.nodeRef,
|
|
226
230
|
...(n.sourceFile ? { sourceFile: n.sourceFile } : {}),
|
package/dist/confidence.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confidence.js","sourceRoot":"","sources":["../src/confidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuEH,4EAA4E;AAE5E,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAa;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC9B,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"confidence.js","sourceRoot":"","sources":["../src/confidence.ts"],"names":[],"mappings":"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"}
|
package/dist/differ.js
CHANGED
|
@@ -29,11 +29,7 @@ export function structuralDiff(originalSource, inferred, filePath = 'input.ts')
|
|
|
29
29
|
for (let i = 1; i <= totalLines; i++) {
|
|
30
30
|
const line = originalLines[i - 1];
|
|
31
31
|
const trimmed = line.trim();
|
|
32
|
-
const isTrivial = !trimmed ||
|
|
33
|
-
trimmed.startsWith('//') ||
|
|
34
|
-
trimmed.startsWith('/*') ||
|
|
35
|
-
trimmed.startsWith('*') ||
|
|
36
|
-
trimmed === '*/';
|
|
32
|
+
const isTrivial = !trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*') || trimmed === '*/';
|
|
37
33
|
if (!coveredLines.has(i) && !isTrivial) {
|
|
38
34
|
if (consecutiveUncovered === 0)
|
|
39
35
|
uncoveredStart = i;
|
|
@@ -69,8 +65,8 @@ export function structuralDiff(originalSource, inferred, filePath = 'input.ts')
|
|
|
69
65
|
// Check for inconsistent patterns in inferred constructs
|
|
70
66
|
for (const r of inferred) {
|
|
71
67
|
if (r.node.type === 'interface' && r.node.children) {
|
|
72
|
-
const fields = r.node.children.filter(c => c.type === 'field');
|
|
73
|
-
const optionalFields = fields.filter(f => f.props?.optional === 'true');
|
|
68
|
+
const fields = r.node.children.filter((c) => c.type === 'field');
|
|
69
|
+
const optionalFields = fields.filter((f) => f.props?.optional === 'true');
|
|
74
70
|
if (fields.length > 5 && optionalFields.length === 0) {
|
|
75
71
|
findings.push({
|
|
76
72
|
source: 'kern',
|
package/dist/differ.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,GAAG,GAAG,CAAC;IAC/C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,cAAsB,EACtB,QAAuB,EACvB,QAAQ,GAAG,UAAU;IAErB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IAExC,uDAAuD;IACvD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"differ.js","sourceRoot":"","sources":["../src/differ.ts"],"names":[],"mappings":"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"}
|
package/dist/external-tools.js
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Phase 3 of the review pipeline.
|
|
8
8
|
*/
|
|
9
|
-
import { createFingerprint } from './types.js';
|
|
10
9
|
import { createProject } from './inferrer.js';
|
|
10
|
+
import { createFingerprint } from './types.js';
|
|
11
11
|
// ── ESLint via Node API ──────────────────────────────────────────────────
|
|
12
12
|
/**
|
|
13
13
|
* Run ESLint on given file paths using the Node API.
|
|
@@ -18,7 +18,7 @@ export async function runESLint(filePaths, cwd) {
|
|
|
18
18
|
try {
|
|
19
19
|
// Dynamic import — ESLint is an optional peer dep
|
|
20
20
|
const eslintModuleName = 'eslint';
|
|
21
|
-
const eslintModule = await import(eslintModuleName);
|
|
21
|
+
const eslintModule = (await import(eslintModuleName));
|
|
22
22
|
const ESLint = eslintModule.ESLint || eslintModule.default?.ESLint;
|
|
23
23
|
if (!ESLint)
|
|
24
24
|
return [];
|
|
@@ -103,8 +103,7 @@ export function runTSCDiagnostics(project) {
|
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
const category = diag.getCategory();
|
|
106
|
-
const severity = category === 1 /* Error */ ? 'error' :
|
|
107
|
-
category === 0 /* Warning */ ? 'warning' : 'info';
|
|
106
|
+
const severity = category === 1 /* Error */ ? 'error' : category === 0 /* Warning */ ? 'warning' : 'info';
|
|
108
107
|
const code = diag.getCode();
|
|
109
108
|
const message = diag.getMessageText();
|
|
110
109
|
const messageStr = typeof message === 'string' ? message : message.getMessageText();
|
|
@@ -142,7 +141,7 @@ export function runTSCDiagnosticsFromPaths(filePaths) {
|
|
|
142
141
|
if (filePaths.length === 0)
|
|
143
142
|
return [];
|
|
144
143
|
try {
|
|
145
|
-
const project = createProject();
|
|
144
|
+
const project = createProject(filePaths[0]);
|
|
146
145
|
for (const fp of filePaths) {
|
|
147
146
|
try {
|
|
148
147
|
project.addSourceFileAtPath(fp);
|
|
@@ -167,7 +166,7 @@ export function linkToNodes(findings, inferred) {
|
|
|
167
166
|
if (f.nodeIds && f.nodeIds.length > 0)
|
|
168
167
|
continue; // already linked
|
|
169
168
|
const line = f.primarySpan.startLine;
|
|
170
|
-
const matchingNode = inferred.find(r => r.startLine <= line && r.endLine >= line);
|
|
169
|
+
const matchingNode = inferred.find((r) => r.startLine <= line && r.endLine >= line);
|
|
171
170
|
if (matchingNode) {
|
|
172
171
|
f.nodeIds = [matchingNode.nodeId];
|
|
173
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-tools.js","sourceRoot":"","sources":["../src/external-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"external-tools.js","sourceRoot":"","sources":["../src/external-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Context — derives runtime boundary and import chain context from the import graph.
|
|
3
|
+
*
|
|
4
|
+
* Answers: "Is this file a server component or client component?"
|
|
5
|
+
* Not by looking at the file itself, but by tracing the import chain back to the entry point.
|
|
6
|
+
*
|
|
7
|
+
* A file without 'use client' is still a client component if ALL its importers
|
|
8
|
+
* are within a client boundary. A file under app/api/ is an API route handler.
|
|
9
|
+
* A file imported by both server and client entry points is 'shared'.
|
|
10
|
+
*/
|
|
11
|
+
import type { FileContext, GraphResult } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Build FileContext for every file in the import graph.
|
|
14
|
+
* This is the main function — call it once after resolving the import graph,
|
|
15
|
+
* then pass the resulting Map into each rule via RuleContext.fileContext.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildFileContextMap(graph: GraphResult): Map<string, FileContext>;
|
|
18
|
+
/**
|
|
19
|
+
* Clear the 'use client' cache between runs (for watch mode / tests).
|
|
20
|
+
*/
|
|
21
|
+
export declare function clearFileContextCache(): void;
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Context — derives runtime boundary and import chain context from the import graph.
|
|
3
|
+
*
|
|
4
|
+
* Answers: "Is this file a server component or client component?"
|
|
5
|
+
* Not by looking at the file itself, but by tracing the import chain back to the entry point.
|
|
6
|
+
*
|
|
7
|
+
* A file without 'use client' is still a client component if ALL its importers
|
|
8
|
+
* are within a client boundary. A file under app/api/ is an API route handler.
|
|
9
|
+
* A file imported by both server and client entry points is 'shared'.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from 'fs';
|
|
12
|
+
// ── Entry Point Classification ──────────────────────────────────────────
|
|
13
|
+
/** Classify an entry point file by its path and content */
|
|
14
|
+
function classifyEntryPoint(filePath) {
|
|
15
|
+
const lower = filePath.toLowerCase();
|
|
16
|
+
// Next.js App Router conventions
|
|
17
|
+
if (/\/app\/.*\/route\.(ts|tsx|js|jsx)$/.test(lower))
|
|
18
|
+
return 'api';
|
|
19
|
+
if (/\/api\//.test(lower))
|
|
20
|
+
return 'api';
|
|
21
|
+
if (/\/middleware\.(ts|tsx|js|jsx)$/.test(lower))
|
|
22
|
+
return 'middleware';
|
|
23
|
+
// Check for 'use client' directive
|
|
24
|
+
try {
|
|
25
|
+
const source = readFileSync(filePath, 'utf-8');
|
|
26
|
+
if (/^['"]use client['"];?\s*$/m.test(source.substring(0, 200)))
|
|
27
|
+
return 'client';
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* can't read — fall through */
|
|
31
|
+
}
|
|
32
|
+
// Next.js: page.tsx, layout.tsx, loading.tsx, error.tsx, template.tsx = server by default
|
|
33
|
+
if (/\/(page|layout|loading|error|template|not-found|default)\.(ts|tsx|js|jsx)$/.test(lower))
|
|
34
|
+
return 'server';
|
|
35
|
+
// Express/Fastapi route files
|
|
36
|
+
if (/\/routes?\//.test(lower))
|
|
37
|
+
return 'api';
|
|
38
|
+
if (/\/handlers?\//.test(lower))
|
|
39
|
+
return 'api';
|
|
40
|
+
if (/\/controllers?\//.test(lower))
|
|
41
|
+
return 'api';
|
|
42
|
+
// CLI entry points
|
|
43
|
+
if (/\/cli\.(ts|js)$/.test(lower) || /\/bin\//.test(lower))
|
|
44
|
+
return 'server';
|
|
45
|
+
return 'unknown';
|
|
46
|
+
}
|
|
47
|
+
// ── 'use client' Detection ──────────────────────────────────────────────
|
|
48
|
+
const useClientCache = new Map();
|
|
49
|
+
function hasUseClientDirective(filePath) {
|
|
50
|
+
const cached = useClientCache.get(filePath);
|
|
51
|
+
if (cached !== undefined)
|
|
52
|
+
return cached;
|
|
53
|
+
try {
|
|
54
|
+
const source = readFileSync(filePath, 'utf-8');
|
|
55
|
+
const result = /^['"]use client['"];?\s*$/m.test(source.substring(0, 200));
|
|
56
|
+
useClientCache.set(filePath, result);
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
useClientCache.set(filePath, false);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ── Client Boundary Propagation ─────────────────────────────────────────
|
|
65
|
+
/**
|
|
66
|
+
* Determine if a file is within a client boundary.
|
|
67
|
+
* A file is client if:
|
|
68
|
+
* 1. It has 'use client' directive, OR
|
|
69
|
+
* 2. ALL files that import it are within a client boundary (recursive)
|
|
70
|
+
*
|
|
71
|
+
* Entry files without 'use client' are server by definition.
|
|
72
|
+
*/
|
|
73
|
+
function isWithinClientBoundary(filePath, fileMap, entrySet, cache, visiting) {
|
|
74
|
+
if (hasUseClientDirective(filePath))
|
|
75
|
+
return true;
|
|
76
|
+
const cached = cache.get(filePath);
|
|
77
|
+
if (cached !== undefined)
|
|
78
|
+
return cached;
|
|
79
|
+
// Entry files without 'use client' are server components
|
|
80
|
+
if (entrySet.has(filePath)) {
|
|
81
|
+
cache.set(filePath, false);
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Cycle guard — optimistic (assume client in cycles)
|
|
85
|
+
if (visiting.has(filePath))
|
|
86
|
+
return true;
|
|
87
|
+
const gf = fileMap.get(filePath);
|
|
88
|
+
if (!gf || gf.importedBy.length === 0) {
|
|
89
|
+
cache.set(filePath, false);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
visiting.add(filePath);
|
|
93
|
+
const result = gf.importedBy.every((importer) => isWithinClientBoundary(importer, fileMap, entrySet, cache, visiting));
|
|
94
|
+
visiting.delete(filePath);
|
|
95
|
+
cache.set(filePath, result);
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
// ── Import Chain Tracing ────────────────────────────────────────────────
|
|
99
|
+
/** Trace the shortest import chain from an entry point to the target file */
|
|
100
|
+
function traceImportChain(targetPath, fileMap, entrySet) {
|
|
101
|
+
if (entrySet.has(targetPath))
|
|
102
|
+
return [targetPath];
|
|
103
|
+
// BFS backwards (following importedBy edges) from target toward entry points.
|
|
104
|
+
// parent maps: child → its importer (one step closer to entry).
|
|
105
|
+
const visited = new Set();
|
|
106
|
+
const parent = new Map();
|
|
107
|
+
const queue = [targetPath];
|
|
108
|
+
visited.add(targetPath);
|
|
109
|
+
let foundEntry;
|
|
110
|
+
while (queue.length > 0) {
|
|
111
|
+
const current = queue.shift();
|
|
112
|
+
const gf = fileMap.get(current);
|
|
113
|
+
if (!gf)
|
|
114
|
+
continue;
|
|
115
|
+
for (const importer of gf.importedBy) {
|
|
116
|
+
if (visited.has(importer))
|
|
117
|
+
continue;
|
|
118
|
+
visited.add(importer);
|
|
119
|
+
parent.set(importer, current); // importer → current (toward target)
|
|
120
|
+
if (entrySet.has(importer)) {
|
|
121
|
+
foundEntry = importer;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
queue.push(importer);
|
|
125
|
+
}
|
|
126
|
+
if (foundEntry)
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
if (!foundEntry)
|
|
130
|
+
return [targetPath];
|
|
131
|
+
// Reconstruct: walk from entry → target via parent map
|
|
132
|
+
// parent maps importer→child, so walk: entry → parent.get(entry) → ... → target
|
|
133
|
+
const chain = [foundEntry];
|
|
134
|
+
let node = foundEntry;
|
|
135
|
+
while (node !== targetPath) {
|
|
136
|
+
const next = parent.get(node);
|
|
137
|
+
if (!next)
|
|
138
|
+
break;
|
|
139
|
+
chain.push(next);
|
|
140
|
+
node = next;
|
|
141
|
+
}
|
|
142
|
+
return chain;
|
|
143
|
+
}
|
|
144
|
+
// ── Main API ────────────────────────────────────────────────────────────
|
|
145
|
+
/**
|
|
146
|
+
* Build FileContext for every file in the import graph.
|
|
147
|
+
* This is the main function — call it once after resolving the import graph,
|
|
148
|
+
* then pass the resulting Map into each rule via RuleContext.fileContext.
|
|
149
|
+
*/
|
|
150
|
+
export function buildFileContextMap(graph) {
|
|
151
|
+
const contextMap = new Map();
|
|
152
|
+
const fileMap = new Map();
|
|
153
|
+
const entrySet = new Set(graph.entryFiles);
|
|
154
|
+
for (const gf of graph.files) {
|
|
155
|
+
fileMap.set(gf.path, gf);
|
|
156
|
+
}
|
|
157
|
+
// Classify entry points
|
|
158
|
+
const entryBoundaries = new Map();
|
|
159
|
+
for (const entry of graph.entryFiles) {
|
|
160
|
+
entryBoundaries.set(entry, classifyEntryPoint(entry));
|
|
161
|
+
}
|
|
162
|
+
// Client boundary propagation cache
|
|
163
|
+
const clientBoundaryCache = new Map();
|
|
164
|
+
for (const gf of graph.files) {
|
|
165
|
+
const isClient = isWithinClientBoundary(gf.path, fileMap, entrySet, clientBoundaryCache, new Set());
|
|
166
|
+
const hasDirective = hasUseClientDirective(gf.path);
|
|
167
|
+
const importChain = traceImportChain(gf.path, fileMap, entrySet);
|
|
168
|
+
// Determine boundary from import chain
|
|
169
|
+
let boundary = 'unknown';
|
|
170
|
+
if (isClient || hasDirective) {
|
|
171
|
+
boundary = 'client';
|
|
172
|
+
}
|
|
173
|
+
else if (entrySet.has(gf.path)) {
|
|
174
|
+
boundary = entryBoundaries.get(gf.path) || 'unknown';
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Inherit boundary from entry points that import this file
|
|
178
|
+
const entryBounds = new Set();
|
|
179
|
+
for (const entry of graph.entryFiles) {
|
|
180
|
+
// Check if this entry eventually imports this file
|
|
181
|
+
const entryGf = fileMap.get(entry);
|
|
182
|
+
if (entryGf && canReach(entry, gf.path, fileMap, new Set())) {
|
|
183
|
+
entryBounds.add(entryBoundaries.get(entry) || 'unknown');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (entryBounds.size === 1) {
|
|
187
|
+
boundary = [...entryBounds][0];
|
|
188
|
+
}
|
|
189
|
+
else if (entryBounds.size > 1) {
|
|
190
|
+
boundary = 'shared'; // imported by both server and client entry points
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Find which entry points reach this file
|
|
194
|
+
const reachableEntries = [];
|
|
195
|
+
for (const entry of graph.entryFiles) {
|
|
196
|
+
if (entry === gf.path || canReach(entry, gf.path, fileMap, new Set())) {
|
|
197
|
+
reachableEntries.push(entry);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
contextMap.set(gf.path, {
|
|
201
|
+
boundary,
|
|
202
|
+
entryPoints: reachableEntries,
|
|
203
|
+
importChain,
|
|
204
|
+
depth: gf.distance,
|
|
205
|
+
importedBy: gf.importedBy,
|
|
206
|
+
isClientBoundary: isClient,
|
|
207
|
+
hasUseClientDirective: hasDirective,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return contextMap;
|
|
211
|
+
}
|
|
212
|
+
/** Check if source file can reach target file via imports (DFS) */
|
|
213
|
+
function canReach(source, target, fileMap, visited) {
|
|
214
|
+
if (visited.has(source))
|
|
215
|
+
return false;
|
|
216
|
+
visited.add(source);
|
|
217
|
+
const gf = fileMap.get(source);
|
|
218
|
+
if (!gf)
|
|
219
|
+
return false;
|
|
220
|
+
for (const imp of gf.imports) {
|
|
221
|
+
if (imp === target)
|
|
222
|
+
return true;
|
|
223
|
+
if (canReach(imp, target, fileMap, visited))
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Clear the 'use client' cache between runs (for watch mode / tests).
|
|
230
|
+
*/
|
|
231
|
+
export function clearFileContextCache() {
|
|
232
|
+
useClientCache.clear();
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=file-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-context.js","sourceRoot":"","sources":["../src/file-context.ts"],"names":[],"mappings":"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"}
|
package/dist/file-role.js
CHANGED
|
@@ -8,7 +8,9 @@ import { SyntaxKind } from 'ts-morph';
|
|
|
8
8
|
/** Classify a source file's role based on AST evidence and path heuristics. */
|
|
9
9
|
export function classifyFileRole(sourceFile, filePath) {
|
|
10
10
|
// 1. Test files
|
|
11
|
-
if (/\.(test|spec)\.(tsx?|jsx?)$/.test(filePath) ||
|
|
11
|
+
if (/\.(test|spec)\.(tsx?|jsx?)$/.test(filePath) ||
|
|
12
|
+
/\/tests?\//.test(filePath) ||
|
|
13
|
+
/^test_/.test(filePath.split('/').pop() || '')) {
|
|
12
14
|
return 'test';
|
|
13
15
|
}
|
|
14
16
|
// 2. Barrel / re-export only files
|
|
@@ -24,12 +26,17 @@ export function classifyFileRole(sourceFile, filePath) {
|
|
|
24
26
|
return 'rule-definition';
|
|
25
27
|
}
|
|
26
28
|
const basename = lower.split('/').pop() || '';
|
|
27
|
-
if (/\/examples?\//i.test(lower) ||
|
|
29
|
+
if (/\/examples?\//i.test(lower) ||
|
|
30
|
+
/\/fixtures?\//i.test(lower) ||
|
|
31
|
+
/\/preview-/.test(basename) ||
|
|
32
|
+
/(?:^|[-_.])examples?\.(tsx?|jsx?)$/.test(basename)) {
|
|
28
33
|
return 'example';
|
|
29
34
|
}
|
|
30
35
|
// 4. Content markers
|
|
31
36
|
const fullText = sourceFile.getFullText();
|
|
32
|
-
if (/\/\/\s*@generated/i.test(fullText) ||
|
|
37
|
+
if (/\/\/\s*@generated/i.test(fullText) ||
|
|
38
|
+
/\/\/\s*Generated by/i.test(fullText) ||
|
|
39
|
+
/\/\/\s*Auto-generated/i.test(fullText)) {
|
|
33
40
|
return 'codegen';
|
|
34
41
|
}
|
|
35
42
|
// 5. AST evidence: file produces string output containing JSX/hook patterns = codegen
|
|
@@ -44,11 +51,11 @@ function isBarrelFile(sourceFile) {
|
|
|
44
51
|
const statements = sourceFile.getStatements();
|
|
45
52
|
if (statements.length === 0)
|
|
46
53
|
return true;
|
|
47
|
-
return statements.every(s => {
|
|
54
|
+
return statements.every((s) => {
|
|
48
55
|
const kind = s.getKind();
|
|
49
|
-
return kind === SyntaxKind.ImportDeclaration
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
return (kind === SyntaxKind.ImportDeclaration ||
|
|
57
|
+
kind === SyntaxKind.ExportDeclaration ||
|
|
58
|
+
kind === SyntaxKind.ExportAssignment);
|
|
52
59
|
});
|
|
53
60
|
}
|
|
54
61
|
/**
|
package/dist/file-role.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-role.js","sourceRoot":"","sources":["../src/file-role.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"file-role.js","sourceRoot":"","sources":["../src/file-role.ts"],"names":[],"mappings":"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"}
|
package/dist/graph.d.ts
CHANGED
|
@@ -7,5 +7,5 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Codex contributions: extension fallback, shortest-distance tracking, skip counters.
|
|
9
9
|
*/
|
|
10
|
-
import type {
|
|
10
|
+
import type { GraphOptions, GraphResult } from './types.js';
|
|
11
11
|
export declare function resolveImportGraph(entryFiles: string[], options?: GraphOptions): GraphResult;
|