create-relkit 0.4.0 → 0.5.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 (277) hide show
  1. package/dist/add-name.d.ts +9 -0
  2. package/dist/add-name.d.ts.map +1 -0
  3. package/dist/add-name.js +18 -0
  4. package/dist/add-name.js.map +1 -0
  5. package/dist/add-options-parser.d.ts +21 -0
  6. package/dist/add-options-parser.d.ts.map +1 -0
  7. package/dist/add-options-parser.js +103 -0
  8. package/dist/add-options-parser.js.map +1 -0
  9. package/dist/add-options-resource.d.ts +5 -0
  10. package/dist/add-options-resource.d.ts.map +1 -0
  11. package/dist/add-options-resource.js +18 -0
  12. package/dist/add-options-resource.js.map +1 -0
  13. package/dist/add-options.d.ts +6 -0
  14. package/dist/add-options.d.ts.map +1 -0
  15. package/dist/add-options.js +165 -0
  16. package/dist/add-options.js.map +1 -0
  17. package/dist/add-output.d.ts +4 -0
  18. package/dist/add-output.d.ts.map +1 -0
  19. package/dist/add-output.js +33 -0
  20. package/dist/add-output.js.map +1 -0
  21. package/dist/add-plan.d.ts +4 -0
  22. package/dist/add-plan.d.ts.map +1 -0
  23. package/dist/add-plan.js +62 -0
  24. package/dist/add-plan.js.map +1 -0
  25. package/dist/add-resolution-discovery.d.ts +13 -0
  26. package/dist/add-resolution-discovery.d.ts.map +1 -0
  27. package/dist/add-resolution-discovery.js +70 -0
  28. package/dist/add-resolution-discovery.js.map +1 -0
  29. package/dist/add-resolution-state.d.ts +23 -0
  30. package/dist/add-resolution-state.d.ts.map +1 -0
  31. package/dist/add-resolution-state.js +89 -0
  32. package/dist/add-resolution-state.js.map +1 -0
  33. package/dist/add-resolver-domain.d.ts +4 -0
  34. package/dist/add-resolver-domain.d.ts.map +1 -0
  35. package/dist/add-resolver-domain.js +150 -0
  36. package/dist/add-resolver-domain.js.map +1 -0
  37. package/dist/add-resolver-platform.d.ts +4 -0
  38. package/dist/add-resolver-platform.d.ts.map +1 -0
  39. package/dist/add-resolver-platform.js +112 -0
  40. package/dist/add-resolver-platform.js.map +1 -0
  41. package/dist/add-resolver-resources.d.ts +4 -0
  42. package/dist/add-resolver-resources.d.ts.map +1 -0
  43. package/dist/add-resolver-resources.js +150 -0
  44. package/dist/add-resolver-resources.js.map +1 -0
  45. package/dist/add-resolver.d.ts +14 -0
  46. package/dist/add-resolver.d.ts.map +1 -0
  47. package/dist/add-resolver.js +41 -0
  48. package/dist/add-resolver.js.map +1 -0
  49. package/dist/add-transaction-files.d.ts +12 -0
  50. package/dist/add-transaction-files.d.ts.map +1 -0
  51. package/dist/add-transaction-files.js +103 -0
  52. package/dist/add-transaction-files.js.map +1 -0
  53. package/dist/add-transaction.d.ts +17 -0
  54. package/dist/add-transaction.d.ts.map +1 -0
  55. package/dist/add-transaction.js +115 -0
  56. package/dist/add-transaction.js.map +1 -0
  57. package/dist/add-types.d.ts +136 -0
  58. package/dist/add-types.d.ts.map +1 -0
  59. package/dist/add-types.js +41 -0
  60. package/dist/add-types.js.map +1 -0
  61. package/dist/bucket-profiles.d.ts +4 -0
  62. package/dist/bucket-profiles.d.ts.map +1 -0
  63. package/dist/bucket-profiles.js +18 -0
  64. package/dist/bucket-profiles.js.map +1 -0
  65. package/dist/create-additions.d.ts +7 -0
  66. package/dist/create-additions.d.ts.map +1 -0
  67. package/dist/create-additions.js +27 -0
  68. package/dist/create-additions.js.map +1 -0
  69. package/dist/create-preview.d.ts +12 -0
  70. package/dist/create-preview.d.ts.map +1 -0
  71. package/dist/create-preview.js +50 -0
  72. package/dist/create-preview.js.map +1 -0
  73. package/dist/create-resolver.d.ts +14 -0
  74. package/dist/create-resolver.d.ts.map +1 -0
  75. package/dist/create-resolver.js +96 -0
  76. package/dist/create-resolver.js.map +1 -0
  77. package/dist/domain-planning.d.ts +24 -0
  78. package/dist/domain-planning.d.ts.map +1 -0
  79. package/dist/domain-planning.js +94 -0
  80. package/dist/domain-planning.js.map +1 -0
  81. package/dist/generate-files-utilities.d.ts +18 -0
  82. package/dist/generate-files-utilities.d.ts.map +1 -0
  83. package/dist/generate-files-utilities.js +87 -0
  84. package/dist/generate-files-utilities.js.map +1 -0
  85. package/dist/generate-files.d.ts +1 -12
  86. package/dist/generate-files.d.ts.map +1 -1
  87. package/dist/generate-files.js +38 -89
  88. package/dist/generate-files.js.map +1 -1
  89. package/dist/generate-output.d.ts +2 -1
  90. package/dist/generate-output.d.ts.map +1 -1
  91. package/dist/generate-output.js +9 -0
  92. package/dist/generate-output.js.map +1 -1
  93. package/dist/generate-process.d.ts +1 -1
  94. package/dist/generate-process.d.ts.map +1 -1
  95. package/dist/generate-process.js +7 -3
  96. package/dist/generate-process.js.map +1 -1
  97. package/dist/generate-types.d.ts +46 -0
  98. package/dist/generate-types.d.ts.map +1 -0
  99. package/dist/generate-types.js +20 -0
  100. package/dist/generate-types.js.map +1 -0
  101. package/dist/generate.d.ts +1 -38
  102. package/dist/generate.d.ts.map +1 -1
  103. package/dist/generate.js +34 -39
  104. package/dist/generate.js.map +1 -1
  105. package/dist/index.d.ts +18 -0
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +79 -9
  108. package/dist/index.js.map +1 -1
  109. package/dist/options.d.ts +5 -1
  110. package/dist/options.d.ts.map +1 -1
  111. package/dist/options.js +10 -1
  112. package/dist/options.js.map +1 -1
  113. package/dist/plan-builder.d.ts +33 -0
  114. package/dist/plan-builder.d.ts.map +1 -0
  115. package/dist/plan-builder.js +139 -0
  116. package/dist/plan-builder.js.map +1 -0
  117. package/dist/plan-manifest.d.ts +6 -0
  118. package/dist/plan-manifest.d.ts.map +1 -0
  119. package/dist/plan-manifest.js +40 -0
  120. package/dist/plan-manifest.js.map +1 -0
  121. package/dist/project-discovery-app.d.ts +7 -0
  122. package/dist/project-discovery-app.d.ts.map +1 -0
  123. package/dist/project-discovery-app.js +122 -0
  124. package/dist/project-discovery-app.js.map +1 -0
  125. package/dist/project-discovery-database.d.ts +11 -0
  126. package/dist/project-discovery-database.d.ts.map +1 -0
  127. package/dist/project-discovery-database.js +46 -0
  128. package/dist/project-discovery-database.js.map +1 -0
  129. package/dist/project-discovery-types.d.ts +45 -0
  130. package/dist/project-discovery-types.d.ts.map +1 -0
  131. package/dist/project-discovery-types.js +2 -0
  132. package/dist/project-discovery-types.js.map +1 -0
  133. package/dist/project-discovery.d.ts +4 -0
  134. package/dist/project-discovery.d.ts.map +1 -0
  135. package/dist/project-discovery.js +152 -0
  136. package/dist/project-discovery.js.map +1 -0
  137. package/dist/prompt-driver.d.ts +32 -0
  138. package/dist/prompt-driver.d.ts.map +1 -0
  139. package/dist/prompt-driver.js +42 -0
  140. package/dist/prompt-driver.js.map +1 -0
  141. package/dist/provider-planning-definitions.d.ts +35 -0
  142. package/dist/provider-planning-definitions.d.ts.map +1 -0
  143. package/dist/provider-planning-definitions.js +109 -0
  144. package/dist/provider-planning-definitions.js.map +1 -0
  145. package/dist/provider-planning.d.ts +11 -0
  146. package/dist/provider-planning.d.ts.map +1 -0
  147. package/dist/provider-planning.js +131 -0
  148. package/dist/provider-planning.js.map +1 -0
  149. package/dist/render-ai-sources.d.ts +18 -0
  150. package/dist/render-ai-sources.d.ts.map +1 -0
  151. package/dist/render-ai-sources.js +49 -0
  152. package/dist/render-ai-sources.js.map +1 -0
  153. package/dist/render-ai.d.ts +11 -0
  154. package/dist/render-ai.d.ts.map +1 -0
  155. package/dist/render-ai.js +61 -0
  156. package/dist/render-ai.js.map +1 -0
  157. package/dist/render-auth-schema.d.ts +3 -0
  158. package/dist/render-auth-schema.d.ts.map +1 -0
  159. package/dist/render-auth-schema.js +85 -0
  160. package/dist/render-auth-schema.js.map +1 -0
  161. package/dist/render-auth-sources.d.ts +3 -0
  162. package/dist/render-auth-sources.d.ts.map +1 -0
  163. package/dist/render-auth-sources.js +17 -0
  164. package/dist/render-auth-sources.js.map +1 -0
  165. package/dist/render-auth.d.ts +6 -0
  166. package/dist/render-auth.d.ts.map +1 -0
  167. package/dist/render-auth.js +84 -0
  168. package/dist/render-auth.js.map +1 -0
  169. package/dist/render-database-sources.d.ts +5 -0
  170. package/dist/render-database-sources.d.ts.map +1 -0
  171. package/dist/render-database-sources.js +65 -0
  172. package/dist/render-database-sources.js.map +1 -0
  173. package/dist/render-database.d.ts +13 -0
  174. package/dist/render-database.d.ts.map +1 -0
  175. package/dist/render-database.js +40 -0
  176. package/dist/render-database.js.map +1 -0
  177. package/dist/render-domain-register.d.ts +4 -0
  178. package/dist/render-domain-register.d.ts.map +1 -0
  179. package/dist/render-domain-register.js +11 -0
  180. package/dist/render-domain-register.js.map +1 -0
  181. package/dist/render-domain-sources.d.ts +19 -0
  182. package/dist/render-domain-sources.d.ts.map +1 -0
  183. package/dist/render-domain-sources.js +132 -0
  184. package/dist/render-domain-sources.js.map +1 -0
  185. package/dist/render-domain.d.ts +26 -0
  186. package/dist/render-domain.d.ts.map +1 -0
  187. package/dist/render-domain.js +98 -0
  188. package/dist/render-domain.js.map +1 -0
  189. package/dist/render-resource-sources.d.ts +4 -0
  190. package/dist/render-resource-sources.d.ts.map +1 -0
  191. package/dist/render-resource-sources.js +31 -0
  192. package/dist/render-resource-sources.js.map +1 -0
  193. package/dist/render-resources.d.ts +11 -0
  194. package/dist/render-resources.d.ts.map +1 -0
  195. package/dist/render-resources.js +53 -0
  196. package/dist/render-resources.js.map +1 -0
  197. package/dist/render-route-sources.d.ts +6 -0
  198. package/dist/render-route-sources.d.ts.map +1 -0
  199. package/dist/render-route-sources.js +35 -0
  200. package/dist/render-route-sources.js.map +1 -0
  201. package/dist/render-routes.d.ts +13 -0
  202. package/dist/render-routes.d.ts.map +1 -0
  203. package/dist/render-routes.js +48 -0
  204. package/dist/render-routes.js.map +1 -0
  205. package/dist/render-service.d.ts +6 -0
  206. package/dist/render-service.d.ts.map +1 -0
  207. package/dist/render-service.js +124 -0
  208. package/dist/render-service.js.map +1 -0
  209. package/dist/scaffold-catalog.d.ts +75 -0
  210. package/dist/scaffold-catalog.d.ts.map +1 -0
  211. package/dist/scaffold-catalog.js +24 -0
  212. package/dist/scaffold-catalog.js.map +1 -0
  213. package/dist/source-edit.d.ts +10 -0
  214. package/dist/source-edit.d.ts.map +1 -0
  215. package/dist/source-edit.js +136 -0
  216. package/dist/source-edit.js.map +1 -0
  217. package/dist/source-import-edit.d.ts +3 -0
  218. package/dist/source-import-edit.d.ts.map +1 -0
  219. package/dist/source-import-edit.js +52 -0
  220. package/dist/source-import-edit.js.map +1 -0
  221. package/dist/template-root.d.ts +5 -0
  222. package/dist/template-root.d.ts.map +1 -0
  223. package/dist/template-root.js +15 -0
  224. package/dist/template-root.js.map +1 -0
  225. package/dist/templates/default/README.md +1 -1
  226. package/dist/templates/default/v1/agent/.env.example +0 -2
  227. package/dist/templates/default/v1/agent/README.md +7 -8
  228. package/dist/templates/default/v1/agent/package.json +6 -4
  229. package/dist/templates/default/v1/agent/relkit.config.ts +5 -15
  230. package/dist/templates/default/v1/agent/src/hello/agents/assistant.agent.ts +37 -4
  231. package/dist/templates/default/v1/agent/src/hello/agents/review.agent.ts +43 -0
  232. package/dist/templates/default/v1/agent/src/platform/env.ts +0 -2
  233. package/dist/templates/default/v1/agent/tests/integration/hello.route.test.ts +17 -6
  234. package/dist/templates/default/v1/agent/tests/unit/assistant.agent.test.ts +14 -36
  235. package/dist/templates/default/v1/agent/tests/unit/review.agent.test.ts +19 -0
  236. package/dist/templates/default/v1/api/package.json +3 -3
  237. package/dist/templates/default/v1/fullstack/.env.example +1 -0
  238. package/dist/templates/default/v1/fullstack/README.md +15 -0
  239. package/dist/templates/default/v1/fullstack/gitignore +4 -0
  240. package/dist/templates/default/v1/fullstack/package.json +35 -0
  241. package/dist/templates/default/v1/fullstack/relkit.config.ts +15 -0
  242. package/dist/templates/default/v1/fullstack/src/hello/agents/assistant.agent.ts +46 -0
  243. package/dist/templates/default/v1/fullstack/src/hello/agents/review.agent.ts +43 -0
  244. package/dist/templates/default/v1/fullstack/src/hello/functions/hello.function.ts +10 -0
  245. package/dist/templates/default/v1/fullstack/src/hello/service.ts +4 -0
  246. package/dist/templates/default/v1/fullstack/src/hello/tools/lookup.tool.ts +9 -0
  247. package/dist/templates/default/v1/fullstack/src/platform/env.ts +5 -0
  248. package/dist/templates/default/v1/fullstack/src/routes/hello/route.ts +4 -0
  249. package/dist/templates/default/v1/fullstack/tests/integration/hello.route.test.ts +29 -0
  250. package/dist/templates/default/v1/fullstack/tests/unit/assistant.agent.test.ts +18 -0
  251. package/dist/templates/default/v1/fullstack/tests/unit/hello.function.test.ts +7 -0
  252. package/dist/templates/default/v1/fullstack/tests/unit/review.agent.test.ts +19 -0
  253. package/dist/templates/default/v1/fullstack/tsconfig.json +21 -0
  254. package/dist/templates/default/v1/fullstack/web/app/agent-config.ts +7 -0
  255. package/dist/templates/default/v1/fullstack/web/app/layout.tsx +12 -0
  256. package/dist/templates/default/v1/fullstack/web/app/page.tsx +85 -0
  257. package/dist/templates/default/v1/fullstack/web/app/providers.tsx +29 -0
  258. package/dist/templates/default/v1/fullstack/web/next-env.d.ts +2 -0
  259. package/dist/templates/default/v1/fullstack/web/next.config.ts +5 -0
  260. package/dist/templates/default/v1/fullstack/web/tsconfig.json +10 -0
  261. package/dist/templates/default/v1/minimal/package.json +3 -3
  262. package/dist/templates/default/v1/tasks/.env.example +2 -0
  263. package/dist/templates/default/v1/tasks/README.md +15 -0
  264. package/dist/templates/default/v1/tasks/examples/export-orders.json +1 -0
  265. package/dist/templates/default/v1/tasks/gitignore +10 -0
  266. package/dist/templates/default/v1/tasks/package.json +24 -0
  267. package/dist/templates/default/v1/tasks/relkit.config.ts +11 -0
  268. package/dist/templates/default/v1/tasks/src/orders/functions/health.function.ts +9 -0
  269. package/dist/templates/default/v1/tasks/src/orders/jobs/export-orders.job.ts +15 -0
  270. package/dist/templates/default/v1/tasks/src/orders/service.ts +10 -0
  271. package/dist/templates/default/v1/tasks/src/orders/tasks/export-orders.task.ts +19 -0
  272. package/dist/templates/default/v1/tasks/src/platform/env.ts +3 -0
  273. package/dist/templates/default/v1/tasks/src/routes/health/route.ts +4 -0
  274. package/dist/templates/default/v1/tasks/tests/unit/export-orders.task.test.ts +7 -0
  275. package/dist/templates/default/v1/tasks/tsconfig.json +14 -0
  276. package/package.json +6 -1
  277. package/dist/templates/default/v1/agent/src/hello/functions/ask-assistant.function.ts +0 -16
@@ -0,0 +1,50 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { EXAMPLE_PATH_PREFIXES, listProjectFiles } from "./generate-files.js";
4
+ import { readAppDiscovery } from "./project-discovery-app.js";
5
+ import { validateCreateOptions } from "./validate.js";
6
+ import { resolveTemplateRoot } from "./template-root.js";
7
+ export async function planCreate(options, context = {}) {
8
+ const validated = validateCreateOptions(options, context.cwd === undefined ? {} : { cwd: context.cwd });
9
+ const root = join(resolveTemplateRoot(context), options.jobs === undefined ? options.template : "tasks");
10
+ const manifest = JSON.parse(await readFile(join(root, "package.json"), "utf8"));
11
+ const dependencies = { ...manifest.dependencies, ...manifest.devDependencies };
12
+ const version = dependencies["@relkit/app"] ?? "0.4.0";
13
+ if (options.cloud === "aws")
14
+ dependencies["@relkit/aws"] = version;
15
+ if (options.deploy === "pulumi")
16
+ dependencies["@relkit/pulumi"] = version;
17
+ if (options.jobs !== undefined) {
18
+ dependencies["@relkit/docker"] = version;
19
+ dependencies[`@relkit/${options.jobs.replace(/-docker$/u, "")}`] = version;
20
+ }
21
+ const configPath = join(root, "relkit.config.ts");
22
+ const app = readAppDiscovery(await readFile(configPath, "utf8"), configPath, root);
23
+ const files = (await listProjectFiles(root))
24
+ .map((path) => (path === "gitignore" ? ".gitignore" : path))
25
+ .filter((path) => options.examples ||
26
+ !EXAMPLE_PATH_PREFIXES.some((prefix) => path === prefix || path.startsWith(`${prefix}/`)));
27
+ return Object.freeze({
28
+ destination: validated.destination,
29
+ files: Object.freeze(files),
30
+ dependencies: Object.freeze(Object.fromEntries(Object.entries(dependencies).sort())),
31
+ profiles: Object.freeze(app.profiles.map((profile) => `${profile.capability}:${profile.name}`)),
32
+ warnings: Object.freeze([]),
33
+ });
34
+ }
35
+ export function formatCreatePlan(plan) {
36
+ return [
37
+ `Destination: ${plan.destination}`,
38
+ "Files:",
39
+ ...plan.files.map((path) => ` ${path}`),
40
+ "Dependencies:",
41
+ ...Object.entries(plan.dependencies).map(([name, version]) => ` ${name}@${version}`),
42
+ ...(plan.profiles.length
43
+ ? ["Profiles:", ...plan.profiles.map((profile) => ` ${profile}`)]
44
+ : []),
45
+ ...(plan.warnings.length
46
+ ? ["Warnings:", ...plan.warnings.map((warning) => ` ${warning}`)]
47
+ : []),
48
+ ].join("\n");
49
+ }
50
+ //# sourceMappingURL=create-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-preview.js","sourceRoot":"","sources":["../src/create-preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type CreateOptions } from "./options.js";
2
+ import { type PromptDriver } from "./prompt-driver.js";
3
+ export interface ResolveCreateContext {
4
+ readonly json?: boolean;
5
+ readonly interactive?: boolean;
6
+ readonly promptDriver?: PromptDriver;
7
+ }
8
+ export interface ResolvedCreateOptions {
9
+ readonly options: CreateOptions;
10
+ readonly prompted: boolean;
11
+ }
12
+ export declare function resolveCreateOptions(args: readonly string[], context?: ResolveCreateContext): Promise<CreateOptions>;
13
+ export declare function resolveCreateOptionsDetails(args: readonly string[], context?: ResolveCreateContext): Promise<ResolvedCreateOptions>;
14
+ //# sourceMappingURL=create-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-resolver.d.ts","sourceRoot":"","sources":["../src/create-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKhF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAkFhC"}
@@ -0,0 +1,96 @@
1
+ import { CREATE_CLOUDS, CREATE_DEPLOYMENTS, CREATE_JOBS, CREATE_TEMPLATES, normalizeCreateOptions, } from "./options.js";
2
+ import { createClackPromptDriver } from "./prompt-driver.js";
3
+ import { isValidPackageName } from "./validate.js";
4
+ const VALUE_OPTIONS = new Set(["template", "cloud", "deploy", "jobs", "directory"]);
5
+ export async function resolveCreateOptions(args, context = {}) {
6
+ return (await resolveCreateOptionsDetails(args, context)).options;
7
+ }
8
+ export async function resolveCreateOptionsDetails(args, context = {}) {
9
+ if (context.interactive !== true) {
10
+ return {
11
+ options: normalizeCreateOptions(args, context.json === undefined ? {} : { json: context.json }),
12
+ prompted: false,
13
+ };
14
+ }
15
+ const prompt = context.promptDriver ?? createClackPromptDriver("RELKIT_CREATE_CANCELLED");
16
+ const output = [...args];
17
+ const complete = Boolean(positional(output)) &&
18
+ ["template", "cloud", "deploy", "jobs", "directory"].every((name) => has(output, name)) &&
19
+ ["examples", "install", "git"].every((name) => has(output, name) || has(output, `no-${name}`));
20
+ let name = positional(output);
21
+ if (!name) {
22
+ name = await prompt.text({
23
+ message: "Project name",
24
+ validate: (value) => isValidPackageName(value) ? undefined : "Use a valid npm package name.",
25
+ });
26
+ output.unshift(name);
27
+ }
28
+ if (!has(output, "template"))
29
+ output.push("--template", await prompt.select({
30
+ message: "Starter template",
31
+ options: CREATE_TEMPLATES.map((value) => ({ value, label: title(value) })),
32
+ initialValue: "minimal",
33
+ }));
34
+ if (!has(output, "cloud"))
35
+ output.push("--cloud", await prompt.select({
36
+ message: "Cloud provider",
37
+ options: CREATE_CLOUDS.map((value) => ({ value, label: title(value) })),
38
+ initialValue: "none",
39
+ }));
40
+ if (!has(output, "deploy"))
41
+ output.push("--deploy", await prompt.select({
42
+ message: "Deployment adapter",
43
+ options: CREATE_DEPLOYMENTS.map((value) => ({ value, label: title(value) })),
44
+ initialValue: "none",
45
+ }));
46
+ if (!has(output, "jobs")) {
47
+ const selected = await prompt.select({
48
+ message: "Jobs service",
49
+ options: [
50
+ { value: "none", label: "None" },
51
+ ...CREATE_JOBS.map((value) => ({ value, label: title(value) })),
52
+ ],
53
+ initialValue: "none",
54
+ });
55
+ if (selected !== "none")
56
+ output.push("--jobs", selected);
57
+ }
58
+ await booleanChoice(output, prompt, "examples", "Include examples?", true);
59
+ await booleanChoice(output, prompt, "install", "Install dependencies?", true);
60
+ await booleanChoice(output, prompt, "git", "Initialize a Git repository?", true);
61
+ if (!has(output, "directory"))
62
+ output.push("--directory", await prompt.text({
63
+ message: "Destination",
64
+ initialValue: name,
65
+ validate: (value) => (value?.trim() ? undefined : "A destination is required."),
66
+ }));
67
+ return {
68
+ options: normalizeCreateOptions(output, context.json === undefined ? {} : { json: context.json }),
69
+ prompted: !complete,
70
+ };
71
+ }
72
+ async function booleanChoice(args, prompt, name, message, initialValue) {
73
+ if (has(args, name) || has(args, `no-${name}`))
74
+ return;
75
+ args.push(`--${(await prompt.confirm({ message, initialValue })) ? name : `no-${name}`}`);
76
+ }
77
+ function has(args, name) {
78
+ return args.some((value) => value === `--${name}` || value.startsWith(`--${name}=`));
79
+ }
80
+ function positional(args) {
81
+ for (let index = 0; index < args.length; index += 1) {
82
+ const value = args[index];
83
+ if (value.startsWith("--")) {
84
+ const name = value.slice(2).split("=", 1)[0];
85
+ if (!value.includes("=") && VALUE_OPTIONS.has(name))
86
+ index += 1;
87
+ }
88
+ else
89
+ return value;
90
+ }
91
+ return undefined;
92
+ }
93
+ function title(value) {
94
+ return value.replace(/^./, (character) => character.toUpperCase());
95
+ }
96
+ //# sourceMappingURL=create-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-resolver.js","sourceRoot":"","sources":["../src/create-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,uBAAuB,EAAqB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAapF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAuB,EACvB,UAAgC,EAAE;IAElC,OAAO,CAAC,MAAM,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAuB,EACvB,UAAgC,EAAE;IAElC,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,sBAAsB,CAC7B,IAAI,EACJ,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CACzD;YACD,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,uBAAuB,CAAC,yBAAyB,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB,MAAM,QAAQ,GACZ,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvF,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;IACjG,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B;SAC1E,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;QAC1B,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1E,YAAY,EAAE,SAAS;SACxB,CAAC,CACH,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;QACvB,MAAM,CAAC,IAAI,CACT,SAAS,EACT,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvE,YAAY,EAAE,MAAM;SACrB,CAAC,CACH,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,UAAU,EACV,MAAM,MAAM,CAAC,MAAM,CAAC;YAClB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5E,YAAY,EAAE,MAAM;SACrB,CAAC,CACH,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAChC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;aAChE;YACD,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,IAAI,QAAQ,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC3E,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,CAAC,CAAC;IACjF,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;QAC3B,MAAM,CAAC,IAAI,CACT,aAAa,EACb,MAAM,MAAM,CAAC,IAAI,CAAC;YAChB,OAAO,EAAE,aAAa;YACtB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC;SAChF,CAAC,CACH,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,sBAAsB,CAC7B,MAAM,EACN,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CACzD;QACD,QAAQ,EAAE,CAAC,QAAQ;KACpB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAc,EACd,MAAoB,EACpB,IAAoC,EACpC,OAAe,EACf,YAAqB;IAErB,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;QAAE,OAAO;IACvD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,GAAG,CAAC,IAAuB,EAAE,IAAY;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,UAAU,CAAC,IAAuB;IACzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QAClE,CAAC;;YAAM,OAAO,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type NormalizedArtifactName } from "./add-name.js";
2
+ import { PlanBuilder } from "./plan-builder.js";
3
+ import type { DiscoveredArtifact, DiscoveredService } from "./project-discovery-types.js";
4
+ export interface DomainTarget {
5
+ readonly domain: NormalizedArtifactName;
6
+ readonly servicePath: string;
7
+ readonly service: DiscoveredService | undefined;
8
+ }
9
+ export interface DomainArtifact {
10
+ readonly name: NormalizedArtifactName;
11
+ readonly path: string;
12
+ readonly id: string;
13
+ readonly binding: string;
14
+ readonly exportKind: "default" | "named";
15
+ }
16
+ export declare function resolveDomain(builder: PlanBuilder): Promise<DomainTarget>;
17
+ export declare function addPublicMember(builder: PlanBuilder, target: DomainTarget, category: "functions" | "events" | "tasks" | "jobs", artifact: DomainArtifact, artifactPath: string): Promise<void>;
18
+ export declare function domainArtifact(target: DomainTarget, value: string, directory: string, fileSuffix: string, kindSuffix?: string, exportKind?: "default" | "named"): DomainArtifact;
19
+ export declare function resolveArtifact(builder: PlanBuilder, target: DomainTarget, kind: DiscoveredArtifact["kind"], value: string): DiscoveredArtifact;
20
+ export declare function assertAvailableId(builder: PlanBuilder, id: string): void;
21
+ export declare function sourceModule(path: string): string;
22
+ export declare function sourceImport(binding: string, module: string, exportKind: "default" | "named" | undefined): string;
23
+ export declare function serviceSource(domain: NormalizedArtifactName): string;
24
+ //# sourceMappingURL=domain-planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-planning.d.ts","sourceRoot":"","sources":["../src/domain-planning.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAG1F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;CAC1C;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAqC/E;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,EACnD,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,GAAE,SAAS,GAAG,OAAmB,GAC1C,cAAc,CAUhB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAChC,KAAK,EAAE,MAAM,GACZ,kBAAkB,CAgBpB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAIxE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAC1C,MAAM,CAIR;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,94 @@
1
+ import { ADD_FAILURE_CODES, AddScaffoldError } from "./add-types.js";
2
+ import { normalizeArtifactName } from "./add-name.js";
3
+ import { PlanBuilder } from "./plan-builder.js";
4
+ import { addFactoryObjectMember, addSourceImport } from "./source-edit.js";
5
+ export async function resolveDomain(builder) {
6
+ const request = builder.request;
7
+ if (request.service && request.createService)
8
+ usage("--service and --create-service are exclusive.");
9
+ if (request.createService) {
10
+ const domain = normalizeArtifactName(request.createService);
11
+ if (builder.discovery.services.some((service) => service.domain === domain.fileStem)) {
12
+ collision(`Service ${domain.fileStem} already exists.`);
13
+ }
14
+ const servicePath = `src/${domain.fileStem}/service.ts`;
15
+ await builder.create(servicePath, serviceSource(domain));
16
+ return { domain, servicePath, service: undefined };
17
+ }
18
+ const generic = builder.discovery.services.filter((service) => service.capability === "generic");
19
+ const selected = request.service
20
+ ? generic.find((service) => [service.domain, service.binding].includes(normalizeArtifactName(request.service).fileStem))
21
+ : generic.length === 1
22
+ ? generic[0]
23
+ : undefined;
24
+ if (selected === undefined) {
25
+ usage(request.service
26
+ ? `Unknown generic service: ${request.service}`
27
+ : generic.length === 0
28
+ ? "No generic service exists; use --create-service <name>."
29
+ : "Multiple generic services exist; use --service <name>.");
30
+ }
31
+ return {
32
+ domain: normalizeArtifactName(selected.domain),
33
+ servicePath: selected.path,
34
+ service: selected,
35
+ };
36
+ }
37
+ export async function addPublicMember(builder, target, category, artifact, artifactPath) {
38
+ const importPath = sourceModule(artifactPath);
39
+ await builder.update(target.servicePath, (source) => {
40
+ const imported = addSourceImport(source, target.servicePath, sourceImport(artifact.binding, importPath, artifact.exportKind));
41
+ return addFactoryObjectMember(imported, target.servicePath, ["defineService"], [category], artifact.binding, artifact.binding);
42
+ });
43
+ }
44
+ export function domainArtifact(target, value, directory, fileSuffix, kindSuffix, exportKind = "default") {
45
+ const name = normalizeArtifactName(value);
46
+ const suffix = kindSuffix ? normalizeArtifactName(kindSuffix) : undefined;
47
+ return {
48
+ name,
49
+ path: `src/${target.domain.fileStem}/${directory}/${name.fileStem}.${fileSuffix}.ts`,
50
+ id: `${target.domain.idSegment}.${name.idSegment}${suffix ? `-${suffix.idSegment}` : ""}`,
51
+ binding: `${name.identifier}${suffix ? capitalize(suffix.identifier) : ""}`,
52
+ exportKind,
53
+ };
54
+ }
55
+ export function resolveArtifact(builder, target, kind, value) {
56
+ const normalized = normalizeArtifactName(value);
57
+ const candidates = builder.artifacts.filter((artifact) => artifact.domain === target.domain.fileStem && artifact.kind === kind);
58
+ const exact = candidates.find((artifact) => [artifact.binding, artifact.id, fileStem(artifact.path)].includes(value));
59
+ const normalizedMatch = candidates.find((artifact) => normalizeArtifactName(artifact.binding).fileStem === normalized.fileStem ||
60
+ normalizeArtifactName(fileStem(artifact.path)).fileStem === normalized.fileStem);
61
+ const result = exact ?? normalizedMatch;
62
+ if (result === undefined)
63
+ usage(`Unknown ${kind} in ${target.domain.fileStem}: ${value}`);
64
+ return result;
65
+ }
66
+ export function assertAvailableId(builder, id) {
67
+ if (builder.artifacts.some((artifact) => artifact.id === id)) {
68
+ collision(`Descriptor ID ${id} already exists.`);
69
+ }
70
+ }
71
+ export function sourceModule(path) {
72
+ return `@app/${path.replace(/^src\//, "").replace(/\.ts$/, ".js")}`;
73
+ }
74
+ export function sourceImport(binding, module, exportKind) {
75
+ return exportKind === "named"
76
+ ? `import { ${binding} } from "${module}";`
77
+ : `import ${binding} from "${module}";`;
78
+ }
79
+ export function serviceSource(domain) {
80
+ return `import { defineService } from "@relkit/app/services";\n\nexport default defineService({ id: "${domain.idSegment}" });\n`;
81
+ }
82
+ function usage(message) {
83
+ throw new AddScaffoldError(ADD_FAILURE_CODES.usage, message);
84
+ }
85
+ function collision(message) {
86
+ throw new AddScaffoldError(ADD_FAILURE_CODES.collision, message);
87
+ }
88
+ function capitalize(value) {
89
+ return `${value[0].toUpperCase()}${value.slice(1)}`;
90
+ }
91
+ function fileStem(path) {
92
+ return path.split("/").at(-1).split(".")[0];
93
+ }
94
+ //# sourceMappingURL=domain-planning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-planning.js","sourceRoot":"","sources":["../src/domain-planning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare const EXAMPLE_PATH_PREFIXES: readonly ["src/routes", "src/orders", "src/echo", "src/hello/tools", "src/hello/agents", "tests"];
2
+ export interface StageCleanupResult {
3
+ readonly temporaryPath?: string;
4
+ readonly removed: boolean;
5
+ }
6
+ export declare function cleanupStagedProject(stage: string | undefined, destination: string): Promise<StageCleanupResult>;
7
+ export declare function requireTemplate(path: string): Promise<void>;
8
+ export declare function requireFiles(root: string, paths: readonly string[]): Promise<void>;
9
+ export declare function replaceOnce(path: string, before: string, after: string): Promise<void>;
10
+ export declare function removeExamples(root: string): Promise<void>;
11
+ export declare function listProjectFiles(root: string, current?: string): Promise<string[]>;
12
+ export declare function projectId(name: string): string;
13
+ export declare function compareNames(left: {
14
+ name: string;
15
+ }, right: {
16
+ name: string;
17
+ }): number;
18
+ //# sourceMappingURL=generate-files-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files-utilities.d.ts","sourceRoot":"","sources":["../src/generate-files-utilities.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,mGAOxB,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;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;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEpF"}
@@ -0,0 +1,87 @@
1
+ import { access, chmod, lstat, readdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, join, relative, resolve } from "node:path";
3
+ import { GenerateProjectError } from "./generate-types.js";
4
+ export const EXAMPLE_PATH_PREFIXES = [
5
+ "src/routes",
6
+ "src/orders",
7
+ "src/echo",
8
+ "src/hello/tools",
9
+ "src/hello/agents",
10
+ "tests",
11
+ ];
12
+ export async function cleanupStagedProject(stage, destination) {
13
+ if (stage === undefined)
14
+ return { removed: false };
15
+ const temporaryPath = resolve(stage);
16
+ const parent = resolve(dirname(destination));
17
+ const prefix = `.${basename(destination)}-relkit-`;
18
+ if (dirname(temporaryPath) !== parent || !basename(temporaryPath).startsWith(prefix))
19
+ return { removed: false };
20
+ try {
21
+ const info = await lstat(temporaryPath);
22
+ if (!info.isDirectory() || info.isSymbolicLink())
23
+ return { temporaryPath, removed: false };
24
+ await rm(temporaryPath, { recursive: true, force: true });
25
+ return { temporaryPath, removed: true };
26
+ }
27
+ catch (error) {
28
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
29
+ return { temporaryPath, removed: true };
30
+ return { temporaryPath, removed: false };
31
+ }
32
+ }
33
+ export async function requireTemplate(path) {
34
+ try {
35
+ if ((await readdir(path)).length === 0)
36
+ throw new Error("empty");
37
+ }
38
+ catch {
39
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_MISSING", "Selected template is missing.");
40
+ }
41
+ }
42
+ export async function requireFiles(root, paths) {
43
+ for (const path of paths) {
44
+ try {
45
+ await access(join(root, path));
46
+ }
47
+ catch {
48
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template file is missing: ${path}`);
49
+ }
50
+ }
51
+ }
52
+ export async function replaceOnce(path, before, after) {
53
+ const content = await readFile(path, "utf8");
54
+ const first = content.indexOf(before);
55
+ if (first < 0 || first !== content.lastIndexOf(before))
56
+ throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template substitution is unavailable: ${path}`);
57
+ await writeFile(path, content.slice(0, first) + after + content.slice(first + before.length), "utf8");
58
+ await chmod(path, 0o644);
59
+ }
60
+ export async function removeExamples(root) {
61
+ for (const directory of EXAMPLE_PATH_PREFIXES)
62
+ await rm(join(root, directory), { recursive: true, force: true });
63
+ }
64
+ export async function listProjectFiles(root, current = root) {
65
+ const result = [];
66
+ for (const entry of (await readdir(current, { withFileTypes: true })).sort(compareNames)) {
67
+ if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".relkit")
68
+ continue;
69
+ const path = join(current, entry.name);
70
+ if (entry.isDirectory())
71
+ result.push(...(await listProjectFiles(root, path)));
72
+ else if (entry.isFile())
73
+ result.push(relative(root, path).replaceAll("\\", "/"));
74
+ }
75
+ return result;
76
+ }
77
+ export function projectId(name) {
78
+ const value = name
79
+ .replace(/^@/, "")
80
+ .replace("/", "-")
81
+ .replace(/[^A-Za-z0-9._-]+/g, "-");
82
+ return value.replace(/^[._-]+/, "").replace(/(?<![._-])[._-]+$/, "") || "app";
83
+ }
84
+ export function compareNames(left, right) {
85
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
86
+ }
87
+ //# sourceMappingURL=generate-files-utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-files-utilities.js","sourceRoot":"","sources":["../src/generate-files-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,kBAAkB;IAClB,OAAO;CACC,CAAC;AAOX,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;QAClF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,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;YACtE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1C,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,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,KAAK,MAAM,SAAS,IAAI,qBAAqB;QAC3C,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,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB,EAAE,KAAuB;IAC1E,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"}
@@ -1,16 +1,5 @@
1
1
  import type { CreateOptions } from "./options.js";
2
- export interface StageCleanupResult {
3
- readonly temporaryPath?: string;
4
- readonly removed: boolean;
5
- }
2
+ export { EXAMPLE_PATH_PREFIXES, cleanupStagedProject, listProjectFiles, projectId, removeExamples, replaceOnce, requireFiles, requireTemplate, type StageCleanupResult, } from "./generate-files-utilities.js";
6
3
  export declare function copyTemplate(source: string, target: string): Promise<void>;
7
4
  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
5
  //# sourceMappingURL=generate-files.d.ts.map
@@ -1 +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,CAc1F;AAyCD,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,CAUhE;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"}
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;AAClD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,KAAK,kBAAkB,GACxB,MAAM,+BAA+B,CAAC;AAYvC,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,CAc1F"}
@@ -1,6 +1,8 @@
1
1
  import { access, chmod, lstat, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
2
2
  import { basename, dirname, join, relative, resolve } from "node:path";
3
- import { GenerateProjectError } from "./generate.js";
3
+ import { GenerateProjectError } from "./generate-types.js";
4
+ export { EXAMPLE_PATH_PREFIXES, cleanupStagedProject, listProjectFiles, projectId, removeExamples, replaceOnce, requireFiles, requireTemplate, } from "./generate-files-utilities.js";
5
+ import { EXAMPLE_PATH_PREFIXES, compareNames, listProjectFiles, projectId, removeExamples, replaceOnce, } from "./generate-files-utilities.js";
4
6
  const FILE_MODE = 0o644;
5
7
  const DIRECTORY_MODE = 0o755;
6
8
  export async function copyTemplate(source, target) {
@@ -33,11 +35,26 @@ async function customizeDeployment(root, options) {
33
35
  const imports = [
34
36
  ...(options.cloud === "aws" ? ['import "@relkit/aws";'] : []),
35
37
  ...(options.deploy === "pulumi" ? ['import "@relkit/pulumi";'] : []),
38
+ ...(options.jobs === undefined ? [] : ['import { docker } from "@relkit/docker";']),
39
+ ...(options.jobs === "inngest-docker" ? ['import { inngest } from "@relkit/inngest";'] : []),
40
+ ...(options.jobs === "effect-mq-docker"
41
+ ? ['import { effectMq } from "@relkit/effect-mq";']
42
+ : []),
43
+ ...(options.jobs === "trigger-docker" ? ['import { trigger } from "@relkit/trigger";'] : []),
36
44
  ].join("\n");
37
45
  await replaceOnce(configPath, "// relkit:create:deployment-imports", imports);
38
- await replaceOnce(configPath, " // relkit:create:deployment", options.cloud === "aws" && options.deploy === "pulumi"
39
- ? ' deployment: { engine: "pulumi", host: "aws" },'
40
- : "");
46
+ await replaceOnce(configPath, " // relkit:create:deployment", [
47
+ options.cloud === "aws" && options.deploy === "pulumi"
48
+ ? ' deployment: { engine: "pulumi", host: "aws" },'
49
+ : "",
50
+ options.jobs === "inngest-docker" ? " jobs: { default: docker(inngest()) }," : "",
51
+ options.jobs === "effect-mq-docker" ? " jobs: { default: docker(effectMq()) }," : "",
52
+ options.jobs === "trigger-docker" ? " jobs: { default: docker(trigger()) }," : "",
53
+ options.jobs === undefined ? "" : ' defaults: { jobs: "default" },',
54
+ ]
55
+ .filter(Boolean)
56
+ .join("\n"));
57
+ await customizeTaskFixture(root, options);
41
58
  const manifestPath = join(root, "package.json");
42
59
  const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
43
60
  const version = manifest.dependencies["@relkit/app"];
@@ -45,6 +62,10 @@ async function customizeDeployment(root, options) {
45
62
  manifest.dependencies["@relkit/aws"] = version;
46
63
  if (options.deploy === "pulumi")
47
64
  manifest.dependencies["@relkit/pulumi"] = version;
65
+ if (options.jobs !== undefined) {
66
+ manifest.dependencies["@relkit/docker"] = version;
67
+ manifest.dependencies[`@relkit/${options.jobs.replace(/-docker$/u, "")}`] = version;
68
+ }
48
69
  if (options.cloud === "aws" && options.deploy === "pulumi") {
49
70
  manifest.scripts["deploy:preview"] = "relkit deploy preview";
50
71
  manifest.scripts.deploy = "relkit deploy up";
@@ -54,92 +75,20 @@ async function customizeDeployment(root, options) {
54
75
  await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
55
76
  await chmod(manifestPath, FILE_MODE);
56
77
  }
78
+ async function customizeTaskFixture(root, options) {
79
+ if (options.jobs === undefined || options.jobs === "inngest-docker")
80
+ return;
81
+ const taskPath = join(root, "src/orders/tasks/export-orders.task.ts");
82
+ const jobPath = join(root, "src/orders/jobs/export-orders.job.ts");
83
+ if (options.jobs === "effect-mq-docker")
84
+ await replaceOnce(taskPath, 'execution: "durable"', 'execution: "retryable"');
85
+ await replaceOnce(taskPath, " progress: z.object({ completed: z.number().int().nonnegative() }),\n", "");
86
+ await replaceOnce(taskPath, " await context.progress.emit({ completed: 0 });\n", "");
87
+ await replaceOnce(taskPath, " await context.progress.emit({ completed: orderIds.length });\n", "");
88
+ await replaceOnce(jobPath, ' operations: ["trigger", "get", "list", "watch"],', ' operations: ["trigger"],');
89
+ await replaceOnce(jobPath, ' fields: ["status", "progress", "output"],', ' fields: ["status", "output"],');
90
+ }
57
91
  function sorted(values) {
58
92
  return Object.fromEntries(Object.entries(values).sort(([left], [right]) => left.localeCompare(right)));
59
93
  }
60
- /** Removes only a verified mkdtemp sibling; broad or unresolved paths are never recursed. */
61
- export async function cleanupStagedProject(stage, destination) {
62
- if (stage === undefined)
63
- return { removed: false };
64
- const temporaryPath = resolve(stage);
65
- const parent = resolve(dirname(destination));
66
- const prefix = `.${basename(destination)}-relkit-`;
67
- if (dirname(temporaryPath) !== parent || !basename(temporaryPath).startsWith(prefix)) {
68
- return { removed: false };
69
- }
70
- try {
71
- const info = await lstat(temporaryPath);
72
- if (!info.isDirectory() || info.isSymbolicLink())
73
- return { temporaryPath, removed: false };
74
- await rm(temporaryPath, { recursive: true, force: true });
75
- return { temporaryPath, removed: true };
76
- }
77
- catch (error) {
78
- if (error instanceof Error && "code" in error && error.code === "ENOENT") {
79
- return { temporaryPath, removed: true };
80
- }
81
- return { temporaryPath, removed: false };
82
- }
83
- }
84
- export async function requireTemplate(path) {
85
- try {
86
- if ((await readdir(path)).length === 0)
87
- throw new Error("empty");
88
- }
89
- catch {
90
- throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_MISSING", "Selected template is missing.");
91
- }
92
- }
93
- export async function requireFiles(root, paths) {
94
- for (const path of paths) {
95
- try {
96
- await access(join(root, path));
97
- }
98
- catch {
99
- throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template file is missing: ${path}`);
100
- }
101
- }
102
- }
103
- export async function replaceOnce(path, before, after) {
104
- const content = await readFile(path, "utf8");
105
- const first = content.indexOf(before);
106
- if (first < 0 || first !== content.lastIndexOf(before))
107
- throw new GenerateProjectError("RELKIT_CREATE_TEMPLATE_INVALID", `Template substitution is unavailable: ${path}`);
108
- await writeFile(path, content.slice(0, first) + after + content.slice(first + before.length), "utf8");
109
- await chmod(path, FILE_MODE);
110
- }
111
- export async function removeExamples(root) {
112
- for (const directory of [
113
- "src/routes",
114
- "src/orders",
115
- "src/echo",
116
- "src/hello/tools",
117
- "src/hello/agents",
118
- "tests",
119
- ])
120
- await rm(join(root, directory), { recursive: true, force: true });
121
- }
122
- export async function listProjectFiles(root, current = root) {
123
- const result = [];
124
- for (const entry of (await readdir(current, { withFileTypes: true })).sort(compareNames)) {
125
- if (entry.name === ".git" || entry.name === "node_modules" || entry.name === ".relkit")
126
- continue;
127
- const path = join(current, entry.name);
128
- if (entry.isDirectory())
129
- result.push(...(await listProjectFiles(root, path)));
130
- else if (entry.isFile())
131
- result.push(relative(root, path).replaceAll("\\", "/"));
132
- }
133
- return result;
134
- }
135
- export function projectId(name) {
136
- const value = name
137
- .replace(/^@/, "")
138
- .replace("/", "-")
139
- .replace(/[^A-Za-z0-9._-]+/g, "-");
140
- return value.replace(/^[._-]+/, "").replace(/(?<![._-])[._-]+$/, "") || "app";
141
- }
142
- function compareNames(left, right) {
143
- return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
144
- }
145
94
  //# sourceMappingURL=generate-files.js.map