create-relkit 0.0.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 (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/generate-files.d.ts +16 -0
  4. package/dist/generate-files.d.ts.map +1 -0
  5. package/dist/generate-files.js +108 -0
  6. package/dist/generate-files.js.map +1 -0
  7. package/dist/generate-output.d.ts +20 -0
  8. package/dist/generate-output.d.ts.map +1 -0
  9. package/dist/generate-output.js +67 -0
  10. package/dist/generate-output.js.map +1 -0
  11. package/dist/generate-process.d.ts +9 -0
  12. package/dist/generate-process.d.ts.map +1 -0
  13. package/dist/generate-process.js +76 -0
  14. package/dist/generate-process.js.map +1 -0
  15. package/dist/generate.d.ts +42 -0
  16. package/dist/generate.d.ts.map +1 -0
  17. package/dist/generate.js +103 -0
  18. package/dist/generate.js.map +1 -0
  19. package/dist/index.d.ts +6 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +32 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/options.d.ts +38 -0
  24. package/dist/options.d.ts.map +1 -0
  25. package/dist/options.js +113 -0
  26. package/dist/options.js.map +1 -0
  27. package/dist/templates/default/README.md +13 -0
  28. package/dist/templates/default/v1/agent/.env.example +3 -0
  29. package/dist/templates/default/v1/agent/README.md +23 -0
  30. package/dist/templates/default/v1/agent/gitignore +10 -0
  31. package/dist/templates/default/v1/agent/package.json +29 -0
  32. package/dist/templates/default/v1/agent/relkit.config.ts +23 -0
  33. package/dist/templates/default/v1/agent/src/agents/assistant.agent.ts +13 -0
  34. package/dist/templates/default/v1/agent/src/env.ts +7 -0
  35. package/dist/templates/default/v1/agent/src/functions/hello.function.ts +21 -0
  36. package/dist/templates/default/v1/agent/src/routes/hello/route.ts +7 -0
  37. package/dist/templates/default/v1/agent/tests/integration/hello.route.test.ts +13 -0
  38. package/dist/templates/default/v1/agent/tests/unit/assistant.agent.test.ts +29 -0
  39. package/dist/templates/default/v1/agent/tests/unit/hello.function.test.ts +9 -0
  40. package/dist/templates/default/v1/agent/tsconfig.json +23 -0
  41. package/dist/templates/default/v1/api/.env.example +4 -0
  42. package/dist/templates/default/v1/api/README.md +25 -0
  43. package/dist/templates/default/v1/api/gitignore +10 -0
  44. package/dist/templates/default/v1/api/package.json +30 -0
  45. package/dist/templates/default/v1/api/relkit.config.ts +19 -0
  46. package/dist/templates/default/v1/api/src/env.ts +8 -0
  47. package/dist/templates/default/v1/api/src/events/order-audit.event.ts +15 -0
  48. package/dist/templates/default/v1/api/src/events/order-confirmation.event.ts +11 -0
  49. package/dist/templates/default/v1/api/src/events/order-created.event.ts +15 -0
  50. package/dist/templates/default/v1/api/src/functions/echo.function.ts +10 -0
  51. package/dist/templates/default/v1/api/src/functions/hello.function.ts +13 -0
  52. package/dist/templates/default/v1/api/src/functions/orders/create-order.function.ts +29 -0
  53. package/dist/templates/default/v1/api/src/functions/orders/price-order.function.ts +10 -0
  54. package/dist/templates/default/v1/api/src/routes/echo/route.ts +6 -0
  55. package/dist/templates/default/v1/api/src/routes/hello/route.ts +6 -0
  56. package/dist/templates/default/v1/api/src/routes/orders/route.ts +9 -0
  57. package/dist/templates/default/v1/api/src/services/orders.service.ts +7 -0
  58. package/dist/templates/default/v1/api/tests/integration/echo.route.test.ts +17 -0
  59. package/dist/templates/default/v1/api/tests/integration/hello.route.test.ts +13 -0
  60. package/dist/templates/default/v1/api/tests/integration/order-events.test.ts +71 -0
  61. package/dist/templates/default/v1/api/tests/integration/orders.route.test.ts +24 -0
  62. package/dist/templates/default/v1/api/tests/unit/echo.function.test.ts +9 -0
  63. package/dist/templates/default/v1/api/tests/unit/hello.function.test.ts +9 -0
  64. package/dist/templates/default/v1/api/tests/unit/orders.function.test.ts +26 -0
  65. package/dist/templates/default/v1/api/tsconfig.json +23 -0
  66. package/dist/templates/default/v1/minimal/.env.example +1 -0
  67. package/dist/templates/default/v1/minimal/README.md +19 -0
  68. package/dist/templates/default/v1/minimal/gitignore +10 -0
  69. package/dist/templates/default/v1/minimal/package.json +29 -0
  70. package/dist/templates/default/v1/minimal/relkit.config.ts +10 -0
  71. package/dist/templates/default/v1/minimal/src/env.ts +5 -0
  72. package/dist/templates/default/v1/minimal/src/functions/hello.function.ts +14 -0
  73. package/dist/templates/default/v1/minimal/src/routes/hello/route.ts +7 -0
  74. package/dist/templates/default/v1/minimal/tests/integration/hello.route.test.ts +13 -0
  75. package/dist/templates/default/v1/minimal/tests/unit/hello.function.test.ts +9 -0
  76. package/dist/templates/default/v1/minimal/tsconfig.json +23 -0
  77. package/dist/validate.d.ts +23 -0
  78. package/dist/validate.d.ts.map +1 -0
  79. package/dist/validate.js +156 -0
  80. package/dist/validate.js.map +1 -0
  81. package/package.json +39 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rel-kit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # create-relkit
2
+
3
+ Create a RELKIT application from a supported project template.
4
+
5
+ See [@relkit/app](https://github.com/rel-kit/relkit) for supported application APIs.
@@ -0,0 +1,16 @@
1
+ import type { CreateOptions } from "./options.js";
2
+ export interface StageCleanupResult {
3
+ readonly temporaryPath?: string;
4
+ readonly removed: boolean;
5
+ }
6
+ export declare function copyTemplate(source: string, target: string): Promise<void>;
7
+ export declare function customizeProject(root: string, options: CreateOptions): Promise<void>;
8
+ /** Removes only a verified mkdtemp sibling; broad or unresolved paths are never recursed. */
9
+ export declare function cleanupStagedProject(stage: string | undefined, destination: string): Promise<StageCleanupResult>;
10
+ export declare function requireTemplate(path: string): Promise<void>;
11
+ export declare function requireFiles(root: string, paths: readonly string[]): Promise<void>;
12
+ export declare function replaceOnce(path: string, before: string, after: string): Promise<void>;
13
+ export declare function removeExamples(root: string): Promise<void>;
14
+ export declare function listProjectFiles(root: string, current?: string): Promise<string[]>;
15
+ export declare function projectId(name: string): string;
16
+ //# sourceMappingURL=generate-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files.d.ts","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAa1F;AAED,6FAA6F;AAC7F,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASjE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5F;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUtF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
@@ -0,0 +1,108 @@
1
+ import { access, chmod, lstat, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join, relative, resolve } from "node:path";
3
+ import { GenerateProjectError } from "./generate.js";
4
+ const FILE_MODE = 0o644;
5
+ const DIRECTORY_MODE = 0o755;
6
+ export async function copyTemplate(source, target) {
7
+ await mkdir(target, { recursive: true, mode: DIRECTORY_MODE });
8
+ await chmod(target, DIRECTORY_MODE);
9
+ const entries = (await readdir(source, { withFileTypes: true })).sort(compareNames);
10
+ for (const entry of entries) {
11
+ const from = join(source, entry.name);
12
+ const to = join(target, entry.name === "gitignore" ? ".gitignore" : entry.name);
13
+ if (entry.isDirectory())
14
+ await copyTemplate(from, to);
15
+ else if (entry.isFile()) {
16
+ await writeFile(to, await readFile(from), { mode: FILE_MODE });
17
+ await chmod(to, FILE_MODE);
18
+ }
19
+ else
20
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", "Template contains an unsupported entry.");
21
+ }
22
+ }
23
+ export async function customizeProject(root, options) {
24
+ await replaceOnce(join(root, "package.json"), '"name": "my-app"', `"name": ${JSON.stringify(options.name)}`);
25
+ await replaceOnce(join(root, "README.md"), "# my-app", `# ${options.name}`);
26
+ await replaceOnce(join(root, "relkit.config.ts"), "export default defineConfig({", `export default defineConfig({\n id: ${JSON.stringify(projectId(options.name))},`);
27
+ if (!options.examples)
28
+ await removeExamples(root);
29
+ }
30
+ /** Removes only a verified mkdtemp sibling; broad or unresolved paths are never recursed. */
31
+ export async function cleanupStagedProject(stage, destination) {
32
+ if (stage === undefined)
33
+ return { removed: false };
34
+ const temporaryPath = resolve(stage);
35
+ const parent = resolve(dirname(destination));
36
+ const prefix = `.${basename(destination)}-relkit-`;
37
+ if (dirname(temporaryPath) !== parent || !basename(temporaryPath).startsWith(prefix)) {
38
+ return { removed: false };
39
+ }
40
+ try {
41
+ const info = await lstat(temporaryPath);
42
+ if (!info.isDirectory() || info.isSymbolicLink())
43
+ return { temporaryPath, removed: false };
44
+ await rm(temporaryPath, { recursive: true, force: true });
45
+ return { temporaryPath, removed: true };
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
49
+ return { temporaryPath, removed: true };
50
+ }
51
+ return { temporaryPath, removed: false };
52
+ }
53
+ }
54
+ export async function requireTemplate(path) {
55
+ try {
56
+ if ((await readdir(path)).length === 0)
57
+ throw new Error("empty");
58
+ }
59
+ catch {
60
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_MISSING", "Selected template is missing.");
61
+ }
62
+ }
63
+ export async function requireFiles(root, paths) {
64
+ for (const path of paths) {
65
+ try {
66
+ await access(join(root, path));
67
+ }
68
+ catch {
69
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template file is missing: ${path}`);
70
+ }
71
+ }
72
+ }
73
+ export async function replaceOnce(path, before, after) {
74
+ const content = await readFile(path, "utf8");
75
+ const first = content.indexOf(before);
76
+ if (first < 0 || first !== content.lastIndexOf(before))
77
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template substitution is unavailable: ${path}`);
78
+ await writeFile(path, content.slice(0, first) + after + content.slice(first + before.length), "utf8");
79
+ await chmod(path, FILE_MODE);
80
+ }
81
+ export async function removeExamples(root) {
82
+ for (const directory of ["src/functions", "src/routes", "src/tools", "src/agents", "tests"])
83
+ await rm(join(root, directory), { recursive: true, force: true });
84
+ }
85
+ export async function listProjectFiles(root, current = root) {
86
+ const result = [];
87
+ for (const entry of (await readdir(current, { withFileTypes: true })).sort(compareNames)) {
88
+ if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".relkit")
89
+ continue;
90
+ const path = join(current, entry.name);
91
+ if (entry.isDirectory())
92
+ result.push(...(await listProjectFiles(root, path)));
93
+ else if (entry.isFile())
94
+ result.push(relative(root, path).replaceAll("\\", "/"));
95
+ }
96
+ return result;
97
+ }
98
+ export function projectId(name) {
99
+ const value = name
100
+ .replace(/^@/, "")
101
+ .replace("/", "-")
102
+ .replace(/[^A-Za-z0-9._-]+/g, "-");
103
+ return value.replace(/^[._-]+|[._-]+$/g, "") || "app";
104
+ }
105
+ function compareNames(left, right) {
106
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
107
+ }
108
+ //# sourceMappingURL=generate-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files.js","sourceRoot":"","sources":["../src/generate-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,MAAM,cAAc,GAAG,KAAK,CAAC;AAO7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc;IAC/D,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;aACjD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxB,MAAM,SAAS,CAAC,EAAE,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7B,CAAC;;YACC,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,EAChC,yCAAyC,CAC1C,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAsB;IACzE,MAAM,WAAW,CACf,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAC1B,kBAAkB,EAClB,WAAW,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAC1C,CAAC;IACF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,WAAW,CACf,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAC9B,+BAA+B,EAC/B,wCAAwC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CACnF,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,6FAA6F;AAC7F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAyB,EACzB,WAAmB;IAEnB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC;IACnD,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3F,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,EAChC,+BAA+B,CAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,KAAwB;IACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,EAChC,6BAA6B,IAAI,EAAE,CACpC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc,EAAE,KAAa;IAC3E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;QACpD,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,EAChC,yCAAyC,IAAI,EAAE,CAChD,CAAC;IACJ,MAAM,SAAS,CACb,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EACtE,MAAM,CACP,CAAC;IACF,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,KAAK,MAAM,SAAS,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC;QACzF,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAO,GAAG,IAAI;IACjE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACzF,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YACpF,SAAS;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;aACzE,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI;SACf,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;SACjB,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB,EAAE,KAAuB;IACnE,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { CreateOptions } from "./options.js";
2
+ export interface GenerateNextSteps {
3
+ readonly commands: Readonly<{
4
+ readonly cd: string;
5
+ readonly dev: "bun run dev";
6
+ readonly test: "bun run test";
7
+ readonly check: "bun run check";
8
+ readonly build: "bun run build";
9
+ }>;
10
+ readonly endpoints: Readonly<{
11
+ readonly backend: "http://localhost:3000";
12
+ readonly inspector: "http://localhost:3210";
13
+ readonly openapi: "http://localhost:3000/_relkit/v1/openapi.json";
14
+ readonly apiReference: "http://localhost:3000/_relkit/v1/api-reference";
15
+ readonly route?: "GET http://localhost:3000/hello?name=RelKit";
16
+ }>;
17
+ }
18
+ export declare function createGenerateNextSteps(options: Pick<CreateOptions, "examples">, destination: string, cwd?: string): GenerateNextSteps;
19
+ export declare function formatGenerateResult(value: unknown): string;
20
+ //# sourceMappingURL=generate-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-output.d.ts","sourceRoot":"","sources":["../src/generate-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;QAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;QAC9B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;QAChC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;KACjC,CAAC,CAAC;IACH,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;QAC1C,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;QAC5C,QAAQ,CAAC,OAAO,EAAE,+CAA+C,CAAC;QAClE,QAAQ,CAAC,YAAY,EAAE,gDAAgD,CAAC;QACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,6CAA6C,CAAC;KAChE,CAAC,CAAC;CACJ;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EACxC,WAAW,EAAE,MAAM,EACnB,GAAG,SAAgB,GAClB,iBAAiB,CAiBnB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAoB3D"}
@@ -0,0 +1,67 @@
1
+ import { basename, relative, resolve } from "node:path";
2
+ export function createGenerateNextSteps(options, destination, cwd = process.cwd()) {
3
+ const directory = relative(resolve(cwd), resolve(destination)) || basename(destination);
4
+ const commands = Object.freeze({
5
+ cd: `cd ${shellWord(directory)}`,
6
+ dev: "bun run dev",
7
+ test: "bun run test",
8
+ check: "bun run check",
9
+ build: "bun run build",
10
+ });
11
+ const endpoints = Object.freeze({
12
+ backend: "http://localhost:3000",
13
+ inspector: "http://localhost:3210",
14
+ openapi: "http://localhost:3000/_relkit/v1/openapi.json",
15
+ apiReference: "http://localhost:3000/_relkit/v1/api-reference",
16
+ ...(options.examples ? { route: "GET http://localhost:3000/hello?name=RelKit" } : {}),
17
+ });
18
+ return Object.freeze({ commands, endpoints });
19
+ }
20
+ export function formatGenerateResult(value) {
21
+ if (!isRecord(value) || !isNextSteps(value.nextSteps))
22
+ return JSON.stringify(value);
23
+ const { commands, endpoints } = value.nextSteps;
24
+ return [
25
+ ...(typeof value.name === "string" && typeof value.destination === "string"
26
+ ? [`Success! Created ${value.name} at ${value.destination}.`, ""]
27
+ : []),
28
+ commands.cd,
29
+ commands.dev,
30
+ "",
31
+ `backend: ${endpoints.backend}`,
32
+ `inspector: ${endpoints.inspector}`,
33
+ `openapi: ${endpoints.openapi}`,
34
+ `api docs: ${endpoints.apiReference}`,
35
+ ...(endpoints.route === undefined ? [] : [`route: ${endpoints.route}`]),
36
+ "",
37
+ commands.test,
38
+ commands.check,
39
+ commands.build,
40
+ ].join("\n");
41
+ }
42
+ function shellWord(value) {
43
+ if (/^[A-Za-z0-9_./@-]+$/.test(value))
44
+ return value.startsWith("-") ? `./${value}` : value;
45
+ return `'${value.replaceAll("'", "'\\''")}'`;
46
+ }
47
+ function isNextSteps(value) {
48
+ if (!isRecord(value) || !isRecord(value.commands) || !isRecord(value.endpoints))
49
+ return false;
50
+ const commands = value.commands;
51
+ const endpoints = value.endpoints;
52
+ return (typeof commands.cd === "string" &&
53
+ commands.dev === "bun run dev" &&
54
+ commands.test === "bun run test" &&
55
+ commands.check === "bun run check" &&
56
+ commands.build === "bun run build" &&
57
+ endpoints.backend === "http://localhost:3000" &&
58
+ endpoints.inspector === "http://localhost:3210" &&
59
+ endpoints.openapi === "http://localhost:3000/_relkit/v1/openapi.json" &&
60
+ endpoints.apiReference === "http://localhost:3000/_relkit/v1/api-reference" &&
61
+ (endpoints.route === undefined ||
62
+ endpoints.route === "GET http://localhost:3000/hello?name=RelKit"));
63
+ }
64
+ function isRecord(value) {
65
+ return value !== null && typeof value === "object" && !Array.isArray(value);
66
+ }
67
+ //# sourceMappingURL=generate-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-output.js","sourceRoot":"","sources":["../src/generate-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { GenerateProjectError, type GenerateCommandResult, type GenerateFailurePoint, type GenerateProjectContext } from "./generate.js";
2
+ import type { StageCleanupResult } from "./generate-files.js";
3
+ export declare function generationError(error: unknown, fallback: string, cleanup?: StageCleanupResult): GenerateProjectError;
4
+ export declare function injectGenerateFailure(context: GenerateProjectContext, point: GenerateFailurePoint): void;
5
+ export declare function runProjectStep(context: GenerateProjectContext, command: readonly string[], cwd: string, step: string, point: GenerateFailurePoint): Promise<void>;
6
+ export declare function throwIfAborted(signal: AbortSignal | undefined): void;
7
+ export declare function resolveRelkitExecutable(context: GenerateProjectContext, root: string): Promise<string>;
8
+ export declare function runProjectCommand(command: readonly string[], cwd: string, signal?: AbortSignal): Promise<GenerateCommandResult>;
9
+ //# sourceMappingURL=generate-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-process.d.ts","sourceRoot":"","sources":["../src/generate-process.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,oBAAoB,CAuBtB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,oBAAoB,GAC1B,IAAI,CAUN;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAKpE;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,sBAAsB,EAC/B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,qBAAqB,CAAC,CAchC"}
@@ -0,0 +1,76 @@
1
+ import { access } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { CreateValidationError } from "./validate.js";
4
+ import { GenerateProjectError, } from "./generate.js";
5
+ export function generationError(error, fallback, cleanup) {
6
+ let failure;
7
+ if (error instanceof GenerateProjectError)
8
+ failure = error;
9
+ else if (error instanceof CreateValidationError)
10
+ failure = new GenerateProjectError(error.code, error.message);
11
+ else if (error instanceof Error && typeof error.code === "string")
12
+ failure = new GenerateProjectError(error.code, error.message);
13
+ else
14
+ failure = new GenerateProjectError(fallback, error instanceof Error ? error.message : String(error));
15
+ if (cleanup?.temporaryPath === undefined)
16
+ return failure;
17
+ const state = cleanup.removed ? "cleaned" : "retained";
18
+ return new GenerateProjectError(failure.code, `${failure.message} Temporary directory ${state}: ${cleanup.temporaryPath}.`, cleanup.temporaryPath);
19
+ }
20
+ export function injectGenerateFailure(context, point) {
21
+ try {
22
+ context.failAt?.(point);
23
+ }
24
+ catch (error) {
25
+ if (error instanceof GenerateProjectError)
26
+ throw error;
27
+ throw new GenerateProjectError(`RELKIT_CREATE_${point.toUpperCase()}_FAILED`, error instanceof Error ? error.message : `Injected ${point} failure.`);
28
+ }
29
+ }
30
+ export async function runProjectStep(context, command, cwd, step, point) {
31
+ throwIfAborted(context.signal);
32
+ injectGenerateFailure(context, point);
33
+ const result = await (context.commandRunner ?? runProjectCommand)(command, cwd, context.signal);
34
+ throwIfAborted(context.signal);
35
+ if (result.exitCode !== 0) {
36
+ const output = result.stderr?.trim() || result.stdout?.trim();
37
+ throw new GenerateProjectError(`RELKIT_CREATE_${step.toUpperCase()}_FAILED`, `${step} failed with exit code ${result.exitCode}.${output ? `\n${output}` : ""}`);
38
+ }
39
+ }
40
+ export function throwIfAborted(signal) {
41
+ if (signal?.aborted)
42
+ throw (signal.reason ?? new GenerateProjectError("RELKIT_INTERRUPTED", "Generation was interrupted."));
43
+ }
44
+ export async function resolveRelkitExecutable(context, root) {
45
+ if (context.relkitExecutable !== undefined)
46
+ return context.relkitExecutable;
47
+ if (context.commandRunner !== undefined)
48
+ return "relkit";
49
+ for (const candidate of [join(root, "node_modules/.bin/relkit"), Bun.which("relkit")]) {
50
+ if (candidate === null || candidate === undefined)
51
+ continue;
52
+ try {
53
+ await access(candidate);
54
+ return candidate;
55
+ }
56
+ catch { }
57
+ }
58
+ throw new GenerateProjectError("RELKIT_CREATE_CLI_UNAVAILABLE", "The relkit CLI is not available for project checks.");
59
+ }
60
+ export async function runProjectCommand(command, cwd, signal) {
61
+ const child = Bun.spawn([...command], { cwd, stdout: "pipe", stderr: "pipe" });
62
+ const abort = () => child.kill();
63
+ signal?.addEventListener("abort", abort, { once: true });
64
+ try {
65
+ const [stdout, stderr, exitCode] = await Promise.all([
66
+ new Response(child.stdout).text(),
67
+ new Response(child.stderr).text(),
68
+ child.exited,
69
+ ]);
70
+ return { exitCode, stdout, stderr };
71
+ }
72
+ finally {
73
+ signal?.removeEventListener("abort", abort);
74
+ }
75
+ }
76
+ //# sourceMappingURL=generate-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-process.js","sourceRoot":"","sources":["../src/generate-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { CreateOptions } from "./options.js";
2
+ import { type GenerateNextSteps } from "./generate-output.js";
3
+ export interface GenerateCommandResult {
4
+ readonly exitCode: number;
5
+ readonly stdout?: string;
6
+ readonly stderr?: string;
7
+ }
8
+ export type GenerateCommandRunner = (command: readonly string[], cwd: string, signal?: AbortSignal) => Promise<GenerateCommandResult>;
9
+ export type GenerateFailurePoint = "copy" | "substitute" | "install" | "git" | "doctor" | "check" | "rename";
10
+ export interface GenerateProjectContext {
11
+ readonly cwd?: string;
12
+ readonly templateRoot?: string;
13
+ readonly commandRunner?: GenerateCommandRunner;
14
+ readonly bunExecutable?: string;
15
+ readonly gitExecutable?: string;
16
+ readonly relkitExecutable?: string;
17
+ readonly signal?: AbortSignal;
18
+ readonly onProgress?: (message: string) => void;
19
+ readonly failAt?: (point: GenerateFailurePoint) => void;
20
+ }
21
+ export interface GenerateProjectResult {
22
+ readonly ok: true;
23
+ readonly command: "create";
24
+ readonly name: string;
25
+ readonly template: CreateOptions["template"];
26
+ readonly cloud: CreateOptions["cloud"];
27
+ readonly deploy: CreateOptions["deploy"];
28
+ readonly destination: string;
29
+ readonly files: readonly string[];
30
+ readonly installed: boolean;
31
+ readonly gitInitialized: boolean;
32
+ readonly nextSteps: GenerateNextSteps;
33
+ }
34
+ export declare class GenerateProjectError extends Error {
35
+ readonly code: string;
36
+ readonly exitCode = 1;
37
+ readonly temporaryPath: string | undefined;
38
+ constructor(code: string, message: string, temporaryPath?: string);
39
+ }
40
+ /** Copies, validates, checks, and atomically publishes one generated project. */
41
+ export declare function generateProject(options: CreateOptions, context?: GenerateProjectContext): Promise<GenerateProjectResult>;
42
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAiBlD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAEpC,MAAM,MAAM,oBAAoB,GAC9B,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;CACvC;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAK3C,QAAQ,CAAC,IAAI,EAAE,MAAM;IAJvB,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGhC,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM;CAMzB;AAED,iFAAiF;AACjF,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAiGhC"}
@@ -0,0 +1,103 @@
1
+ import { existsSync } from "node:fs";
2
+ import { mkdir, mkdtemp, rename } from "node:fs/promises";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { CreateValidationError, validateCreateOptions } from "./validate.js";
6
+ import { injectGenerateFailure, generationError, resolveRelkitExecutable, runProjectStep, throwIfAborted, } from "./generate-process.js";
7
+ import { copyTemplate, cleanupStagedProject, customizeProject, listProjectFiles, requireFiles, requireTemplate, } from "./generate-files.js";
8
+ import { createGenerateNextSteps } from "./generate-output.js";
9
+ const DIRECTORY_MODE = 0o755;
10
+ export class GenerateProjectError extends Error {
11
+ code;
12
+ exitCode = 1;
13
+ temporaryPath;
14
+ constructor(code, message, temporaryPath) {
15
+ super(message);
16
+ this.code = code;
17
+ this.temporaryPath = temporaryPath;
18
+ this.name = "GenerateProjectError";
19
+ }
20
+ }
21
+ /** Copies, validates, checks, and atomically publishes one generated project. */
22
+ export async function generateProject(options, context = {}) {
23
+ let validated;
24
+ try {
25
+ validated = validateCreateOptions(options, context.cwd === undefined ? {} : { cwd: context.cwd });
26
+ }
27
+ catch (error) {
28
+ throw generationError(error, "RELKIT_CREATE_VALIDATION_FAILED");
29
+ }
30
+ throwIfAborted(context.signal);
31
+ context.onProgress?.(`Creating a new RELKIT app in ${validated.destination}.`);
32
+ const templateRoot = resolveTemplateRoot(context);
33
+ const template = join(templateRoot, options.template);
34
+ let stage;
35
+ let published = false;
36
+ try {
37
+ await requireTemplate(template);
38
+ await mkdir(dirname(validated.destination), { recursive: true, mode: DIRECTORY_MODE });
39
+ const staged = await mkdtemp(join(dirname(validated.destination), `.${basename(validated.destination)}-relkit-`));
40
+ stage = staged;
41
+ injectGenerateFailure(context, "copy");
42
+ await copyTemplate(template, staged);
43
+ injectGenerateFailure(context, "substitute");
44
+ await customizeProject(staged, options);
45
+ await requireFiles(staged, [
46
+ "package.json",
47
+ "relkit.config.ts",
48
+ "src/env.ts",
49
+ ".env.example",
50
+ ".gitignore",
51
+ ]);
52
+ if (options.install) {
53
+ context.onProgress?.("Installing dependencies...");
54
+ await runProjectStep(context, [context.bunExecutable ?? process.execPath, "install"], staged, "install", "install");
55
+ }
56
+ const git = context.gitExecutable ?? (context.commandRunner ? "git" : Bun.which("git"));
57
+ const gitInitialized = options.git && git !== null;
58
+ if (gitInitialized) {
59
+ context.onProgress?.("Initializing Git repository...");
60
+ await runProjectStep(context, [git, "init"], staged, "git", "git");
61
+ }
62
+ const relkit = await resolveRelkitExecutable(context, staged);
63
+ const deploymentCheck = options.cloud === "none" || options.deploy === "none";
64
+ context.onProgress?.("Checking generated project...");
65
+ await runProjectStep(context, [relkit, "doctor", "--project-root", staged, ...(deploymentCheck ? ["--no-pulumi"] : [])], staged, "doctor", "doctor");
66
+ await runProjectStep(context, [relkit, "check", "--project-root", staged], staged, "check", "check");
67
+ throwIfAborted(context.signal);
68
+ injectGenerateFailure(context, "rename");
69
+ await rename(staged, validated.destination);
70
+ published = true;
71
+ return Object.freeze({
72
+ ok: true,
73
+ command: "create",
74
+ name: options.name,
75
+ template: options.template,
76
+ cloud: options.cloud,
77
+ deploy: options.deploy,
78
+ destination: validated.destination,
79
+ files: Object.freeze(await listProjectFiles(validated.destination)),
80
+ installed: options.install,
81
+ gitInitialized,
82
+ nextSteps: createGenerateNextSteps(options, validated.destination, context.cwd),
83
+ });
84
+ }
85
+ catch (error) {
86
+ const cleanup = published
87
+ ? undefined
88
+ : await cleanupStagedProject(stage, validated.destination);
89
+ throw generationError(error, "RELKIT_CREATE_FAILED", cleanup);
90
+ }
91
+ }
92
+ function resolveTemplateRoot(context) {
93
+ if (context.templateRoot !== undefined)
94
+ return resolve(context.templateRoot);
95
+ const packaged = fileURLToPath(new URL("./templates/default/v1", import.meta.url));
96
+ if (existsSync(packaged))
97
+ return resolve(packaged);
98
+ const source = fileURLToPath(new URL("../../../templates/default/v1", import.meta.url));
99
+ if (existsSync(source))
100
+ return resolve(source);
101
+ return resolve(context.cwd ?? process.cwd(), "templates/default/v1");
102
+ }
103
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bun
2
+ export * from "./options.js";
3
+ export * from "./validate.js";
4
+ export * from "./generate.js";
5
+ export * from "./generate-output.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAKA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bun
2
+ import { generateProject } from "./generate.js";
3
+ import { formatGenerateResult } from "./generate-output.js";
4
+ import { normalizeCreateOptions } from "./options.js";
5
+ export * from "./options.js";
6
+ export * from "./validate.js";
7
+ export * from "./generate.js";
8
+ export * from "./generate-output.js";
9
+ if (import.meta.main) {
10
+ try {
11
+ const options = normalizeCreateOptions(process.argv.slice(2));
12
+ const result = await generateProject(options, {
13
+ ...(options.json
14
+ ? {}
15
+ : { onProgress: (message) => process.stderr.write(`${message}\n`) }),
16
+ });
17
+ process.stdout.write(`${options.json ? JSON.stringify(result) : formatGenerateResult(result)}\n`);
18
+ }
19
+ catch (error) {
20
+ const code = error instanceof Error && "code" in error && typeof error.code === "string"
21
+ ? error.code
22
+ : "RELKIT_CREATE_FAILED";
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ const json = process.argv.includes("--json");
25
+ const output = json
26
+ ? JSON.stringify({ ok: false, error: { code, message } })
27
+ : `${code}: ${message}`;
28
+ (json ? process.stdout : process.stderr).write(`${output}\n`);
29
+ process.exitCode = code === "RELKIT_CREATE_USAGE" ? 2 : 1;
30
+ }
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AAErC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;YAC5C,GAAG,CAAC,OAAO,CAAC,IAAI;gBACd,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;SAC/E,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GACR,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YACzE,CAAC,CAAC,KAAK,CAAC,IAAI;YACZ,CAAC,CAAC,sBAAsB,CAAC;QAC7B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI;YACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;YACzD,CAAC,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ export declare const CREATE_TEMPLATES: readonly ["minimal", "api", "agent"];
2
+ export type CreateTemplate = (typeof CREATE_TEMPLATES)[number];
3
+ export declare const CREATE_CLOUDS: readonly ["aws", "none"];
4
+ export type CreateCloud = (typeof CREATE_CLOUDS)[number];
5
+ export declare const CREATE_DEPLOYMENTS: readonly ["pulumi", "none"];
6
+ export type CreateDeployment = (typeof CREATE_DEPLOYMENTS)[number];
7
+ export declare const CREATE_OPTION_DEFAULTS: Readonly<{
8
+ template: CreateTemplate;
9
+ cloud: CreateCloud;
10
+ deploy: CreateDeployment;
11
+ install: boolean;
12
+ git: boolean;
13
+ examples: boolean;
14
+ forceEmptyDirectory: boolean;
15
+ json: boolean;
16
+ }>;
17
+ export interface CreateOptions {
18
+ readonly name: string;
19
+ readonly template: CreateTemplate;
20
+ readonly cloud: CreateCloud;
21
+ readonly deploy: CreateDeployment;
22
+ readonly install: boolean;
23
+ readonly git: boolean;
24
+ readonly examples: boolean;
25
+ readonly directory?: string;
26
+ readonly forceEmptyDirectory: boolean;
27
+ readonly json: boolean;
28
+ }
29
+ export interface CreateOptionsContext {
30
+ readonly json?: boolean;
31
+ }
32
+ export declare class CreateOptionsError extends Error {
33
+ readonly code: "RELKIT_CREATE_USAGE";
34
+ constructor(message: string);
35
+ }
36
+ /** Parses the non-interactive create flags and applies the v3 defaults. */
37
+ export declare function normalizeCreateOptions(args: readonly string[], context?: CreateOptionsContext): CreateOptions;
38
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,sCAAuC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,aAAa,0BAA2B,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,eAAO,MAAM,kBAAkB,6BAA8B,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,eAAO,MAAM,sBAAsB;cACV,cAAc;WACrB,WAAW;YACP,gBAAgB;aACnB,OAAO;SACX,OAAO;cACF,OAAO;yBACK,OAAO;UACtB,OAAO;EACtB,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBAEnC,OAAO,EAAE,MAAM;CAI5B;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,aAAa,CAyDf"}