@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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
175
- const command = `${envVars} npx wrangler list`;
176
- const {
177
- stdout: list
178
- } = await executeWithRateLimit(command, 'workers');
179
- return list;
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
248
- const command = process.platform === 'win32' ? `${envVars} powershell -Command "Write-Output '${value}' | npx wrangler secret put ${key} --env ${env}"` : `${envVars} echo "${value}" | npx wrangler secret put ${key} --env ${env}`;
249
- try {
250
- // Increase retries for secrets due to higher timeout likelihood
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
261
- const command = `${envVars} npx wrangler secret delete ${key} --env ${env}`;
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
- } catch (error) {
265
- throw new Error(`Secret deletion failed: ${error.message}`);
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
273
- const command = `${envVars} npx wrangler secret list --env ${env}`;
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
- } catch (error) {
280
- throw new Error(`Failed to list secrets: ${error.message}`);
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
350
- const command = `${envVars} npx wrangler d1 create ${name}`;
351
- const {
352
- stdout: output
353
- } = await executeWithRateLimit(command, 'd1');
354
- const idMatch = output.match(/database_id = "([^"]+)"/);
355
- if (!idMatch) {
356
- throw new Error('Could not extract database ID from creation output');
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
368
- const command = `${envVars} npx wrangler d1 delete ${name} --skip-confirmation`;
369
- try {
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
- } catch (error) {
372
- throw new Error(`Database deletion failed: ${error.message}`);
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
- const envVars = apiToken ? `CLOUDFLARE_API_TOKEN=${apiToken}` : '';
384
- const command = `${envVars} npx wrangler d1 migrations apply ${databaseName} --env ${env} --remote`;
385
- await executeWithRateLimit(command, 'd1');
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('../utils/prompt-utils.js');
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('../utils/prompt-utils.js');
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamyla/clodo-framework",
3
- "version": "4.0.6",
3
+ "version": "4.0.7",
4
4
  "description": "Reusable framework for Clodo-style software architecture on Cloudflare Workers + D1",
5
5
  "type": "module",
6
6
  "sideEffects": [