@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,321 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import chalk from 'chalk';
6
+ import { raiseCliError, raiseNeedsUserAction } from './agent-contract.js';
7
+ import { isJson, isNonInteractive } from './cli-context.js';
8
+ import { buildDefaultWranglerToml, deriveProjectSlug } from './runtime-scaffold.js';
9
+ import { wranglerArgs, wranglerCommand, wranglerHint } from './wrangler.js';
10
+ // ─── Public API ───
11
+ /**
12
+ * Full Auth Gate: check auth → login if needed → extract account_id.
13
+ * Returns CloudflareAuth or exits the process on failure.
14
+ *
15
+ * Resolution order for account_id:
16
+ * 1. CLOUDFLARE_ACCOUNT_ID env var
17
+ * 2. .edgebase/cloudflare.json cache
18
+ * 3. wrangler.toml account_id field
19
+ * 4. wrangler whoami output
20
+ */
21
+ export async function ensureCloudflareAuth(projectDir, isTTY) {
22
+ console.log(chalk.blue('☁️ Checking Cloudflare authentication...'));
23
+ // 1. Check existing auth
24
+ let auth = checkWranglerAuth(projectDir);
25
+ if (auth) {
26
+ console.log(chalk.green('✓'), `Authenticated as ${chalk.cyan(auth.accountName)} (${auth.accountId.slice(0, 8)}...)`);
27
+ return auth;
28
+ }
29
+ // 2. Not authenticated
30
+ if (!isTTY || isNonInteractive() || isJson()) {
31
+ raiseNeedsUserAction({
32
+ code: 'cloudflare_login_required',
33
+ message: 'Cloudflare authentication is required before this command can continue.',
34
+ hint: 'Set CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID for automation, or complete a one-time wrangler login.',
35
+ action: {
36
+ type: 'open_browser',
37
+ title: 'Cloudflare Login',
38
+ message: 'This step opens the Cloudflare OAuth flow in a browser and requires the user to finish sign-in.',
39
+ command: wranglerHint(['wrangler', 'login']),
40
+ instructions: [
41
+ 'Run the login command in an interactive terminal, or provide CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_ID.',
42
+ 'After authentication succeeds, rerun the original EdgeBase command.',
43
+ ],
44
+ },
45
+ });
46
+ }
47
+ // 3. Interactive: auto-trigger login
48
+ console.log(chalk.yellow('⚠'), 'Not authenticated with Cloudflare.');
49
+ console.log();
50
+ const success = triggerWranglerLogin(projectDir);
51
+ if (!success) {
52
+ raiseCliError({
53
+ code: 'cloudflare_login_failed',
54
+ message: 'Cloudflare login failed.',
55
+ hint: `Try running \`${wranglerHint(['wrangler', 'login'])}\` manually in an interactive terminal, then rerun the EdgeBase command.`,
56
+ });
57
+ }
58
+ // 4. Re-check auth after login
59
+ auth = checkWranglerAuth(projectDir);
60
+ if (!auth) {
61
+ raiseCliError({
62
+ code: 'cloudflare_account_resolution_failed',
63
+ message: 'Authentication completed but account info could not be resolved.',
64
+ hint: `Run \`${wranglerHint(['wrangler', 'whoami'])}\` to verify the active account, then retry.`,
65
+ });
66
+ }
67
+ console.log(chalk.green('✓'), `Authenticated as ${chalk.cyan(auth.accountName)} (${auth.accountId.slice(0, 8)}...)`);
68
+ // 5. Cache for future runs
69
+ saveCachedAccountId(projectDir, auth.accountId, auth.accountName);
70
+ return auth;
71
+ }
72
+ /**
73
+ * Check if user is authenticated via `wrangler whoami`.
74
+ * Returns parsed account info or null if not authenticated.
75
+ *
76
+ * Checks in order:
77
+ * 1. CLOUDFLARE_ACCOUNT_ID env (+ verify via whoami if possible)
78
+ * 2. Cached .edgebase/cloudflare.json
79
+ * 3. wrangler.toml account_id
80
+ * 4. wrangler whoami output
81
+ */
82
+ export function checkWranglerAuth(projectDir) {
83
+ // Quick path: env var provides account_id
84
+ const envAccountId = process.env.CLOUDFLARE_ACCOUNT_ID;
85
+ const envApiToken = process.env.CLOUDFLARE_API_TOKEN;
86
+ if (envApiToken && envAccountId) {
87
+ return {
88
+ accountId: envAccountId,
89
+ accountName: 'ENV',
90
+ authMethod: 'api_token',
91
+ };
92
+ }
93
+ // Try wrangler whoami to check actual auth status
94
+ let whoamiOutput;
95
+ try {
96
+ whoamiOutput = execFileSync(wranglerCommand(), wranglerArgs(['wrangler', 'whoami']), {
97
+ cwd: projectDir,
98
+ encoding: 'utf-8',
99
+ stdio: ['ignore', 'pipe', 'pipe'],
100
+ timeout: 30000,
101
+ });
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ // Check for unauthenticated indicators
107
+ if (whoamiOutput.includes('not authenticated') ||
108
+ whoamiOutput.includes('No OAuth token') ||
109
+ whoamiOutput.includes('no auth')) {
110
+ return null;
111
+ }
112
+ // Parse accounts from whoami output
113
+ const accounts = parseWhoamiOutput(whoamiOutput);
114
+ if (accounts.length === 0)
115
+ return null;
116
+ // Determine account_id (priority: env > cache > toml > whoami)
117
+ let accountId = envAccountId ?? null;
118
+ let accountName = accounts[0].name;
119
+ if (!accountId) {
120
+ // Check cache
121
+ const cached = loadCachedAccountId(projectDir);
122
+ if (cached) {
123
+ // Verify cached id is still in the accounts list
124
+ const match = accounts.find(a => a.id === cached);
125
+ if (match) {
126
+ accountId = match.id;
127
+ accountName = match.name;
128
+ }
129
+ }
130
+ }
131
+ if (!accountId) {
132
+ // Check wrangler.toml
133
+ const tomlId = extractAccountIdFromToml(projectDir);
134
+ if (tomlId) {
135
+ const match = accounts.find(a => a.id === tomlId);
136
+ if (match) {
137
+ accountId = match.id;
138
+ accountName = match.name;
139
+ }
140
+ }
141
+ }
142
+ if (!accountId) {
143
+ // Use first account from whoami
144
+ accountId = accounts[0].id;
145
+ accountName = accounts[0].name;
146
+ }
147
+ return {
148
+ accountId,
149
+ accountName,
150
+ authMethod: envApiToken ? 'api_token' : 'oauth',
151
+ };
152
+ }
153
+ /**
154
+ * Parse `wrangler whoami` table output to extract account names and IDs.
155
+ *
156
+ * Wrangler outputs a pipe-delimited table like:
157
+ * ┌──────────────────┬──────────────────────────────────┐
158
+ * │ Account Name │ Account ID │
159
+ * ├──────────────────┼──────────────────────────────────┤
160
+ * │ John's Account │ abcdef1234567890abcdef1234567890 │
161
+ * └──────────────────┴──────────────────────────────────┘
162
+ */
163
+ export function parseWhoamiOutput(output) {
164
+ const accounts = [];
165
+ const lines = output.split('\n');
166
+ for (const line of lines) {
167
+ // Match 32-char hex strings (Cloudflare account IDs)
168
+ const idMatch = line.match(/([0-9a-f]{32})/);
169
+ if (!idMatch)
170
+ continue;
171
+ // Extract account name from the same row (pipe-delimited)
172
+ const parts = line.split('│').map(s => s.trim()).filter(Boolean);
173
+ const name = parts.length >= 2 ? parts[0] : 'Unknown';
174
+ accounts.push({ name, id: idMatch[1] });
175
+ }
176
+ return accounts;
177
+ }
178
+ /**
179
+ * Trigger `wrangler login` (browser OAuth flow).
180
+ * Only works in interactive terminals. Blocks until complete.
181
+ */
182
+ export function triggerWranglerLogin(projectDir) {
183
+ console.log(chalk.blue('🔐 Opening Cloudflare login in browser...'));
184
+ console.log(chalk.dim(' This opens Cloudflare OAuth in your browser and requires the user to finish sign-in.'));
185
+ console.log(chalk.dim(' Return to the terminal after the browser flow completes.'));
186
+ console.log();
187
+ try {
188
+ execFileSync(wranglerCommand(), wranglerArgs(['wrangler', 'login']), {
189
+ cwd: projectDir,
190
+ stdio: 'inherit',
191
+ timeout: 120000, // 2 minute timeout for browser auth
192
+ });
193
+ console.log();
194
+ return true;
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
200
+ /**
201
+ * Ensure wrangler.toml exists at project root with account_id.
202
+ * - If exists: inject/update account_id
203
+ * - If missing: create minimal template
204
+ *
205
+ * Returns the path to wrangler.toml.
206
+ */
207
+ export function ensureWranglerToml(projectDir, accountId) {
208
+ const wranglerPath = join(projectDir, 'wrangler.toml');
209
+ if (existsSync(wranglerPath)) {
210
+ let content = readFileSync(wranglerPath, 'utf-8');
211
+ if (/^account_id\s*=/m.test(content)) {
212
+ // Update existing account_id
213
+ content = content.replace(/^account_id\s*=\s*"[^"]*"/m, `account_id = "${accountId}"`);
214
+ }
215
+ else {
216
+ // Insert account_id after the name line (or at the top)
217
+ const nameMatch = content.match(/^name\s*=\s*"[^"]*"\n/m);
218
+ if (nameMatch && nameMatch.index !== undefined) {
219
+ const insertPos = nameMatch.index + nameMatch[0].length;
220
+ content =
221
+ content.slice(0, insertPos) +
222
+ `account_id = "${accountId}"\n` +
223
+ content.slice(insertPos);
224
+ }
225
+ else {
226
+ content = `account_id = "${accountId}"\n` + content;
227
+ }
228
+ }
229
+ writeFileSync(wranglerPath, content, 'utf-8');
230
+ console.log(chalk.green('✓'), 'wrangler.toml updated with account_id');
231
+ return wranglerPath;
232
+ }
233
+ // No wrangler.toml — create minimal template
234
+ const template = buildDefaultWranglerToml(accountId, deriveProjectSlug(projectDir))
235
+ .replace('id = "local"', 'id = "placeholder"')
236
+ .replace('database_id = "local"', 'database_id = "placeholder"');
237
+ writeFileSync(wranglerPath, template, 'utf-8');
238
+ console.log(chalk.green('✓'), 'wrangler.toml created with account_id');
239
+ return wranglerPath;
240
+ }
241
+ /**
242
+ * Load cached account_id from .edgebase/cloudflare.json.
243
+ */
244
+ export function loadCachedAccountId(projectDir) {
245
+ const cachePath = join(projectDir, '.edgebase', 'cloudflare.json');
246
+ if (!existsSync(cachePath))
247
+ return null;
248
+ try {
249
+ const data = JSON.parse(readFileSync(cachePath, 'utf-8'));
250
+ return data.accountId ?? null;
251
+ }
252
+ catch {
253
+ return null;
254
+ }
255
+ }
256
+ /**
257
+ * Save account_id to .edgebase/cloudflare.json.
258
+ */
259
+ export function saveCachedAccountId(projectDir, accountId, accountName) {
260
+ const edgebaseDir = join(projectDir, '.edgebase');
261
+ const cachePath = join(edgebaseDir, 'cloudflare.json');
262
+ if (!existsSync(edgebaseDir)) {
263
+ mkdirSync(edgebaseDir, { recursive: true });
264
+ }
265
+ writeFileSync(cachePath, JSON.stringify({ accountId, accountName, updatedAt: new Date().toISOString() }, null, 2), 'utf-8');
266
+ chmodSync(cachePath, 0o600);
267
+ }
268
+ // ─── API Token Resolution ───
269
+ /**
270
+ * Locate the wrangler config directory (varies by platform).
271
+ */
272
+ function getWranglerConfigDir() {
273
+ const legacyDir = join(homedir(), '.wrangler');
274
+ if (existsSync(legacyDir))
275
+ return legacyDir;
276
+ if (process.platform === 'darwin') {
277
+ return join(homedir(), 'Library', 'Preferences', '.wrangler');
278
+ }
279
+ return join(process.env.XDG_CONFIG_HOME || join(homedir(), '.config'), '.wrangler');
280
+ }
281
+ /**
282
+ * Read the OAuth token from wrangler's local config file.
283
+ */
284
+ export function readWranglerOauthToken() {
285
+ const environment = process.env.CLOUDFLARE_API_ENVIRONMENT === 'staging'
286
+ ? 'staging'
287
+ : 'default';
288
+ const authConfigPath = join(getWranglerConfigDir(), 'config', `${environment}.toml`);
289
+ if (!existsSync(authConfigPath))
290
+ return null;
291
+ const raw = readFileSync(authConfigPath, 'utf-8');
292
+ const oauthMatch = raw.match(/^oauth_token\s*=\s*"([^"]+)"/m);
293
+ return oauthMatch?.[1] ?? null;
294
+ }
295
+ /**
296
+ * Resolve a Cloudflare API token from env var or wrangler OAuth login.
297
+ * Used by deploy (to store as Worker secret) and realtime provisioning.
298
+ */
299
+ export function resolveApiToken() {
300
+ if (process.env.CLOUDFLARE_API_TOKEN) {
301
+ return { token: process.env.CLOUDFLARE_API_TOKEN, source: 'env' };
302
+ }
303
+ const wranglerOauthToken = readWranglerOauthToken();
304
+ if (wranglerOauthToken) {
305
+ return { token: wranglerOauthToken, source: 'wrangler_oauth' };
306
+ }
307
+ throw new Error('Could not resolve a Cloudflare API token. Set CLOUDFLARE_API_TOKEN or complete a wrangler login.');
308
+ }
309
+ // ─── Internal Helpers ───
310
+ /**
311
+ * Extract account_id from wrangler.toml.
312
+ */
313
+ function extractAccountIdFromToml(projectDir) {
314
+ const wranglerPath = join(projectDir, 'wrangler.toml');
315
+ if (!existsSync(wranglerPath))
316
+ return null;
317
+ const content = readFileSync(wranglerPath, 'utf-8');
318
+ const match = content.match(/^account_id\s*=\s*"([^"]+)"/m);
319
+ return match?.[1] ?? null;
320
+ }
321
+ //# sourceMappingURL=cf-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf-auth.js","sourceRoot":"","sources":["../../src/lib/cf-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Global CLI context — shared state for verbose/quiet/json modes.
3
+ *
4
+ * Set once in index.ts via `preAction` hook, read by all commands
5
+ * and utility modules (spinner, update-check, etc.).
6
+ */
7
+ export interface CliContext {
8
+ verbose: boolean;
9
+ quiet: boolean;
10
+ json: boolean;
11
+ nonInteractive: boolean;
12
+ }
13
+ export declare function setContext(opts: Partial<CliContext>): void;
14
+ export declare function getContext(): Readonly<CliContext>;
15
+ /** True when --verbose flag is set. */
16
+ export declare function isVerbose(): boolean;
17
+ /** True when --quiet or --json flag is set (suppress non-essential output). */
18
+ export declare function isQuiet(): boolean;
19
+ /** True when --json flag is set (structured output mode). */
20
+ export declare function isJson(): boolean;
21
+ /** True when prompts/browser flows should not auto-run and must be explicit. */
22
+ export declare function isNonInteractive(): boolean;
23
+ //# sourceMappingURL=cli-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-context.d.ts","sourceRoot":"","sources":["../../src/lib/cli-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAiBD,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAE1D;AAED,wBAAgB,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,CAEjD;AAID,uCAAuC;AACvC,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Global CLI context — shared state for verbose/quiet/json modes.
3
+ *
4
+ * Set once in index.ts via `preAction` hook, read by all commands
5
+ * and utility modules (spinner, update-check, etc.).
6
+ */
7
+ const GLOBAL_CLI_CONTEXT_KEY = '__edgebaseCliContext';
8
+ const globalScope = globalThis;
9
+ // Keep one shared CLI context even when modules are reloaded in tests or by dynamic imports.
10
+ const ctx = globalScope[GLOBAL_CLI_CONTEXT_KEY]
11
+ ?? (globalScope[GLOBAL_CLI_CONTEXT_KEY] = {
12
+ verbose: false,
13
+ quiet: false,
14
+ json: false,
15
+ nonInteractive: false,
16
+ });
17
+ export function setContext(opts) {
18
+ Object.assign(ctx, opts);
19
+ }
20
+ export function getContext() {
21
+ return ctx;
22
+ }
23
+ // ─── Convenience helpers ───
24
+ /** True when --verbose flag is set. */
25
+ export function isVerbose() {
26
+ return ctx.verbose;
27
+ }
28
+ /** True when --quiet or --json flag is set (suppress non-essential output). */
29
+ export function isQuiet() {
30
+ return ctx.quiet || ctx.json;
31
+ }
32
+ /** True when --json flag is set (structured output mode). */
33
+ export function isJson() {
34
+ return ctx.json;
35
+ }
36
+ /** True when prompts/browser flows should not auto-run and must be explicit. */
37
+ export function isNonInteractive() {
38
+ return ctx.nonInteractive;
39
+ }
40
+ //# sourceMappingURL=cli-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-context.js","sourceRoot":"","sources":["../../src/lib/cli-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAEtD,MAAM,WAAW,GAAG,UAEnB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,GAAG,GAAe,WAAW,CAAC,sBAAsB,CAAC;OACtD,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG;QACxC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAK;QACX,cAAc,EAAE,KAAK;KACtB,CAAC,CAAC;AAEL,MAAM,UAAU,UAAU,CAAC,IAAyB;IAClD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8BAA8B;AAE9B,uCAAuC;AACvC,MAAM,UAAU,SAAS;IACvB,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,OAAO;IACrB,OAAO,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,MAAM;IACpB,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,GAAG,CAAC,cAAc,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,26 @@
1
+ export type CloudflareResourceType = 'kv_namespace' | 'd1_database' | 'vectorize' | 'hyperdrive' | 'r2_bucket' | 'turnstile_widget';
2
+ export interface CloudflareResourceRecord {
3
+ type: CloudflareResourceType;
4
+ name: string;
5
+ binding?: string;
6
+ id?: string;
7
+ managed?: boolean;
8
+ source?: 'created' | 'existing' | 'wrangler' | 'manual';
9
+ metadata?: Record<string, string | number | boolean | null>;
10
+ }
11
+ export interface CloudflareDeployManifest {
12
+ version: 2;
13
+ deployedAt: string;
14
+ accountId: string;
15
+ worker: {
16
+ name: string;
17
+ url: string;
18
+ };
19
+ resources: CloudflareResourceRecord[];
20
+ }
21
+ export declare function normalizeCloudflareDeployManifest(raw: unknown): CloudflareDeployManifest | null;
22
+ export declare function getCloudflareDeployManifestPath(projectDir: string): string;
23
+ export declare function readCloudflareDeployManifest(projectDir: string): CloudflareDeployManifest | null;
24
+ export declare function writeCloudflareDeployManifest(projectDir: string, manifest: CloudflareDeployManifest): string;
25
+ export declare function findCloudflareResourceRecord(manifest: CloudflareDeployManifest | null, candidate: Pick<CloudflareResourceRecord, 'type' | 'name' | 'binding' | 'id'>): CloudflareResourceRecord | null;
26
+ //# sourceMappingURL=cloudflare-deploy-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-deploy-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare-deploy-manifest.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,aAAa,GACb,WAAW,GACX,YAAY,GACZ,WAAW,GACX,kBAAkB,CAAC;AAEvB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,SAAS,EAAE,wBAAwB,EAAE,CAAC;CACvC;AAiFD,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,OAAO,GACX,wBAAwB,GAAG,IAAI,CA0BjC;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,GAAG,IAAI,CAUhG;AAED,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,GACjC,MAAM,CAKR;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,wBAAwB,GAAG,IAAI,EACzC,SAAS,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAC5E,wBAAwB,GAAG,IAAI,CAajC"}
@@ -0,0 +1,107 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ function isResourceType(value) {
4
+ return value === 'kv_namespace'
5
+ || value === 'd1_database'
6
+ || value === 'vectorize'
7
+ || value === 'hyperdrive'
8
+ || value === 'r2_bucket'
9
+ || value === 'turnstile_widget';
10
+ }
11
+ function normalizeResourceRecord(value) {
12
+ if (!value || typeof value !== 'object')
13
+ return null;
14
+ const resource = value;
15
+ if (!isResourceType(resource.type) || typeof resource.name !== 'string')
16
+ return null;
17
+ const metadata = resource.metadata && typeof resource.metadata === 'object' && !Array.isArray(resource.metadata)
18
+ ? Object.fromEntries(Object.entries(resource.metadata).filter(([, entry]) => entry === null
19
+ || typeof entry === 'string'
20
+ || typeof entry === 'number'
21
+ || typeof entry === 'boolean'))
22
+ : undefined;
23
+ return {
24
+ type: resource.type,
25
+ name: resource.name,
26
+ binding: typeof resource.binding === 'string' ? resource.binding : undefined,
27
+ id: typeof resource.id === 'string' ? resource.id : undefined,
28
+ managed: typeof resource.managed === 'boolean' ? resource.managed : true,
29
+ source: resource.source === 'created'
30
+ || resource.source === 'existing'
31
+ || resource.source === 'wrangler'
32
+ || resource.source === 'manual'
33
+ ? resource.source
34
+ : undefined,
35
+ metadata,
36
+ };
37
+ }
38
+ function normalizeLegacyResource(value) {
39
+ if (!isResourceType(value.type) || typeof value.name !== 'string')
40
+ return null;
41
+ return {
42
+ type: value.type,
43
+ name: value.name,
44
+ binding: typeof value.binding === 'string' ? value.binding : undefined,
45
+ id: typeof value.id === 'string' ? value.id : undefined,
46
+ managed: true,
47
+ source: 'existing',
48
+ };
49
+ }
50
+ function isStringRecord(value) {
51
+ return typeof value === 'object' && value !== null;
52
+ }
53
+ export function normalizeCloudflareDeployManifest(raw) {
54
+ if (!isStringRecord(raw))
55
+ return null;
56
+ const worker = isStringRecord(raw.worker) ? raw.worker : {};
57
+ const resourcesRaw = Array.isArray(raw.resources) ? raw.resources : [];
58
+ const resources = raw.version === 1
59
+ ? resourcesRaw
60
+ .map((entry) => normalizeLegacyResource(entry))
61
+ .filter((entry) => entry !== null)
62
+ : resourcesRaw
63
+ .map((entry) => normalizeResourceRecord(entry))
64
+ .filter((entry) => entry !== null);
65
+ if (typeof raw.accountId !== 'string')
66
+ return null;
67
+ return {
68
+ version: 2,
69
+ deployedAt: typeof raw.deployedAt === 'string' ? raw.deployedAt : new Date(0).toISOString(),
70
+ accountId: raw.accountId,
71
+ worker: {
72
+ name: typeof worker.name === 'string' ? worker.name : '',
73
+ url: typeof worker.url === 'string' ? worker.url : '',
74
+ },
75
+ resources,
76
+ };
77
+ }
78
+ export function getCloudflareDeployManifestPath(projectDir) {
79
+ return join(projectDir, '.edgebase', 'cloudflare-deploy-manifest.json');
80
+ }
81
+ export function readCloudflareDeployManifest(projectDir) {
82
+ const manifestPath = getCloudflareDeployManifestPath(projectDir);
83
+ if (!existsSync(manifestPath))
84
+ return null;
85
+ try {
86
+ const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
87
+ return normalizeCloudflareDeployManifest(raw);
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ export function writeCloudflareDeployManifest(projectDir, manifest) {
94
+ const manifestPath = getCloudflareDeployManifestPath(projectDir);
95
+ mkdirSync(join(projectDir, '.edgebase'), { recursive: true });
96
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
97
+ return manifestPath;
98
+ }
99
+ export function findCloudflareResourceRecord(manifest, candidate) {
100
+ if (!manifest)
101
+ return null;
102
+ return (manifest.resources.find((resource) => resource.type === candidate.type
103
+ && ((!!candidate.id && resource.id === candidate.id)
104
+ || (!!candidate.binding && !!resource.binding && resource.binding === candidate.binding)
105
+ || resource.name === candidate.name)) ?? null);
106
+ }
107
+ //# sourceMappingURL=cloudflare-deploy-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-deploy-manifest.js","sourceRoot":"","sources":["../../src/lib/cloudflare-deploy-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface WranglerR2Bucket {
2
+ binding: string;
3
+ bucketName: string;
4
+ jurisdiction?: string;
5
+ }
6
+ export interface WranglerD1Database {
7
+ binding: string;
8
+ databaseName: string;
9
+ databaseId?: string;
10
+ }
11
+ export interface WranglerKvNamespace {
12
+ binding: string;
13
+ id?: string;
14
+ }
15
+ export interface WranglerVectorize {
16
+ binding: string;
17
+ indexName: string;
18
+ }
19
+ export interface WranglerHyperdrive {
20
+ binding: string;
21
+ id: string;
22
+ }
23
+ export interface WranglerResourceConfig {
24
+ workerName: string;
25
+ r2Buckets: WranglerR2Bucket[];
26
+ d1Databases: WranglerD1Database[];
27
+ kvNamespaces: WranglerKvNamespace[];
28
+ vectorizeIndexes: WranglerVectorize[];
29
+ hyperdriveConfigs: WranglerHyperdrive[];
30
+ }
31
+ export declare function parseWranglerResourceConfig(content: string): WranglerResourceConfig;
32
+ //# sourceMappingURL=cloudflare-wrangler-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-wrangler-resources.d.ts","sourceRoot":"","sources":["../../src/lib/cloudflare-wrangler-resources.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;CACzC;AAYD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAoDnF"}
@@ -0,0 +1,59 @@
1
+ function getTomlBlockValues(content, blockName) {
2
+ const pattern = new RegExp(`\\[\\[${blockName}\\]\\]([\\s\\S]*?)(?=\\n\\[\\[|\\n\\[|$)`, 'g');
3
+ return [...content.matchAll(pattern)].map((match) => match[1] ?? '');
4
+ }
5
+ function readTomlString(block, key) {
6
+ const match = block.match(new RegExp(`^\\s*${key}\\s*=\\s*"([^"]+)"`, 'm'));
7
+ return match?.[1];
8
+ }
9
+ export function parseWranglerResourceConfig(content) {
10
+ const workerName = content.match(/^name\s*=\s*"([^"]+)"/m)?.[1] ?? '';
11
+ const r2Buckets = [];
12
+ for (const block of getTomlBlockValues(content, 'r2_buckets')) {
13
+ const binding = readTomlString(block, 'binding');
14
+ const bucketName = readTomlString(block, 'bucket_name');
15
+ if (!binding || !bucketName)
16
+ continue;
17
+ const bucket = { binding, bucketName };
18
+ const jurisdiction = readTomlString(block, 'jurisdiction');
19
+ if (jurisdiction) {
20
+ bucket.jurisdiction = jurisdiction;
21
+ }
22
+ r2Buckets.push(bucket);
23
+ }
24
+ const d1Databases = [];
25
+ for (const block of getTomlBlockValues(content, 'd1_databases')) {
26
+ const binding = readTomlString(block, 'binding');
27
+ const databaseName = readTomlString(block, 'database_name');
28
+ if (!binding || !databaseName)
29
+ continue;
30
+ const databaseId = readTomlString(block, 'database_id');
31
+ d1Databases.push({ binding, databaseName, databaseId });
32
+ }
33
+ const kvNamespaces = [];
34
+ for (const block of getTomlBlockValues(content, 'kv_namespaces')) {
35
+ const binding = readTomlString(block, 'binding');
36
+ if (!binding)
37
+ continue;
38
+ const id = readTomlString(block, 'id');
39
+ kvNamespaces.push({ binding, id });
40
+ }
41
+ const vectorizeIndexes = [];
42
+ for (const block of getTomlBlockValues(content, 'vectorize')) {
43
+ const binding = readTomlString(block, 'binding');
44
+ const indexName = readTomlString(block, 'index_name');
45
+ if (!binding || !indexName)
46
+ continue;
47
+ vectorizeIndexes.push({ binding, indexName });
48
+ }
49
+ const hyperdriveConfigs = [];
50
+ for (const block of getTomlBlockValues(content, 'hyperdrive')) {
51
+ const binding = readTomlString(block, 'binding');
52
+ const id = readTomlString(block, 'id');
53
+ if (!binding || !id)
54
+ continue;
55
+ hyperdriveConfigs.push({ binding, id });
56
+ }
57
+ return { workerName, r2Buckets, d1Databases, kvNamespaces, vectorizeIndexes, hyperdriveConfigs };
58
+ }
59
+ //# sourceMappingURL=cloudflare-wrangler-resources.js.map