@lownoise-studio/rendershield 0.3.1 → 1.1.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +73 -32
  2. package/CONTRIBUTING.md +41 -0
  3. package/README.md +227 -144
  4. package/SECURITY.md +25 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +39 -26
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cliArgs.d.ts +8 -0
  10. package/dist/cliArgs.d.ts.map +1 -0
  11. package/dist/cliArgs.js +56 -0
  12. package/dist/cliArgs.js.map +1 -0
  13. package/dist/commands/build.d.ts +3 -0
  14. package/dist/commands/build.d.ts.map +1 -0
  15. package/dist/commands/build.js +12 -11
  16. package/dist/commands/build.js.map +1 -1
  17. package/dist/commands/init.d.ts +3 -0
  18. package/dist/commands/init.d.ts.map +1 -0
  19. package/dist/commands/init.js +8 -7
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/verify.d.ts +33 -0
  22. package/dist/commands/verify.d.ts.map +1 -0
  23. package/dist/commands/verify.js +202 -117
  24. package/dist/commands/verify.js.map +1 -1
  25. package/dist/configPath.d.ts +7 -0
  26. package/dist/configPath.d.ts.map +1 -0
  27. package/dist/configPath.js +8 -0
  28. package/dist/configPath.js.map +1 -0
  29. package/dist/core/generateRobots.d.ts +3 -0
  30. package/dist/core/generateRobots.d.ts.map +1 -0
  31. package/dist/core/generateSitemap.d.ts +3 -0
  32. package/dist/core/generateSitemap.d.ts.map +1 -0
  33. package/dist/core/generateWorker.d.ts +3 -0
  34. package/dist/core/generateWorker.d.ts.map +1 -0
  35. package/dist/core/generateWorker.js +75 -75
  36. package/dist/core/generateWorker.js.map +1 -1
  37. package/dist/core/listOutputRoutes.d.ts +4 -0
  38. package/dist/core/listOutputRoutes.d.ts.map +1 -0
  39. package/dist/core/listOutputRoutes.js +40 -0
  40. package/dist/core/listOutputRoutes.js.map +1 -0
  41. package/dist/core/loadConfig.d.ts +5 -0
  42. package/dist/core/loadConfig.d.ts.map +1 -0
  43. package/dist/core/loadConfig.js +108 -58
  44. package/dist/core/loadConfig.js.map +1 -1
  45. package/dist/core/loadMarkdown.d.ts +3 -0
  46. package/dist/core/loadMarkdown.d.ts.map +1 -0
  47. package/dist/core/loadMarkdown.js +4 -3
  48. package/dist/core/loadMarkdown.js.map +1 -1
  49. package/dist/core/renderHtml.d.ts +3 -0
  50. package/dist/core/renderHtml.d.ts.map +1 -0
  51. package/dist/core/renderHtml.js +25 -10
  52. package/dist/core/renderHtml.js.map +1 -1
  53. package/dist/core/validateOutput.d.ts +28 -0
  54. package/dist/core/validateOutput.d.ts.map +1 -0
  55. package/dist/core/validateOutput.js +7 -1
  56. package/dist/core/validateOutput.js.map +1 -1
  57. package/dist/errors.d.ts +14 -0
  58. package/dist/errors.d.ts.map +1 -0
  59. package/dist/errors.js +24 -0
  60. package/dist/errors.js.map +1 -0
  61. package/dist/index.d.ts +22 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +20 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/types.d.ts +53 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +1 -1
  68. package/dist/types.js.map +1 -1
  69. package/docs/CONFIG.md +70 -0
  70. package/docs/deploy-cloudflare.md +40 -14
  71. package/package.json +25 -2
  72. package/rendershield.config.schema.json +100 -0
  73. package/src/cli.ts +96 -75
  74. package/src/cliArgs.ts +71 -0
  75. package/src/commands/build.ts +200 -185
  76. package/src/commands/init.ts +8 -8
  77. package/src/commands/verify.ts +451 -236
  78. package/src/configPath.ts +17 -0
  79. package/src/core/generateWorker.ts +97 -97
  80. package/src/core/listOutputRoutes.ts +51 -0
  81. package/src/core/loadConfig.ts +282 -173
  82. package/src/core/loadMarkdown.ts +9 -3
  83. package/src/core/renderHtml.ts +36 -12
  84. package/src/core/validateOutput.ts +335 -328
  85. package/src/errors.ts +48 -0
  86. package/src/index.ts +43 -0
  87. package/src/types.ts +5 -2
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CommandOptions } from "./configPath.js";
2
+ import type { VerifyOptions } from "./commands/verify.js";
3
+ export declare function extractGlobalOptions(argv: string[]): {
4
+ options: CommandOptions;
5
+ rest: string[];
6
+ };
7
+ export declare function parseVerifyArgs(argv: string[], globalOptions: CommandOptions): VerifyOptions;
8
+ //# sourceMappingURL=cliArgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliArgs.d.ts","sourceRoot":"","sources":["../src/cliArgs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACpD,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAsBA;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,EAAE,cAAc,GAC5B,aAAa,CAmCf"}
@@ -0,0 +1,56 @@
1
+ const GLOBAL_FLAGS = new Set(["--config"]);
2
+ export function extractGlobalOptions(argv) {
3
+ const options = {};
4
+ const rest = [];
5
+ for (let i = 0; i < argv.length; i++) {
6
+ const arg = argv[i];
7
+ if (arg === "--config") {
8
+ const value = argv[i + 1]?.trim();
9
+ if (!value || value.startsWith("-")) {
10
+ rest.push(arg);
11
+ continue;
12
+ }
13
+ options.configPath = value;
14
+ i++;
15
+ continue;
16
+ }
17
+ if (!GLOBAL_FLAGS.has(arg)) {
18
+ rest.push(arg);
19
+ }
20
+ }
21
+ return { options, rest };
22
+ }
23
+ export function parseVerifyArgs(argv, globalOptions) {
24
+ const options = { ...globalOptions };
25
+ const positional = [];
26
+ for (let i = 0; i < argv.length; i++) {
27
+ const arg = argv[i];
28
+ if (arg === "--prod") {
29
+ options.prod = true;
30
+ const value = argv[i + 1]?.trim();
31
+ if (value && !value.startsWith("-")) {
32
+ options.prodUrl = value;
33
+ i++;
34
+ }
35
+ continue;
36
+ }
37
+ if (arg === "--check") {
38
+ options.check = true;
39
+ continue;
40
+ }
41
+ if (arg === "--all") {
42
+ options.all = true;
43
+ continue;
44
+ }
45
+ if (arg === "--config") {
46
+ i++;
47
+ continue;
48
+ }
49
+ positional.push(arg);
50
+ }
51
+ if (!options.prodUrl && positional[0] && !positional[0].startsWith("-")) {
52
+ options.prodUrl = positional[0];
53
+ }
54
+ return options;
55
+ }
56
+ //# sourceMappingURL=cliArgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliArgs.js","sourceRoot":"","sources":["../src/cliArgs.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE3C,MAAM,UAAU,oBAAoB,CAAC,IAAc;IAIjD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACf,SAAS;YACX,CAAC;YACD,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;YAC3B,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAc,EACd,aAA6B;IAE7B,MAAM,OAAO,GAAkB,EAAE,GAAG,aAAa,EAAE,CAAC;IACpD,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;gBACxB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommandOptions } from "../configPath.js";
2
+ export declare function cmdBuild(cwd?: string, options?: CommandOptions): Promise<void>;
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA8HvD,wBAAsB,QAAQ,CAAC,GAAG,SAAgB,EAAE,OAAO,CAAC,EAAE,cAAc,iBA+D3E"}
@@ -7,6 +7,7 @@ import { generateSitemapXml } from "../core/generateSitemap.js";
7
7
  import { generateRobotsTxt } from "../core/generateRobots.js";
8
8
  import { generateWorkerJs } from "../core/generateWorker.js";
9
9
  import { validatePrerenderHtml } from "../core/validateOutput.js";
10
+ import { renderShieldError } from "../errors.js";
10
11
  function routeToOutDir(outDirAbs, routePath) {
11
12
  // /blog/slug -> outDir/blog/slug/index.html
12
13
  const clean = routePath.replace(/^\//, "");
@@ -27,7 +28,7 @@ async function validateOutputPath(outDir, cwd) {
27
28
  }
28
29
  catch (err) {
29
30
  const msg = err instanceof Error ? err.message : String(err);
30
- throw new Error(`Cannot resolve project root: ${cwdAbs}. ${msg}`);
31
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Cannot resolve project root: ${cwdAbs}. ${msg}`);
31
32
  }
32
33
  const outDirAbs = path.resolve(cwdAbs, outDir);
33
34
  // Order: realpath → normalize → then case-fold for comparisons
@@ -37,18 +38,18 @@ async function validateOutputPath(outDir, cwd) {
37
38
  // rarely returns absolute on Windows; startsWith("..") and path.isAbsolute(rel) cover escapes.
38
39
  const relative = path.relative(normalizedCwd, normalizedOut);
39
40
  if (relative.startsWith("..") || relative === ".." || path.isAbsolute(relative)) {
40
- throw new Error(`Output directory "${outDir}" resolves outside project root. Use a relative path within the project.`);
41
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves outside project root. Use a relative path within the project.`);
41
42
  }
42
43
  // Reject: root filesystem (/, C:\, C:/) — early reject; real safety is "inside root" above
43
44
  const rootPaths = ["/", "c:\\", "c:/"];
44
45
  const outLower = normalizedOut.toLowerCase();
45
46
  if (rootPaths.includes(outLower)) {
46
- throw new Error(`Output directory "${outDir}" resolves to root filesystem. This is not allowed for safety.`);
47
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves to root filesystem. This is not allowed for safety.`);
47
48
  }
48
49
  // Reject: output dir equals project root (would delete entire project). Case-fold after normalize.
49
50
  const cwdLower = normalizedCwd.toLowerCase();
50
51
  if (outLower === cwdLower) {
51
- throw new Error(`Output directory "${outDir}" cannot be the project root. Use a subdirectory (e.g. dist-prerender).`);
52
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" cannot be the project root. Use a subdirectory (e.g. dist-prerender).`);
52
53
  }
53
54
  if (await fs.pathExists(outDirAbs)) {
54
55
  // Path exists: resolve symlinks and ensure real path is inside root
@@ -62,7 +63,7 @@ async function validateOutputPath(outDir, cwd) {
62
63
  const outDirRealNorm = path.normalize(outDirReal);
63
64
  const relativeReal = path.relative(normalizedCwd, outDirRealNorm);
64
65
  if (relativeReal.startsWith("..") || relativeReal === ".." || path.isAbsolute(relativeReal)) {
65
- throw new Error(`Output directory "${outDir}" resolves (via symlink) outside project root. Use a path that does not escape the project.`);
66
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" resolves (via symlink) outside project root. Use a path that does not escape the project.`);
66
67
  }
67
68
  }
68
69
  else {
@@ -85,11 +86,11 @@ async function validateOutputPath(outDir, cwd) {
85
86
  // Nearest existing parent is filesystem root → outside project, reject
86
87
  const parentLower = parentRealNorm.toLowerCase();
87
88
  if (rootPaths.includes(parentLower)) {
88
- throw new Error(`Output directory "${outDir}" has a parent that resolves to filesystem root. Use a path inside the project.`);
89
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" has a parent that resolves to filesystem root. Use a path inside the project.`);
89
90
  }
90
91
  const relParent = path.relative(normalizedCwd, parentRealNorm);
91
92
  if (relParent.startsWith("..") || relParent === ".." || path.isAbsolute(relParent)) {
92
- throw new Error(`Output directory "${outDir}" has a parent that resolves (via symlink) outside project root. Use a path that does not escape the project.`);
93
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" has a parent that resolves (via symlink) outside project root. Use a path that does not escape the project.`);
93
94
  }
94
95
  foundParentInsideRoot = true;
95
96
  break;
@@ -101,12 +102,12 @@ async function validateOutputPath(outDir, cwd) {
101
102
  }
102
103
  if (!foundParentInsideRoot) {
103
104
  // No existing parent found before hitting dirname loop stop (shouldn't happen on a normal FS)
104
- throw new Error(`Output directory "${outDir}" could not be validated: no existing parent path found. Use a path inside the project.`);
105
+ throw renderShieldError("OUTPUT_PATH_UNSAFE", `Output directory "${outDir}" could not be validated: no existing parent path found. Use a path inside the project.`);
105
106
  }
106
107
  }
107
108
  }
108
- export async function cmdBuild(cwd = process.cwd()) {
109
- const cfg = await loadConfig(cwd);
109
+ export async function cmdBuild(cwd = process.cwd(), options) {
110
+ const cfg = await loadConfig(cwd, options);
110
111
  // Validate output path before any destructive operations
111
112
  await validateOutputPath(cfg.output.outDir, cwd);
112
113
  const outDirAbs = path.join(cwd, cfg.output.outDir);
@@ -115,7 +116,7 @@ export async function cmdBuild(cwd = process.cwd()) {
115
116
  await fs.ensureDir(outDirAbs);
116
117
  const docs = await loadAllMarkdownDocs(cfg, cwd);
117
118
  if (docs.length === 0) {
118
- throw new Error("No markdown documents found. Check content paths/patterns.");
119
+ throw renderShieldError("BUILD_FAILED", "No markdown documents found. Check content paths/patterns.");
119
120
  }
120
121
  // Generate pages (validate BEFORE writing)
121
122
  for (const doc of docs) {
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type CommandOptions } from "../configPath.js";
2
+ export declare function cmdInit(cwd?: string, options?: CommandOptions): Promise<void>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA2E1E,wBAAsB,OAAO,CAAC,GAAG,SAAgB,EAAE,OAAO,CAAC,EAAE,cAAc,iBAkC1E"}
@@ -1,6 +1,6 @@
1
1
  import fs from "fs-extra";
2
2
  import path from "node:path";
3
- const CONFIG_NAME = "rendershield.config.json";
3
+ import { resolveConfigFile } from "../configPath.js";
4
4
  const DEFAULT_CONFIG = {
5
5
  version: 1,
6
6
  site: {
@@ -36,7 +36,7 @@ const DEFAULT_CONFIG = {
36
36
  },
37
37
  worker: {
38
38
  enabled: true,
39
- lovableOrigin: "https://YOUR_SITE.lovable.app",
39
+ spaOrigin: "https://app.example.com",
40
40
  rewriteRouteBases: ["/blog/"],
41
41
  botUserAgentPatterns: [
42
42
  "googlebot",
@@ -71,17 +71,18 @@ This is **RenderShield**.
71
71
 
72
72
  That's the whole trick.
73
73
  `;
74
- export async function cmdInit(cwd = process.cwd()) {
75
- const configPath = path.join(cwd, CONFIG_NAME);
74
+ export async function cmdInit(cwd = process.cwd(), options) {
75
+ const configPath = resolveConfigFile(cwd, options?.configPath);
76
+ const configName = path.basename(configPath);
76
77
  const contentDir = path.join(cwd, "content", "blog");
77
78
  const samplePath = path.join(contentDir, "hello-world.md");
78
79
  const configExists = await fs.pathExists(configPath);
79
80
  if (!configExists) {
80
81
  await fs.writeFile(configPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + "\n", "utf8");
81
- console.log(`Created ${CONFIG_NAME}`);
82
+ console.log(`Created ${configName}`);
82
83
  }
83
84
  else {
84
- console.log(`${CONFIG_NAME} already exists (leaving it alone)`);
85
+ console.log(`${configName} already exists (leaving it alone)`);
85
86
  }
86
87
  await fs.ensureDir(contentDir);
87
88
  const sampleExists = await fs.pathExists(samplePath);
@@ -94,7 +95,7 @@ export async function cmdInit(cwd = process.cwd()) {
94
95
  }
95
96
  console.log(`
96
97
  Next:
97
- 1) Edit rendershield.config.json
98
+ 1) Edit ${configName}
98
99
  2) Add content under content/blog/
99
100
  3) Run: rendershield build
100
101
  `);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAE/C,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,CAAC;IACV,IAAI,EAAE;QACJ,aAAa,EAAE,qBAAqB;QACpC,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,oCAAoC;QACpD,UAAU,EAAE,WAAW;KACxB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE;YACR,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,cAAc;oBACvB,SAAS,EAAE,OAAO;oBAClB,UAAU,EAAE,SAAS;iBACtB;aACF;SACF;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,IAAI;KACjB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,cAAc;KACrB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,aAAa;KACpB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,+BAA+B;QAC9C,iBAAiB,EAAE,CAAC,QAAQ,CAAC;QAC7B,oBAAoB,EAAE;YACpB,WAAW;YACX,SAAS;YACT,QAAQ;YACR,WAAW;YACX,eAAe;YACf,YAAY;YACZ,qBAAqB;YACrB,aAAa;YACb,UAAU;YACV,YAAY;YACZ,UAAU;YACV,UAAU;SACX;QACD,YAAY,EAAE,IAAI;KACnB;CACF,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEpD,MAAM,WAAW,GAAG;;;iBAGH,KAAK;;;;;;;;;;;CAWrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,SAAS,CAChB,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC9C,MAAM,CACP,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,oCAAoC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;;;;;CAKb,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAuB,MAAM,kBAAkB,CAAC;AAE1E,MAAM,cAAc,GAAG;IACrB,OAAO,EAAE,CAAC;IACV,IAAI,EAAE;QACJ,aAAa,EAAE,qBAAqB;QACpC,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,oCAAoC;QACpD,UAAU,EAAE,WAAW;KACxB;IACD,OAAO,EAAE;QACP,QAAQ,EAAE;YACR,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,cAAc;oBACvB,SAAS,EAAE,OAAO;oBAClB,UAAU,EAAE,SAAS;iBACtB;aACF;SACF;KACF;IACD,MAAM,EAAE;QACN,MAAM,EAAE,gBAAgB;QACxB,UAAU,EAAE,IAAI;KACjB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,cAAc;KACrB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,aAAa;KACpB;IACD,MAAM,EAAE;QACN,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,yBAAyB;QACpC,iBAAiB,EAAE,CAAC,QAAQ,CAAC;QAC7B,oBAAoB,EAAE;YACpB,WAAW;YACX,SAAS;YACT,QAAQ;YACR,WAAW;YACX,eAAe;YACf,YAAY;YACZ,qBAAqB;YACrB,aAAa;YACb,UAAU;YACV,YAAY;YACZ,UAAU;YACV,UAAU;SACX;QACD,YAAY,EAAE,IAAI;KACnB;CACF,CAAC;AAEF,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEpD,MAAM,WAAW,GAAG;;;iBAGH,KAAK;;;;;;;;;;;CAWrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,OAAwB;IACzE,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IAE3D,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,SAAS,CAChB,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC9C,MAAM,CACP,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,oCAAoC,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC;;YAEF,UAAU;;;CAGrB,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ContractCheckResult } from "../core/validateOutput.js";
2
+ import type { CommandOptions } from "../configPath.js";
3
+ export type VerifyPageResult = {
4
+ routePath: string;
5
+ outputFile: string;
6
+ url: string;
7
+ contract?: ContractCheckResult;
8
+ };
9
+ export type VerifyOptions = CommandOptions & {
10
+ /** Set when --prod is passed (URL may be omitted with --all). */
11
+ prod?: boolean;
12
+ prodUrl?: string;
13
+ check?: boolean;
14
+ all?: boolean;
15
+ };
16
+ export type VerifyLocalResult = {
17
+ mode: "local";
18
+ canonicalBase: string;
19
+ checked: boolean;
20
+ ok: boolean;
21
+ pages: VerifyPageResult[];
22
+ };
23
+ export type VerifyProdResult = {
24
+ mode: "prod";
25
+ ok: boolean;
26
+ pages: Array<{
27
+ url: string;
28
+ contract: ContractCheckResult;
29
+ }>;
30
+ };
31
+ export type VerifyResult = VerifyLocalResult | VerifyProdResult;
32
+ export declare function cmdVerify(cwd?: string, options?: VerifyOptions): Promise<VerifyResult>;
33
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoCvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,mBAAmB,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAEhE,wBAAsB,SAAS,CAC7B,GAAG,SAAgB,EACnB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAiBvB"}