@nifrajs/cli 3.5.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -3
- package/dist/app-files.d.ts +11 -0
- package/dist/app-files.d.ts.map +1 -0
- package/dist/app-files.js +34 -0
- package/dist/app-files.js.map +1 -0
- package/dist/assure-hydration.d.ts +7 -1
- package/dist/assure-hydration.d.ts.map +1 -1
- package/dist/assure-hydration.js +128 -43
- package/dist/assure-hydration.js.map +1 -1
- package/dist/assure.d.ts.map +1 -1
- package/dist/assure.js +16 -2
- package/dist/assure.js.map +1 -1
- package/dist/capabilities-tool.d.ts +5 -1
- package/dist/capabilities-tool.d.ts.map +1 -1
- package/dist/capabilities-tool.js +32 -10
- package/dist/capabilities-tool.js.map +1 -1
- package/dist/cdn-check.d.ts +41 -0
- package/dist/cdn-check.d.ts.map +1 -0
- package/dist/cdn-check.js +207 -0
- package/dist/cdn-check.js.map +1 -0
- package/dist/check-diagnostics.d.ts +4 -0
- package/dist/check-diagnostics.d.ts.map +1 -1
- package/dist/check-diagnostics.js +13 -0
- package/dist/check-diagnostics.js.map +1 -1
- package/dist/check-scan.d.ts +49 -7
- package/dist/check-scan.d.ts.map +1 -1
- package/dist/check-scan.js +291 -62
- package/dist/check-scan.js.map +1 -1
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +99 -63
- package/dist/check.js.map +1 -1
- package/dist/cli.d.ts +42 -16
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +262 -82
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.d.ts +62 -5
- package/dist/command-catalog.d.ts.map +1 -1
- package/dist/command-catalog.js +275 -35
- package/dist/command-catalog.js.map +1 -1
- package/dist/config-target.d.ts +8 -0
- package/dist/config-target.d.ts.map +1 -0
- package/dist/config-target.js +45 -0
- package/dist/config-target.js.map +1 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js +52 -13
- package/dist/contracts.js.map +1 -1
- package/dist/db-audit.d.ts +37 -0
- package/dist/db-audit.d.ts.map +1 -0
- package/dist/db-audit.js +99 -0
- package/dist/db-audit.js.map +1 -0
- package/dist/db-child.d.ts +64 -0
- package/dist/db-child.d.ts.map +1 -0
- package/dist/db-child.js +213 -0
- package/dist/db-child.js.map +1 -0
- package/dist/db-config.d.ts +60 -0
- package/dist/db-config.d.ts.map +1 -0
- package/dist/db-config.js +176 -0
- package/dist/db-config.js.map +1 -0
- package/dist/db-tool.d.ts +84 -0
- package/dist/db-tool.d.ts.map +1 -0
- package/dist/db-tool.js +537 -0
- package/dist/db-tool.js.map +1 -0
- package/dist/dev-bun-config.d.ts +20 -13
- package/dist/dev-bun-config.d.ts.map +1 -1
- package/dist/dev-bun-config.js +98 -41
- package/dist/dev-bun-config.js.map +1 -1
- package/dist/dev-feed-tool.d.ts +106 -0
- package/dist/dev-feed-tool.d.ts.map +1 -0
- package/dist/dev-feed-tool.js +713 -0
- package/dist/dev-feed-tool.js.map +1 -0
- package/dist/dev-server-client.d.ts +67 -0
- package/dist/dev-server-client.d.ts.map +1 -0
- package/dist/dev-server-client.js +195 -0
- package/dist/dev-server-client.js.map +1 -0
- package/dist/diff-tool.d.ts +3 -3
- package/dist/diff-tool.d.ts.map +1 -1
- package/dist/diff-tool.js +6 -5
- package/dist/diff-tool.js.map +1 -1
- package/dist/docs-search.d.ts.map +1 -1
- package/dist/docs-search.js +12 -4
- package/dist/docs-search.js.map +1 -1
- package/dist/doctor.d.ts +17 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +76 -15
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +15 -0
- package/dist/env-file.d.ts.map +1 -1
- package/dist/env-file.js +73 -1
- package/dist/env-file.js.map +1 -1
- package/dist/fix-recipes.d.ts.map +1 -1
- package/dist/fix-recipes.js +48 -22
- package/dist/fix-recipes.js.map +1 -1
- package/dist/frontend-guidance.js +5 -5
- package/dist/frontend-guidance.js.map +1 -1
- package/dist/i18n-check.d.ts +16 -0
- package/dist/i18n-check.d.ts.map +1 -0
- package/dist/i18n-check.js +154 -0
- package/dist/i18n-check.js.map +1 -0
- package/dist/init-agents.d.ts +49 -13
- package/dist/init-agents.d.ts.map +1 -1
- package/dist/init-agents.js +239 -34
- package/dist/init-agents.js.map +1 -1
- package/dist/internal/code-unit-order.d.ts +4 -0
- package/dist/internal/code-unit-order.d.ts.map +1 -0
- package/dist/internal/code-unit-order.js +6 -0
- package/dist/internal/code-unit-order.js.map +1 -0
- package/dist/internal/script-kind.d.ts +7 -0
- package/dist/internal/script-kind.d.ts.map +1 -0
- package/dist/internal/script-kind.js +12 -0
- package/dist/internal/script-kind.js.map +1 -0
- package/dist/internal/source-facts.d.ts +5 -0
- package/dist/internal/source-facts.d.ts.map +1 -1
- package/dist/internal/source-facts.js +61 -5
- package/dist/internal/source-facts.js.map +1 -1
- package/dist/internal/typescript-import.d.ts +49 -24
- package/dist/internal/typescript-import.d.ts.map +1 -1
- package/dist/internal/typescript-import.js +507 -67
- package/dist/internal/typescript-import.js.map +1 -1
- package/dist/introspect.d.ts +5 -1
- package/dist/introspect.d.ts.map +1 -1
- package/dist/introspect.js +92 -27
- package/dist/introspect.js.map +1 -1
- package/dist/learn.js +3 -3
- package/dist/learn.js.map +1 -1
- package/dist/levels-tool.d.ts +10 -0
- package/dist/levels-tool.d.ts.map +1 -1
- package/dist/levels-tool.js +33 -3
- package/dist/levels-tool.js.map +1 -1
- package/dist/load.d.ts +67 -17
- package/dist/load.d.ts.map +1 -1
- package/dist/load.js +78 -18
- package/dist/load.js.map +1 -1
- package/dist/manifest-tool.d.ts.map +1 -1
- package/dist/manifest-tool.js +3 -2
- package/dist/manifest-tool.js.map +1 -1
- package/dist/mcp-app-tool.d.ts.map +1 -1
- package/dist/mcp-app-tool.js +2 -0
- package/dist/mcp-app-tool.js.map +1 -1
- package/dist/mcp-context.js +1 -1
- package/dist/mcp-context.js.map +1 -1
- package/dist/mcp-delegate.d.ts +57 -0
- package/dist/mcp-delegate.d.ts.map +1 -0
- package/dist/mcp-delegate.js +130 -0
- package/dist/mcp-delegate.js.map +1 -0
- package/dist/mcp-docs-tools.d.ts.map +1 -1
- package/dist/mcp-docs-tools.js +23 -5
- package/dist/mcp-docs-tools.js.map +1 -1
- package/dist/mcp-exec.d.ts +2 -0
- package/dist/mcp-exec.d.ts.map +1 -1
- package/dist/mcp-exec.js +132 -108
- package/dist/mcp-exec.js.map +1 -1
- package/dist/mcp-http.d.ts.map +1 -1
- package/dist/mcp-http.js +17 -5
- package/dist/mcp-http.js.map +1 -1
- package/dist/mcp-io.d.ts +14 -0
- package/dist/mcp-io.d.ts.map +1 -1
- package/dist/mcp-io.js +45 -0
- package/dist/mcp-io.js.map +1 -1
- package/dist/mcp-isolate.d.ts +48 -0
- package/dist/mcp-isolate.d.ts.map +1 -0
- package/dist/mcp-isolate.js +222 -0
- package/dist/mcp-isolate.js.map +1 -0
- package/dist/mcp-project-child.d.ts +74 -0
- package/dist/mcp-project-child.d.ts.map +1 -0
- package/dist/mcp-project-child.js +130 -0
- package/dist/mcp-project-child.js.map +1 -0
- package/dist/mcp-render.js +2 -2
- package/dist/mcp-render.js.map +1 -1
- package/dist/mcp-root.d.ts +37 -9
- package/dist/mcp-root.d.ts.map +1 -1
- package/dist/mcp-root.js +110 -23
- package/dist/mcp-root.js.map +1 -1
- package/dist/mcp-run.d.ts +18 -1
- package/dist/mcp-run.d.ts.map +1 -1
- package/dist/mcp-run.js +82 -9
- package/dist/mcp-run.js.map +1 -1
- package/dist/mcp-ws.js +4 -1
- package/dist/mcp-ws.js.map +1 -1
- package/dist/mcp.d.ts +16 -3
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +81 -53
- package/dist/mcp.js.map +1 -1
- package/dist/migrate-layout.d.ts +44 -0
- package/dist/migrate-layout.d.ts.map +1 -0
- package/dist/migrate-layout.js +1155 -0
- package/dist/migrate-layout.js.map +1 -0
- package/dist/openapi-tool.d.ts +2 -2
- package/dist/openapi-tool.d.ts.map +1 -1
- package/dist/openapi-tool.js.map +1 -1
- package/dist/openapi-types.d.ts +2 -1
- package/dist/openapi-types.d.ts.map +1 -1
- package/dist/openapi-types.js +240 -12
- package/dist/openapi-types.js.map +1 -1
- package/dist/pipeline-report.d.ts +3 -2
- package/dist/pipeline-report.d.ts.map +1 -1
- package/dist/pipeline-report.js +19 -16
- package/dist/pipeline-report.js.map +1 -1
- package/dist/port.d.ts +5 -4
- package/dist/port.d.ts.map +1 -1
- package/dist/port.js +46 -29
- package/dist/port.js.map +1 -1
- package/dist/project-facts.d.ts +5 -0
- package/dist/project-facts.d.ts.map +1 -1
- package/dist/project-facts.js.map +1 -1
- package/dist/recipes/4.0.0.d.ts +9 -0
- package/dist/recipes/4.0.0.d.ts.map +1 -0
- package/dist/recipes/4.0.0.js +36 -0
- package/dist/recipes/4.0.0.js.map +1 -0
- package/dist/recipes/index.d.ts.map +1 -1
- package/dist/recipes/index.js +2 -0
- package/dist/recipes/index.js.map +1 -1
- package/dist/release-verification.d.ts +11 -1
- package/dist/release-verification.d.ts.map +1 -1
- package/dist/release-verification.js +47 -4
- package/dist/release-verification.js.map +1 -1
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +12 -8
- package/dist/review.js.map +1 -1
- package/dist/route-types.d.ts +28 -0
- package/dist/route-types.d.ts.map +1 -0
- package/dist/route-types.js +106 -0
- package/dist/route-types.js.map +1 -0
- package/dist/rules/codes.d.ts +9 -0
- package/dist/rules/codes.d.ts.map +1 -1
- package/dist/rules/codes.js +9 -0
- package/dist/rules/codes.js.map +1 -1
- package/dist/rules/data-guard.d.ts +12 -0
- package/dist/rules/data-guard.d.ts.map +1 -0
- package/dist/rules/data-guard.js +213 -0
- package/dist/rules/data-guard.js.map +1 -0
- package/dist/rules/index.d.ts +3 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +17 -5
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/islands.d.ts.map +1 -1
- package/dist/rules/islands.js +7 -4
- package/dist/rules/islands.js.map +1 -1
- package/dist/rules/legacy.d.ts.map +1 -1
- package/dist/rules/legacy.js +71 -38
- package/dist/rules/legacy.js.map +1 -1
- package/dist/rules/nano.d.ts.map +1 -1
- package/dist/rules/nano.js +15 -6
- package/dist/rules/nano.js.map +1 -1
- package/dist/rules/pages.d.ts +15 -0
- package/dist/rules/pages.d.ts.map +1 -0
- package/dist/rules/pages.js +88 -0
- package/dist/rules/pages.js.map +1 -0
- package/dist/rules/routes.d.ts +11 -0
- package/dist/rules/routes.d.ts.map +1 -1
- package/dist/rules/routes.js +180 -2
- package/dist/rules/routes.js.map +1 -1
- package/dist/rules/secrets.d.ts +10 -0
- package/dist/rules/secrets.d.ts.map +1 -0
- package/dist/rules/secrets.js +169 -0
- package/dist/rules/secrets.js.map +1 -0
- package/dist/rules/security.d.ts +7 -0
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +171 -65
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/typescript.d.ts +16 -0
- package/dist/rules/typescript.d.ts.map +1 -0
- package/dist/rules/typescript.js +59 -0
- package/dist/rules/typescript.js.map +1 -0
- package/dist/rules/zones.d.ts +17 -0
- package/dist/rules/zones.d.ts.map +1 -0
- package/dist/rules/zones.js +174 -0
- package/dist/rules/zones.js.map +1 -0
- package/dist/scaffold.d.ts +25 -12
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +132 -87
- package/dist/scaffold.js.map +1 -1
- package/dist/sdk.d.ts +17 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +941 -153
- package/dist/sdk.js.map +1 -1
- package/dist/search-terms.d.ts +2 -0
- package/dist/search-terms.d.ts.map +1 -1
- package/dist/search-terms.js +23 -8
- package/dist/search-terms.js.map +1 -1
- package/dist/smoke.d.ts +79 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +494 -0
- package/dist/smoke.js.map +1 -0
- package/dist/sync-manifest.d.ts +10 -2
- package/dist/sync-manifest.d.ts.map +1 -1
- package/dist/sync-manifest.js +44 -19
- package/dist/sync-manifest.js.map +1 -1
- package/dist/sync-routes.d.ts +4 -3
- package/dist/sync-routes.d.ts.map +1 -1
- package/dist/sync-routes.js +4 -3
- package/dist/sync-routes.js.map +1 -1
- package/dist/test-tool.d.ts.map +1 -1
- package/dist/test-tool.js +30 -11
- package/dist/test-tool.js.map +1 -1
- package/dist/types-search.d.ts.map +1 -1
- package/dist/types-search.js +11 -5
- package/dist/types-search.js.map +1 -1
- package/dist/upgrade.d.ts +36 -6
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +167 -29
- package/dist/upgrade.js.map +1 -1
- package/dist/verification-plan.d.ts.map +1 -1
- package/dist/verification-plan.js +4 -0
- package/dist/verification-plan.js.map +1 -1
- package/dist/verification.d.ts.map +1 -1
- package/dist/verification.js +45 -12
- package/dist/verification.js.map +1 -1
- package/dist/web-app-options.d.ts +19 -0
- package/dist/web-app-options.d.ts.map +1 -0
- package/dist/web-app-options.js +49 -0
- package/dist/web-app-options.js.map +1 -0
- package/dist/work-graph.d.ts.map +1 -1
- package/dist/work-graph.js +29 -13
- package/dist/work-graph.js.map +1 -1
- package/docs/examples.json +185 -29
- package/docs/llms-full.txt +3807 -580
- package/docs/types.json +14229 -10939
- package/package.json +19 -12
- package/src/app-files.ts +40 -0
- package/src/assure-hydration.ts +139 -46
- package/src/assure.ts +17 -2
- package/src/capabilities-tool.ts +35 -9
- package/src/cdn-check.ts +268 -0
- package/src/check-diagnostics.ts +17 -0
- package/src/check-scan.ts +358 -63
- package/src/check.ts +97 -62
- package/src/cli.ts +296 -87
- package/src/command-catalog.ts +389 -48
- package/src/config-target.ts +47 -0
- package/src/contracts.ts +54 -12
- package/src/db-audit.ts +128 -0
- package/src/db-child.ts +285 -0
- package/src/db-config.ts +224 -0
- package/src/db-tool.ts +690 -0
- package/src/dev-bun-config.ts +116 -40
- package/src/dev-feed-tool.ts +912 -0
- package/src/dev-server-client.ts +267 -0
- package/src/diff-tool.ts +6 -5
- package/src/docs-search.ts +10 -3
- package/src/doctor.ts +98 -15
- package/src/env-file.ts +78 -1
- package/src/fix-recipes.ts +53 -32
- package/src/frontend-guidance.ts +5 -5
- package/src/i18n-check.ts +179 -0
- package/src/init-agents.ts +301 -38
- package/src/internal/code-unit-order.ts +5 -0
- package/src/internal/script-kind.ts +11 -0
- package/src/internal/source-facts.ts +96 -22
- package/src/internal/typescript-import.ts +663 -68
- package/src/introspect.ts +90 -27
- package/src/learn.ts +3 -3
- package/src/levels-tool.ts +47 -2
- package/src/load.ts +140 -33
- package/src/manifest-tool.ts +3 -2
- package/src/mcp-app-tool.ts +2 -0
- package/src/mcp-context.ts +1 -1
- package/src/mcp-delegate.ts +162 -0
- package/src/mcp-docs-tools.ts +23 -5
- package/src/mcp-exec.ts +160 -132
- package/src/mcp-http.ts +19 -5
- package/src/mcp-io.ts +57 -0
- package/src/mcp-isolate.ts +287 -0
- package/src/mcp-project-child.ts +182 -0
- package/src/mcp-render.ts +2 -2
- package/src/mcp-root.ts +117 -22
- package/src/mcp-run.ts +104 -10
- package/src/mcp-ws.ts +4 -1
- package/src/mcp.ts +106 -64
- package/src/migrate-layout.ts +1338 -0
- package/src/openapi-tool.ts +7 -3
- package/src/openapi-types.ts +315 -13
- package/src/pipeline-report.ts +22 -18
- package/src/port.ts +53 -30
- package/src/project-facts.ts +5 -0
- package/src/recipes/4.0.0.ts +37 -0
- package/src/recipes/index.ts +2 -0
- package/src/release-verification.ts +74 -5
- package/src/review.ts +13 -8
- package/src/route-types.ts +133 -0
- package/src/rules/codes.ts +9 -0
- package/src/rules/data-guard.ts +230 -0
- package/src/rules/index.ts +18 -5
- package/src/rules/islands.ts +12 -4
- package/src/rules/legacy.ts +71 -39
- package/src/rules/nano.ts +18 -6
- package/src/rules/pages.ts +99 -0
- package/src/rules/routes.ts +181 -2
- package/src/rules/secrets.ts +174 -0
- package/src/rules/security.ts +198 -70
- package/src/rules/typescript.ts +77 -0
- package/src/rules/zones.ts +195 -0
- package/src/scaffold.ts +147 -95
- package/src/sdk.ts +1215 -158
- package/src/search-terms.ts +24 -7
- package/src/smoke.ts +607 -0
- package/src/sync-manifest.ts +50 -19
- package/src/sync-routes.ts +4 -3
- package/src/test-tool.ts +32 -11
- package/src/types-search.ts +11 -4
- package/src/upgrade.ts +205 -25
- package/src/verification-plan.ts +13 -0
- package/src/verification.ts +50 -12
- package/src/web-app-options.ts +57 -0
- package/src/work-graph.ts +27 -13
package/dist/smoke.js
ADDED
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { realpath, stat } from "node:fs/promises";
|
|
10
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
const safeId = (value, fallback) => /^[A-Za-z0-9._-]{1,80}$/.test(value) ? value : fallback;
|
|
13
|
+
const MAX_SMOKE_PATH_LENGTH = 4_096;
|
|
14
|
+
const MAX_SMOKE_MARKER_LENGTH = 4_096;
|
|
15
|
+
const MAX_SMOKE_BODY_LENGTH = 1_048_576;
|
|
16
|
+
const MAX_SMOKE_RESPONSE_BODY_LENGTH = 1_048_576;
|
|
17
|
+
const MAX_SMOKE_HEADER_NAME_LENGTH = 256;
|
|
18
|
+
const MAX_SMOKE_HEADER_VALUE_LENGTH = 8_192;
|
|
19
|
+
const HTTP_TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
20
|
+
const SCHEME_PREFIX = /^[A-Za-z][A-Za-z0-9+.-]*:/;
|
|
21
|
+
function hasControlCharacter(value, includeBackslash = false) {
|
|
22
|
+
for (let index = 0; index < value.length; index++) {
|
|
23
|
+
const code = value.charCodeAt(index);
|
|
24
|
+
if (code <= 0x1f || code === 0x7f || (includeBackslash && code === 0x5c))
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function isRecord(value) {
|
|
30
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
function validStatus(value) {
|
|
33
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 100 && value <= 599;
|
|
34
|
+
}
|
|
35
|
+
function validRelativePath(value) {
|
|
36
|
+
return (typeof value === "string" &&
|
|
37
|
+
value.length > 0 &&
|
|
38
|
+
value.length <= MAX_SMOKE_PATH_LENGTH &&
|
|
39
|
+
value.startsWith("/") &&
|
|
40
|
+
!value.startsWith("//") &&
|
|
41
|
+
!SCHEME_PREFIX.test(value) &&
|
|
42
|
+
!hasControlCharacter(value, true));
|
|
43
|
+
}
|
|
44
|
+
function headerError(value, label) {
|
|
45
|
+
if (!isRecord(value))
|
|
46
|
+
return `${label} must be an object`;
|
|
47
|
+
for (const [name, headerValue] of Object.entries(value)) {
|
|
48
|
+
if (name.length === 0 || name.length > MAX_SMOKE_HEADER_NAME_LENGTH || !HTTP_TOKEN.test(name))
|
|
49
|
+
return `${label} contains an invalid header name`;
|
|
50
|
+
if (typeof headerValue !== "string" ||
|
|
51
|
+
headerValue.length > MAX_SMOKE_HEADER_VALUE_LENGTH ||
|
|
52
|
+
hasControlCharacter(headerValue))
|
|
53
|
+
return `${label} contains an invalid header value`;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
new Headers(value);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return `${label} contains an invalid header`;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
function requestCheckError(value, label) {
|
|
64
|
+
if (!isRecord(value))
|
|
65
|
+
return `${label} must be an object`;
|
|
66
|
+
if (typeof value.id !== "string" || !/^[A-Za-z0-9._-]{1,80}$/.test(value.id))
|
|
67
|
+
return `${label}.id must be a short safe identifier`;
|
|
68
|
+
if (!validRelativePath(value.path))
|
|
69
|
+
return `${label}.path must be a local absolute path`;
|
|
70
|
+
if (value.method !== undefined) {
|
|
71
|
+
if (typeof value.method !== "string" ||
|
|
72
|
+
value.method.length === 0 ||
|
|
73
|
+
value.method.length > 32 ||
|
|
74
|
+
!HTTP_TOKEN.test(value.method))
|
|
75
|
+
return `${label}.method is invalid`;
|
|
76
|
+
}
|
|
77
|
+
if (!validStatus(value.expectedStatus))
|
|
78
|
+
return `${label}.expectedStatus is invalid`;
|
|
79
|
+
if (value.headers !== undefined) {
|
|
80
|
+
const error = headerError(value.headers, `${label}.headers`);
|
|
81
|
+
if (error !== undefined)
|
|
82
|
+
return error;
|
|
83
|
+
}
|
|
84
|
+
if (value.expectedHeaders !== undefined) {
|
|
85
|
+
const error = headerError(value.expectedHeaders, `${label}.expectedHeaders`);
|
|
86
|
+
if (error !== undefined)
|
|
87
|
+
return error;
|
|
88
|
+
}
|
|
89
|
+
if (value.body !== undefined &&
|
|
90
|
+
(typeof value.body !== "string" || value.body.length > MAX_SMOKE_BODY_LENGTH))
|
|
91
|
+
return `${label}.body is invalid or too large`;
|
|
92
|
+
if (value.contentType !== undefined &&
|
|
93
|
+
value.contentType !== "json" &&
|
|
94
|
+
value.contentType !== "text")
|
|
95
|
+
return `${label}.contentType is invalid`;
|
|
96
|
+
const method = typeof value.method === "string" ? value.method.toUpperCase() : "GET";
|
|
97
|
+
if (value.body !== undefined && (method === "GET" || method === "HEAD"))
|
|
98
|
+
return `${label}.body cannot be used with ${method}`;
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
function smokeSsrError(value) {
|
|
102
|
+
if (!isRecord(value))
|
|
103
|
+
return "ssr check must be an object";
|
|
104
|
+
if (!validRelativePath(value.path))
|
|
105
|
+
return "ssr.path must be a local absolute path";
|
|
106
|
+
if (typeof value.marker !== "string" ||
|
|
107
|
+
value.marker.length === 0 ||
|
|
108
|
+
value.marker.length > MAX_SMOKE_MARKER_LENGTH)
|
|
109
|
+
return "ssr.marker must be non-empty and bounded";
|
|
110
|
+
if (value.expectedStatus !== undefined && !validStatus(value.expectedStatus))
|
|
111
|
+
return "ssr.expectedStatus is invalid";
|
|
112
|
+
if (value.expectedHeaders !== undefined)
|
|
113
|
+
return headerError(value.expectedHeaders, "ssr.expectedHeaders");
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
function fixtureError(fixture, inProcess) {
|
|
117
|
+
if (!isRecord(fixture))
|
|
118
|
+
return "fixture must export an object";
|
|
119
|
+
const app = fixture.app;
|
|
120
|
+
if ((typeof app !== "object" && typeof app !== "function") || app === null)
|
|
121
|
+
return "fixture.app must be an object with fetch(request)";
|
|
122
|
+
if (typeof app.fetch !== "function")
|
|
123
|
+
return "fixture.app.fetch must be a function";
|
|
124
|
+
if (!inProcess && typeof fixture.start !== "function")
|
|
125
|
+
return "fixture.start must be a function in production mode";
|
|
126
|
+
if (inProcess && fixture.start !== undefined && typeof fixture.start !== "function")
|
|
127
|
+
return "fixture.start must be a function when provided";
|
|
128
|
+
if (fixture.ssr === undefined)
|
|
129
|
+
return "SSR check is not configured";
|
|
130
|
+
const ssrError = smokeSsrError(fixture.ssr);
|
|
131
|
+
if (ssrError !== undefined)
|
|
132
|
+
return ssrError;
|
|
133
|
+
const mountedApi = fixture.mountedApi;
|
|
134
|
+
if (!Array.isArray(mountedApi) || mountedApi.length === 0)
|
|
135
|
+
return "at least one mounted API witness is required";
|
|
136
|
+
for (let index = 0; index < mountedApi.length; index++) {
|
|
137
|
+
const error = requestCheckError(mountedApi[index], `mountedApi[${index}]`);
|
|
138
|
+
if (error !== undefined)
|
|
139
|
+
return error;
|
|
140
|
+
}
|
|
141
|
+
const notFound = fixture.notFound ?? {
|
|
142
|
+
id: "not-found",
|
|
143
|
+
path: "/__nifra_smoke_missing__",
|
|
144
|
+
expectedStatus: 404,
|
|
145
|
+
};
|
|
146
|
+
const notFoundError = requestCheckError(notFound, "notFound");
|
|
147
|
+
if (notFoundError !== undefined)
|
|
148
|
+
return notFoundError;
|
|
149
|
+
if (!isRecord(notFound) || notFound.expectedStatus !== 404)
|
|
150
|
+
return "notFound.expectedStatus must be 404";
|
|
151
|
+
for (const [field, category] of [
|
|
152
|
+
["securityHeaders", "securityHeaders"],
|
|
153
|
+
["authCallbacks", "authCallbacks"],
|
|
154
|
+
]) {
|
|
155
|
+
const checks = fixture[field];
|
|
156
|
+
if (checks === undefined)
|
|
157
|
+
continue;
|
|
158
|
+
if (!Array.isArray(checks))
|
|
159
|
+
return `${category} must be an array`;
|
|
160
|
+
for (let index = 0; index < checks.length; index++) {
|
|
161
|
+
const error = requestCheckError(checks[index], `${category}[${index}]`);
|
|
162
|
+
if (error !== undefined)
|
|
163
|
+
return error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (fixture.contract !== undefined && typeof fixture.contract !== "function")
|
|
167
|
+
return "contract must be a function";
|
|
168
|
+
if (fixture.hydration !== undefined && typeof fixture.hydration !== "function")
|
|
169
|
+
return "hydration must be a function";
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
const responseContentType = (response) => response.headers.get("content-type")?.split(";", 1)[0] ?? "";
|
|
173
|
+
const expectedHeaderMatches = (response, expected) => Object.entries(expected ?? {}).every(([name, value]) => response.headers.get(name) === value);
|
|
174
|
+
function responseLike(value) {
|
|
175
|
+
if (value === null || typeof value !== "object")
|
|
176
|
+
return false;
|
|
177
|
+
const candidate = value;
|
|
178
|
+
return (typeof candidate.status === "number" &&
|
|
179
|
+
Number.isInteger(candidate.status) &&
|
|
180
|
+
candidate.status >= 100 &&
|
|
181
|
+
candidate.status <= 599 &&
|
|
182
|
+
typeof candidate.headers?.get === "function" &&
|
|
183
|
+
typeof candidate.text === "function" &&
|
|
184
|
+
(candidate.body === null || typeof candidate.body === "object"));
|
|
185
|
+
}
|
|
186
|
+
async function boundedResponseText(response) {
|
|
187
|
+
if (response.body === null)
|
|
188
|
+
return { text: "", tooLarge: false };
|
|
189
|
+
const reader = response.body.getReader();
|
|
190
|
+
const chunks = [];
|
|
191
|
+
let total = 0;
|
|
192
|
+
try {
|
|
193
|
+
for (;;) {
|
|
194
|
+
const next = await reader.read();
|
|
195
|
+
if (next.done)
|
|
196
|
+
break;
|
|
197
|
+
total += next.value.byteLength;
|
|
198
|
+
if (total > MAX_SMOKE_RESPONSE_BODY_LENGTH) {
|
|
199
|
+
try {
|
|
200
|
+
await reader.cancel();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// The response is already a failed witness; cancellation errors are not actionable here.
|
|
204
|
+
}
|
|
205
|
+
return { tooLarge: true };
|
|
206
|
+
}
|
|
207
|
+
chunks.push(next.value);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
reader.releaseLock();
|
|
212
|
+
}
|
|
213
|
+
const bytes = new Uint8Array(total);
|
|
214
|
+
let offset = 0;
|
|
215
|
+
for (const chunk of chunks) {
|
|
216
|
+
bytes.set(chunk, offset);
|
|
217
|
+
offset += chunk.byteLength;
|
|
218
|
+
}
|
|
219
|
+
return { text: new TextDecoder().decode(bytes), tooLarge: false };
|
|
220
|
+
}
|
|
221
|
+
function requestFor(origin, check) {
|
|
222
|
+
const method = check.method ?? "GET";
|
|
223
|
+
const headers = new Headers(check.headers);
|
|
224
|
+
return new Request(new URL(check.path, origin).href, {
|
|
225
|
+
method,
|
|
226
|
+
headers,
|
|
227
|
+
...(check.body === undefined ? {} : { body: check.body }),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
function validateRequestCheck(check, response) {
|
|
231
|
+
return (async () => {
|
|
232
|
+
if (!responseLike(response))
|
|
233
|
+
return { ok: false, message: "fetch returned an invalid response" };
|
|
234
|
+
if (response.status !== check.expectedStatus) {
|
|
235
|
+
return { ok: false, message: `status ${response.status}, expected ${check.expectedStatus}` };
|
|
236
|
+
}
|
|
237
|
+
if (!expectedHeaderMatches(response, check.expectedHeaders)) {
|
|
238
|
+
return { ok: false, message: "expected header missing or mismatched" };
|
|
239
|
+
}
|
|
240
|
+
if (check.contentType !== undefined) {
|
|
241
|
+
const expected = check.contentType === "json" ? "application/json" : "text/plain";
|
|
242
|
+
if (responseContentType(response) !== expected) {
|
|
243
|
+
return { ok: false, message: `content type ${responseContentType(response) || "missing"}` };
|
|
244
|
+
}
|
|
245
|
+
if (check.contentType === "json") {
|
|
246
|
+
const body = await boundedResponseText(response);
|
|
247
|
+
if (body.tooLarge)
|
|
248
|
+
return { ok: false, message: "response body is too large" };
|
|
249
|
+
try {
|
|
250
|
+
JSON.parse(body.text ?? "");
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return { ok: false, message: "response is not valid JSON" };
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return { ok: true };
|
|
258
|
+
})();
|
|
259
|
+
}
|
|
260
|
+
/** Run the safe, bounded production smoke checks declared by one application fixture. */
|
|
261
|
+
export async function runSmoke(fixture, options = {}) {
|
|
262
|
+
const checks = [];
|
|
263
|
+
const add = (category, id, status, message) => {
|
|
264
|
+
checks.push({
|
|
265
|
+
category,
|
|
266
|
+
id: safeId(id, `${category}-${checks.length + 1}`),
|
|
267
|
+
status,
|
|
268
|
+
...(message === undefined ? {} : { message }),
|
|
269
|
+
});
|
|
270
|
+
};
|
|
271
|
+
const inProcess = options.inProcess === true;
|
|
272
|
+
const invalidFixture = fixtureError(fixture, inProcess);
|
|
273
|
+
if (invalidFixture !== undefined) {
|
|
274
|
+
add("start", "fixture", "fail", invalidFixture);
|
|
275
|
+
return reportOf(checks, inProcess ? "in-process" : "production");
|
|
276
|
+
}
|
|
277
|
+
let server;
|
|
278
|
+
try {
|
|
279
|
+
if (inProcess) {
|
|
280
|
+
add("start", "in-process", "pass");
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
try {
|
|
284
|
+
server = await fixture.start(fixture.app);
|
|
285
|
+
if (server === null ||
|
|
286
|
+
typeof server.origin !== "string" ||
|
|
287
|
+
server.origin.trim() === "" ||
|
|
288
|
+
typeof server.stop !== "function" ||
|
|
289
|
+
(server.fetch !== undefined && typeof server.fetch !== "function")) {
|
|
290
|
+
add("start", "production-start", "fail", "start function returned an invalid server");
|
|
291
|
+
return reportOf(checks, "production");
|
|
292
|
+
}
|
|
293
|
+
const originUrl = new URL(server.origin);
|
|
294
|
+
if ((originUrl.protocol !== "http:" && originUrl.protocol !== "https:") ||
|
|
295
|
+
originUrl.username !== "" ||
|
|
296
|
+
originUrl.password !== "" ||
|
|
297
|
+
originUrl.pathname !== "/" ||
|
|
298
|
+
originUrl.search !== "" ||
|
|
299
|
+
originUrl.hash !== "") {
|
|
300
|
+
add("start", "production-start", "fail", "production server origin is invalid");
|
|
301
|
+
return reportOf(checks, "production");
|
|
302
|
+
}
|
|
303
|
+
add("start", "production-start", "pass");
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
add("start", "production-start", "fail", "production server failed to start");
|
|
307
|
+
return reportOf(checks, "production");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const origin = server?.origin ?? "http://nifra-smoke.invalid";
|
|
311
|
+
const fetchRequest = async (check) => {
|
|
312
|
+
const request = requestFor(origin, check);
|
|
313
|
+
return server?.fetch !== undefined
|
|
314
|
+
? await server.fetch(request)
|
|
315
|
+
: inProcess
|
|
316
|
+
? await fixture.app.fetch(request)
|
|
317
|
+
: await globalThis.fetch(request);
|
|
318
|
+
};
|
|
319
|
+
const hookContext = { app: fixture.app, origin, request: fetchRequest };
|
|
320
|
+
if (fixture.ssr === undefined) {
|
|
321
|
+
add("ssr", "ssr", "fail", "SSR check is not configured");
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
try {
|
|
325
|
+
const response = await fetchRequest({
|
|
326
|
+
id: "ssr",
|
|
327
|
+
path: fixture.ssr.path,
|
|
328
|
+
expectedStatus: fixture.ssr.expectedStatus ?? 200,
|
|
329
|
+
...(fixture.ssr.expectedHeaders === undefined
|
|
330
|
+
? {}
|
|
331
|
+
: { expectedHeaders: fixture.ssr.expectedHeaders }),
|
|
332
|
+
});
|
|
333
|
+
if (!responseLike(response)) {
|
|
334
|
+
add("ssr", "ssr", "fail", "fetch returned an invalid response");
|
|
335
|
+
}
|
|
336
|
+
else if (response.status !== (fixture.ssr.expectedStatus ?? 200)) {
|
|
337
|
+
add("ssr", "ssr", "fail", `status ${response.status}`);
|
|
338
|
+
}
|
|
339
|
+
else if (responseContentType(response) !== "text/html") {
|
|
340
|
+
add("ssr", "ssr", "fail", "response is not HTML");
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
const body = await boundedResponseText(response);
|
|
344
|
+
if (body.tooLarge)
|
|
345
|
+
add("ssr", "ssr", "fail", "response body is too large");
|
|
346
|
+
else if (!(body.text ?? "").includes(fixture.ssr.marker))
|
|
347
|
+
add("ssr", "ssr", "fail", "SSR marker is missing");
|
|
348
|
+
else if (!expectedHeaderMatches(response, fixture.ssr.expectedHeaders))
|
|
349
|
+
add("ssr", "ssr", "fail", "expected header missing or mismatched");
|
|
350
|
+
else
|
|
351
|
+
add("ssr", "ssr", "pass");
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
add("ssr", "ssr", "fail", "SSR request failed");
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const mountedApi = fixture.mountedApi;
|
|
359
|
+
if (mountedApi === undefined || mountedApi.length === 0) {
|
|
360
|
+
add("api", "mounted-api", "fail", "at least one mounted API witness is required");
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
for (const check of mountedApi) {
|
|
364
|
+
try {
|
|
365
|
+
const result = await validateRequestCheck(check, await fetchRequest(check));
|
|
366
|
+
add("api", check.id, result.ok ? "pass" : "fail", result.message);
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
add("api", check.id, "fail", "mounted API request failed");
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
const notFound = fixture.notFound ?? {
|
|
374
|
+
id: "not-found",
|
|
375
|
+
path: "/__nifra_smoke_missing__",
|
|
376
|
+
expectedStatus: 404,
|
|
377
|
+
};
|
|
378
|
+
try {
|
|
379
|
+
const result = await validateRequestCheck(notFound, await fetchRequest(notFound));
|
|
380
|
+
add("not-found", notFound.id, result.ok ? "pass" : "fail", result.message);
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
add("not-found", notFound.id, "fail", "404 request failed");
|
|
384
|
+
}
|
|
385
|
+
for (const check of fixture.securityHeaders ?? []) {
|
|
386
|
+
try {
|
|
387
|
+
const result = await validateRequestCheck(check, await fetchRequest(check));
|
|
388
|
+
add("headers", check.id, result.ok ? "pass" : "fail", result.message);
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
add("headers", check.id, "fail", "security-header request failed");
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (fixture.securityHeaders === undefined)
|
|
395
|
+
add("headers", "security-headers", "skip");
|
|
396
|
+
for (const check of fixture.authCallbacks ?? []) {
|
|
397
|
+
try {
|
|
398
|
+
const result = await validateRequestCheck(check, await fetchRequest(check));
|
|
399
|
+
add("auth", check.id, result.ok ? "pass" : "fail", result.message);
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
add("auth", check.id, "fail", "auth callback request failed");
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (fixture.authCallbacks === undefined)
|
|
406
|
+
add("auth", "auth-callbacks", "skip");
|
|
407
|
+
if (fixture.contract === undefined) {
|
|
408
|
+
add("contract", "response-contract", "skip");
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
try {
|
|
412
|
+
const result = await fixture.contract(hookContext);
|
|
413
|
+
if (result === undefined ||
|
|
414
|
+
typeof result !== "object" ||
|
|
415
|
+
result === null ||
|
|
416
|
+
typeof result.ok !== "boolean" ||
|
|
417
|
+
(result.failures !== undefined &&
|
|
418
|
+
(!Number.isInteger(result.failures) || result.failures < 0)) ||
|
|
419
|
+
(result.gaps !== undefined && (!Number.isInteger(result.gaps) || result.gaps < 0))) {
|
|
420
|
+
add("contract", "response-contract", "fail", "contract hook returned no verdict");
|
|
421
|
+
}
|
|
422
|
+
else if (!result.ok || (result.failures ?? 0) > 0 || (result.gaps ?? 0) > 0) {
|
|
423
|
+
add("contract", "response-contract", "fail", "contract witnesses failed");
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
add("contract", "response-contract", "pass");
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
add("contract", "response-contract", "fail", "contract hook failed");
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (fixture.hydration === undefined) {
|
|
434
|
+
add("hydration", "hydration", "skip");
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
try {
|
|
438
|
+
await fixture.hydration(hookContext);
|
|
439
|
+
add("hydration", "hydration", "pass");
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
add("hydration", "hydration", "fail", "hydration hook failed");
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
finally {
|
|
447
|
+
if (server !== undefined) {
|
|
448
|
+
try {
|
|
449
|
+
await server.stop();
|
|
450
|
+
}
|
|
451
|
+
catch {
|
|
452
|
+
add("start", "production-stop", "fail", "production server failed to stop");
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return reportOf(checks, inProcess ? "in-process" : "production");
|
|
457
|
+
}
|
|
458
|
+
function reportOf(checks, mode) {
|
|
459
|
+
const passed = checks.filter((check) => check.status === "pass").length;
|
|
460
|
+
const failed = checks.filter((check) => check.status === "fail").length;
|
|
461
|
+
const skipped = checks.length - passed - failed;
|
|
462
|
+
return {
|
|
463
|
+
version: 1,
|
|
464
|
+
ok: failed === 0,
|
|
465
|
+
mode,
|
|
466
|
+
checks: Object.freeze([...checks]),
|
|
467
|
+
counts: { passed, failed, skipped },
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
/** Load a user-owned smoke fixture without executing arbitrary project code during catalog/help. */
|
|
471
|
+
export async function loadSmokeFixture(cwd, fixturePath = "nifra.smoke.ts") {
|
|
472
|
+
if (typeof fixturePath !== "string" || fixturePath.length === 0 || fixturePath.length > 256)
|
|
473
|
+
throw new Error("smoke fixture path must be a non-empty bounded project-relative path");
|
|
474
|
+
const path = resolve(cwd, fixturePath);
|
|
475
|
+
const projectRoot = await realpath(cwd).catch(() => undefined);
|
|
476
|
+
const fixtureRoot = await realpath(path).catch(() => undefined);
|
|
477
|
+
if (projectRoot === undefined || fixtureRoot === undefined)
|
|
478
|
+
throw new Error("smoke fixture not found");
|
|
479
|
+
const relativeFixture = relative(projectRoot, fixtureRoot);
|
|
480
|
+
if (relativeFixture === "" || relativeFixture.startsWith("..") || isAbsolute(relativeFixture))
|
|
481
|
+
throw new Error("smoke fixture must be inside the project");
|
|
482
|
+
const fixtureStats = await stat(fixtureRoot).catch(() => undefined);
|
|
483
|
+
if (fixtureStats === undefined || !fixtureStats.isFile())
|
|
484
|
+
throw new Error("smoke fixture must resolve to a file");
|
|
485
|
+
const specifier = pathToFileURL(fixtureRoot);
|
|
486
|
+
specifier.searchParams.set("nifra-smoke", String(Date.now()));
|
|
487
|
+
const loaded = (await import(__rewriteRelativeImportExtension(specifier.href)));
|
|
488
|
+
const fixture = loaded.default;
|
|
489
|
+
if (fixture === null || typeof fixture !== "object") {
|
|
490
|
+
throw new Error("smoke fixture must default-export an object");
|
|
491
|
+
}
|
|
492
|
+
return fixture;
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke.js","sourceRoot":"","sources":["../src/smoke.ts"],"names":[],"mappings":"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"}
|
package/dist/sync-manifest.d.ts
CHANGED
|
@@ -21,13 +21,21 @@ export interface SyncManifestResult {
|
|
|
21
21
|
/** Set when the sync was REFUSED because discovery found zero routes for a manifest that had some
|
|
22
22
|
* (`routes/` likely emptied by mistake) - the manifest was left untouched rather than wiped. */
|
|
23
23
|
readonly refusedEmpty?: boolean;
|
|
24
|
+
/** Set when the `routes/` tree could not be built into a route table (a duplicate route, two routes of
|
|
25
|
+
* one shape sharing a path, ...) - the manifest was left untouched and the sync failed. */
|
|
26
|
+
readonly error?: string;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Discover every generated `server-manifest.ts` under `cwd` and re-sync its route table from the live
|
|
27
30
|
* `routes/` tree, preserving baked client assets. Returns one result per generated manifest. Never throws
|
|
28
|
-
* on a per-manifest
|
|
31
|
+
* on a per-manifest failure: an absent or unreadable routes dir is skipped, and a route table that fails
|
|
32
|
+
* to build is reported in that manifest's `error`.
|
|
29
33
|
*/
|
|
30
34
|
export declare function syncServerManifests(cwd: string): Promise<SyncManifestResult[]>;
|
|
31
|
-
/**
|
|
35
|
+
/** True when no manifest's route table failed to build. */
|
|
36
|
+
export declare function syncManifestsOk(results: readonly SyncManifestResult[]): boolean;
|
|
37
|
+
/** Per-file summary lines + the client-rebuild caveat. */
|
|
38
|
+
export declare function renderSyncManifestResults(results: readonly SyncManifestResult[]): string[];
|
|
39
|
+
/** CLI entry: sync every generated manifest and print the summary. False when a route table failed to build. */
|
|
32
40
|
export declare function runSyncManifest(cwd: string): Promise<boolean>;
|
|
33
41
|
//# sourceMappingURL=sync-manifest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-manifest.d.ts","sourceRoot":"","sources":["../src/sync-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"sync-manifest.d.ts","sourceRoot":"","sources":["../src/sync-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsBH,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC;oGACgG;IAChG,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B;+FAC2F;IAC3F,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyCpF;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,OAAO,CAE/E;AAED,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,GAAG,MAAM,EAAE,CA+B1F;AAED,gHAAgH;AAChH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAInE"}
|