@edge-base/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +182 -0
  2. package/dist/commands/admin.d.ts +10 -0
  3. package/dist/commands/admin.d.ts.map +1 -0
  4. package/dist/commands/admin.js +307 -0
  5. package/dist/commands/admin.js.map +1 -0
  6. package/dist/commands/backup.d.ts +148 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +1247 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/completion.d.ts +3 -0
  11. package/dist/commands/completion.d.ts.map +1 -0
  12. package/dist/commands/completion.js +168 -0
  13. package/dist/commands/completion.js.map +1 -0
  14. package/dist/commands/create-plugin.d.ts +3 -0
  15. package/dist/commands/create-plugin.d.ts.map +1 -0
  16. package/dist/commands/create-plugin.js +208 -0
  17. package/dist/commands/create-plugin.js.map +1 -0
  18. package/dist/commands/deploy.d.ts +146 -0
  19. package/dist/commands/deploy.d.ts.map +1 -0
  20. package/dist/commands/deploy.js +1823 -0
  21. package/dist/commands/deploy.js.map +1 -0
  22. package/dist/commands/describe.d.ts +45 -0
  23. package/dist/commands/describe.d.ts.map +1 -0
  24. package/dist/commands/describe.js +114 -0
  25. package/dist/commands/describe.js.map +1 -0
  26. package/dist/commands/destroy.d.ts +13 -0
  27. package/dist/commands/destroy.d.ts.map +1 -0
  28. package/dist/commands/destroy.js +642 -0
  29. package/dist/commands/destroy.js.map +1 -0
  30. package/dist/commands/dev.d.ts +80 -0
  31. package/dist/commands/dev.d.ts.map +1 -0
  32. package/dist/commands/dev.js +1131 -0
  33. package/dist/commands/dev.js.map +1 -0
  34. package/dist/commands/docker.d.ts +22 -0
  35. package/dist/commands/docker.d.ts.map +1 -0
  36. package/dist/commands/docker.js +373 -0
  37. package/dist/commands/docker.js.map +1 -0
  38. package/dist/commands/export.d.ts +15 -0
  39. package/dist/commands/export.d.ts.map +1 -0
  40. package/dist/commands/export.js +142 -0
  41. package/dist/commands/export.js.map +1 -0
  42. package/dist/commands/init.d.ts +7 -0
  43. package/dist/commands/init.d.ts.map +1 -0
  44. package/dist/commands/init.js +506 -0
  45. package/dist/commands/init.js.map +1 -0
  46. package/dist/commands/keys.d.ts +23 -0
  47. package/dist/commands/keys.d.ts.map +1 -0
  48. package/dist/commands/keys.js +347 -0
  49. package/dist/commands/keys.js.map +1 -0
  50. package/dist/commands/logs.d.ts +17 -0
  51. package/dist/commands/logs.d.ts.map +1 -0
  52. package/dist/commands/logs.js +104 -0
  53. package/dist/commands/logs.js.map +1 -0
  54. package/dist/commands/migrate.d.ts +29 -0
  55. package/dist/commands/migrate.d.ts.map +1 -0
  56. package/dist/commands/migrate.js +302 -0
  57. package/dist/commands/migrate.js.map +1 -0
  58. package/dist/commands/migration.d.ts +18 -0
  59. package/dist/commands/migration.d.ts.map +1 -0
  60. package/dist/commands/migration.js +114 -0
  61. package/dist/commands/migration.js.map +1 -0
  62. package/dist/commands/neon.d.ts +66 -0
  63. package/dist/commands/neon.d.ts.map +1 -0
  64. package/dist/commands/neon.js +600 -0
  65. package/dist/commands/neon.js.map +1 -0
  66. package/dist/commands/plugins.d.ts +9 -0
  67. package/dist/commands/plugins.d.ts.map +1 -0
  68. package/dist/commands/plugins.js +295 -0
  69. package/dist/commands/plugins.js.map +1 -0
  70. package/dist/commands/realtime.d.ts +3 -0
  71. package/dist/commands/realtime.d.ts.map +1 -0
  72. package/dist/commands/realtime.js +71 -0
  73. package/dist/commands/realtime.js.map +1 -0
  74. package/dist/commands/secret.d.ts +7 -0
  75. package/dist/commands/secret.d.ts.map +1 -0
  76. package/dist/commands/secret.js +180 -0
  77. package/dist/commands/secret.js.map +1 -0
  78. package/dist/commands/seed.d.ts +21 -0
  79. package/dist/commands/seed.d.ts.map +1 -0
  80. package/dist/commands/seed.js +325 -0
  81. package/dist/commands/seed.js.map +1 -0
  82. package/dist/commands/telemetry.d.ts +12 -0
  83. package/dist/commands/telemetry.d.ts.map +1 -0
  84. package/dist/commands/telemetry.js +57 -0
  85. package/dist/commands/telemetry.js.map +1 -0
  86. package/dist/commands/typegen.d.ts +26 -0
  87. package/dist/commands/typegen.d.ts.map +1 -0
  88. package/dist/commands/typegen.js +212 -0
  89. package/dist/commands/typegen.js.map +1 -0
  90. package/dist/commands/upgrade.d.ts +29 -0
  91. package/dist/commands/upgrade.d.ts.map +1 -0
  92. package/dist/commands/upgrade.js +265 -0
  93. package/dist/commands/upgrade.js.map +1 -0
  94. package/dist/commands/webhook-test.d.ts +3 -0
  95. package/dist/commands/webhook-test.d.ts.map +1 -0
  96. package/dist/commands/webhook-test.js +133 -0
  97. package/dist/commands/webhook-test.js.map +1 -0
  98. package/dist/index.d.ts +3 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +183 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/lib/agent-contract.d.ts +36 -0
  103. package/dist/lib/agent-contract.d.ts.map +1 -0
  104. package/dist/lib/agent-contract.js +78 -0
  105. package/dist/lib/agent-contract.js.map +1 -0
  106. package/dist/lib/cf-auth.d.ts +76 -0
  107. package/dist/lib/cf-auth.d.ts.map +1 -0
  108. package/dist/lib/cf-auth.js +321 -0
  109. package/dist/lib/cf-auth.js.map +1 -0
  110. package/dist/lib/cli-context.d.ts +23 -0
  111. package/dist/lib/cli-context.d.ts.map +1 -0
  112. package/dist/lib/cli-context.js +40 -0
  113. package/dist/lib/cli-context.js.map +1 -0
  114. package/dist/lib/cloudflare-deploy-manifest.d.ts +26 -0
  115. package/dist/lib/cloudflare-deploy-manifest.d.ts.map +1 -0
  116. package/dist/lib/cloudflare-deploy-manifest.js +107 -0
  117. package/dist/lib/cloudflare-deploy-manifest.js.map +1 -0
  118. package/dist/lib/cloudflare-wrangler-resources.d.ts +32 -0
  119. package/dist/lib/cloudflare-wrangler-resources.d.ts.map +1 -0
  120. package/dist/lib/cloudflare-wrangler-resources.js +59 -0
  121. package/dist/lib/cloudflare-wrangler-resources.js.map +1 -0
  122. package/dist/lib/config-editor.d.ts +139 -0
  123. package/dist/lib/config-editor.d.ts.map +1 -0
  124. package/dist/lib/config-editor.js +1188 -0
  125. package/dist/lib/config-editor.js.map +1 -0
  126. package/dist/lib/deploy-shared.d.ts +55 -0
  127. package/dist/lib/deploy-shared.d.ts.map +1 -0
  128. package/dist/lib/deploy-shared.js +183 -0
  129. package/dist/lib/deploy-shared.js.map +1 -0
  130. package/dist/lib/dev-sidecar.d.ts +31 -0
  131. package/dist/lib/dev-sidecar.d.ts.map +1 -0
  132. package/dist/lib/dev-sidecar.js +1058 -0
  133. package/dist/lib/dev-sidecar.js.map +1 -0
  134. package/dist/lib/fetch-with-timeout.d.ts +14 -0
  135. package/dist/lib/fetch-with-timeout.d.ts.map +1 -0
  136. package/dist/lib/fetch-with-timeout.js +29 -0
  137. package/dist/lib/fetch-with-timeout.js.map +1 -0
  138. package/dist/lib/function-registry.d.ts +56 -0
  139. package/dist/lib/function-registry.d.ts.map +1 -0
  140. package/dist/lib/function-registry.js +210 -0
  141. package/dist/lib/function-registry.js.map +1 -0
  142. package/dist/lib/load-config.d.ts +24 -0
  143. package/dist/lib/load-config.d.ts.map +1 -0
  144. package/dist/lib/load-config.js +263 -0
  145. package/dist/lib/load-config.js.map +1 -0
  146. package/dist/lib/local-secrets.d.ts +2 -0
  147. package/dist/lib/local-secrets.d.ts.map +1 -0
  148. package/dist/lib/local-secrets.js +60 -0
  149. package/dist/lib/local-secrets.js.map +1 -0
  150. package/dist/lib/managed-resource-names.d.ts +4 -0
  151. package/dist/lib/managed-resource-names.d.ts.map +1 -0
  152. package/dist/lib/managed-resource-names.js +19 -0
  153. package/dist/lib/managed-resource-names.js.map +1 -0
  154. package/dist/lib/migrator.d.ts +57 -0
  155. package/dist/lib/migrator.d.ts.map +1 -0
  156. package/dist/lib/migrator.js +321 -0
  157. package/dist/lib/migrator.js.map +1 -0
  158. package/dist/lib/neon.d.ts +41 -0
  159. package/dist/lib/neon.d.ts.map +1 -0
  160. package/dist/lib/neon.js +325 -0
  161. package/dist/lib/neon.js.map +1 -0
  162. package/dist/lib/node-tools.d.ts +10 -0
  163. package/dist/lib/node-tools.d.ts.map +1 -0
  164. package/dist/lib/node-tools.js +32 -0
  165. package/dist/lib/node-tools.js.map +1 -0
  166. package/dist/lib/npm.d.ts +8 -0
  167. package/dist/lib/npm.d.ts.map +1 -0
  168. package/dist/lib/npm.js +10 -0
  169. package/dist/lib/npm.js.map +1 -0
  170. package/dist/lib/npx.d.ts +9 -0
  171. package/dist/lib/npx.d.ts.map +1 -0
  172. package/dist/lib/npx.js +11 -0
  173. package/dist/lib/npx.js.map +1 -0
  174. package/dist/lib/project-runtime.d.ts +38 -0
  175. package/dist/lib/project-runtime.d.ts.map +1 -0
  176. package/dist/lib/project-runtime.js +122 -0
  177. package/dist/lib/project-runtime.js.map +1 -0
  178. package/dist/lib/prompts.d.ts +28 -0
  179. package/dist/lib/prompts.d.ts.map +1 -0
  180. package/dist/lib/prompts.js +85 -0
  181. package/dist/lib/prompts.js.map +1 -0
  182. package/dist/lib/rate-limit-bindings.d.ts +11 -0
  183. package/dist/lib/rate-limit-bindings.d.ts.map +1 -0
  184. package/dist/lib/rate-limit-bindings.js +52 -0
  185. package/dist/lib/rate-limit-bindings.js.map +1 -0
  186. package/dist/lib/realtime-provision.d.ts +22 -0
  187. package/dist/lib/realtime-provision.d.ts.map +1 -0
  188. package/dist/lib/realtime-provision.js +246 -0
  189. package/dist/lib/realtime-provision.js.map +1 -0
  190. package/dist/lib/resolve-options.d.ts +42 -0
  191. package/dist/lib/resolve-options.d.ts.map +1 -0
  192. package/dist/lib/resolve-options.js +98 -0
  193. package/dist/lib/resolve-options.js.map +1 -0
  194. package/dist/lib/runtime-scaffold.d.ts +17 -0
  195. package/dist/lib/runtime-scaffold.d.ts.map +1 -0
  196. package/dist/lib/runtime-scaffold.js +366 -0
  197. package/dist/lib/runtime-scaffold.js.map +1 -0
  198. package/dist/lib/schema-check.d.ts +79 -0
  199. package/dist/lib/schema-check.d.ts.map +1 -0
  200. package/dist/lib/schema-check.js +347 -0
  201. package/dist/lib/schema-check.js.map +1 -0
  202. package/dist/lib/spinner.d.ts +20 -0
  203. package/dist/lib/spinner.d.ts.map +1 -0
  204. package/dist/lib/spinner.js +42 -0
  205. package/dist/lib/spinner.js.map +1 -0
  206. package/dist/lib/telemetry.d.ts +37 -0
  207. package/dist/lib/telemetry.d.ts.map +1 -0
  208. package/dist/lib/telemetry.js +98 -0
  209. package/dist/lib/telemetry.js.map +1 -0
  210. package/dist/lib/turnstile-provision.d.ts +27 -0
  211. package/dist/lib/turnstile-provision.d.ts.map +1 -0
  212. package/dist/lib/turnstile-provision.js +144 -0
  213. package/dist/lib/turnstile-provision.js.map +1 -0
  214. package/dist/lib/update-check.d.ts +13 -0
  215. package/dist/lib/update-check.d.ts.map +1 -0
  216. package/dist/lib/update-check.js +110 -0
  217. package/dist/lib/update-check.js.map +1 -0
  218. package/dist/lib/wrangler-secrets.d.ts +3 -0
  219. package/dist/lib/wrangler-secrets.d.ts.map +1 -0
  220. package/dist/lib/wrangler-secrets.js +32 -0
  221. package/dist/lib/wrangler-secrets.js.map +1 -0
  222. package/dist/lib/wrangler.d.ts +9 -0
  223. package/dist/lib/wrangler.d.ts.map +1 -0
  224. package/dist/lib/wrangler.js +84 -0
  225. package/dist/lib/wrangler.js.map +1 -0
  226. package/dist/templates/plugin/README.md.tmpl +91 -0
  227. package/dist/templates/plugin/client/js/package.json.tmpl +23 -0
  228. package/dist/templates/plugin/client/js/src/index.ts.tmpl +68 -0
  229. package/dist/templates/plugin/client/js/tsconfig.json.tmpl +14 -0
  230. package/dist/templates/plugin/server/package.json.tmpl +19 -0
  231. package/dist/templates/plugin/server/src/index.ts.tmpl +59 -0
  232. package/dist/templates/plugin/server/tsconfig.json.tmpl +14 -0
  233. package/llms.txt +94 -0
  234. package/package.json +60 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Interactive prompt helpers using Node.js readline.
3
+ * All prompts return default values silently when stdin is not a TTY (CI/CD).
4
+ */
5
+ import { type CliChoice } from './agent-contract.js';
6
+ interface PromptMetadata {
7
+ field?: string;
8
+ hint?: string;
9
+ message?: string;
10
+ choices?: CliChoice[];
11
+ }
12
+ /**
13
+ * Prompt the user for a text value.
14
+ * Returns defaultValue (or empty string) in non-TTY environments.
15
+ */
16
+ export declare function promptText(message: string, defaultValue?: string, metadata?: PromptMetadata): Promise<string>;
17
+ /**
18
+ * Prompt the user to select from a list of choices.
19
+ * Returns the first choice in non-TTY environments.
20
+ */
21
+ export declare function promptSelect(message: string, choices: string[], metadata?: PromptMetadata): Promise<string>;
22
+ /**
23
+ * Prompt the user for a yes/no confirmation.
24
+ * Returns defaultValue in non-TTY environments.
25
+ */
26
+ export declare function promptConfirm(message: string, defaultValue?: boolean): Promise<boolean>;
27
+ export {};
28
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGtE,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,YAAY,UAAO,GAClB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Interactive prompt helpers using Node.js readline.
3
+ * All prompts return default values silently when stdin is not a TTY (CI/CD).
4
+ */
5
+ import { createInterface } from 'node:readline';
6
+ import { raiseNeedsInput } from './agent-contract.js';
7
+ import { isNonInteractive } from './cli-context.js';
8
+ /**
9
+ * Prompt the user for a text value.
10
+ * Returns defaultValue (or empty string) in non-TTY environments.
11
+ */
12
+ export async function promptText(message, defaultValue, metadata) {
13
+ if (!process.stdin.isTTY || isNonInteractive()) {
14
+ if (defaultValue !== undefined)
15
+ return defaultValue;
16
+ raiseNeedsInput({
17
+ code: 'input_required',
18
+ field: metadata?.field,
19
+ message: metadata?.message ?? `${message.replace(/:?\s*$/, '')} is required.`,
20
+ hint: metadata?.hint,
21
+ });
22
+ }
23
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
24
+ const suffix = defaultValue ? ` (${defaultValue})` : '';
25
+ return new Promise((resolve) => {
26
+ rl.question(`${message}${suffix}: `, (answer) => {
27
+ rl.close();
28
+ resolve(answer.trim() || defaultValue || '');
29
+ });
30
+ });
31
+ }
32
+ /**
33
+ * Prompt the user to select from a list of choices.
34
+ * Returns the first choice in non-TTY environments.
35
+ */
36
+ export async function promptSelect(message, choices, metadata) {
37
+ if (choices.length === 0)
38
+ return '';
39
+ if ((!process.stdin.isTTY || isNonInteractive()) && choices.length === 1)
40
+ return choices[0];
41
+ if (!process.stdin.isTTY || isNonInteractive()) {
42
+ raiseNeedsInput({
43
+ code: 'selection_required',
44
+ field: metadata?.field,
45
+ message: metadata?.message ?? `${message.replace(/:?\s*$/, '')}.`,
46
+ hint: metadata?.hint,
47
+ choices: metadata?.choices ?? choices.map((choice) => ({
48
+ label: choice,
49
+ value: choice,
50
+ })),
51
+ });
52
+ }
53
+ console.log(message);
54
+ choices.forEach((c, i) => console.log(` ${i + 1}. ${c}`));
55
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
56
+ return new Promise((resolve) => {
57
+ rl.question(' Select (number): ', (answer) => {
58
+ rl.close();
59
+ const idx = parseInt(answer, 10) - 1;
60
+ resolve(choices[idx] ?? choices[0]);
61
+ });
62
+ });
63
+ }
64
+ /**
65
+ * Prompt the user for a yes/no confirmation.
66
+ * Returns defaultValue in non-TTY environments.
67
+ */
68
+ export async function promptConfirm(message, defaultValue = true) {
69
+ if (!process.stdin.isTTY || isNonInteractive())
70
+ return defaultValue;
71
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
72
+ const suffix = defaultValue ? ' (Y/n)' : ' (y/N)';
73
+ return new Promise((resolve) => {
74
+ rl.question(`${message}${suffix}: `, (answer) => {
75
+ rl.close();
76
+ const normalized = answer.trim().toLowerCase();
77
+ if (!normalized) {
78
+ resolve(defaultValue);
79
+ return;
80
+ }
81
+ resolve(normalized === 'y' || normalized === 'yes');
82
+ });
83
+ });
84
+ }
85
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { EdgeBaseConfig } from '@edge-base/shared';
2
+ export type BuiltInRateLimitGroup = 'global' | 'db' | 'storage' | 'functions' | 'auth' | 'authSignin' | 'authSignup' | 'events';
3
+ export interface RateLimitBindingSpec {
4
+ group: BuiltInRateLimitGroup;
5
+ binding: string;
6
+ namespaceId: string;
7
+ limit: number;
8
+ period: 10 | 60;
9
+ }
10
+ export declare function resolveRateLimitBindings(config?: EdgeBaseConfig | Record<string, unknown>): RateLimitBindingSpec[];
11
+ //# sourceMappingURL=rate-limit-bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-bindings.d.ts","sourceRoot":"","sources":["../../src/lib/rate-limit-bindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAC7B,QAAQ,GACR,IAAI,GACJ,SAAS,GACT,WAAW,GACX,MAAM,GACN,YAAY,GACZ,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;CACjB;AA4CD,wBAAgB,wBAAwB,CACtC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChD,oBAAoB,EAAE,CAmBxB"}
@@ -0,0 +1,52 @@
1
+ const DEFAULT_LIMIT = 10_000_000;
2
+ const DEFAULT_PERIOD = 60;
3
+ const BUILT_IN_BINDINGS = [
4
+ { group: 'global', binding: 'GLOBAL_RATE_LIMITER', namespaceId: '1001' },
5
+ { group: 'db', binding: 'DB_RATE_LIMITER', namespaceId: '1002' },
6
+ { group: 'storage', binding: 'STORAGE_RATE_LIMITER', namespaceId: '1003' },
7
+ { group: 'functions', binding: 'FUNCTIONS_RATE_LIMITER', namespaceId: '1004' },
8
+ { group: 'auth', binding: 'AUTH_RATE_LIMITER', namespaceId: '1005' },
9
+ { group: 'authSignin', binding: 'AUTH_SIGNIN_RATE_LIMITER', namespaceId: '1006' },
10
+ { group: 'authSignup', binding: 'AUTH_SIGNUP_RATE_LIMITER', namespaceId: '1007' },
11
+ { group: 'events', binding: 'EVENTS_RATE_LIMITER', namespaceId: '1008' },
12
+ ];
13
+ function getRateLimitingConfig(config) {
14
+ if (!config || typeof config !== 'object' || !('rateLimiting' in config))
15
+ return undefined;
16
+ const rateLimiting = config.rateLimiting;
17
+ if (!rateLimiting || typeof rateLimiting !== 'object')
18
+ return undefined;
19
+ return rateLimiting;
20
+ }
21
+ function normalizeLimit(limit) {
22
+ if (typeof limit !== 'number' || !Number.isFinite(limit))
23
+ return DEFAULT_LIMIT;
24
+ return Math.max(0, Math.floor(limit));
25
+ }
26
+ function normalizePeriod(period) {
27
+ return period === 10 ? 10 : DEFAULT_PERIOD;
28
+ }
29
+ function normalizeNamespaceId(namespaceId, fallback) {
30
+ if (typeof namespaceId !== 'string')
31
+ return fallback;
32
+ const trimmed = namespaceId.trim();
33
+ return trimmed || fallback;
34
+ }
35
+ export function resolveRateLimitBindings(config) {
36
+ const rateLimiting = getRateLimitingConfig(config);
37
+ return BUILT_IN_BINDINGS.flatMap((definition) => {
38
+ const groupConfig = rateLimiting?.[definition.group];
39
+ const bindingConfig = groupConfig?.binding;
40
+ if (bindingConfig?.enabled === false) {
41
+ return [];
42
+ }
43
+ return [{
44
+ group: definition.group,
45
+ binding: definition.binding,
46
+ namespaceId: normalizeNamespaceId(bindingConfig?.namespaceId, definition.namespaceId),
47
+ limit: normalizeLimit(bindingConfig?.limit),
48
+ period: normalizePeriod(bindingConfig?.period),
49
+ }];
50
+ });
51
+ }
52
+ //# sourceMappingURL=rate-limit-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-bindings.js","sourceRoot":"","sources":["../../src/lib/rate-limit-bindings.ts"],"names":[],"mappings":"AA0BA,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,cAAc,GAAY,EAAE,CAAC;AAEnC,MAAM,iBAAiB,GAA+B;IACpD,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,EAAE;IACxE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE;IAChE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,EAAE;IAC1E,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,EAAE;IAC9E,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE;IACpE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,EAAE;IACjF,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,EAAE;IACjF,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,EAAE;CACzE,CAAC;AAEF,SAAS,qBAAqB,CAAC,MAAiD;IAC9E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,IAAI,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3F,MAAM,YAAY,GAAI,MAAqC,CAAC,YAAY,CAAC;IACzE,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxE,OAAO,YAAkC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAC/E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAoB,EAAE,QAAgB;IAClE,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAiD;IAEjD,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QAC9C,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,WAAW,EAAE,OAAO,CAAC;QAE3C,IAAI,aAAa,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC;gBACN,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,WAAW,EAAE,oBAAoB,CAAC,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;gBACrF,KAAK,EAAE,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC;gBAC3C,MAAM,EAAE,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC;aAC/C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const REALTIME_SECRET_NAMES: readonly ["CF_REALTIME_APP_ID", "CF_REALTIME_APP_SECRET", "CF_REALTIME_TURN_KEY_ID", "CF_REALTIME_TURN_API_TOKEN"];
2
+ export interface RealtimeProvisionOptions {
3
+ projectDir: string;
4
+ appName?: string;
5
+ turnName?: string;
6
+ forceCreateApp?: boolean;
7
+ forceCreateTurn?: boolean;
8
+ syncWorkersSecrets?: boolean;
9
+ }
10
+ export interface RealtimeProvisionResult {
11
+ appId: string;
12
+ appSecret: string;
13
+ appName: string;
14
+ appSource: 'local' | 'created';
15
+ turnKeyId: string;
16
+ turnApiToken: string;
17
+ turnName: string;
18
+ turnSource: 'local' | 'created';
19
+ warnings?: string[];
20
+ }
21
+ export declare function provisionRealtime(options: RealtimeProvisionOptions): Promise<RealtimeProvisionResult>;
22
+ //# sourceMappingURL=realtime-provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-provision.d.ts","sourceRoot":"","sources":["../../src/lib/realtime-provision.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,qBAAqB,oHAKxB,CAAC;AAgCX,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AA+JD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAmIlC"}
@@ -0,0 +1,246 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { basename, join } from 'node:path';
4
+ import chalk from 'chalk';
5
+ import { ensureCloudflareAuth, resolveApiToken } from './cf-auth.js';
6
+ import { isQuiet } from './cli-context.js';
7
+ import { writeLocalSecrets } from './local-secrets.js';
8
+ import { deriveProjectSlug } from './runtime-scaffold.js';
9
+ import { npxCommand } from './npx.js';
10
+ const CLOUDFLARE_API_BASE = 'https://api.cloudflare.com/client/v4';
11
+ export const REALTIME_SECRET_NAMES = [
12
+ 'CF_REALTIME_APP_ID',
13
+ 'CF_REALTIME_APP_SECRET',
14
+ 'CF_REALTIME_TURN_KEY_ID',
15
+ 'CF_REALTIME_TURN_API_TOKEN',
16
+ ];
17
+ function parseEnvFile(filePath) {
18
+ if (!existsSync(filePath))
19
+ return {};
20
+ const values = {};
21
+ const raw = readFileSync(filePath, 'utf-8');
22
+ for (const line of raw.split('\n')) {
23
+ const trimmed = line.trim();
24
+ if (!trimmed || trimmed.startsWith('#'))
25
+ continue;
26
+ const idx = trimmed.indexOf('=');
27
+ if (idx <= 0)
28
+ continue;
29
+ values[trimmed.slice(0, idx).trim()] = trimmed.slice(idx + 1).trim();
30
+ }
31
+ return values;
32
+ }
33
+ function readLocalSecretSnapshot(projectDir) {
34
+ const fromJson = (() => {
35
+ const filePath = join(projectDir, '.edgebase', 'secrets.json');
36
+ if (!existsSync(filePath))
37
+ return {};
38
+ try {
39
+ const parsed = JSON.parse(readFileSync(filePath, 'utf-8'));
40
+ return parsed;
41
+ }
42
+ catch {
43
+ return {};
44
+ }
45
+ })();
46
+ const merged = {
47
+ ...parseEnvFile(join(projectDir, '.env.development')),
48
+ ...parseEnvFile(join(projectDir, '.dev.vars')),
49
+ ...fromJson,
50
+ };
51
+ const snapshot = {};
52
+ for (const key of REALTIME_SECRET_NAMES) {
53
+ if (typeof merged[key] === 'string' && merged[key]) {
54
+ snapshot[key] = merged[key];
55
+ }
56
+ }
57
+ return snapshot;
58
+ }
59
+ function readWranglerName(projectDir) {
60
+ const wranglerPath = join(projectDir, 'wrangler.toml');
61
+ if (!existsSync(wranglerPath))
62
+ return null;
63
+ const content = readFileSync(wranglerPath, 'utf-8');
64
+ const match = content.match(/^name\s*=\s*"([^"]+)"/m);
65
+ return match?.[1] ?? null;
66
+ }
67
+ function deriveManagedBaseName(projectDir) {
68
+ return readWranglerName(projectDir) ?? deriveProjectSlug(projectDir) ?? basename(projectDir);
69
+ }
70
+ function getDefaultRealtimeNames(projectDir) {
71
+ const baseName = deriveManagedBaseName(projectDir);
72
+ return {
73
+ appName: `${baseName}-realtime`,
74
+ turnName: `${baseName}-turn`,
75
+ };
76
+ }
77
+ function toProvisionAuthError(error, tokenSource) {
78
+ if (!(error instanceof Error)) {
79
+ return new Error('Cloudflare Realtime provisioning failed for an unknown reason.');
80
+ }
81
+ if (tokenSource === 'wrangler_oauth' && /authentication error/i.test(error.message)) {
82
+ return new Error('Cloudflare Calls/Realtime provisioning rejected the current wrangler OAuth token. ' +
83
+ 'Create a Cloudflare API token with Calls Write or Connectivity Admin permissions, export it as CLOUDFLARE_API_TOKEN, and rerun this command.');
84
+ }
85
+ return error;
86
+ }
87
+ async function cloudflareApi(accountId, apiToken, path, init) {
88
+ const response = await fetch(`${CLOUDFLARE_API_BASE}/accounts/${accountId}${path}`, {
89
+ ...init,
90
+ headers: {
91
+ Authorization: `Bearer ${apiToken}`,
92
+ 'Content-Type': 'application/json',
93
+ ...(init?.headers ?? {}),
94
+ },
95
+ });
96
+ const data = (await response.json().catch(() => ({})));
97
+ if (!response.ok || !data.success || data.result === undefined) {
98
+ const errorMessage = data.errors?.map((error) => error.message).filter(Boolean).join(', ');
99
+ throw new Error(errorMessage || `Cloudflare API request failed (${response.status})`);
100
+ }
101
+ return data.result;
102
+ }
103
+ async function listRealtimeApps(accountId, apiToken) {
104
+ return cloudflareApi(accountId, apiToken, '/calls/apps');
105
+ }
106
+ async function createRealtimeApp(accountId, apiToken, name) {
107
+ return cloudflareApi(accountId, apiToken, '/calls/apps', {
108
+ method: 'POST',
109
+ body: JSON.stringify({ name }),
110
+ });
111
+ }
112
+ async function listTurnKeys(accountId, apiToken) {
113
+ return cloudflareApi(accountId, apiToken, '/calls/turn_keys');
114
+ }
115
+ async function createTurnKey(accountId, apiToken, name) {
116
+ return cloudflareApi(accountId, apiToken, '/calls/turn_keys', {
117
+ method: 'POST',
118
+ body: JSON.stringify({ name }),
119
+ });
120
+ }
121
+ function hasCompleteLocalSecrets(snapshot) {
122
+ return REALTIME_SECRET_NAMES.every((key) => typeof snapshot[key] === 'string' && snapshot[key]);
123
+ }
124
+ function putWorkersSecret(projectDir, secretName, value) {
125
+ execFileSync(npxCommand(), ['wrangler', 'secret', 'put', secretName], {
126
+ cwd: projectDir,
127
+ input: value,
128
+ stdio: ['pipe', 'pipe', 'pipe'],
129
+ });
130
+ }
131
+ function syncWorkersSecrets(projectDir, secrets) {
132
+ for (const [secretName, value] of Object.entries(secrets)) {
133
+ putWorkersSecret(projectDir, secretName, value);
134
+ }
135
+ }
136
+ export async function provisionRealtime(options) {
137
+ const existingSecrets = readLocalSecretSnapshot(options.projectDir);
138
+ const names = getDefaultRealtimeNames(options.projectDir);
139
+ const appName = options.appName?.trim() || names.appName;
140
+ const turnName = options.turnName?.trim() || names.turnName;
141
+ if (hasCompleteLocalSecrets(existingSecrets) &&
142
+ !options.forceCreateApp &&
143
+ !options.forceCreateTurn) {
144
+ return {
145
+ appId: existingSecrets.CF_REALTIME_APP_ID,
146
+ appSecret: existingSecrets.CF_REALTIME_APP_SECRET,
147
+ appName,
148
+ appSource: 'local',
149
+ turnKeyId: existingSecrets.CF_REALTIME_TURN_KEY_ID,
150
+ turnApiToken: existingSecrets.CF_REALTIME_TURN_API_TOKEN,
151
+ turnName,
152
+ turnSource: 'local',
153
+ };
154
+ }
155
+ const auth = await ensureCloudflareAuth(options.projectDir, process.stdout.isTTY);
156
+ const { token: apiToken, source: apiTokenSource } = resolveApiToken();
157
+ try {
158
+ let appId = existingSecrets.CF_REALTIME_APP_ID;
159
+ let appSecret = existingSecrets.CF_REALTIME_APP_SECRET;
160
+ let appSource = appId && appSecret ? 'local' : 'created';
161
+ if (options.forceCreateApp || !appId || !appSecret) {
162
+ if (!options.forceCreateApp) {
163
+ const existingApp = (await listRealtimeApps(auth.accountId, apiToken))
164
+ .find((candidate) => candidate.name === appName);
165
+ if (existingApp && (!appId || !appSecret)) {
166
+ throw new Error(`Realtime app '${appName}' already exists in Cloudflare, but its secret is not stored locally. ` +
167
+ 'Cloudflare does not return existing app secrets again. Use --force-create-app to mint a new app or restore CF_REALTIME_APP_SECRET locally.');
168
+ }
169
+ }
170
+ const createdApp = await createRealtimeApp(auth.accountId, apiToken, appName);
171
+ if (!createdApp.uid || !createdApp.secret) {
172
+ throw new Error('Cloudflare returned an incomplete Realtime app response.');
173
+ }
174
+ appId = createdApp.uid;
175
+ appSecret = createdApp.secret;
176
+ appSource = 'created';
177
+ }
178
+ let turnKeyId = existingSecrets.CF_REALTIME_TURN_KEY_ID;
179
+ let turnApiToken = existingSecrets.CF_REALTIME_TURN_API_TOKEN;
180
+ let turnSource = turnKeyId && turnApiToken ? 'local' : 'created';
181
+ if (options.forceCreateTurn || !turnKeyId || !turnApiToken) {
182
+ if (!options.forceCreateTurn) {
183
+ const existingTurnKey = (await listTurnKeys(auth.accountId, apiToken))
184
+ .find((candidate) => candidate.name === turnName);
185
+ if (existingTurnKey && (!turnKeyId || !turnApiToken)) {
186
+ throw new Error(`TURN key '${turnName}' already exists in Cloudflare, but its API token is not stored locally. ` +
187
+ 'Cloudflare does not return existing TURN key tokens again. Use --force-create-turn to mint a new TURN key or restore CF_REALTIME_TURN_API_TOKEN locally.');
188
+ }
189
+ }
190
+ const createdTurnKey = await createTurnKey(auth.accountId, apiToken, turnName);
191
+ if (!createdTurnKey.uid || !createdTurnKey.key) {
192
+ throw new Error('Cloudflare returned an incomplete TURN key response.');
193
+ }
194
+ turnKeyId = createdTurnKey.uid;
195
+ turnApiToken = createdTurnKey.key;
196
+ turnSource = 'created';
197
+ }
198
+ const secrets = {
199
+ CF_REALTIME_APP_ID: appId,
200
+ CF_REALTIME_APP_SECRET: appSecret,
201
+ CF_REALTIME_TURN_KEY_ID: turnKeyId,
202
+ CF_REALTIME_TURN_API_TOKEN: turnApiToken,
203
+ };
204
+ writeLocalSecrets(options.projectDir, secrets);
205
+ if (options.syncWorkersSecrets !== false) {
206
+ try {
207
+ syncWorkersSecrets(options.projectDir, secrets);
208
+ }
209
+ catch (err) {
210
+ const warning = `Realtime secrets were written locally, but syncing Workers secrets failed: ${err instanceof Error ? err.message : String(err)}`;
211
+ if (!isQuiet()) {
212
+ console.log(chalk.yellow('⚠'), warning);
213
+ console.log(chalk.dim(' You can retry with `npx edgebase realtime provision` or set the secrets manually.'));
214
+ }
215
+ return {
216
+ appId: secrets.CF_REALTIME_APP_ID,
217
+ appSecret: secrets.CF_REALTIME_APP_SECRET,
218
+ appName,
219
+ appSource,
220
+ turnKeyId: secrets.CF_REALTIME_TURN_KEY_ID,
221
+ turnApiToken: secrets.CF_REALTIME_TURN_API_TOKEN,
222
+ turnName,
223
+ turnSource,
224
+ warnings: [
225
+ warning,
226
+ 'You can retry with `npx edgebase realtime provision` or set the secrets manually.',
227
+ ],
228
+ };
229
+ }
230
+ }
231
+ return {
232
+ appId: secrets.CF_REALTIME_APP_ID,
233
+ appSecret: secrets.CF_REALTIME_APP_SECRET,
234
+ appName,
235
+ appSource,
236
+ turnKeyId: secrets.CF_REALTIME_TURN_KEY_ID,
237
+ turnApiToken: secrets.CF_REALTIME_TURN_API_TOKEN,
238
+ turnName,
239
+ turnSource,
240
+ };
241
+ }
242
+ catch (error) {
243
+ throw toProvisionAuthError(error, apiTokenSource);
244
+ }
245
+ }
246
+ //# sourceMappingURL=realtime-provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-provision.js","sourceRoot":"","sources":["../../src/lib/realtime-provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared utilities for resolving common CLI options:
3
+ * - Service Key (--service-key / EDGEBASE_SERVICE_KEY / .edgebase/secrets.json)
4
+ * - Server URL (--url / EDGEBASE_URL)
5
+ *
6
+ * Eliminates duplication across backup, export, admin, seed commands.
7
+ */
8
+ /**
9
+ * Resolve Service Key from multiple sources (flag → env → secrets file).
10
+ * Exits with helpful error if not found.
11
+ *
12
+ * Resolution order:
13
+ * 1. --service-key flag
14
+ * 2. EDGEBASE_SERVICE_KEY environment variable
15
+ * 3. .edgebase/secrets.json file (auto-saved after deploy)
16
+ */
17
+ export declare function resolveServiceKey(options: {
18
+ serviceKey?: string;
19
+ }): string;
20
+ /**
21
+ * Resolve Service Key from multiple sources without requiring one to exist.
22
+ *
23
+ * Resolution order:
24
+ * 1. --service-key flag
25
+ * 2. EDGEBASE_SERVICE_KEY environment variable
26
+ * 3. .edgebase/secrets.json file (auto-saved after deploy)
27
+ */
28
+ export declare function resolveOptionalServiceKey(options: {
29
+ serviceKey?: string;
30
+ }): string | undefined;
31
+ /**
32
+ * Resolve server URL from flag or environment variable.
33
+ * Exits with helpful error if not found (when required=true).
34
+ *
35
+ * Resolution order:
36
+ * 1. --url flag
37
+ * 2. EDGEBASE_URL environment variable
38
+ */
39
+ export declare function resolveServerUrl(options: {
40
+ url?: string;
41
+ }, required?: boolean): string;
42
+ //# sourceMappingURL=resolve-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-options.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-options.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAgB1E;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAqB9F;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,UAAO,GAAG,MAAM,CAqBnF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared utilities for resolving common CLI options:
3
+ * - Service Key (--service-key / EDGEBASE_SERVICE_KEY / .edgebase/secrets.json)
4
+ * - Server URL (--url / EDGEBASE_URL)
5
+ *
6
+ * Eliminates duplication across backup, export, admin, seed commands.
7
+ */
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { raiseNeedsInput } from './agent-contract.js';
11
+ /**
12
+ * Resolve Service Key from multiple sources (flag → env → secrets file).
13
+ * Exits with helpful error if not found.
14
+ *
15
+ * Resolution order:
16
+ * 1. --service-key flag
17
+ * 2. EDGEBASE_SERVICE_KEY environment variable
18
+ * 3. .edgebase/secrets.json file (auto-saved after deploy)
19
+ */
20
+ export function resolveServiceKey(options) {
21
+ const resolved = resolveOptionalServiceKey(options);
22
+ if (resolved)
23
+ return resolved;
24
+ raiseNeedsInput({
25
+ code: 'service_key_required',
26
+ field: 'serviceKey',
27
+ message: 'Service Key required.',
28
+ hint: 'Provide --service-key <key>, set EDGEBASE_SERVICE_KEY, or deploy once so .edgebase/secrets.json is populated.',
29
+ choices: [{
30
+ label: 'Provide service key flag',
31
+ value: 'service-key',
32
+ args: ['--service-key', '<key>'],
33
+ hint: 'Use an admin Service Key with backup/export/admin commands.',
34
+ }],
35
+ });
36
+ }
37
+ /**
38
+ * Resolve Service Key from multiple sources without requiring one to exist.
39
+ *
40
+ * Resolution order:
41
+ * 1. --service-key flag
42
+ * 2. EDGEBASE_SERVICE_KEY environment variable
43
+ * 3. .edgebase/secrets.json file (auto-saved after deploy)
44
+ */
45
+ export function resolveOptionalServiceKey(options) {
46
+ // 1. CLI flag
47
+ if (options.serviceKey)
48
+ return options.serviceKey;
49
+ // 2. Environment variable
50
+ const envKey = process.env.EDGEBASE_SERVICE_KEY;
51
+ if (envKey)
52
+ return envKey;
53
+ // 3. .edgebase/secrets.json (auto-saved after first deploy)
54
+ const projectDir = process.cwd();
55
+ const secretsPath = join(projectDir, '.edgebase', 'secrets.json');
56
+ if (existsSync(secretsPath)) {
57
+ try {
58
+ const secrets = JSON.parse(readFileSync(secretsPath, 'utf-8'));
59
+ if (secrets.SERVICE_KEY)
60
+ return secrets.SERVICE_KEY;
61
+ }
62
+ catch {
63
+ /* ignore corrupted file */
64
+ }
65
+ }
66
+ return undefined;
67
+ }
68
+ /**
69
+ * Resolve server URL from flag or environment variable.
70
+ * Exits with helpful error if not found (when required=true).
71
+ *
72
+ * Resolution order:
73
+ * 1. --url flag
74
+ * 2. EDGEBASE_URL environment variable
75
+ */
76
+ export function resolveServerUrl(options, required = true) {
77
+ // 1. CLI flag
78
+ if (options.url)
79
+ return options.url.replace(/\/$/, '');
80
+ // 2. Environment variable
81
+ const envUrl = process.env.EDGEBASE_URL;
82
+ if (envUrl)
83
+ return envUrl.replace(/\/$/, '');
84
+ if (!required)
85
+ return '';
86
+ raiseNeedsInput({
87
+ code: 'worker_url_required',
88
+ field: 'url',
89
+ message: 'Worker URL required.',
90
+ hint: 'Provide --url <worker-url> or set EDGEBASE_URL. Typical values are http://localhost:8787 for local dev or https://<name>.workers.dev for production.',
91
+ choices: [{
92
+ label: 'Provide worker URL flag',
93
+ value: 'url',
94
+ args: ['--url', '<worker-url>'],
95
+ }],
96
+ });
97
+ }
98
+ //# sourceMappingURL=resolve-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-options.js","sourceRoot":"","sources":["../../src/lib/resolve-options.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgC;IAChE,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,eAAe,CAAC;QACd,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,+GAA+G;QACrH,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,0BAA0B;gBACjC,KAAK,EAAE,aAAa;gBACpB,IAAI,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC;gBAChC,IAAI,EAAE,6DAA6D;aACpE,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgC;IACxE,cAAc;IACd,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC;IAElD,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,4DAA4D;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,OAAO,CAAC,WAAW;gBAAE,OAAO,OAAO,CAAC,WAAW,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAyB,EAAE,QAAQ,GAAG,IAAI;IACzE,cAAc;IACd,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEvD,0BAA0B;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACxC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,eAAe,CAAC;QACd,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,sJAAsJ;QAC5J,OAAO,EAAE,CAAC;gBACR,KAAK,EAAE,yBAAyB;gBAChC,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;aAChC,CAAC;KACH,CAAC,CAAC;AACL,CAAC"}