@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.
- package/README.md +182 -0
- package/dist/commands/admin.d.ts +10 -0
- package/dist/commands/admin.d.ts.map +1 -0
- package/dist/commands/admin.js +307 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/backup.d.ts +148 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +1247 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +168 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/create-plugin.d.ts +3 -0
- package/dist/commands/create-plugin.d.ts.map +1 -0
- package/dist/commands/create-plugin.js +208 -0
- package/dist/commands/create-plugin.js.map +1 -0
- package/dist/commands/deploy.d.ts +146 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +1823 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/describe.d.ts +45 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +114 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/destroy.d.ts +13 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +642 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/dev.d.ts +80 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +1131 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/docker.d.ts +22 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +373 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/export.d.ts +15 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +142 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +506 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/keys.d.ts +23 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +347 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/logs.d.ts +17 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +104 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/migrate.d.ts +29 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +302 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/migration.d.ts +18 -0
- package/dist/commands/migration.d.ts.map +1 -0
- package/dist/commands/migration.js +114 -0
- package/dist/commands/migration.js.map +1 -0
- package/dist/commands/neon.d.ts +66 -0
- package/dist/commands/neon.d.ts.map +1 -0
- package/dist/commands/neon.js +600 -0
- package/dist/commands/neon.js.map +1 -0
- package/dist/commands/plugins.d.ts +9 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +295 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/realtime.d.ts +3 -0
- package/dist/commands/realtime.d.ts.map +1 -0
- package/dist/commands/realtime.js +71 -0
- package/dist/commands/realtime.js.map +1 -0
- package/dist/commands/secret.d.ts +7 -0
- package/dist/commands/secret.d.ts.map +1 -0
- package/dist/commands/secret.js +180 -0
- package/dist/commands/secret.js.map +1 -0
- package/dist/commands/seed.d.ts +21 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +325 -0
- package/dist/commands/seed.js.map +1 -0
- package/dist/commands/telemetry.d.ts +12 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +57 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/typegen.d.ts +26 -0
- package/dist/commands/typegen.d.ts.map +1 -0
- package/dist/commands/typegen.js +212 -0
- package/dist/commands/typegen.js.map +1 -0
- package/dist/commands/upgrade.d.ts +29 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +265 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/webhook-test.d.ts +3 -0
- package/dist/commands/webhook-test.d.ts.map +1 -0
- package/dist/commands/webhook-test.js +133 -0
- package/dist/commands/webhook-test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-contract.d.ts +36 -0
- package/dist/lib/agent-contract.d.ts.map +1 -0
- package/dist/lib/agent-contract.js +78 -0
- package/dist/lib/agent-contract.js.map +1 -0
- package/dist/lib/cf-auth.d.ts +76 -0
- package/dist/lib/cf-auth.d.ts.map +1 -0
- package/dist/lib/cf-auth.js +321 -0
- package/dist/lib/cf-auth.js.map +1 -0
- package/dist/lib/cli-context.d.ts +23 -0
- package/dist/lib/cli-context.d.ts.map +1 -0
- package/dist/lib/cli-context.js +40 -0
- package/dist/lib/cli-context.js.map +1 -0
- package/dist/lib/cloudflare-deploy-manifest.d.ts +26 -0
- package/dist/lib/cloudflare-deploy-manifest.d.ts.map +1 -0
- package/dist/lib/cloudflare-deploy-manifest.js +107 -0
- package/dist/lib/cloudflare-deploy-manifest.js.map +1 -0
- package/dist/lib/cloudflare-wrangler-resources.d.ts +32 -0
- package/dist/lib/cloudflare-wrangler-resources.d.ts.map +1 -0
- package/dist/lib/cloudflare-wrangler-resources.js +59 -0
- package/dist/lib/cloudflare-wrangler-resources.js.map +1 -0
- package/dist/lib/config-editor.d.ts +139 -0
- package/dist/lib/config-editor.d.ts.map +1 -0
- package/dist/lib/config-editor.js +1188 -0
- package/dist/lib/config-editor.js.map +1 -0
- package/dist/lib/deploy-shared.d.ts +55 -0
- package/dist/lib/deploy-shared.d.ts.map +1 -0
- package/dist/lib/deploy-shared.js +183 -0
- package/dist/lib/deploy-shared.js.map +1 -0
- package/dist/lib/dev-sidecar.d.ts +31 -0
- package/dist/lib/dev-sidecar.d.ts.map +1 -0
- package/dist/lib/dev-sidecar.js +1058 -0
- package/dist/lib/dev-sidecar.js.map +1 -0
- package/dist/lib/fetch-with-timeout.d.ts +14 -0
- package/dist/lib/fetch-with-timeout.d.ts.map +1 -0
- package/dist/lib/fetch-with-timeout.js +29 -0
- package/dist/lib/fetch-with-timeout.js.map +1 -0
- package/dist/lib/function-registry.d.ts +56 -0
- package/dist/lib/function-registry.d.ts.map +1 -0
- package/dist/lib/function-registry.js +210 -0
- package/dist/lib/function-registry.js.map +1 -0
- package/dist/lib/load-config.d.ts +24 -0
- package/dist/lib/load-config.d.ts.map +1 -0
- package/dist/lib/load-config.js +263 -0
- package/dist/lib/load-config.js.map +1 -0
- package/dist/lib/local-secrets.d.ts +2 -0
- package/dist/lib/local-secrets.d.ts.map +1 -0
- package/dist/lib/local-secrets.js +60 -0
- package/dist/lib/local-secrets.js.map +1 -0
- package/dist/lib/managed-resource-names.d.ts +4 -0
- package/dist/lib/managed-resource-names.d.ts.map +1 -0
- package/dist/lib/managed-resource-names.js +19 -0
- package/dist/lib/managed-resource-names.js.map +1 -0
- package/dist/lib/migrator.d.ts +57 -0
- package/dist/lib/migrator.d.ts.map +1 -0
- package/dist/lib/migrator.js +321 -0
- package/dist/lib/migrator.js.map +1 -0
- package/dist/lib/neon.d.ts +41 -0
- package/dist/lib/neon.d.ts.map +1 -0
- package/dist/lib/neon.js +325 -0
- package/dist/lib/neon.js.map +1 -0
- package/dist/lib/node-tools.d.ts +10 -0
- package/dist/lib/node-tools.d.ts.map +1 -0
- package/dist/lib/node-tools.js +32 -0
- package/dist/lib/node-tools.js.map +1 -0
- package/dist/lib/npm.d.ts +8 -0
- package/dist/lib/npm.d.ts.map +1 -0
- package/dist/lib/npm.js +10 -0
- package/dist/lib/npm.js.map +1 -0
- package/dist/lib/npx.d.ts +9 -0
- package/dist/lib/npx.d.ts.map +1 -0
- package/dist/lib/npx.js +11 -0
- package/dist/lib/npx.js.map +1 -0
- package/dist/lib/project-runtime.d.ts +38 -0
- package/dist/lib/project-runtime.d.ts.map +1 -0
- package/dist/lib/project-runtime.js +122 -0
- package/dist/lib/project-runtime.js.map +1 -0
- package/dist/lib/prompts.d.ts +28 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +85 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/rate-limit-bindings.d.ts +11 -0
- package/dist/lib/rate-limit-bindings.d.ts.map +1 -0
- package/dist/lib/rate-limit-bindings.js +52 -0
- package/dist/lib/rate-limit-bindings.js.map +1 -0
- package/dist/lib/realtime-provision.d.ts +22 -0
- package/dist/lib/realtime-provision.d.ts.map +1 -0
- package/dist/lib/realtime-provision.js +246 -0
- package/dist/lib/realtime-provision.js.map +1 -0
- package/dist/lib/resolve-options.d.ts +42 -0
- package/dist/lib/resolve-options.d.ts.map +1 -0
- package/dist/lib/resolve-options.js +98 -0
- package/dist/lib/resolve-options.js.map +1 -0
- package/dist/lib/runtime-scaffold.d.ts +17 -0
- package/dist/lib/runtime-scaffold.d.ts.map +1 -0
- package/dist/lib/runtime-scaffold.js +366 -0
- package/dist/lib/runtime-scaffold.js.map +1 -0
- package/dist/lib/schema-check.d.ts +79 -0
- package/dist/lib/schema-check.d.ts.map +1 -0
- package/dist/lib/schema-check.js +347 -0
- package/dist/lib/schema-check.js.map +1 -0
- package/dist/lib/spinner.d.ts +20 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +42 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/telemetry.d.ts +37 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +98 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/turnstile-provision.d.ts +27 -0
- package/dist/lib/turnstile-provision.d.ts.map +1 -0
- package/dist/lib/turnstile-provision.js +144 -0
- package/dist/lib/turnstile-provision.js.map +1 -0
- package/dist/lib/update-check.d.ts +13 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +110 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/wrangler-secrets.d.ts +3 -0
- package/dist/lib/wrangler-secrets.d.ts.map +1 -0
- package/dist/lib/wrangler-secrets.js +32 -0
- package/dist/lib/wrangler-secrets.js.map +1 -0
- package/dist/lib/wrangler.d.ts +9 -0
- package/dist/lib/wrangler.d.ts.map +1 -0
- package/dist/lib/wrangler.js +84 -0
- package/dist/lib/wrangler.js.map +1 -0
- package/dist/templates/plugin/README.md.tmpl +91 -0
- package/dist/templates/plugin/client/js/package.json.tmpl +23 -0
- package/dist/templates/plugin/client/js/src/index.ts.tmpl +68 -0
- package/dist/templates/plugin/client/js/tsconfig.json.tmpl +14 -0
- package/dist/templates/plugin/server/package.json.tmpl +19 -0
- package/dist/templates/plugin/server/src/index.ts.tmpl +59 -0
- package/dist/templates/plugin/server/tsconfig.json.tmpl +14 -0
- package/llms.txt +94 -0
- 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
|