@kernlang/review 3.3.8 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cache.js +1 -1
- package/dist/call-graph.d.ts +10 -0
- package/dist/call-graph.js +138 -9
- package/dist/call-graph.js.map +1 -1
- package/dist/concept-rules/auth-drift.js +2 -0
- package/dist/concept-rules/auth-drift.js.map +1 -1
- package/dist/concept-rules/auth-propagation-drift.d.ts +10 -0
- package/dist/concept-rules/auth-propagation-drift.js +85 -0
- package/dist/concept-rules/auth-propagation-drift.js.map +1 -0
- package/dist/concept-rules/body-shape-drift.d.ts +32 -0
- package/dist/concept-rules/body-shape-drift.js +98 -0
- package/dist/concept-rules/body-shape-drift.js.map +1 -0
- package/dist/concept-rules/contract-drift.js +3 -1
- package/dist/concept-rules/contract-drift.js.map +1 -1
- package/dist/concept-rules/contract-method-drift.js +2 -0
- package/dist/concept-rules/contract-method-drift.js.map +1 -1
- package/dist/concept-rules/cross-stack-utils.d.ts +24 -0
- package/dist/concept-rules/cross-stack-utils.js +123 -29
- package/dist/concept-rules/cross-stack-utils.js.map +1 -1
- package/dist/concept-rules/index.d.ts +4 -2
- package/dist/concept-rules/index.js +22 -3
- package/dist/concept-rules/index.js.map +1 -1
- package/dist/concept-rules/mutation-without-idempotency.d.ts +10 -0
- package/dist/concept-rules/mutation-without-idempotency.js +47 -0
- package/dist/concept-rules/mutation-without-idempotency.js.map +1 -0
- package/dist/concept-rules/request-validation-drift.d.ts +11 -0
- package/dist/concept-rules/request-validation-drift.js +99 -0
- package/dist/concept-rules/request-validation-drift.js.map +1 -0
- package/dist/concept-rules/root-cause.d.ts +4 -0
- package/dist/concept-rules/root-cause.js +31 -0
- package/dist/concept-rules/root-cause.js.map +1 -0
- package/dist/concept-rules/unbounded-collection-query.d.ts +10 -0
- package/dist/concept-rules/unbounded-collection-query.js +58 -0
- package/dist/concept-rules/unbounded-collection-query.js.map +1 -0
- package/dist/concept-rules/unhandled-api-error-shape.d.ts +10 -0
- package/dist/concept-rules/unhandled-api-error-shape.js +59 -0
- package/dist/concept-rules/unhandled-api-error-shape.js.map +1 -0
- package/dist/default-export.d.ts +41 -0
- package/dist/default-export.js +76 -0
- package/dist/default-export.js.map +1 -0
- package/dist/eval.d.ts +67 -0
- package/dist/eval.js +177 -0
- package/dist/eval.js.map +1 -0
- package/dist/external-tools.js +52 -3
- package/dist/external-tools.js.map +1 -1
- package/dist/file-context.js +32 -13
- package/dist/file-context.js.map +1 -1
- package/dist/file-role.d.ts +6 -0
- package/dist/file-role.js +27 -0
- package/dist/file-role.js.map +1 -1
- package/dist/framework-seeds.d.ts +46 -0
- package/dist/framework-seeds.js +245 -0
- package/dist/framework-seeds.js.map +1 -0
- package/dist/git-env.d.ts +1 -0
- package/dist/git-env.js +25 -0
- package/dist/git-env.js.map +1 -0
- package/dist/graph.js +246 -21
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.js +314 -96
- package/dist/index.js.map +1 -1
- package/dist/mappers/ts-concepts.js +730 -1
- package/dist/mappers/ts-concepts.js.map +1 -1
- package/dist/path-canonical.d.ts +34 -0
- package/dist/path-canonical.js +85 -0
- package/dist/path-canonical.js.map +1 -0
- package/dist/policy.d.ts +22 -0
- package/dist/policy.js +47 -0
- package/dist/policy.js.map +1 -0
- package/dist/project-context.d.ts +135 -0
- package/dist/project-context.js +563 -0
- package/dist/project-context.js.map +1 -0
- package/dist/public-api.d.ts +21 -0
- package/dist/public-api.js +17 -2
- package/dist/public-api.js.map +1 -1
- package/dist/python-fallback.d.ts +2 -0
- package/dist/python-fallback.js +506 -0
- package/dist/python-fallback.js.map +1 -0
- package/dist/reporter.js +106 -1
- package/dist/reporter.js.map +1 -1
- package/dist/rule-quality.d.ts +58 -0
- package/dist/rule-quality.js +357 -0
- package/dist/rule-quality.js.map +1 -0
- package/dist/rules/base.js +21 -3
- package/dist/rules/base.js.map +1 -1
- package/dist/rules/dead-code.d.ts +2 -2
- package/dist/rules/dead-code.js +88 -4
- package/dist/rules/dead-code.js.map +1 -1
- package/dist/rules/index.d.ts +22 -0
- package/dist/rules/index.js +72 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/kern-source.d.ts +4 -0
- package/dist/rules/kern-source.js +184 -0
- package/dist/rules/kern-source.js.map +1 -1
- package/dist/rules/react.js +52 -3
- package/dist/rules/react.js.map +1 -1
- package/dist/rules/suggest-kern-primitive.js +0 -1
- package/dist/rules/suggest-kern-primitive.js.map +1 -1
- package/dist/semantic-diff.js +2 -0
- package/dist/semantic-diff.js.map +1 -1
- package/dist/suppression/apply-suppression.js +2 -0
- package/dist/suppression/apply-suppression.js.map +1 -1
- package/dist/suppression/parse-directives.d.ts +13 -5
- package/dist/suppression/parse-directives.js +62 -8
- package/dist/suppression/parse-directives.js.map +1 -1
- package/dist/suppression/types.d.ts +9 -0
- package/dist/suppression/types.js +6 -1
- package/dist/suppression/types.js.map +1 -1
- package/dist/taint-crossfile.js +15 -8
- package/dist/taint-crossfile.js.map +1 -1
- package/dist/telemetry.d.ts +126 -0
- package/dist/telemetry.js +303 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +172 -2
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
package/dist/external-tools.js
CHANGED
|
@@ -6,9 +6,17 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Phase 3 of the review pipeline.
|
|
8
8
|
*/
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { dirname, resolve } from 'path';
|
|
9
11
|
import { createProject } from './inferrer.js';
|
|
10
12
|
import { debugDetail } from './review-health.js';
|
|
11
13
|
import { createFingerprint } from './types.js';
|
|
14
|
+
function optionalPackageName(...parts) {
|
|
15
|
+
return parts.join('');
|
|
16
|
+
}
|
|
17
|
+
function importOptionalModule(specifier) {
|
|
18
|
+
return import(specifier);
|
|
19
|
+
}
|
|
12
20
|
/**
|
|
13
21
|
* Node-style error check — used to distinguish "optional peer dep missing" (quietly skip)
|
|
14
22
|
* from "the peer dep is installed but failed to load" (surface as degraded-mode health note).
|
|
@@ -35,10 +43,10 @@ function isModuleNotFound(err) {
|
|
|
35
43
|
export async function runESLint(filePaths, cwd, health) {
|
|
36
44
|
// Dynamic import — ESLint is an optional peer dep. MODULE_NOT_FOUND at this step means
|
|
37
45
|
// "not installed" (quiet skip); anything else is a real load failure worth surfacing.
|
|
38
|
-
const eslintModuleName = '
|
|
46
|
+
const eslintModuleName = optionalPackageName('es', 'lint');
|
|
39
47
|
let ESLint;
|
|
40
48
|
try {
|
|
41
|
-
const eslintModule = (await
|
|
49
|
+
const eslintModule = (await importOptionalModule(eslintModuleName));
|
|
42
50
|
ESLint = eslintModule.ESLint || eslintModule.default?.ESLint;
|
|
43
51
|
}
|
|
44
52
|
catch (err) {
|
|
@@ -163,7 +171,8 @@ export function runTSCDiagnostics(project, options = {}, health) {
|
|
|
163
171
|
// both point at the same user-side remedy, both are environmental from review's POV.)
|
|
164
172
|
const isLoadingNoise = code === 6059 || code === 6307;
|
|
165
173
|
const isEnvironmentalNoise = code === 2792 || code === 17004 || code === 2580 || code === 2591;
|
|
166
|
-
if (
|
|
174
|
+
if (options.downgradeProjectLoadingErrors &&
|
|
175
|
+
(isLoadingNoise || isEnvironmentalNoise || isReviewModeModuleResolutionNoise(code, messageStr, filePath))) {
|
|
167
176
|
continue;
|
|
168
177
|
}
|
|
169
178
|
findings.push({
|
|
@@ -191,6 +200,46 @@ export function runTSCDiagnostics(project, options = {}, health) {
|
|
|
191
200
|
}
|
|
192
201
|
return findings;
|
|
193
202
|
}
|
|
203
|
+
function isReviewModeModuleResolutionNoise(code, message, importerFilePath) {
|
|
204
|
+
if (code !== 2307)
|
|
205
|
+
return false;
|
|
206
|
+
const specifier = extractMissingModuleSpecifier(message);
|
|
207
|
+
if (!specifier)
|
|
208
|
+
return false;
|
|
209
|
+
// KERN-generated facades are commonly imported as `.js` from TS source and
|
|
210
|
+
// materialized by `kern compile`. In guard mode, a missing generated facade is
|
|
211
|
+
// pipeline ordering noise unless the explicit lint/typecheck phase says
|
|
212
|
+
// otherwise.
|
|
213
|
+
if (isGeneratedModuleSpecifier(specifier))
|
|
214
|
+
return true;
|
|
215
|
+
// Bare package misses (`vitest`, `ai`, etc.) are dependency-install or workspace
|
|
216
|
+
// context failures in review mode. The explicit `--lint` tsc path still reports
|
|
217
|
+
// them as real compiler errors.
|
|
218
|
+
if (isBareModuleSpecifier(specifier))
|
|
219
|
+
return true;
|
|
220
|
+
// TS ESM commonly imports `./foo.js` while the source file is `foo.ts`. If the
|
|
221
|
+
// corresponding TS source exists, this is a moduleResolution mismatch in
|
|
222
|
+
// review's ad-hoc Project, not a code bug.
|
|
223
|
+
return isTsBackedJsSpecifier(specifier, importerFilePath);
|
|
224
|
+
}
|
|
225
|
+
function extractMissingModuleSpecifier(message) {
|
|
226
|
+
const match = message.match(/Cannot find module ['"]([^'"]+)['"]/);
|
|
227
|
+
return match?.[1];
|
|
228
|
+
}
|
|
229
|
+
function isGeneratedModuleSpecifier(specifier) {
|
|
230
|
+
const normalized = specifier.replace(/\\/g, '/');
|
|
231
|
+
return /(?:^|\/)generated\//.test(normalized) || /(?:^|\/)__generated__\//.test(normalized);
|
|
232
|
+
}
|
|
233
|
+
function isBareModuleSpecifier(specifier) {
|
|
234
|
+
return !specifier.startsWith('.') && !specifier.startsWith('/') && !/^[A-Za-z]:[\\/]/.test(specifier);
|
|
235
|
+
}
|
|
236
|
+
function isTsBackedJsSpecifier(specifier, importerFilePath) {
|
|
237
|
+
if (!specifier.startsWith('.') || !/\.(?:mjs|cjs|js|jsx)$/.test(specifier))
|
|
238
|
+
return false;
|
|
239
|
+
const resolved = resolve(dirname(importerFilePath), specifier);
|
|
240
|
+
const withoutJsExt = resolved.replace(/\.(?:mjs|cjs|js|jsx)$/, '');
|
|
241
|
+
return ['.ts', '.tsx', '.mts', '.cts', '.d.ts'].some((ext) => existsSync(`${withoutJsExt}${ext}`));
|
|
242
|
+
}
|
|
194
243
|
// ── tsc Diagnostics from file paths ───────────────────────────────────
|
|
195
244
|
/**
|
|
196
245
|
* Run TypeScript compiler diagnostics from file paths (no pre-existing Project).
|
|
@@ -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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"}
|
package/dist/file-context.js
CHANGED
|
@@ -155,37 +155,49 @@ function traceImportChain(targetPath, fileMap, entrySet) {
|
|
|
155
155
|
export function buildFileContextMap(graph) {
|
|
156
156
|
const contextMap = new Map();
|
|
157
157
|
const fileMap = new Map();
|
|
158
|
-
|
|
158
|
+
// Internal maps key by canonicalPath (red-team #9 / Option B). Cross-file
|
|
159
|
+
// edges (gf.imports / gf.importedBy / graph.entryFiles include canonical
|
|
160
|
+
// forms after the canonicalisation pass in graph.ts), and ts-morph paths
|
|
161
|
+
// round-trip through canonical, so canonical is the only stable key.
|
|
162
|
+
// Display paths are reported via gf.path on the value side, not the key.
|
|
163
|
+
const entrySet = new Set(graph.entryFiles.map((p) => graph.files.find((g) => g.path === p)?.canonicalPath ?? p));
|
|
159
164
|
for (const gf of graph.files) {
|
|
160
|
-
fileMap.set(gf.
|
|
165
|
+
fileMap.set(gf.canonicalPath, gf);
|
|
161
166
|
}
|
|
162
|
-
// Classify entry points
|
|
167
|
+
// Classify entry points (key by canonicalPath so subsequent lookups match)
|
|
163
168
|
const entryBoundaries = new Map();
|
|
164
169
|
for (const entry of graph.entryFiles) {
|
|
165
|
-
|
|
170
|
+
const entryGf = graph.files.find((g) => g.path === entry);
|
|
171
|
+
const key = entryGf?.canonicalPath ?? entry;
|
|
172
|
+
// classifyEntryPoint reads suffix patterns (page.tsx, route.ts, etc.) —
|
|
173
|
+
// those are the same regardless of /var vs /private/var, so passing
|
|
174
|
+
// either form works. Use display so reads from disk hit the right file.
|
|
175
|
+
entryBoundaries.set(key, classifyEntryPoint(entry));
|
|
166
176
|
}
|
|
167
177
|
// Client boundary propagation cache
|
|
168
178
|
const clientBoundaryCache = new Map();
|
|
169
179
|
for (const gf of graph.files) {
|
|
170
|
-
const isClient = isWithinClientBoundary(gf.
|
|
180
|
+
const isClient = isWithinClientBoundary(gf.canonicalPath, fileMap, entrySet, clientBoundaryCache, new Set());
|
|
181
|
+
// hasUseClientDirective reads from disk — pass display so symlinked
|
|
182
|
+
// paths work even on systems without realpath idempotence guarantees.
|
|
171
183
|
const hasDirective = hasUseClientDirective(gf.path);
|
|
172
|
-
const importChain = traceImportChain(gf.
|
|
184
|
+
const importChain = traceImportChain(gf.canonicalPath, fileMap, entrySet);
|
|
173
185
|
// Determine boundary from import chain
|
|
174
186
|
let boundary = 'unknown';
|
|
175
187
|
if (isClient || hasDirective) {
|
|
176
188
|
boundary = 'client';
|
|
177
189
|
}
|
|
178
|
-
else if (entrySet.has(gf.
|
|
179
|
-
boundary = entryBoundaries.get(gf.
|
|
190
|
+
else if (entrySet.has(gf.canonicalPath)) {
|
|
191
|
+
boundary = entryBoundaries.get(gf.canonicalPath) || 'unknown';
|
|
180
192
|
}
|
|
181
193
|
else {
|
|
182
194
|
// Inherit boundary from entry points that import this file
|
|
183
195
|
const entryBounds = new Set();
|
|
184
196
|
for (const entry of graph.entryFiles) {
|
|
185
|
-
|
|
186
|
-
const
|
|
187
|
-
if (entryGf && canReach(
|
|
188
|
-
entryBounds.add(entryBoundaries.get(
|
|
197
|
+
const entryGf = graph.files.find((g) => g.path === entry);
|
|
198
|
+
const entryKey = entryGf?.canonicalPath ?? entry;
|
|
199
|
+
if (entryGf && canReach(entryKey, gf.canonicalPath, fileMap, new Set())) {
|
|
200
|
+
entryBounds.add(entryBoundaries.get(entryKey) || 'unknown');
|
|
189
201
|
}
|
|
190
202
|
}
|
|
191
203
|
if (entryBounds.size === 1) {
|
|
@@ -198,10 +210,17 @@ export function buildFileContextMap(graph) {
|
|
|
198
210
|
// Find which entry points reach this file
|
|
199
211
|
const reachableEntries = [];
|
|
200
212
|
for (const entry of graph.entryFiles) {
|
|
201
|
-
|
|
213
|
+
const entryGf = graph.files.find((g) => g.path === entry);
|
|
214
|
+
const entryKey = entryGf?.canonicalPath ?? entry;
|
|
215
|
+
if (entryKey === gf.canonicalPath || canReach(entryKey, gf.canonicalPath, fileMap, new Set())) {
|
|
216
|
+
// Push the DISPLAY entry path so consumers see what the user
|
|
217
|
+
// passed in, not the realpath-resolved form.
|
|
202
218
|
reachableEntries.push(entry);
|
|
203
219
|
}
|
|
204
220
|
}
|
|
221
|
+
// contextMap keyed by gf.path (display) so callers querying by the
|
|
222
|
+
// path they passed in find the entry directly. Internal lookups
|
|
223
|
+
// (fileMap, traceImportChain) use canonicalPath — see above.
|
|
205
224
|
contextMap.set(gf.path, {
|
|
206
225
|
boundary,
|
|
207
226
|
entryPoints: reachableEntries,
|
package/dist/file-context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-context.js","sourceRoot":"","sources":["../src/file-context.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"file-context.js","sourceRoot":"","sources":["../src/file-context.ts"],"names":[],"mappings":"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"}
|
package/dist/file-role.d.ts
CHANGED
|
@@ -8,3 +8,9 @@ import { type SourceFile } from 'ts-morph';
|
|
|
8
8
|
import type { FileRole } from './types.js';
|
|
9
9
|
/** Classify a source file's role based on AST evidence and path heuristics. */
|
|
10
10
|
export declare function classifyFileRole(sourceFile: SourceFile, filePath: string): FileRole;
|
|
11
|
+
/**
|
|
12
|
+
* Path-only role classifier for languages where we don't have a ts-morph SourceFile
|
|
13
|
+
* (Python, .kern). Recognizes test/codegen/example/rule-definition by path; everything
|
|
14
|
+
* else falls back to 'runtime'. Barrel detection is unavailable without an AST.
|
|
15
|
+
*/
|
|
16
|
+
export declare function classifyFileRoleByPath(filePath: string): FileRole;
|
package/dist/file-role.js
CHANGED
|
@@ -46,6 +46,33 @@ export function classifyFileRole(sourceFile, filePath) {
|
|
|
46
46
|
// 6. Default
|
|
47
47
|
return 'runtime';
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Path-only role classifier for languages where we don't have a ts-morph SourceFile
|
|
51
|
+
* (Python, .kern). Recognizes test/codegen/example/rule-definition by path; everything
|
|
52
|
+
* else falls back to 'runtime'. Barrel detection is unavailable without an AST.
|
|
53
|
+
*/
|
|
54
|
+
export function classifyFileRoleByPath(filePath) {
|
|
55
|
+
if (/\.(test|spec)\.(tsx?|jsx?|py)$/.test(filePath) ||
|
|
56
|
+
/\/tests?\//.test(filePath) ||
|
|
57
|
+
/^test_/.test(filePath.split('/').pop() || '')) {
|
|
58
|
+
return 'test';
|
|
59
|
+
}
|
|
60
|
+
const lower = filePath.toLowerCase();
|
|
61
|
+
if (/\/(codegen|generated|__generated__|gen)\//i.test(lower) || /\/codegen-/.test(lower)) {
|
|
62
|
+
return 'codegen';
|
|
63
|
+
}
|
|
64
|
+
if (/\/rules?\//i.test(lower) && /\/review\//.test(lower)) {
|
|
65
|
+
return 'rule-definition';
|
|
66
|
+
}
|
|
67
|
+
const basename = lower.split('/').pop() || '';
|
|
68
|
+
if (/\/examples?\//i.test(lower) ||
|
|
69
|
+
/\/fixtures?\//i.test(lower) ||
|
|
70
|
+
/\/preview-/.test(basename) ||
|
|
71
|
+
/(?:^|[-_.])examples?\.(tsx?|jsx?|py)$/.test(basename)) {
|
|
72
|
+
return 'example';
|
|
73
|
+
}
|
|
74
|
+
return 'runtime';
|
|
75
|
+
}
|
|
49
76
|
/** A barrel file has only import/export declarations and no executable statements. */
|
|
50
77
|
function isBarrelFile(sourceFile) {
|
|
51
78
|
const statements = sourceFile.getStatements();
|
package/dist/file-role.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-role.js","sourceRoot":"","sources":["../src/file-role.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-role.js","sourceRoot":"","sources":["../src/file-role.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAmB,UAAU,EAAE,MAAM,UAAU,CAAC;AAGvD,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,UAAsB,EAAE,QAAgB;IACvE,gBAAgB;IAChB,IACE,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC5C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mCAAmC;IACnC,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,4CAA4C;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9C,IACE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3B,oCAAoC,CAAC,IAAI,CAAC,QAAQ,CAAC,EACnD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAC1C,IACE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,EACvC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sFAAsF;IACtF,IAAI,wBAAwB,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,aAAa;IACb,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,IACE,gCAAgC,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC/C,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAC9C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9C,IACE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3B,uCAAuC,CAAC,IAAI,CAAC,QAAQ,CAAC,EACtD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sFAAsF;AACtF,SAAS,YAAY,CAAC,UAAsB;IAC1C,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,CACL,IAAI,KAAK,UAAU,CAAC,iBAAiB;YACrC,IAAI,KAAK,UAAU,CAAC,iBAAiB;YACrC,IAAI,KAAK,UAAU,CAAC,gBAAgB,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,UAAsB;IACtD,MAAM,WAAW,GAAG,8DAA8D,CAAC;IAEnF,mDAAmD;IACnD,MAAM,SAAS,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC;IACjG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC;QAClD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,yFAAyF;IACzF,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC1E,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC;YACzC,eAAe,EAAE,CAAC;YAClB,IAAI,eAAe,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,wCAAwC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KNOWN_FRAMEWORK_SEEDS — per-pattern, per-symbol public-API conventions.
|
|
3
|
+
*
|
|
4
|
+
* MAINTENANCE CONTRACT
|
|
5
|
+
*
|
|
6
|
+
* Every entry must be **symbol-scoped**. A whole-file "this file is public"
|
|
7
|
+
* seed is forbidden by Phase 4 design — a stale helper sitting next to a
|
|
8
|
+
* Next.js page would silently inherit public-API status, which was
|
|
9
|
+
* red-team CRITICAL #2 against Plan v3. Each pattern lists the EXACT
|
|
10
|
+
* export names the convention treats as runtime entry points; everything
|
|
11
|
+
* else stays subject to dead-export checks.
|
|
12
|
+
*
|
|
13
|
+
* Order matters. The first matching seed wins, so put more-specific
|
|
14
|
+
* patterns before more-general ones (e.g. `pages/api/**` before
|
|
15
|
+
* `pages/** /*.*`). The matcher uses POSIX-style globs from
|
|
16
|
+
* `public-api.ts:globToRegex`; patterns are matched against the input
|
|
17
|
+
* file path normalized to forward slashes.
|
|
18
|
+
*
|
|
19
|
+
* Step 7a covers the "stable" Next.js conventions documented in the
|
|
20
|
+
* official routing/file-convention docs and stable across versions
|
|
21
|
+
* 13–15. Edge cases — parallel-route slots, metadata image files,
|
|
22
|
+
* instrumentation, mdx-components, the v16 middleware → proxy rename —
|
|
23
|
+
* land in step 7b. Splitting keeps each commit a clear change set if
|
|
24
|
+
* one half regresses.
|
|
25
|
+
*/
|
|
26
|
+
export interface FrameworkSeed {
|
|
27
|
+
/** Pattern this convention applies to (POSIX-style glob, no braces). */
|
|
28
|
+
pattern: string;
|
|
29
|
+
/** Public symbol names — runtime entry points ONLY. */
|
|
30
|
+
symbols: readonly string[];
|
|
31
|
+
/** Short description for diagnostics / future maintainers. */
|
|
32
|
+
why: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* STABLE Next.js conventions (step 7a). Edge-case shapes (parallel routes,
|
|
36
|
+
* metadata files like icon/opengraph-image, instrumentation, proxy) live
|
|
37
|
+
* in step 7b — each commit stays a clean change set.
|
|
38
|
+
*/
|
|
39
|
+
export declare const KNOWN_FRAMEWORK_SEEDS: readonly FrameworkSeed[];
|
|
40
|
+
/**
|
|
41
|
+
* Match a file path against KNOWN_FRAMEWORK_SEEDS. Returns the FIRST
|
|
42
|
+
* matching seed (more-specific patterns must be ordered before more-
|
|
43
|
+
* general ones — see the const above). Returns undefined when nothing
|
|
44
|
+
* matches; the caller falls back to package.json-driven seeding.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getFrameworkSeed(filePath: string): FrameworkSeed | undefined;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KNOWN_FRAMEWORK_SEEDS — per-pattern, per-symbol public-API conventions.
|
|
3
|
+
*
|
|
4
|
+
* MAINTENANCE CONTRACT
|
|
5
|
+
*
|
|
6
|
+
* Every entry must be **symbol-scoped**. A whole-file "this file is public"
|
|
7
|
+
* seed is forbidden by Phase 4 design — a stale helper sitting next to a
|
|
8
|
+
* Next.js page would silently inherit public-API status, which was
|
|
9
|
+
* red-team CRITICAL #2 against Plan v3. Each pattern lists the EXACT
|
|
10
|
+
* export names the convention treats as runtime entry points; everything
|
|
11
|
+
* else stays subject to dead-export checks.
|
|
12
|
+
*
|
|
13
|
+
* Order matters. The first matching seed wins, so put more-specific
|
|
14
|
+
* patterns before more-general ones (e.g. `pages/api/**` before
|
|
15
|
+
* `pages/** /*.*`). The matcher uses POSIX-style globs from
|
|
16
|
+
* `public-api.ts:globToRegex`; patterns are matched against the input
|
|
17
|
+
* file path normalized to forward slashes.
|
|
18
|
+
*
|
|
19
|
+
* Step 7a covers the "stable" Next.js conventions documented in the
|
|
20
|
+
* official routing/file-convention docs and stable across versions
|
|
21
|
+
* 13–15. Edge cases — parallel-route slots, metadata image files,
|
|
22
|
+
* instrumentation, mdx-components, the v16 middleware → proxy rename —
|
|
23
|
+
* land in step 7b. Splitting keeps each commit a clear change set if
|
|
24
|
+
* one half regresses.
|
|
25
|
+
*/
|
|
26
|
+
import { globToRegex, toPosix } from './public-api.js';
|
|
27
|
+
/**
|
|
28
|
+
* Route-segment config exports valid on Next.js page/layout/route files.
|
|
29
|
+
* Listing them once lets the page/layout/route patterns share the same set.
|
|
30
|
+
* Source: Next.js routing/route-segment-config.
|
|
31
|
+
*/
|
|
32
|
+
const ROUTE_SEGMENT_CONFIG = [
|
|
33
|
+
'dynamic',
|
|
34
|
+
'dynamicParams',
|
|
35
|
+
'revalidate',
|
|
36
|
+
'fetchCache',
|
|
37
|
+
'runtime',
|
|
38
|
+
'preferredRegion',
|
|
39
|
+
'maxDuration',
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Metadata exports valid on page/layout files. `viewport` and
|
|
43
|
+
* `generateViewport` are post-13.6 additions; `generateStaticParams` is
|
|
44
|
+
* how dynamic routes pre-render at build time.
|
|
45
|
+
*/
|
|
46
|
+
const PAGE_METADATA = ['metadata', 'generateMetadata', 'viewport', 'generateViewport', 'generateStaticParams'];
|
|
47
|
+
const PAGE_LIKE_SYMBOLS = ['default', ...PAGE_METADATA, ...ROUTE_SEGMENT_CONFIG];
|
|
48
|
+
const ROUTE_HANDLER_VERBS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'];
|
|
49
|
+
const APP_EXTS = ['ts', 'tsx', 'js', 'jsx'];
|
|
50
|
+
const SCRIPT_EXTS = ['ts', 'js'];
|
|
51
|
+
const PAGES_EXTS = ['tsx', 'ts', 'jsx', 'js'];
|
|
52
|
+
/**
|
|
53
|
+
* Symbol surface for app/ metadata image files (icon, apple-icon,
|
|
54
|
+
* opengraph-image, twitter-image). The dynamic forms (`.ts(x)`/`.js(x)`)
|
|
55
|
+
* export `default` (the image-generation function) plus optional
|
|
56
|
+
* `generateImageMetadata`, `alt`, `size`, `contentType`. Static forms
|
|
57
|
+
* (`.png`, `.svg`, etc.) have no JS exports so we skip those extensions.
|
|
58
|
+
* Source: Next.js metadata-files docs.
|
|
59
|
+
*/
|
|
60
|
+
const IMAGE_METADATA_SYMBOLS = ['default', 'generateImageMetadata', 'alt', 'size', 'contentType'];
|
|
61
|
+
/**
|
|
62
|
+
* STABLE Next.js conventions (step 7a). Edge-case shapes (parallel routes,
|
|
63
|
+
* metadata files like icon/opengraph-image, instrumentation, proxy) live
|
|
64
|
+
* in step 7b — each commit stays a clean change set.
|
|
65
|
+
*/
|
|
66
|
+
export const KNOWN_FRAMEWORK_SEEDS = [
|
|
67
|
+
// App Router: route handlers — HTTP verbs + segment config.
|
|
68
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
69
|
+
pattern: `**/app/**/route.${ext}`,
|
|
70
|
+
symbols: [...ROUTE_HANDLER_VERBS, ...ROUTE_SEGMENT_CONFIG],
|
|
71
|
+
why: 'Next.js App Router route handler',
|
|
72
|
+
})),
|
|
73
|
+
// App Router: special files (template/loading/error/not-found/global-error)
|
|
74
|
+
// — `default` only.
|
|
75
|
+
...APP_EXTS.flatMap((ext) => ['template', 'loading', 'error', 'not-found', 'global-error'].map((kind) => ({
|
|
76
|
+
pattern: `**/app/**/${kind}.${ext}`,
|
|
77
|
+
symbols: ['default'],
|
|
78
|
+
why: `Next.js App Router ${kind}`,
|
|
79
|
+
}))),
|
|
80
|
+
// App Router: page + layout — symmetric public surface (default render
|
|
81
|
+
// + metadata + segment config).
|
|
82
|
+
...APP_EXTS.flatMap((ext) => [
|
|
83
|
+
{
|
|
84
|
+
pattern: `**/app/**/page.${ext}`,
|
|
85
|
+
symbols: PAGE_LIKE_SYMBOLS,
|
|
86
|
+
why: 'Next.js App Router page',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
pattern: `**/app/**/layout.${ext}`,
|
|
90
|
+
symbols: PAGE_LIKE_SYMBOLS,
|
|
91
|
+
why: 'Next.js App Router layout',
|
|
92
|
+
},
|
|
93
|
+
]),
|
|
94
|
+
// Pages Router: special files first (more specific patterns).
|
|
95
|
+
...PAGES_EXTS.flatMap((ext) => [
|
|
96
|
+
{
|
|
97
|
+
pattern: `**/pages/_app.${ext}`,
|
|
98
|
+
symbols: ['default'],
|
|
99
|
+
why: 'Next.js Pages Router _app',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
pattern: `**/pages/_document.${ext}`,
|
|
103
|
+
symbols: ['default'],
|
|
104
|
+
why: 'Next.js Pages Router _document',
|
|
105
|
+
},
|
|
106
|
+
]),
|
|
107
|
+
// Pages Router: API routes — `default` (handler) + `config` (size limits,
|
|
108
|
+
// bodyParser, runtime). Must come BEFORE the general pages/**/*.* pattern
|
|
109
|
+
// so api files get the api-specific seed.
|
|
110
|
+
...PAGES_EXTS.map((ext) => ({
|
|
111
|
+
pattern: `**/pages/api/**/*.${ext}`,
|
|
112
|
+
symbols: ['default', 'config'],
|
|
113
|
+
why: 'Next.js Pages Router API route',
|
|
114
|
+
})),
|
|
115
|
+
// Pages Router: data-fetching pages.
|
|
116
|
+
...PAGES_EXTS.map((ext) => ({
|
|
117
|
+
pattern: `**/pages/**/*.${ext}`,
|
|
118
|
+
symbols: ['default', 'getServerSideProps', 'getStaticProps', 'getStaticPaths', 'config'],
|
|
119
|
+
why: 'Next.js Pages Router page',
|
|
120
|
+
})),
|
|
121
|
+
// Middleware: root or src/, with both ts and js.
|
|
122
|
+
...SCRIPT_EXTS.flatMap((ext) => [
|
|
123
|
+
{
|
|
124
|
+
pattern: `**/middleware.${ext}`,
|
|
125
|
+
symbols: ['default', 'middleware', 'config'],
|
|
126
|
+
why: 'Next.js middleware',
|
|
127
|
+
},
|
|
128
|
+
]),
|
|
129
|
+
// ── Step 7b — edge-case Next.js conventions ────────────────────────────
|
|
130
|
+
// Parallel-route slot fallback. `app/@slot/default.tsx` (and any nested
|
|
131
|
+
// `default.{ext}` under `app/`) is rendered when an unmatched parallel
|
|
132
|
+
// segment has no other match. Always exports `default` only.
|
|
133
|
+
...APP_EXTS.map((ext) => ({
|
|
134
|
+
pattern: `**/app/**/default.${ext}`,
|
|
135
|
+
symbols: ['default'],
|
|
136
|
+
why: 'Next.js App Router parallel-route default',
|
|
137
|
+
})),
|
|
138
|
+
// Auth-flow special files (Next 15+): forbidden() and unauthorized()
|
|
139
|
+
// navigations resolve to dedicated UI files. Symmetric with not-found.
|
|
140
|
+
...APP_EXTS.flatMap((ext) => ['forbidden', 'unauthorized', 'global-not-found'].map((kind) => ({
|
|
141
|
+
pattern: `**/app/**/${kind}.${ext}`,
|
|
142
|
+
symbols: ['default'],
|
|
143
|
+
why: `Next.js App Router ${kind}`,
|
|
144
|
+
}))),
|
|
145
|
+
// Metadata route handlers — sitemap, robots, manifest. Always at the
|
|
146
|
+
// app/ root or under a route group; export `default` (the generator).
|
|
147
|
+
// sitemap.{ext} also supports `generateSitemaps` for paginated sitemaps.
|
|
148
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
149
|
+
pattern: `**/app/**/sitemap.${ext}`,
|
|
150
|
+
symbols: ['default', 'generateSitemaps'],
|
|
151
|
+
why: 'Next.js App Router sitemap',
|
|
152
|
+
})),
|
|
153
|
+
...SCRIPT_EXTS.flatMap((ext) => ['robots', 'manifest'].map((kind) => ({
|
|
154
|
+
pattern: `**/app/**/${kind}.${ext}`,
|
|
155
|
+
symbols: ['default'],
|
|
156
|
+
why: `Next.js App Router ${kind}`,
|
|
157
|
+
}))),
|
|
158
|
+
// Image metadata files — dynamic generation forms only. Static images
|
|
159
|
+
// (`.png`, `.svg`, …) have no JS exports so we don't pattern those.
|
|
160
|
+
...APP_EXTS.flatMap((ext) => ['icon', 'apple-icon', 'opengraph-image', 'twitter-image'].map((kind) => ({
|
|
161
|
+
pattern: `**/app/**/${kind}.${ext}`,
|
|
162
|
+
symbols: IMAGE_METADATA_SYMBOLS,
|
|
163
|
+
why: `Next.js App Router ${kind}`,
|
|
164
|
+
}))),
|
|
165
|
+
// instrumentation.{ts,js} — root-level (or src/-level) hooks. `register`
|
|
166
|
+
// runs at server start; `onRequestError` reports per-request errors.
|
|
167
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
168
|
+
pattern: `**/instrumentation.${ext}`,
|
|
169
|
+
symbols: ['register', 'onRequestError'],
|
|
170
|
+
why: 'Next.js instrumentation',
|
|
171
|
+
})),
|
|
172
|
+
// instrumentation-client.{ts,js} — Next 15+ client-side companion.
|
|
173
|
+
// `onRouterTransitionStart` fires on route changes.
|
|
174
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
175
|
+
pattern: `**/instrumentation-client.${ext}`,
|
|
176
|
+
symbols: ['onRouterTransitionStart'],
|
|
177
|
+
why: 'Next.js instrumentation-client',
|
|
178
|
+
})),
|
|
179
|
+
// mdx-components.{ts,tsx,js,jsx} — required at the project root for MDX
|
|
180
|
+
// pages to resolve component overrides via useMDXComponents.
|
|
181
|
+
...APP_EXTS.map((ext) => ({
|
|
182
|
+
pattern: `**/mdx-components.${ext}`,
|
|
183
|
+
symbols: ['useMDXComponents'],
|
|
184
|
+
why: 'Next.js mdx-components',
|
|
185
|
+
})),
|
|
186
|
+
// Forward-compat: Next 16 renames `middleware` to `proxy`. Adding the
|
|
187
|
+
// pattern now means upgrading projects keep their seeds working without
|
|
188
|
+
// a kern-lang release. If Next walks back the rename, removing this
|
|
189
|
+
// pattern is a no-op for projects still on `middleware.{ts,js}`.
|
|
190
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
191
|
+
pattern: `**/proxy.${ext}`,
|
|
192
|
+
symbols: ['default', 'proxy', 'config'],
|
|
193
|
+
why: 'Next.js proxy (v16 middleware rename)',
|
|
194
|
+
})),
|
|
195
|
+
// ── Nuxt 3+ conventions ────────────────────────────────────────────────
|
|
196
|
+
//
|
|
197
|
+
// SCOPE NOTE: only Nuxt-specific path shapes are seeded here. Generic
|
|
198
|
+
// top-level `middleware/`, `plugins/`, `modules/`, `composables/` dirs
|
|
199
|
+
// are NOT seeded because non-Nuxt projects with similarly-named dirs
|
|
200
|
+
// would get over-marked: a stale plugin in `plugins/legacy.ts` of an
|
|
201
|
+
// arbitrary project would inherit public-API status. The `**/server/**`
|
|
202
|
+
// patterns ARE Nuxt-specific (Nitro server routes), so seeding them is
|
|
203
|
+
// safe. `nuxt.config.{ts,js}` is uniquely identifying.
|
|
204
|
+
//
|
|
205
|
+
// SFC files (`.vue`) are not reviewed — symbols inside `<script setup>`
|
|
206
|
+
// never reach the dead-export rule — so Vue's `pages/**/*.vue`,
|
|
207
|
+
// `layouts/**/*.vue`, `components/**/*.vue` are intentionally absent.
|
|
208
|
+
// Nuxt server routes — defineEventHandler default-export the handler
|
|
209
|
+
// factory. Symbol-scoped to `default`; siblings stay subject to
|
|
210
|
+
// dead-export checks.
|
|
211
|
+
...SCRIPT_EXTS.flatMap((ext) => ['api', 'middleware', 'plugins', 'routes'].map((kind) => ({
|
|
212
|
+
pattern: `**/server/${kind}/**/*.${ext}`,
|
|
213
|
+
symbols: ['default'],
|
|
214
|
+
why: `Nuxt server/${kind} handler`,
|
|
215
|
+
}))),
|
|
216
|
+
// nuxt.config — defineNuxtConfig default export. Uniquely Nuxt-named.
|
|
217
|
+
...SCRIPT_EXTS.map((ext) => ({
|
|
218
|
+
pattern: `**/nuxt.config.${ext}`,
|
|
219
|
+
symbols: ['default'],
|
|
220
|
+
why: 'Nuxt config',
|
|
221
|
+
})),
|
|
222
|
+
];
|
|
223
|
+
/**
|
|
224
|
+
* Compiled regex per seed. globToRegex is non-trivial; cache once per
|
|
225
|
+
* process — KNOWN_FRAMEWORK_SEEDS is `as const` so the cache is sound.
|
|
226
|
+
*/
|
|
227
|
+
const compiled = KNOWN_FRAMEWORK_SEEDS.map((seed) => ({
|
|
228
|
+
regex: globToRegex(seed.pattern),
|
|
229
|
+
seed,
|
|
230
|
+
}));
|
|
231
|
+
/**
|
|
232
|
+
* Match a file path against KNOWN_FRAMEWORK_SEEDS. Returns the FIRST
|
|
233
|
+
* matching seed (more-specific patterns must be ordered before more-
|
|
234
|
+
* general ones — see the const above). Returns undefined when nothing
|
|
235
|
+
* matches; the caller falls back to package.json-driven seeding.
|
|
236
|
+
*/
|
|
237
|
+
export function getFrameworkSeed(filePath) {
|
|
238
|
+
const posix = toPosix(filePath);
|
|
239
|
+
for (const { regex, seed } of compiled) {
|
|
240
|
+
if (regex.test(posix))
|
|
241
|
+
return seed;
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=framework-seeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-seeds.js","sourceRoot":"","sources":["../src/framework-seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function withoutLocalGitEnv(env?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
package/dist/git-env.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const LOCAL_GIT_ENV_VARS = [
|
|
2
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
3
|
+
'GIT_COMMON_DIR',
|
|
4
|
+
'GIT_CONFIG',
|
|
5
|
+
'GIT_CONFIG_COUNT',
|
|
6
|
+
'GIT_CONFIG_PARAMETERS',
|
|
7
|
+
'GIT_DIR',
|
|
8
|
+
'GIT_GRAFT_FILE',
|
|
9
|
+
'GIT_IMPLICIT_WORK_TREE',
|
|
10
|
+
'GIT_INDEX_FILE',
|
|
11
|
+
'GIT_NO_REPLACE_OBJECTS',
|
|
12
|
+
'GIT_OBJECT_DIRECTORY',
|
|
13
|
+
'GIT_PREFIX',
|
|
14
|
+
'GIT_REPLACE_REF_BASE',
|
|
15
|
+
'GIT_SHALLOW_FILE',
|
|
16
|
+
'GIT_WORK_TREE',
|
|
17
|
+
];
|
|
18
|
+
export function withoutLocalGitEnv(env = process.env) {
|
|
19
|
+
const clean = { ...env };
|
|
20
|
+
for (const key of LOCAL_GIT_ENV_VARS) {
|
|
21
|
+
delete clean[key];
|
|
22
|
+
}
|
|
23
|
+
return clean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=git-env.js.map
|