@nifrajs/cli 2.12.1 → 2.14.1
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/capabilities-tool.d.ts +54 -1
- package/dist/capabilities-tool.d.ts.map +1 -1
- package/dist/capabilities-tool.js +146 -18
- package/dist/capabilities-tool.js.map +1 -1
- package/dist/check.d.ts +11 -11
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +235 -47
- package/dist/check.js.map +1 -1
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +96 -406
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.d.ts +244 -0
- package/dist/command-catalog.d.ts.map +1 -0
- package/dist/command-catalog.js +1014 -0
- package/dist/command-catalog.js.map +1 -0
- package/dist/contracts.d.ts +9 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +22 -6
- package/dist/contracts.js.map +1 -1
- package/dist/doctor.d.ts +18 -11
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +30 -230
- package/dist/doctor.js.map +1 -1
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +22 -5
- package/dist/load.js.map +1 -1
- package/dist/manifest-tool.d.ts +15 -1
- package/dist/manifest-tool.d.ts.map +1 -1
- package/dist/manifest-tool.js +23 -9
- package/dist/manifest-tool.js.map +1 -1
- package/dist/mcp-http.js +1 -1
- package/dist/mcp.d.ts +8 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +59 -349
- package/dist/mcp.js.map +1 -1
- package/dist/project-facts.d.ts +40 -0
- package/dist/project-facts.d.ts.map +1 -0
- package/dist/project-facts.js +36 -0
- package/dist/project-facts.js.map +1 -0
- package/dist/release-verification.d.ts +45 -0
- package/dist/release-verification.d.ts.map +1 -0
- package/dist/release-verification.js +303 -0
- package/dist/release-verification.js.map +1 -0
- package/dist/rules/comment-markers.d.ts +8 -0
- package/dist/rules/comment-markers.d.ts.map +1 -1
- package/dist/rules/comment-markers.js +36 -0
- package/dist/rules/comment-markers.js.map +1 -1
- package/dist/rules/index.d.ts +2 -3
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/routes.d.ts.map +1 -1
- package/dist/rules/routes.js +12 -14
- package/dist/rules/routes.js.map +1 -1
- package/dist/rules/security.js +14 -14
- package/dist/rules/security.js.map +1 -1
- package/docs/types.json +28 -15
- package/package.json +9 -9
- package/src/capabilities-tool.ts +229 -21
- package/src/check.ts +286 -64
- package/src/cli.ts +106 -399
- package/src/command-catalog.ts +1415 -0
- package/src/contracts.ts +28 -7
- package/src/doctor.ts +56 -264
- package/src/load.ts +25 -6
- package/src/manifest-tool.ts +43 -12
- package/src/mcp-http.ts +1 -1
- package/src/mcp.ts +82 -414
- package/src/project-facts.ts +86 -0
- package/src/release-verification.ts +377 -0
- package/src/rules/comment-markers.ts +36 -0
- package/src/rules/index.ts +3 -4
- package/src/rules/routes.ts +13 -14
- package/src/rules/security.ts +14 -14
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The repository release verification gate.
|
|
3
|
+
*
|
|
4
|
+
* This module is intentionally independent from app loading. The root package scripts and the
|
|
5
|
+
* `nifra verify` command both call this runner, so the local and CI paths share one gate plan.
|
|
6
|
+
*/
|
|
7
|
+
import { mkdtempSync, readFileSync, realpathSync, rmSync } from "node:fs";
|
|
8
|
+
import { tmpdir } from "node:os";
|
|
9
|
+
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
10
|
+
const DEFAULT_GATES = [
|
|
11
|
+
{
|
|
12
|
+
id: "lint",
|
|
13
|
+
commands: [["run", "lint"]],
|
|
14
|
+
remediation: "Run `bun run lint` and fix the reported lint findings.",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "typecheck",
|
|
18
|
+
commands: [["run", "typecheck"]],
|
|
19
|
+
remediation: "Run `bun run typecheck` and fix the reported TypeScript errors.",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "tests",
|
|
23
|
+
commands: [["run", "test"]],
|
|
24
|
+
remediation: "Run `bun run test` and fix the first failing test.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "docs",
|
|
28
|
+
commands: [["run", "check:docs"]],
|
|
29
|
+
remediation: "Run `bun run check:docs` and update the failing documentation example.",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "api-corpus",
|
|
33
|
+
commands: [["run", "check:api"]],
|
|
34
|
+
remediation: "Run `bun run gen:api` and review the generated API reference.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "cards-corpus",
|
|
38
|
+
commands: [["run", "check:cards"]],
|
|
39
|
+
remediation: "Run `bun run gen:cards` and review the generated package cards.",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "node-outcome-corpus",
|
|
43
|
+
commands: [["run", "check:node-outcome"]],
|
|
44
|
+
remediation: "Run `bun run gen:node-outcome` and review the generated Node outcome contract.",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "sitemap",
|
|
48
|
+
commands: [["run", "check:sitemap"]],
|
|
49
|
+
remediation: "Run `bun run gen:sitemap` and review the generated sitemap.",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "public-boundary",
|
|
53
|
+
commands: [["run", "check:public-boundary"]],
|
|
54
|
+
remediation: "Run `bun run check:public-boundary` and remove the reported public-boundary violation.",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "size",
|
|
58
|
+
commands: [["run", "check:size"]],
|
|
59
|
+
remediation: "Run `bun run check:size` and either reduce the bundle or update the reviewed budget.",
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
const RELEASE_GATES = [
|
|
63
|
+
{
|
|
64
|
+
id: "build",
|
|
65
|
+
commands: [["run", "build"]],
|
|
66
|
+
remediation: "Run `bun run build` and fix the first package build failure.",
|
|
67
|
+
},
|
|
68
|
+
...DEFAULT_GATES.slice(0, 3),
|
|
69
|
+
{
|
|
70
|
+
id: "coverage",
|
|
71
|
+
commands: [
|
|
72
|
+
["run", "test:coverage"],
|
|
73
|
+
["run", "check:coverage"],
|
|
74
|
+
],
|
|
75
|
+
remediation: "Run `bun run test:coverage` first, then `bun run check:coverage`, and fix the reported coverage regression.",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "corpus",
|
|
79
|
+
commands: [["run", "check:corpus"]],
|
|
80
|
+
remediation: "Run `bun run gen:llms`, `bun run gen:api`, and `bun run gen:cards`, then rerun the corpus gate.",
|
|
81
|
+
},
|
|
82
|
+
DEFAULT_GATES[3],
|
|
83
|
+
{
|
|
84
|
+
id: "public-boundary",
|
|
85
|
+
commands: [["run", "check:public-boundary"]],
|
|
86
|
+
remediation: "Run `bun run check:public-boundary` and remove the reported public-boundary violation.",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: "size",
|
|
90
|
+
commands: [["run", "check:size"]],
|
|
91
|
+
remediation: "Run `bun run check:size` and either reduce the bundle or update the reviewed budget.",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "core-performance",
|
|
95
|
+
commands: [["run", "check:core-performance"]],
|
|
96
|
+
remediation: "Run `bun run check:core-performance` and investigate the measured performance regression.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: "publish",
|
|
100
|
+
commands: [["run", "check:publish"]],
|
|
101
|
+
remediation: "Run `bun run check:publish` and fix the publish-consumer metadata or type-surface failure.",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: "consumer",
|
|
105
|
+
commands: [["run", "check:consumers"]],
|
|
106
|
+
remediation: "Run `bun run check:consumers` and fix the isolated consumer failure.",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: "cold-start",
|
|
110
|
+
commands: [["run", "check:cold-start"]],
|
|
111
|
+
remediation: "Run `bun run check:cold-start` and fix the fresh scaffold install or build failure.",
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
id: "cross-runtime-deno",
|
|
115
|
+
commands: [
|
|
116
|
+
["run", "test:deno"],
|
|
117
|
+
["run", "check:deno-tarball"],
|
|
118
|
+
],
|
|
119
|
+
remediation: "Run `bun run test:deno` and `bun run check:deno-tarball`, then fix the first Deno compatibility failure.",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "cross-runtime-node",
|
|
123
|
+
commands: [["run", "test:node"]],
|
|
124
|
+
remediation: "Run `bun run test:node` and fix the Node runtime adapter failure.",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: "pipeline-parity",
|
|
128
|
+
commands: [["run", "check:pipeline-parity"]],
|
|
129
|
+
remediation: "Run `bun run check:pipeline-parity` and fix the development and production manifest drift.",
|
|
130
|
+
},
|
|
131
|
+
];
|
|
132
|
+
const runBunCommand = async (spec) => {
|
|
133
|
+
const child = Bun.spawn([process.execPath, ...spec.args], {
|
|
134
|
+
cwd: spec.cwd,
|
|
135
|
+
env: spec.env,
|
|
136
|
+
stdout: "pipe",
|
|
137
|
+
stderr: "pipe",
|
|
138
|
+
});
|
|
139
|
+
const [exitCode, stdout, stderr] = await Promise.all([
|
|
140
|
+
child.exited,
|
|
141
|
+
new Response(child.stdout).text(),
|
|
142
|
+
new Response(child.stderr).text(),
|
|
143
|
+
]);
|
|
144
|
+
return { exitCode, stdout, stderr };
|
|
145
|
+
};
|
|
146
|
+
const parsePackage = (path) => {
|
|
147
|
+
try {
|
|
148
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
149
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
150
|
+
? value
|
|
151
|
+
: undefined;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const workspacePatterns = (pkg) => {
|
|
158
|
+
const workspaces = pkg.workspaces;
|
|
159
|
+
if (Array.isArray(workspaces))
|
|
160
|
+
return workspaces.filter((item) => typeof item === "string");
|
|
161
|
+
if (workspaces !== null && typeof workspaces === "object") {
|
|
162
|
+
const packages = workspaces.packages;
|
|
163
|
+
if (Array.isArray(packages))
|
|
164
|
+
return packages.filter((item) => typeof item === "string");
|
|
165
|
+
}
|
|
166
|
+
return [];
|
|
167
|
+
};
|
|
168
|
+
const workspaceContains = async (root, patterns, target) => {
|
|
169
|
+
if (root === target)
|
|
170
|
+
return patterns.length > 0;
|
|
171
|
+
for (const pattern of patterns) {
|
|
172
|
+
const packagePattern = `${pattern.replace(/\/$/, "")}/package.json`;
|
|
173
|
+
for await (const match of new Bun.Glob(packagePattern).scan({ cwd: root, dot: false })) {
|
|
174
|
+
if (match.split(/[\\/]/).includes("node_modules"))
|
|
175
|
+
continue;
|
|
176
|
+
const packageRoot = resolve(root, dirname(match));
|
|
177
|
+
const targetRelative = relative(packageRoot, target);
|
|
178
|
+
if (targetRelative === "" ||
|
|
179
|
+
(!targetRelative.startsWith(`..${sep}`) && targetRelative !== ".."))
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
};
|
|
185
|
+
/** Resolve the repository root even when the command starts in a workspace package. */
|
|
186
|
+
export async function resolveVerificationRoot(start) {
|
|
187
|
+
const original = realpathSync(resolve(start));
|
|
188
|
+
let current = original;
|
|
189
|
+
for (;;) {
|
|
190
|
+
const pkgPath = join(current, "package.json");
|
|
191
|
+
const pkg = parsePackage(pkgPath);
|
|
192
|
+
if (pkg !== undefined && (await workspaceContains(current, workspacePatterns(pkg), original))) {
|
|
193
|
+
return current;
|
|
194
|
+
}
|
|
195
|
+
const parent = dirname(current);
|
|
196
|
+
if (parent === current)
|
|
197
|
+
return original;
|
|
198
|
+
current = parent;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const gatePlan = (mode) => mode === "release" ? RELEASE_GATES : DEFAULT_GATES;
|
|
202
|
+
const commandLabel = (args) => `bun ${args.join(" ")}`;
|
|
203
|
+
const runGate = async (root, gate, runCommand, fixtureRoot) => {
|
|
204
|
+
let lastExitCode;
|
|
205
|
+
for (const [index, args] of gate.commands.entries()) {
|
|
206
|
+
const fixture = mkdtempSync(join(fixtureRoot, `${gate.id}-${index}-`));
|
|
207
|
+
const result = await runCommand({
|
|
208
|
+
args,
|
|
209
|
+
cwd: root,
|
|
210
|
+
env: {
|
|
211
|
+
...process.env,
|
|
212
|
+
TMPDIR: fixture,
|
|
213
|
+
NIFRA_VERIFY_GATE: gate.id,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
lastExitCode = result.exitCode;
|
|
217
|
+
if (result.exitCode !== 0) {
|
|
218
|
+
return {
|
|
219
|
+
id: gate.id,
|
|
220
|
+
status: "fail",
|
|
221
|
+
commands: gate.commands.map(commandLabel),
|
|
222
|
+
exitCode: result.exitCode,
|
|
223
|
+
message: `${commandLabel(args)} exited with code ${result.exitCode}`,
|
|
224
|
+
remediation: gate.remediation,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
id: gate.id,
|
|
230
|
+
status: "pass",
|
|
231
|
+
commands: gate.commands.map(commandLabel),
|
|
232
|
+
...(lastExitCode === undefined ? {} : { exitCode: lastExitCode }),
|
|
233
|
+
remediation: gate.remediation,
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
const skippedGate = (gate, failedId) => ({
|
|
237
|
+
id: gate.id,
|
|
238
|
+
status: "skipped",
|
|
239
|
+
commands: gate.commands.map(commandLabel),
|
|
240
|
+
message: `not run because the ${failedId} gate failed`,
|
|
241
|
+
remediation: `Fix the ${failedId} gate first, then rerun verification.`,
|
|
242
|
+
});
|
|
243
|
+
/** Collect the same gate result rendered by the CLI and used by repository scripts. */
|
|
244
|
+
export async function collectReleaseVerification(start, options = {}) {
|
|
245
|
+
const mode = options.mode ?? "default";
|
|
246
|
+
const root = await resolveVerificationRoot(start);
|
|
247
|
+
const runCommand = options.runCommand ?? runBunCommand;
|
|
248
|
+
const fixtureRoot = mkdtempSync(join(realpathSync(tmpdir()), "nifra-verify-"));
|
|
249
|
+
const gates = [];
|
|
250
|
+
try {
|
|
251
|
+
let failedId;
|
|
252
|
+
for (const gate of gatePlan(mode)) {
|
|
253
|
+
if (failedId !== undefined) {
|
|
254
|
+
gates.push(skippedGate(gate, failedId));
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const result = await runGate(root, gate, runCommand, fixtureRoot);
|
|
258
|
+
gates.push(result);
|
|
259
|
+
if (result.status === "fail")
|
|
260
|
+
failedId = result.id;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
rmSync(fixtureRoot, { recursive: true, force: true });
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
ok: gates.every((gate) => gate.status === "pass"),
|
|
268
|
+
mode,
|
|
269
|
+
gates,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
export function renderReleaseVerification(result) {
|
|
273
|
+
const lines = [`nifra verify --${result.mode}`, ""];
|
|
274
|
+
for (const gate of result.gates) {
|
|
275
|
+
const marker = gate.status === "pass" ? "✓" : gate.status === "fail" ? "✗" : "-";
|
|
276
|
+
lines.push(`${marker} ${gate.id}: ${gate.status}`);
|
|
277
|
+
if (gate.message !== undefined)
|
|
278
|
+
lines.push(` ${gate.message}`);
|
|
279
|
+
if (gate.status !== "pass")
|
|
280
|
+
lines.push(` fix: ${gate.remediation}`);
|
|
281
|
+
}
|
|
282
|
+
lines.push("", result.ok ? "✓ verification passed" : "✗ verification failed");
|
|
283
|
+
return lines.join("\n");
|
|
284
|
+
}
|
|
285
|
+
/** Run verification and render either the human or machine interface. */
|
|
286
|
+
export async function runReleaseVerification(cwd, options = {}) {
|
|
287
|
+
const result = await collectReleaseVerification(cwd, options);
|
|
288
|
+
if (options.json)
|
|
289
|
+
console.log(JSON.stringify(result, null, 2));
|
|
290
|
+
else
|
|
291
|
+
console.log(renderReleaseVerification(result));
|
|
292
|
+
return result.ok;
|
|
293
|
+
}
|
|
294
|
+
if (import.meta.main) {
|
|
295
|
+
const mode = process.argv.includes("--release") ? "release" : "default";
|
|
296
|
+
const ok = await runReleaseVerification(process.cwd(), {
|
|
297
|
+
mode,
|
|
298
|
+
json: process.argv.includes("--json"),
|
|
299
|
+
});
|
|
300
|
+
if (!ok)
|
|
301
|
+
process.exitCode = 1;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=release-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-verification.js","sourceRoot":"","sources":["../src/release-verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,4 +7,12 @@
|
|
|
7
7
|
* marker in an unrelated comment further up never leaks onto a finding below it.
|
|
8
8
|
*/
|
|
9
9
|
export declare function commentBlockHasMarker(lines: readonly string[], line: number, marker: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* The justification a reason-carrying marker (`<marker>: <reason>`) supplies, or `undefined` when the
|
|
12
|
+
* marker is absent or written with no reason after its colon. Searches the same trailing-comment /
|
|
13
|
+
* comment-block-above region as {@link commentBlockHasMarker}, so a hatch that demands a written reason
|
|
14
|
+
* can require this to be non-empty before it silences anything - an empty `<marker>:` never suppresses,
|
|
15
|
+
* which is how "reason mandatory" is enforced without a second diagnostic.
|
|
16
|
+
*/
|
|
17
|
+
export declare function commentBlockMarkerReason(lines: readonly string[], line: number, marker: string): string | undefined;
|
|
10
18
|
//# sourceMappingURL=comment-markers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-markers.d.ts","sourceRoot":"","sources":["../../src/rules/comment-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAQT"}
|
|
1
|
+
{"version":3,"file":"comment-markers.d.ts","sourceRoot":"","sources":["../../src/rules/comment-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAQT;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,GAAG,SAAS,CAuBpB"}
|
|
@@ -21,4 +21,40 @@ export function commentBlockHasMarker(lines, line, marker) {
|
|
|
21
21
|
}
|
|
22
22
|
return false;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The justification a reason-carrying marker (`<marker>: <reason>`) supplies, or `undefined` when the
|
|
26
|
+
* marker is absent or written with no reason after its colon. Searches the same trailing-comment /
|
|
27
|
+
* comment-block-above region as {@link commentBlockHasMarker}, so a hatch that demands a written reason
|
|
28
|
+
* can require this to be non-empty before it silences anything - an empty `<marker>:` never suppresses,
|
|
29
|
+
* which is how "reason mandatory" is enforced without a second diagnostic.
|
|
30
|
+
*/
|
|
31
|
+
export function commentBlockMarkerReason(lines, line, marker) {
|
|
32
|
+
const reasonOn = (text) => {
|
|
33
|
+
const at = text.indexOf(marker);
|
|
34
|
+
if (at < 0)
|
|
35
|
+
return undefined;
|
|
36
|
+
const rest = text.slice(at + marker.length);
|
|
37
|
+
const colon = rest.indexOf(":");
|
|
38
|
+
if (colon < 0)
|
|
39
|
+
return undefined;
|
|
40
|
+
// A block comment's `*/` closer is not part of the reason.
|
|
41
|
+
const reason = rest
|
|
42
|
+
.slice(colon + 1)
|
|
43
|
+
.replace(/\*\/\s*$/, "")
|
|
44
|
+
.trim();
|
|
45
|
+
return reason.length > 0 ? reason : undefined;
|
|
46
|
+
};
|
|
47
|
+
const onLine = reasonOn(lines[line - 1] ?? "");
|
|
48
|
+
if (onLine !== undefined)
|
|
49
|
+
return onLine;
|
|
50
|
+
for (let i = line - 2; i >= 0; i--) {
|
|
51
|
+
const text = lines[i] ?? "";
|
|
52
|
+
if (!COMMENT_LINE.test(text))
|
|
53
|
+
return undefined;
|
|
54
|
+
const reason = reasonOn(text);
|
|
55
|
+
if (reason !== undefined)
|
|
56
|
+
return reason;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
24
60
|
//# sourceMappingURL=comment-markers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-markers.js","sourceRoot":"","sources":["../../src/rules/comment-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wFAAwF;AACxF,mDAAmD;AACnD,MAAM,YAAY,GAAG,kCAAkC,CAAA;AAEvD,MAAM,UAAU,qBAAqB,CACnC,KAAwB,EACxB,IAAY,EACZ,MAAc;IAEd,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IACzD,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"comment-markers.js","sourceRoot":"","sources":["../../src/rules/comment-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,wFAAwF;AACxF,mDAAmD;AACnD,MAAM,YAAY,GAAG,kCAAkC,CAAA;AAEvD,MAAM,UAAU,qBAAqB,CACnC,KAAwB,EACxB,IAAY,EACZ,MAAc;IAEd,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IACzD,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAA;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;IACxC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAwB,EACxB,IAAY,EACZ,MAAc;IAEd,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAsB,EAAE;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAC/B,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI;aAChB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aAChB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,IAAI,EAAE,CAAA;QACT,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/C,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC9C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAA;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAA;IACzC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
package/dist/rules/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Diagnostic } from "../diagnostics.js";
|
|
2
|
+
import type { ProjectFacts } from "../project-facts.js";
|
|
3
|
+
export type { ProjectFacts } from "../project-facts.js";
|
|
2
4
|
export interface SourceFile {
|
|
3
5
|
readonly file: string;
|
|
4
6
|
readonly content: string;
|
|
@@ -7,9 +9,6 @@ export interface SourceIndex {
|
|
|
7
9
|
readonly files: readonly string[];
|
|
8
10
|
read(file: string): string | undefined;
|
|
9
11
|
}
|
|
10
|
-
export interface ProjectFacts {
|
|
11
|
-
readonly [key: string]: unknown;
|
|
12
|
-
}
|
|
13
12
|
export interface RuleContext {
|
|
14
13
|
readonly root: string;
|
|
15
14
|
readonly sources: SourceIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAA;CACvD;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CACrC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,GAAG,SAAS,QAAQ,EAAE,CA6B7F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,QAAQ,EAAE,CAoFlE;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,SAAS,SAAS,EAAE,EAC9B,KAAK,GAAE,SAAS,QAAQ,EAAO,GAC9B,OAAO,CAAC,UAAU,EAAE,CAAC,CAWvB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,CAMrE"}
|
package/dist/rules/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAA;AA6ExD,eAAO,MAAM,mBAAmB,EAAE,SAiCjC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAgChC,CAAA;AAED,eAAO,MAAM,UAAU,sBAA2D,CAAA"}
|
package/dist/rules/routes.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { diagnostic } from "../diagnostics.js";
|
|
2
2
|
import { commentBlockHasMarker } from "./comment-markers.js";
|
|
3
3
|
/**
|
|
4
|
-
* Route-table lints over the statically collected route registrations (`
|
|
5
|
-
*
|
|
4
|
+
* Route-table lints over the statically collected route registrations (`ProjectFacts.routes` is built
|
|
5
|
+
* once before the registry runs - no rule re-walks source).
|
|
6
6
|
*
|
|
7
7
|
* NF-C018 exists because the typed client's proxy intercepts a fixed set of property names before
|
|
8
8
|
* path resolution (`resolveSegment` + the thenable guard in @nifrajs/client): the seven HTTP verbs
|
|
@@ -29,20 +29,18 @@ const RESERVED_READOUT = "get/post/put/patch/delete/head/options (any casing), s
|
|
|
29
29
|
const RESERVED_SEGMENT_PRAGMA = "nifra-expect reserved-segment";
|
|
30
30
|
/** Parse-don't-cast over the project fact: a malformed entry is dropped, never trusted. */
|
|
31
31
|
function routeFacts(ctx) {
|
|
32
|
-
const raw = ctx.project.
|
|
33
|
-
if (!Array.isArray(raw))
|
|
34
|
-
return [];
|
|
32
|
+
const raw = ctx.project.routes;
|
|
35
33
|
const out = [];
|
|
36
34
|
for (const item of raw) {
|
|
37
|
-
if (typeof item !== "object" || item === null)
|
|
35
|
+
if (typeof item !== "object" || item === null || Array.isArray(item))
|
|
38
36
|
continue;
|
|
39
|
-
const record = item;
|
|
40
|
-
if (typeof record.file
|
|
41
|
-
typeof record.line
|
|
42
|
-
typeof record.method
|
|
43
|
-
typeof record.path
|
|
44
|
-
|
|
45
|
-
}
|
|
37
|
+
const record = Object.fromEntries(Object.entries(item));
|
|
38
|
+
if (typeof record.file !== "string" ||
|
|
39
|
+
typeof record.line !== "number" ||
|
|
40
|
+
typeof record.method !== "string" ||
|
|
41
|
+
typeof record.path !== "string")
|
|
42
|
+
continue;
|
|
43
|
+
out.push({ file: record.file, line: record.line, method: record.method, path: record.path });
|
|
46
44
|
}
|
|
47
45
|
return out;
|
|
48
46
|
}
|
|
@@ -80,7 +78,7 @@ export const reservedSegmentRule = {
|
|
|
80
78
|
continue;
|
|
81
79
|
let lines = linesByFile.get(route.file);
|
|
82
80
|
if (lines === undefined) {
|
|
83
|
-
lines = (ctx.
|
|
81
|
+
lines = (ctx.project.source.read(route.file) ?? "").split("\n");
|
|
84
82
|
linesByFile.set(route.file, lines);
|
|
85
83
|
}
|
|
86
84
|
if (commentBlockHasMarker(lines, route.line, RESERVED_SEGMENT_PRAGMA))
|
package/dist/rules/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAG5D;;;;;;;;;;;;GAYG;AACH,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC1D,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;CACV,CAAC,CAAA;AACF,6FAA6F;AAC7F,MAAM,uBAAuB,GAAwB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAClG,MAAM,gBAAgB,GACpB,iFAAiF,CAAA;AAEnF,yFAAyF;AACzF,MAAM,uBAAuB,GAAG,+BAA+B,CAAA;AAS/D,2FAA2F;AAC3F,SAAS,UAAU,CAAC,GAAgB;IAClC,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/rules/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/security.js
CHANGED
|
@@ -102,8 +102,8 @@ export const secretComparisonRule = {
|
|
|
102
102
|
if (ts === undefined)
|
|
103
103
|
return didNotRun("NF-S002", "Non-constant-time secret comparison scan");
|
|
104
104
|
const findings = [];
|
|
105
|
-
for (const file of ctx.
|
|
106
|
-
const parsed = parsedFile(ts, ctx.
|
|
105
|
+
for (const file of ctx.project.source.files) {
|
|
106
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
107
107
|
if (parsed === undefined)
|
|
108
108
|
continue;
|
|
109
109
|
const { tree, lines } = parsed;
|
|
@@ -158,8 +158,8 @@ export const piiLogRule = {
|
|
|
158
158
|
if (ts === undefined)
|
|
159
159
|
return didNotRun("NF-S003", "Sensitive-value-in-log scan");
|
|
160
160
|
const findings = [];
|
|
161
|
-
for (const file of ctx.
|
|
162
|
-
const parsed = parsedFile(ts, ctx.
|
|
161
|
+
for (const file of ctx.project.source.files) {
|
|
162
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
163
163
|
if (parsed === undefined)
|
|
164
164
|
continue;
|
|
165
165
|
const { tree, lines } = parsed;
|
|
@@ -205,8 +205,8 @@ export const failOpenGateRule = {
|
|
|
205
205
|
if (ts === undefined)
|
|
206
206
|
return didNotRun("NF-S001", "Fail-open gate scan");
|
|
207
207
|
const findings = [];
|
|
208
|
-
for (const file of ctx.
|
|
209
|
-
const parsed = parsedFile(ts, ctx.
|
|
208
|
+
for (const file of ctx.project.source.files) {
|
|
209
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
210
210
|
if (parsed === undefined)
|
|
211
211
|
continue;
|
|
212
212
|
const { tree, lines } = parsed;
|
|
@@ -271,8 +271,8 @@ export const corsOriginPredicateRule = {
|
|
|
271
271
|
if (ts === undefined)
|
|
272
272
|
return didNotRun("NF-S004", "CORS origin predicate scan");
|
|
273
273
|
const findings = [];
|
|
274
|
-
for (const file of ctx.
|
|
275
|
-
const parsed = parsedFile(ts, ctx.
|
|
274
|
+
for (const file of ctx.project.source.files) {
|
|
275
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
276
276
|
if (parsed === undefined)
|
|
277
277
|
continue;
|
|
278
278
|
const { tree, lines } = parsed;
|
|
@@ -328,8 +328,8 @@ export const externalRedirectRule = {
|
|
|
328
328
|
if (ts === undefined)
|
|
329
329
|
return didNotRun("NF-S005", "External redirect opt-out scan");
|
|
330
330
|
const findings = [];
|
|
331
|
-
for (const file of ctx.
|
|
332
|
-
const parsed = parsedFile(ts, ctx.
|
|
331
|
+
for (const file of ctx.project.source.files) {
|
|
332
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
333
333
|
if (parsed === undefined)
|
|
334
334
|
continue;
|
|
335
335
|
const { tree, lines } = parsed;
|
|
@@ -379,8 +379,8 @@ export const assuranceEscapeHatchRule = {
|
|
|
379
379
|
if (ts === undefined)
|
|
380
380
|
return didNotRun("NF-S006", "Security escape hatch scan");
|
|
381
381
|
const findings = [];
|
|
382
|
-
for (const file of ctx.
|
|
383
|
-
const parsed = parsedFile(ts, ctx.
|
|
382
|
+
for (const file of ctx.project.source.files) {
|
|
383
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
384
384
|
if (parsed === undefined)
|
|
385
385
|
continue;
|
|
386
386
|
const { tree, lines } = parsed;
|
|
@@ -420,8 +420,8 @@ export const unprefixedSecureCookieRule = {
|
|
|
420
420
|
if (ts === undefined)
|
|
421
421
|
return didNotRun("NF-S007", "Secure cookie prefix scan");
|
|
422
422
|
const findings = [];
|
|
423
|
-
for (const file of ctx.
|
|
424
|
-
const parsed = parsedFile(ts, ctx.
|
|
423
|
+
for (const file of ctx.project.source.files) {
|
|
424
|
+
const parsed = parsedFile(ts, ctx.project.source, file);
|
|
425
425
|
if (parsed === undefined)
|
|
426
426
|
continue;
|
|
427
427
|
const { tree } = parsed;
|