@tamyla/clodo-framework 4.0.6 → 4.0.7
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## [4.0.7](https://github.com/tamylaa/clodo-framework/compare/v4.0.6...v4.0.7) (2025-12-09)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* correct dynamic import paths in interactive-validation.js ([acbadae](https://github.com/tamylaa/clodo-framework/commit/acbadaefc10cf7efab9dd263f7a40f8db18fccb4))
|
|
7
|
+
* correct import path in interactive-validation.js ([8355677](https://github.com/tamylaa/clodo-framework/commit/83556777a0faa1a85766c0bf4795428d8ba807e6))
|
|
8
|
+
* correct remaining dynamic import paths in interactive-validation.js ([837f0a4](https://github.com/tamylaa/clodo-framework/commit/837f0a48489dbde6b644944950232ec0f424639f))
|
|
9
|
+
* correct Windows PowerShell environment variable handling ([f3c5354](https://github.com/tamylaa/clodo-framework/commit/f3c535449f744a2448b4c1b7d98fc62853a8eaab))
|
|
10
|
+
|
|
1
11
|
## [4.0.6](https://github.com/tamylaa/clodo-framework/compare/v4.0.5...v4.0.6) (2025-12-09)
|
|
2
12
|
|
|
3
13
|
|
|
@@ -171,12 +171,18 @@ export async function listWorkers(options = {}) {
|
|
|
171
171
|
|
|
172
172
|
// Fallback to CLI-based operation
|
|
173
173
|
try {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
174
|
+
if (apiToken) {
|
|
175
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler list"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler list`;
|
|
176
|
+
const {
|
|
177
|
+
stdout: list
|
|
178
|
+
} = await executeWithRateLimit(command, 'workers');
|
|
179
|
+
return list;
|
|
180
|
+
} else {
|
|
181
|
+
const {
|
|
182
|
+
stdout: list
|
|
183
|
+
} = await executeWithRateLimit('npx wrangler list', 'workers');
|
|
184
|
+
return list;
|
|
185
|
+
}
|
|
180
186
|
} catch (error) {
|
|
181
187
|
throw new Error(`Failed to list workers: ${error.message}`);
|
|
182
188
|
}
|
|
@@ -244,40 +250,40 @@ export async function deploySecret(key, value, env = 'production', options = {})
|
|
|
244
250
|
}
|
|
245
251
|
|
|
246
252
|
// Fallback to CLI-based operation with API token if available
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
253
|
+
if (apiToken) {
|
|
254
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; Write-Output '${value}' | npx wrangler secret put ${key} --env ${env}"` : `CLOUDFLARE_API_TOKEN=${apiToken} echo "${value}" | npx wrangler secret put ${key} --env ${env}`;
|
|
255
|
+
await executeWithRateLimit(command, 'workers', 5);
|
|
256
|
+
} else {
|
|
257
|
+
const command = process.platform === 'win32' ? `powershell -Command "Write-Output '${value}' | npx wrangler secret put ${key} --env ${env}"` : `echo "${value}" | npx wrangler secret put ${key} --env ${env}`;
|
|
251
258
|
await executeWithRateLimit(command, 'workers', 5);
|
|
252
|
-
} catch (error) {
|
|
253
|
-
throw new Error(`Secret deployment failed: ${error.message}`);
|
|
254
259
|
}
|
|
255
260
|
}
|
|
256
261
|
export async function deleteSecret(key, env = 'production', options = {}) {
|
|
257
262
|
const {
|
|
258
263
|
apiToken
|
|
259
264
|
} = options;
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
try {
|
|
265
|
+
if (apiToken) {
|
|
266
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler secret delete ${key} --env ${env}"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler secret delete ${key} --env ${env}`;
|
|
263
267
|
await executeWithRateLimit(command, 'workers');
|
|
264
|
-
}
|
|
265
|
-
|
|
268
|
+
} else {
|
|
269
|
+
await executeWithRateLimit(`npx wrangler secret delete ${key} --env ${env}`, 'workers');
|
|
266
270
|
}
|
|
267
271
|
}
|
|
268
272
|
export async function listSecrets(env = 'production', options = {}) {
|
|
269
273
|
const {
|
|
270
274
|
apiToken
|
|
271
275
|
} = options;
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
try {
|
|
276
|
+
if (apiToken) {
|
|
277
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler secret list --env ${env}"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler secret list --env ${env}`;
|
|
275
278
|
const {
|
|
276
279
|
stdout: list
|
|
277
280
|
} = await executeWithRateLimit(command, 'workers');
|
|
278
281
|
return list;
|
|
279
|
-
}
|
|
280
|
-
|
|
282
|
+
} else {
|
|
283
|
+
const {
|
|
284
|
+
stdout: list
|
|
285
|
+
} = await executeWithRateLimit(`npx wrangler secret list --env ${env}`, 'workers');
|
|
286
|
+
return list;
|
|
281
287
|
}
|
|
282
288
|
}
|
|
283
289
|
export async function listDatabases(options = {}) {
|
|
@@ -346,16 +352,26 @@ export async function createDatabase(name, options = {}) {
|
|
|
346
352
|
|
|
347
353
|
// Fallback to CLI-based operation
|
|
348
354
|
try {
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
355
|
+
if (apiToken) {
|
|
356
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler d1 create ${name}"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler d1 create ${name}`;
|
|
357
|
+
const {
|
|
358
|
+
stdout: output
|
|
359
|
+
} = await executeWithRateLimit(command, 'd1');
|
|
360
|
+
const idMatch = output.match(/database_id = "([^"]+)"/);
|
|
361
|
+
if (!idMatch) {
|
|
362
|
+
throw new Error('Could not extract database ID from creation output');
|
|
363
|
+
}
|
|
364
|
+
return idMatch[1];
|
|
365
|
+
} else {
|
|
366
|
+
const {
|
|
367
|
+
stdout: output
|
|
368
|
+
} = await executeWithRateLimit(`npx wrangler d1 create ${name}`, 'd1');
|
|
369
|
+
const idMatch = output.match(/database_id = "([^"]+)"/);
|
|
370
|
+
if (!idMatch) {
|
|
371
|
+
throw new Error('Could not extract database ID from creation output');
|
|
372
|
+
}
|
|
373
|
+
return idMatch[1];
|
|
357
374
|
}
|
|
358
|
-
return idMatch[1];
|
|
359
375
|
} catch (error) {
|
|
360
376
|
throw new Error(`Database creation failed: ${error.message}`);
|
|
361
377
|
}
|
|
@@ -364,12 +380,13 @@ export async function deleteDatabase(name, options = {}) {
|
|
|
364
380
|
const {
|
|
365
381
|
apiToken
|
|
366
382
|
} = options;
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
383
|
+
if (apiToken) {
|
|
384
|
+
// For Windows PowerShell, set environment variable within the command
|
|
385
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler d1 delete ${name} --skip-confirmation"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler d1 delete ${name} --skip-confirmation`;
|
|
370
386
|
await executeWithRateLimit(command, 'd1');
|
|
371
|
-
}
|
|
372
|
-
|
|
387
|
+
} else {
|
|
388
|
+
// No API token provided, use default wrangler auth
|
|
389
|
+
await executeWithRateLimit(`npx wrangler d1 delete ${name} --skip-confirmation`, 'd1');
|
|
373
390
|
}
|
|
374
391
|
}
|
|
375
392
|
export async function runMigrations(databaseName, env = 'production', options = {}) {
|
|
@@ -380,9 +397,12 @@ export async function runMigrations(databaseName, env = 'production', options =
|
|
|
380
397
|
try {
|
|
381
398
|
await ensureMonitoringInitialized();
|
|
382
399
|
const result = await errorRecovery.executeWithRecovery(async () => {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
400
|
+
if (apiToken) {
|
|
401
|
+
const command = process.platform === 'win32' ? `powershell -Command "$env:CLOUDFLARE_API_TOKEN = '${apiToken}'; npx wrangler d1 migrations apply ${databaseName} --env ${env} --remote"` : `CLOUDFLARE_API_TOKEN=${apiToken} npx wrangler d1 migrations apply ${databaseName} --env ${env} --remote`;
|
|
402
|
+
await executeWithRateLimit(command, 'd1');
|
|
403
|
+
} else {
|
|
404
|
+
await executeWithRateLimit(`npx wrangler d1 migrations apply ${databaseName} --env ${env} --remote`, 'd1');
|
|
405
|
+
}
|
|
386
406
|
return true;
|
|
387
407
|
}, {
|
|
388
408
|
operationId: `runMigrations_${databaseName}_${env}`
|
|
@@ -129,7 +129,7 @@ export class InteractiveValidationWorkflow {
|
|
|
129
129
|
console.log('===========================');
|
|
130
130
|
const {
|
|
131
131
|
askChoice
|
|
132
|
-
} = await import('
|
|
132
|
+
} = await import('../../utils/interactive-prompts.js');
|
|
133
133
|
const choice = await askChoice('How would you like to handle the existing worker?', ['🔄 Overwrite/Update - Deploy new version (recommended)', '📝 Rename - Create with a different worker name', '🔍 Compare - Show differences before deciding', '💾 Backup & Update - Create backup before overwriting', '❌ Cancel - Stop deployment'], 0);
|
|
134
134
|
switch (choice) {
|
|
135
135
|
case 0:
|
|
@@ -168,7 +168,7 @@ export class InteractiveValidationWorkflow {
|
|
|
168
168
|
async promptForNewWorkerName(currentName) {
|
|
169
169
|
const {
|
|
170
170
|
askUser
|
|
171
|
-
} = await import('
|
|
171
|
+
} = await import('../../utils/interactive-prompts.js');
|
|
172
172
|
let newName = await askUser(`Enter new worker name (current: ${currentName})`);
|
|
173
173
|
newName = newName.trim();
|
|
174
174
|
if (!newName) {
|