@pixpilot/scaffoldfy 0.39.0 → 0.41.0

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 (66) hide show
  1. package/dist/cli.cjs +1 -1
  2. package/dist/cli.js +1 -1
  3. package/dist/configurations-CKshmsrJ.js +1 -0
  4. package/dist/configurations-Dzwqq0PK.cjs +1 -0
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.d.cts +52 -44
  7. package/dist/index.d.ts +52 -44
  8. package/dist/index.js +1 -1
  9. package/dist/initial-config-CbzFPdT_.cjs +1 -0
  10. package/dist/initial-config-V9mm6hls.js +1 -0
  11. package/dist/run-configuration-sequentially-BXM4VcVd.js +4 -0
  12. package/dist/run-configuration-sequentially-aFTL6LLG.cjs +4 -0
  13. package/dist/scaffoldfy-config-validator/cli.cjs +3 -0
  14. package/dist/scaffoldfy-config-validator/cli.js +3 -0
  15. package/dist/scaffoldfy-config-validator/index.cjs +1 -0
  16. package/dist/scaffoldfy-config-validator/index.d.cts +3 -0
  17. package/dist/scaffoldfy-config-validator/index.d.ts +3 -0
  18. package/dist/scaffoldfy-config-validator/index.js +1 -0
  19. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.cjs +1 -0
  20. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.d.cts +2 -0
  21. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.d.ts +2 -0
  22. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.js +1 -0
  23. package/dist/src-B1q4_DaV.cjs +1 -0
  24. package/dist/src-DEgwCQk3.js +1 -0
  25. package/dist/tasks-B4iFJaO9.js +23 -0
  26. package/dist/tasks-CLC3xylo.cjs +23 -0
  27. package/dist/utils-BWYwAqXM.js +1 -0
  28. package/dist/utils-CkNjiSuw.cjs +1 -0
  29. package/dist/validate-scaffoldfy-json-BDtysLEj.d.cts +38 -0
  30. package/dist/validate-scaffoldfy-json-Bic4iKqc.cjs +1 -0
  31. package/dist/validate-scaffoldfy-json-CgAoowJb.d.ts +38 -0
  32. package/dist/validate-scaffoldfy-json-CwWx82nG.js +1 -0
  33. package/package.json +4 -4
  34. package/dist/chunk-DjWAcSYV.cjs +0 -1
  35. package/dist/config-DFR0mwj6.js +0 -1
  36. package/dist/config-DZmWkoaW.cjs +0 -1
  37. package/dist/configurations-Bjun5iKX.js +0 -1
  38. package/dist/configurations-KSynsxPT.cjs +0 -1
  39. package/dist/run-tasks--KK3MvU0.js +0 -26
  40. package/dist/run-tasks-B0buAbAD.cjs +0 -1
  41. package/dist/run-tasks-BPQFQ9vD.js +0 -1
  42. package/dist/run-tasks-DU00U3qI.cjs +0 -26
  43. package/dist/scaffoldfy-config-json-validator/cli.cjs +0 -3
  44. package/dist/scaffoldfy-config-json-validator/cli.js +0 -3
  45. package/dist/scaffoldfy-config-json-validator/index.cjs +0 -1
  46. package/dist/scaffoldfy-config-json-validator/index.d.cts +0 -3
  47. package/dist/scaffoldfy-config-json-validator/index.d.ts +0 -3
  48. package/dist/scaffoldfy-config-json-validator/index.js +0 -1
  49. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.cjs +0 -1
  50. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.d.cts +0 -2
  51. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.d.ts +0 -2
  52. package/dist/scaffoldfy-config-json-validator/validate-scaffoldfy-json.js +0 -1
  53. package/dist/src-BYAwq7zv.cjs +0 -1
  54. package/dist/src-DBk71cIW.js +0 -1
  55. package/dist/utils-C-yGs5_V.cjs +0 -1
  56. package/dist/utils-DXSrTxhI.js +0 -1
  57. package/dist/validate-scaffoldfy-json-Cfq-nQjy.js +0 -1
  58. package/dist/validate-scaffoldfy-json-Dkaz9ueq.cjs +0 -1
  59. package/dist/validate-scaffoldfy-json-bRhG4eG3.d.cts +0 -10
  60. package/dist/validate-scaffoldfy-json-vYYlnkxk.d.ts +0 -10
  61. /package/dist/{config-CQ-mWBG5.cjs → initial-config-CESipc-c.cjs} +0 -0
  62. /package/dist/{config-nfiOxhDM.js → initial-config-Dt0jw4Vs.js} +0 -0
  63. /package/dist/{scaffoldfy-config-json-validator → scaffoldfy-config-validator}/cli.d.cts +0 -0
  64. /package/dist/{scaffoldfy-config-json-validator → scaffoldfy-config-validator}/cli.d.ts +0 -0
  65. /package/dist/{scaffoldfy-config-json-validator-CpEXHRsI.cjs → scaffoldfy-config-validator-BvNnGMO1.cjs} +0 -0
  66. /package/dist/{scaffoldfy-config-json-validator-DP8-e4Yy.js → scaffoldfy-config-validator-D1iJBnRE.js} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as validateScaffoldfyJsonFile } from "./validate-scaffoldfy-json-vYYlnkxk.js";
1
+ import { n as validateScaffoldfyJsonFile } from "./validate-scaffoldfy-json-CgAoowJb.js";
2
2
  import "./index-BoGG5KAY.js";
3
3
 
4
4
  //#region src/transformers/types.d.ts
@@ -172,7 +172,7 @@ interface WriteConfig {
172
172
  }
173
173
  //#endregion
174
174
  //#region src/types.d.ts
175
- interface InitConfig {
175
+ interface CurrentConfigurationContext {
176
176
  [key: string]: unknown;
177
177
  }
178
178
  /**
@@ -345,9 +345,9 @@ interface TaskDefinition {
345
345
  $configEnabled?: DynamicBooleanValue;
346
346
  }
347
347
  /**
348
- * Configuration file structure for template tasks
348
+ * Configuration file structure for config tasks
349
349
  */
350
- interface TasksConfiguration {
350
+ interface ScaffoldfyConfiguration {
351
351
  name: string;
352
352
  description?: string;
353
353
  enabled?: DynamicBooleanValue;
@@ -365,20 +365,20 @@ interface TaskPlugin {
365
365
  name: string;
366
366
  version?: string;
367
367
  taskTypes: string[];
368
- execute: (task: TaskDefinition, config: InitConfig, options: {
368
+ execute: (task: TaskDefinition, config: CurrentConfigurationContext, options: {
369
369
  dryRun: boolean;
370
370
  }) => Promise<void>;
371
- getDiff?: (task: TaskDefinition, config: InitConfig) => Promise<string>;
371
+ getDiff?: (task: TaskDefinition, config: CurrentConfigurationContext) => Promise<string>;
372
372
  validate?: (task: TaskDefinition) => string[];
373
373
  }
374
374
  /**
375
375
  * Plugin lifecycle hooks
376
376
  */
377
377
  interface PluginHooks {
378
- beforeAll?: (config: InitConfig) => Promise<void>;
379
- afterAll?: (config: InitConfig) => Promise<void>;
380
- beforeTask?: (task: TaskDefinition, config: InitConfig) => Promise<void>;
381
- afterTask?: (task: TaskDefinition, config: InitConfig) => Promise<void>;
378
+ beforeAll?: (config: CurrentConfigurationContext) => Promise<void>;
379
+ afterAll?: (config: CurrentConfigurationContext) => Promise<void>;
380
+ beforeTask?: (task: TaskDefinition, config: CurrentConfigurationContext) => Promise<void>;
381
+ afterTask?: (task: TaskDefinition, config: CurrentConfigurationContext) => Promise<void>;
382
382
  onError?: (error: Error, task?: TaskDefinition) => Promise<void>;
383
383
  }
384
384
  //#endregion
@@ -395,7 +395,7 @@ declare function clearConfigurationCache(): void;
395
395
  * @param visitedPaths - Set of already visited paths to detect circular dependencies
396
396
  * @returns The loaded configuration
397
397
  */
398
- declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
398
+ declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<ScaffoldfyConfiguration>;
399
399
  //#endregion
400
400
  //#region src/configurations/load-tasks-with-inheritance.d.ts
401
401
  /**
@@ -405,7 +405,7 @@ declare function loadConfiguration(configPath: string, visitedPaths?: Set<string
405
405
  * @param visitedPaths - Set of already visited paths
406
406
  * @returns Merged configuration
407
407
  */
408
- declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
408
+ declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<ScaffoldfyConfiguration>;
409
409
  /**
410
410
  * Load tasks from a configuration file with configuration inheritance support
411
411
  * @param tasksFilePath - Path to the tasks configuration file
@@ -420,7 +420,7 @@ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
420
420
  variables?: VariableDefinition[];
421
421
  prompts?: PromptDefinition[];
422
422
  enabled?: EnabledValue;
423
- configs?: TasksConfiguration[];
423
+ configs?: ScaffoldfyConfiguration[];
424
424
  transformers?: Transformer[];
425
425
  }>;
426
426
  //#endregion
@@ -431,31 +431,31 @@ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
431
431
  * @param configurations - Array of configurations to merge (in priority order)
432
432
  * @returns Merged configuration
433
433
  */
434
- declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
434
+ declare function mergeConfigurations(configurations: ScaffoldfyConfiguration[]): ScaffoldfyConfiguration;
435
435
  //#endregion
436
436
  //#region src/dry-run/content-tasks.d.ts
437
437
  /**
438
438
  * Get diff for update-json task
439
439
  */
440
- declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
440
+ declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: CurrentConfigurationContext): Promise<string>;
441
441
  /**
442
442
  * Get diff for regex-replace task
443
443
  */
444
- declare function getRegexReplaceDiff(config: RegexReplaceConfig, initConfig: InitConfig): Promise<string>;
444
+ declare function getRegexReplaceDiff(config: RegexReplaceConfig, initConfig: CurrentConfigurationContext): Promise<string>;
445
445
  /**
446
446
  * Get diff for replace-in-file task
447
447
  */
448
- declare function getReplaceInFileDiff(config: ReplaceInFileConfig, initConfig: InitConfig): Promise<string>;
448
+ declare function getReplaceInFileDiff(config: ReplaceInFileConfig, initConfig: CurrentConfigurationContext): Promise<string>;
449
449
  //#endregion
450
450
  //#region src/dry-run/file-tasks.d.ts
451
451
  /**
452
452
  * Get diff for delete task
453
453
  */
454
- declare function getDeleteDiff(config: DeleteConfig, initConfig: InitConfig): string;
454
+ declare function getDeleteDiff(config: DeleteConfig, initConfig: CurrentConfigurationContext): string;
455
455
  /**
456
456
  * Get diff for rename task
457
457
  */
458
- declare function getRenameDiff(config: RenameConfig, initConfig: InitConfig): string;
458
+ declare function getRenameDiff(config: RenameConfig, initConfig: CurrentConfigurationContext): string;
459
459
  //#endregion
460
460
  //#region src/dry-run/system-tasks.d.ts
461
461
  /**
@@ -465,19 +465,26 @@ declare function getGitInitDiff(config: GitInitConfig): string;
465
465
  /**
466
466
  * Get diff for exec task
467
467
  */
468
- declare function getExecDiff(config: ExecConfig, initConfig: InitConfig): string;
468
+ declare function getExecDiff(config: ExecConfig, initConfig: CurrentConfigurationContext): string;
469
469
  //#endregion
470
470
  //#region src/dry-run/index.d.ts
471
471
  /**
472
472
  * Get diff for any task type
473
473
  */
474
- declare function getTaskDiff(task: TaskDefinition, initConfig: InitConfig): Promise<string>;
474
+ declare function getTaskDiff(task: TaskDefinition, initConfig: CurrentConfigurationContext): Promise<string>;
475
475
  /**
476
476
  * Display diffs for all tasks
477
477
  */
478
- declare function displayTasksDiff(tasks: TaskDefinition[], initConfig: InitConfig): Promise<void>;
478
+ declare function displayTasksDiff(tasks: TaskDefinition[], initConfig: CurrentConfigurationContext): Promise<void>;
479
479
  //#endregion
480
- //#region src/plugin.d.ts
480
+ //#region src/plugin-registry/hooks.d.ts
481
+ /**
482
+ * Register global lifecycle hooks
483
+ * @param hooks - Hook functions to register
484
+ */
485
+ declare function registerHooks(hooks: Partial<PluginHooks>): void;
486
+ //#endregion
487
+ //#region src/plugin-registry/plugin-registration.d.ts
481
488
  /**
482
489
  * Register a plugin
483
490
  * @param plugin - The plugin to register
@@ -494,18 +501,6 @@ declare function unregisterPlugin(pluginName: string): void;
494
501
  * @returns The plugin or undefined if not found
495
502
  */
496
503
  declare function getPlugin(pluginName: string): TaskPlugin | undefined;
497
- /**
498
- * Get a plugin for a task type
499
- * @param taskType - The task type
500
- * @returns The plugin or undefined if not found
501
- */
502
- declare function getPluginForTaskType(taskType: string): TaskPlugin | undefined;
503
- /**
504
- * Check if a task type is handled by a plugin
505
- * @param taskType - The task type to check
506
- * @returns True if a plugin handles this task type
507
- */
508
- declare function isPluginTaskType(taskType: string): boolean;
509
504
  /**
510
505
  * List all registered plugins
511
506
  * @returns Array of plugin names
@@ -515,11 +510,8 @@ declare function listPlugins(): string[];
515
510
  * Clear all registered plugins (useful for testing)
516
511
  */
517
512
  declare function clearPlugins(): void;
518
- /**
519
- * Register global lifecycle hooks
520
- * @param hooks - Hook functions to register
521
- */
522
- declare function registerHooks(hooks: Partial<PluginHooks>): void;
513
+ //#endregion
514
+ //#region src/plugin-registry/task-execution.d.ts
523
515
  /**
524
516
  * Execute a plugin task
525
517
  * @param task - The task to execute
@@ -528,9 +520,25 @@ declare function registerHooks(hooks: Partial<PluginHooks>): void;
528
520
  * @param options.dryRun - Whether to run in dry-run mode
529
521
  * @returns Promise that resolves when the task is complete
530
522
  */
531
- declare function executePluginTask(task: TaskDefinition, config: InitConfig, options: {
523
+ declare function executePluginTask(task: TaskDefinition, config: CurrentConfigurationContext, options: {
532
524
  dryRun: boolean;
533
525
  }): Promise<void>;
526
+ //#endregion
527
+ //#region src/plugin-registry/task-type-mapping.d.ts
528
+ /**
529
+ * Get a plugin for a task type
530
+ * @param taskType - The task type
531
+ * @returns The plugin or undefined if not found
532
+ */
533
+ declare function getPluginForTaskType(taskType: string): TaskPlugin | undefined;
534
+ /**
535
+ * Check if a task type is handled by a plugin
536
+ * @param taskType - The task type to check
537
+ * @returns True if a plugin handles this task type
538
+ */
539
+ declare function isPluginTaskType(taskType: string): boolean;
540
+ //#endregion
541
+ //#region src/plugin-registry/utils.d.ts
534
542
  /**
535
543
  * Create a simple task plugin
536
544
  * @param name - Plugin name
@@ -542,11 +550,11 @@ declare function executePluginTask(task: TaskDefinition, config: InitConfig, opt
542
550
  * @param options.validate - Function to validate task configuration
543
551
  * @returns A TaskPlugin object
544
552
  */
545
- declare function createTaskPlugin(name: string, taskType: string, execute: (task: TaskDefinition, config: InitConfig, options: {
553
+ declare function createTaskPlugin(name: string, taskType: string, execute: (task: TaskDefinition, config: CurrentConfigurationContext, options: {
546
554
  dryRun: boolean;
547
555
  }) => Promise<void>, options?: {
548
556
  version?: string;
549
- getDiff?: (task: TaskDefinition, config: InitConfig) => Promise<string>;
557
+ getDiff?: (task: TaskDefinition, config: CurrentConfigurationContext) => Promise<string>;
550
558
  validate?: (task: TaskDefinition) => string[];
551
559
  }): TaskPlugin;
552
560
  //#endregion
@@ -573,4 +581,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
573
581
  transformers?: Transformer[] | undefined;
574
582
  }): Promise<void>;
575
583
  //#endregion
576
- export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, clearConfigurationCache, clearPlugins, createTaskPlugin, displayTasksDiff, executePluginTask, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getUpdateJsonDiff, isPluginTaskType, listPlugins, loadAndMergeConfiguration, loadConfiguration, loadTasksWithInheritance, mergeConfigurations, registerHooks, registerPlugin, runWithTasks, unregisterPlugin, validateScaffoldfyJsonFile };
584
+ export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, CurrentConfigurationContext, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, ScaffoldfyConfiguration, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, type UpdateJsonConfig, VariableDefinition, type WriteConfig, clearConfigurationCache, clearPlugins, createTaskPlugin, displayTasksDiff, executePluginTask, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getUpdateJsonDiff, isPluginTaskType, listPlugins, loadAndMergeConfiguration, loadConfiguration, loadTasksWithInheritance, mergeConfigurations, registerHooks, registerPlugin, runWithTasks, unregisterPlugin, validateScaffoldfyJsonFile };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{O as e,i as t,n,r,t as i}from"./configurations-Bjun5iKX.js";import{_ as a,a as o,b as s,c,d as l,f as u,g as d,h as f,i as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,v as x,x as S,y as C}from"./run-tasks--KK3MvU0.js";import"./config-nfiOxhDM.js";import{t as w}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{t as T}from"./src-DBk71cIW.js";export{e as clearConfigurationCache,v as clearPlugins,p as createTaskPlugin,_ as displayTasksDiff,o as executePluginTask,a as getDeleteDiff,f as getExecDiff,d as getGitInitDiff,g as getPlugin,y as getPluginForTaskType,C as getRegexReplaceDiff,x as getRenameDiff,s as getReplaceInFileDiff,h as getTaskDiff,S as getUpdateJsonDiff,c as isPluginTaskType,m as listPlugins,i as loadAndMergeConfiguration,t as loadConfiguration,n as loadTasksWithInheritance,r as mergeConfigurations,b as registerHooks,l as registerPlugin,T as runWithTasks,u as unregisterPlugin,w as validateScaffoldfyJsonFile};
1
+ import{F as e,c as t,n,r,t as i}from"./configurations-CKshmsrJ.js";import"./initial-config-Dt0jw4Vs.js";import{A as a,C as o,D as s,E as c,O as l,S as u,T as d,_ as f,d as p,f as m,g as h,h as g,k as _,m as v,p as y,v as b,w as x,x as S,y as C}from"./tasks-B4iFJaO9.js";import{n as w}from"./validate-scaffoldfy-json-CwWx82nG.js";import"./scaffoldfy-config-validator-D1iJBnRE.js";import{t as T}from"./src-DEgwCQk3.js";export{e as clearConfigurationCache,g as clearPlugins,p as createTaskPlugin,u as displayTasksDiff,m as executePluginTask,c as getDeleteDiff,x as getExecDiff,d as getGitInitDiff,h as getPlugin,y as getPluginForTaskType,l as getRegexReplaceDiff,s as getRenameDiff,_ as getReplaceInFileDiff,o as getTaskDiff,a as getUpdateJsonDiff,v as isPluginTaskType,f as listPlugins,i as loadAndMergeConfiguration,t as loadConfiguration,n as loadTasksWithInheritance,r as mergeConfigurations,S as registerHooks,b as registerPlugin,T as runWithTasks,C as unregisterPlugin,w as validateScaffoldfyJsonFile};
@@ -0,0 +1 @@
1
+ const e=require(`./initial-config-CESipc-c.cjs`);exports.createInitialConfig=e.t;
@@ -0,0 +1 @@
1
+ import{t as e}from"./initial-config-Dt0jw4Vs.js";export{e as createInitialConfig};
@@ -0,0 +1,4 @@
1
+ import{D as e,E as t,S as n,a as r,i,o as a,w as o}from"./configurations-CKshmsrJ.js";import{S as s,a as c,c as l,l as u,n as d,o as f,r as p,u as m}from"./tasks-B4iFJaO9.js";import h from"node:process";async function g(e,t){let n=e.prompts??[];if(n.length>0){let e=l(n);e.length>0&&(console.error(`❌ Prompt validation errors:`),e.forEach(e=>console.error(` - ${e}`)),h.exit(1));let r=await m(n,await u(n,t),t);Object.assign(t,r)}}async function _(e,t){let n=e.variables??[];if(n.length>0){let e=i(n);e.length>0&&(console.error(`❌ Variable validation errors:`),e.forEach(e=>console.error(` - ${e}`)),h.exit(1));let o=await a(n,await r(n,t,{skipConditional:!0}),t);Object.assign(t,o);let s=n.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(s.length>0){let e=await a(s,await r(s,t),t);Object.assign(t,e)}}}async function v(e,r){return await n(e.enabled,r)?(await _(e,r),await g(e,r),await n(e.enabled,r)?!0:(t(`⊘ Config "${e.name}" became disabled after variable/prompt resolution - skipping tasks`),!1)):(t(`⊘ Config "${e.name}" is disabled - skipping`),!1)}async function y(n,r,i={}){o(`Running configs with sequential variable/prompt resolution...`),o(`Total configs to process: ${n.length}`),o(`Registering built-in plugins...`),f();let a=[];console.log(``),t(`📋 Collecting input...`),console.log(``);for(let e=0;e<n.length;e++){let t=n[e];if(t==null)continue;let r=`=`.repeat(60);if(o(`\n${r}`),o(`Processing config ${e+1}/${n.length}: "${t.name}"`),o(r),o(`Current config keys: ${Object.keys(i).join(`, `)}`),await v(t,i)){let e=t.tasks??[];e.length>0&&(o(`Found ${e.length} task(s) in config "${t.name}" (will execute later)`),a.push(...e))}}if(o(`
2
+ 🔧 Validating and filtering all collected tasks...`),a.length===0){e(`No tasks found in any config`,`info`);return}console.log(``),e(`🛠️ Preparing tasks...`,`info`);let l=await p(a,i);if(console.log(``),e(`Found ${a.length} tasks (${l.length} enabled)`,`info`),e(`All tasks validated successfully`,`success`),l.length===0){e(`No enabled tasks to execute`,`info`);return}let u=d(l);if(r.dryRun){e(`
3
+ 🔍 Dry run - showing task changes...`,`info`),await s(u,i),e(`
4
+ 🔍 Dry run completed - no changes were made`,`info`),e(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t(`⚙️ Executing tasks...`),console.log(``),await c(u,i,r)}export{y as runConfigurationSequentially};
@@ -0,0 +1,4 @@
1
+ const e=require(`./configurations-Dzwqq0PK.cjs`),t=require(`./tasks-CLC3xylo.cjs`);let n=require(`node:process`);n=e.I(n);async function r(e,r){let i=e.prompts??[];if(i.length>0){let e=t.c(i);e.length>0&&(console.error(`❌ Prompt validation errors:`),e.forEach(e=>console.error(` - ${e}`)),n.default.exit(1));let a=await t.u(i,await t.l(i,r),r);Object.assign(r,a)}}async function i(t,r){let i=t.variables??[];if(i.length>0){let t=e.i(i);t.length>0&&(console.error(`❌ Variable validation errors:`),t.forEach(e=>console.error(` - ${e}`)),n.default.exit(1));let a=await e.o(i,await e.a(i,r,{skipConditional:!0}),r);Object.assign(r,a);let o=i.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(o.length>0){let t=await e.o(o,await e.a(o,r),r);Object.assign(r,t)}}}async function a(t,n){return await e.S(t.enabled,n)?(await i(t,n),await r(t,n),await e.S(t.enabled,n)?!0:(e.E(`⊘ Config "${t.name}" became disabled after variable/prompt resolution - skipping tasks`),!1)):(e.E(`⊘ Config "${t.name}" is disabled - skipping`),!1)}async function o(n,r,i={}){e.w(`Running configs with sequential variable/prompt resolution...`),e.w(`Total configs to process: ${n.length}`),e.w(`Registering built-in plugins...`),t.o();let o=[];console.log(``),e.E(`📋 Collecting input...`),console.log(``);for(let t=0;t<n.length;t++){let r=n[t];if(r==null)continue;let s=`=`.repeat(60);if(e.w(`\n${s}`),e.w(`Processing config ${t+1}/${n.length}: "${r.name}"`),e.w(s),e.w(`Current config keys: ${Object.keys(i).join(`, `)}`),await a(r,i)){let t=r.tasks??[];t.length>0&&(e.w(`Found ${t.length} task(s) in config "${r.name}" (will execute later)`),o.push(...t))}}if(e.w(`
2
+ 🔧 Validating and filtering all collected tasks...`),o.length===0){e.D(`No tasks found in any config`,`info`);return}console.log(``),e.D(`🛠️ Preparing tasks...`,`info`);let s=await t.r(o,i);if(console.log(``),e.D(`Found ${o.length} tasks (${s.length} enabled)`,`info`),e.D(`All tasks validated successfully`,`success`),s.length===0){e.D(`No enabled tasks to execute`,`info`);return}let c=t.n(s);if(r.dryRun){e.D(`
3
+ 🔍 Dry run - showing task changes...`,`info`),await t.S(c,i),e.D(`
4
+ 🔍 Dry run completed - no changes were made`,`info`),e.D(`Run without --dry-run to apply changes`,`info`);return}console.log(``),e.E(`⚙️ Executing tasks...`),console.log(``),await t.a(c,i,r)}exports.runConfigurationSequentially=o;
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ const e=require(`../configurations-Dzwqq0PK.cjs`),t=require(`../validate-scaffoldfy-json-Bic4iKqc.cjs`);let n=require(`node:fs`);n=e.I(n);let r=require(`node:path`);r=e.I(r);let i=require(`node:process`);i=e.I(i);let a=require(`commander`);a=e.I(a);function o(e){let t=[];function i(e){let a=n.default.readdirSync(e,{withFileTypes:!0});for(let n of a){let a=r.default.join(e,n.name);n.isDirectory()?n.name!==`node_modules`&&n.name!==`.git`&&!n.name.startsWith(`.`)&&i(a):n.isFile()&&n.name.endsWith(`.json`)&&t.push(a)}}return i(e),t}function s(){let e=new a.Command;e.name(`validate-scaffoldfy-json`).description(`Validate scaffoldfy JSON files against their schemas`).version(`1.0.0`).option(`-f, --file <path>`,`Path to a JSON file to validate`).option(`-d, --dir <path>`,`Path to a directory to scan for JSON files`).parse(i.default.argv);let n=e.opts(),r=[];n.file!==void 0&&n.file!==``?r=[n.file]:n.dir!==void 0&&n.dir!==``?(console.log(`Scanning directory: ${n.dir}`),r=o(n.dir),console.log(`Found ${r.length} JSON file(s)\n`)):(console.error(`Error: Please provide either --file or --dir option`),e.help());let s=!1;for(let e of r){console.log(`Validating ${e}...`);let n=t.n(e);if(n.valid)console.log(`✅ ${e} is valid`);else if(s=!0,console.error(`❌ ${e} validation failed:`),n.errors)for(let e of n.errors)console.error(` ${e}`)}s&&i.default.exit(1),console.log(`
3
+ ✅ All files validated successfully!`)}require(`url`).pathToFileURL(__filename).href===`file://${i.default.argv[1]}`&&s();
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import"../configurations-CKshmsrJ.js";import{n as e}from"../validate-scaffoldfy-json-CwWx82nG.js";import t from"node:path";import n from"node:fs";import r from"node:process";import{Command as i}from"commander";function a(e){let r=[];function i(e){let a=n.readdirSync(e,{withFileTypes:!0});for(let n of a){let a=t.join(e,n.name);n.isDirectory()?n.name!==`node_modules`&&n.name!==`.git`&&!n.name.startsWith(`.`)&&i(a):n.isFile()&&n.name.endsWith(`.json`)&&r.push(a)}}return i(e),r}function o(){let t=new i;t.name(`validate-scaffoldfy-json`).description(`Validate scaffoldfy JSON files against their schemas`).version(`1.0.0`).option(`-f, --file <path>`,`Path to a JSON file to validate`).option(`-d, --dir <path>`,`Path to a directory to scan for JSON files`).parse(r.argv);let n=t.opts(),o=[];n.file!==void 0&&n.file!==``?o=[n.file]:n.dir!==void 0&&n.dir!==``?(console.log(`Scanning directory: ${n.dir}`),o=a(n.dir),console.log(`Found ${o.length} JSON file(s)\n`)):(console.error(`Error: Please provide either --file or --dir option`),t.help());let s=!1;for(let t of o){console.log(`Validating ${t}...`);let n=e(t);if(n.valid)console.log(`✅ ${t} is valid`);else if(s=!0,console.error(`❌ ${t} validation failed:`),n.errors)for(let e of n.errors)console.error(` ${e}`)}s&&r.exit(1),console.log(`
3
+ ✅ All files validated successfully!`)}import.meta.url===`file://${r.argv[1]}`&&o();export{};
@@ -0,0 +1 @@
1
+ require(`../configurations-Dzwqq0PK.cjs`);const e=require(`../validate-scaffoldfy-json-Bic4iKqc.cjs`);require(`../scaffoldfy-config-validator-BvNnGMO1.cjs`),exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
@@ -0,0 +1,3 @@
1
+ import { n as validateScaffoldfyJsonFile, r as validateTasksSchema, t as displayValidationErrors } from "../validate-scaffoldfy-json-BDtysLEj.cjs";
2
+ import "../index-BtBZHVmz.cjs";
3
+ export { displayValidationErrors, validateScaffoldfyJsonFile, validateTasksSchema };
@@ -0,0 +1,3 @@
1
+ import { n as validateScaffoldfyJsonFile, r as validateTasksSchema, t as displayValidationErrors } from "../validate-scaffoldfy-json-CgAoowJb.js";
2
+ import "../index-BoGG5KAY.js";
3
+ export { displayValidationErrors, validateScaffoldfyJsonFile, validateTasksSchema };
@@ -0,0 +1 @@
1
+ import"../configurations-CKshmsrJ.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-CwWx82nG.js";import"../scaffoldfy-config-validator-D1iJBnRE.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
@@ -0,0 +1 @@
1
+ require(`../configurations-Dzwqq0PK.cjs`);const e=require(`../validate-scaffoldfy-json-Bic4iKqc.cjs`);exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
@@ -0,0 +1,2 @@
1
+ import { n as validateScaffoldfyJsonFile, r as validateTasksSchema, t as displayValidationErrors } from "../validate-scaffoldfy-json-BDtysLEj.cjs";
2
+ export { displayValidationErrors, validateScaffoldfyJsonFile, validateTasksSchema };
@@ -0,0 +1,2 @@
1
+ import { n as validateScaffoldfyJsonFile, r as validateTasksSchema, t as displayValidationErrors } from "../validate-scaffoldfy-json-CgAoowJb.js";
2
+ export { displayValidationErrors, validateScaffoldfyJsonFile, validateTasksSchema };
@@ -0,0 +1 @@
1
+ import"../configurations-CKshmsrJ.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-CwWx82nG.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
@@ -0,0 +1 @@
1
+ const e=require(`./configurations-Dzwqq0PK.cjs`),t=require(`./initial-config-CESipc-c.cjs`),n=require(`./tasks-CLC3xylo.cjs`),r=require(`./validate-scaffoldfy-json-Bic4iKqc.cjs`);let i=require(`node:process`);i=e.I(i);async function a(a,o){let s=t.t();if(!await e.S(o.configEnabled,s,{lazy:!0})){e.E(`⊘ Template is disabled - skipping all execution`);return}o.transformers!==void 0&&o.transformers.length>0&&(e.w(`Registering ${o.transformers.length} transformer(s)...`),e.s.registerAll(o.transformers)),e.w(`Registering built-in plugins...`),n.o(),e.w(`Validating task configurations...`);let c=n.t(a);c.length>0&&(r.t(c),i.default.exit(1)),e.w(`All tasks validated successfully`);let l=a.filter(n=>e.x(n.enabled,t.t(),{lazy:!0}));e.w(`Resolving task dependencies...`);let u=n.i(l);e.w(`Sorted ${u.length} task(s) by dependencies`),e.E(`Welcome! Let's execute your tasks.`),o.dryRun&&e.A(`🔍 DRY RUN MODE - No changes will be made`),e.E(`This will execute your project tasks based on the defined configuration.`);let d=s,f=[...o.variables??[]];if(f.length>0){let t=e.i(f);t.length>0&&(e.D(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.D(` - ${t}`,`error`)),i.default.exit(1)),e.w(`Resolving variable values...`);let n=await e.o(f,await e.a(f,d,{skipConditional:!0}),d);Object.assign(d,n),Object.keys(n).length>0&&(e.w(`Resolved ${Object.keys(n).length} variable(s)`),e.w(`Variable values: ${JSON.stringify(n)}`))}let p=o.prompts??[],m=[...p];if(m.length>0){let t=n.c(m);t.length>0&&(e.D(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.D(` - ${t}`,`error`)),i.default.exit(1)),e.w(`Resolving prompt default values...`);let r=await n.l(m,d);if(p.length>0){e.E(`📋 Collecting prompts (available to all tasks):`);let t=await n.u(p,r,d);Object.assign(d,t)}}if(f.length>0){let t=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.w(`Re-resolving conditional variables with prompt values...`);let n=await e.o(t,await e.a(t,d),d);Object.assign(d,n),Object.keys(n).length>0&&e.w(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await e.S(o.configEnabled,d)){e.E(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let h=[];for(let t of u)t.$configEnabled!=null&&!await e.S(t.$configEnabled,d)||await e.S(t.enabled,d)&&h.push(t);if(e.D(`${h.length} of ${u.length} task(s) enabled for execution`,`info`),o.dryRun){await n.S(h,d),e.E(`🔍 Dry run completed - no changes were made`),e.E(`Run without --dry-run to apply changes`);return}e.w(`Calling beforeAll hook...`),await n.b(`beforeAll`,d);let g=h.length,_=0,v=0,y=[],b=[];for(let t=0;t<h.length;t++){let r=h[t];r!=null&&(e.w(`Calling beforeTask hook for task: ${r.name}`),await n.b(`beforeTask`,r,d),await n.s(r,d,t+1,g,o.dryRun)?(_++,y.push(r.id),e.w(`Calling afterTask hook for task: ${r.name}`),await n.b(`afterTask`,r,d)):(await e.b(r.required,d)&&(v++,b.push(r.name)),e.w(`Calling onError hook for task: ${r.name}`),await n.b(`onError`,Error(`Task ${r.name} failed`),r),e.A(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}v>0&&(e.D(`\n❌ Task execution completed with ${v} error(s)`,`error`),e.D(`Completed: ${_}/${g} tasks`,`info`),e.D(`Failed tasks: ${b.join(`, `)}`,`error`),i.default.exit(1)),e.w(`Calling afterAll hook...`),await n.b(`afterAll`,d),e.k(`✅ All tasks completed successfully!`),e.k(` Completed: ${_}/${g} tasks`)}const o=i.default.argv.includes(`--dry-run`),s=i.default.argv.includes(`--force`);async function c(t,n){try{await a(t,{dryRun:n?.dryRun??o,force:n?.force??s,configFilePath:n?.configFilePath??void 0,...n?.variables!=null&&{variables:n.variables},...n?.prompts!=null&&{prompts:n.prompts},...n?.configEnabled!=null&&{configEnabled:n.configEnabled},...n?.transformers!=null&&{transformers:n.transformers}})}catch(t){e.D(`❌ Task execution failed`,`error`),t instanceof Error?(e.D(`Error: ${t.message}`,`error`),i.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),i.default.exit(1)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return c}});
@@ -0,0 +1 @@
1
+ import{A as e,D as t,E as n,S as r,a as i,b as a,i as o,k as s,o as c,s as l,w as u,x as d}from"./configurations-CKshmsrJ.js";import{t as f}from"./initial-config-Dt0jw4Vs.js";import{S as p,b as m,c as h,i as g,l as _,o as v,s as y,t as b,u as x}from"./tasks-B4iFJaO9.js";import{t as S}from"./validate-scaffoldfy-json-CwWx82nG.js";import C from"node:process";async function w(w,T){let E=f();if(!await r(T.configEnabled,E,{lazy:!0})){n(`⊘ Template is disabled - skipping all execution`);return}T.transformers!==void 0&&T.transformers.length>0&&(u(`Registering ${T.transformers.length} transformer(s)...`),l.registerAll(T.transformers)),u(`Registering built-in plugins...`),v(),u(`Validating task configurations...`);let D=b(w);D.length>0&&(S(D),C.exit(1)),u(`All tasks validated successfully`);let O=w.filter(e=>d(e.enabled,f(),{lazy:!0}));u(`Resolving task dependencies...`);let k=g(O);u(`Sorted ${k.length} task(s) by dependencies`),n(`Welcome! Let's execute your tasks.`),T.dryRun&&e(`🔍 DRY RUN MODE - No changes will be made`),n(`This will execute your project tasks based on the defined configuration.`);let A=E,j=[...T.variables??[]];if(j.length>0){let e=o(j);e.length>0&&(t(`❌ Variable validation errors:`,`error`),e.forEach(e=>t(` - ${e}`,`error`)),C.exit(1)),u(`Resolving variable values...`);let n=await c(j,await i(j,A,{skipConditional:!0}),A);Object.assign(A,n),Object.keys(n).length>0&&(u(`Resolved ${Object.keys(n).length} variable(s)`),u(`Variable values: ${JSON.stringify(n)}`))}let M=T.prompts??[],N=[...M];if(N.length>0){let e=h(N);e.length>0&&(t(`❌ Prompt validation errors:`,`error`),e.forEach(e=>t(` - ${e}`,`error`)),C.exit(1)),u(`Resolving prompt default values...`);let r=await _(N,A);if(M.length>0){n(`📋 Collecting prompts (available to all tasks):`);let e=await x(M,r,A);Object.assign(A,e)}}if(j.length>0){let e=j.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){u(`Re-resolving conditional variables with prompt values...`);let t=await c(e,await i(e,A),A);Object.assign(A,t),Object.keys(t).length>0&&u(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await r(T.configEnabled,A)){n(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let P=[];for(let e of k)e.$configEnabled!=null&&!await r(e.$configEnabled,A)||await r(e.enabled,A)&&P.push(e);if(t(`${P.length} of ${k.length} task(s) enabled for execution`,`info`),T.dryRun){await p(P,A),n(`🔍 Dry run completed - no changes were made`),n(`Run without --dry-run to apply changes`);return}u(`Calling beforeAll hook...`),await m(`beforeAll`,A);let F=P.length,I=0,L=0,R=[],z=[];for(let t=0;t<P.length;t++){let n=P[t];n!=null&&(u(`Calling beforeTask hook for task: ${n.name}`),await m(`beforeTask`,n,A),await y(n,A,t+1,F,T.dryRun)?(I++,R.push(n.id),u(`Calling afterTask hook for task: ${n.name}`),await m(`afterTask`,n,A)):(await a(n.required,A)&&(L++,z.push(n.name)),u(`Calling onError hook for task: ${n.name}`),await m(`onError`,Error(`Task ${n.name} failed`),n),e(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}L>0&&(t(`\n❌ Task execution completed with ${L} error(s)`,`error`),t(`Completed: ${I}/${F} tasks`,`info`),t(`Failed tasks: ${z.join(`, `)}`,`error`),C.exit(1)),u(`Calling afterAll hook...`),await m(`afterAll`,A),s(`✅ All tasks completed successfully!`),s(` Completed: ${I}/${F} tasks`)}const T=C.argv.includes(`--dry-run`),E=C.argv.includes(`--force`);async function D(e,n){try{await w(e,{dryRun:n?.dryRun??T,force:n?.force??E,configFilePath:n?.configFilePath??void 0,...n?.variables!=null&&{variables:n.variables},...n?.prompts!=null&&{prompts:n.prompts},...n?.configEnabled!=null&&{configEnabled:n.configEnabled},...n?.transformers!=null&&{transformers:n.transformers}})}catch(e){t(`❌ Task execution failed`,`error`),e instanceof Error?(t(`Error: ${e.message}`,`error`),C.env.DEBUG!=null&&console.error(e.stack)):console.error(e),C.exit(1)}}export{D as t};
@@ -0,0 +1,23 @@
1
+ import{A as e,C as t,D as n,M as r,N as i,P as a,S as o,_ as s,b as c,d as l,f as u,h as ee,j as d,l as te,s as f,u as p,w as ne}from"./configurations-CKshmsrJ.js";import m from"node:path";import h from"node:fs";import g from"node:process";import{promisify as _}from"node:util";import{execSync as v}from"node:child_process";import{confirm as re,input as ie,number as ae,password as oe,select as se}from"@inquirer/prompts";const ce=_(h.readFile),y={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function b(e,t){switch(t){case`add`:return`${y.green}+ ${e}${y.reset}`;case`remove`:return`${y.red}- ${e}${y.reset}`;case`context`:return`${y.gray} ${e}${y.reset}`;default:return e}}function x(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(b(t,`context`)):(t!==void 0&&i.push(b(t,`remove`)),a!==void 0&&i.push(b(a,`add`)))}return i}function S(e){return h.existsSync(m.join(g.cwd(),e))}async function C(e){return ce(m.join(g.cwd(),e),`utf-8`)}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=e.file;if(!S(r))return`${y.red}✗ File not found: ${e.file}${y.reset}`;try{let t=await C(r),i=JSON.parse(t),a={...i};function o(e){if(typeof e==`string`)return p(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?s(i,t,e):i[t]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${y.cyan}→ No changes${y.reset}`;let u=x(c,l);return`${y.blue}File: ${e.file}${y.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}async function T(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=e.file;if(!S(r))return`${y.red}✗ File not found: ${e.file}${y.reset}`;try{let t=await C(r),i=new RegExp(e.pattern,e.flags??`g`),a=p(e.replacement,n),o=t.replace(i,a);if(t===o)return`${y.cyan}→ No matches found${y.reset}`;let s=x(t,o);return`${y.blue}File: ${e.file}${y.reset}\n${s.join(`
5
+ `)}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}async function E(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=e.file;if(!S(r))return`${y.red}✗ File not found: ${e.file}${y.reset}`;try{let t=await C(r),i=t;for(let{find:r,replace:i}of e.replacements){let e=p(r,n),a=p(i,n);t=t.replace(e,a)}if(i===t)return`${y.cyan}→ No changes${y.reset}`;let a=x(i,t);return`${y.blue}File: ${e.file}${y.reset}\n${a.join(`
6
+ `)}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}function D(e){return e.template!=null&&e.template!==``}function O(e){return e.templateFile!=null&&e.templateFile!==``}function le(e){return e.endsWith(`.hbs`)}function k(e){let t=D(e),n=O(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function ue(e){return D(e)?`inline template`:O(e)?`template file: ${e.templateFile}`:`no template source`}async function A(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=D(e),s=O(e);if(o)return p(e.template,t);if(s){let n=e.templateFile,r=i&&le(n),o=await te(ee(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):p(o,t)}throw Error(`No template content available`)}async function de(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;if(e.template==null||e.template===``)return`${y.red}✗ No template content provided for file: ${e.file}${y.reset}`;let r=e.file,i=p(e.template,n);if(!S(r)){let t=i.split(`
7
+ `).slice(0,10).join(`
8
+ `),n=i.split(`
9
+ `).length>10;return`${y.blue}File: ${e.file}${y.reset}\n${y.green}+ New file would be created${y.reset}\n${y.gray}Content preview:${y.reset}\n${t}${n?`
10
+ ...`:``}`}try{let t=await C(r);if(t===i)return`${y.cyan}→ No changes${y.reset}`;let n=x(t,i);return`${y.blue}File: ${e.file}${y.reset}\n${n.join(`
11
+ `)}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}async function fe(e,n,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let i=e.file;if(S(i))return`${y.cyan}→ File already exists, would be skipped: ${e.file}${y.reset}`;try{if(D(e)){let t=await A(e,n,r),i=t.split(`
12
+ `).slice(0,10).join(`
13
+ `),a=t.split(`
14
+ `).length>10;return`${y.blue}File: ${e.file}${y.reset}\n${y.green}+ New file would be created${y.reset}\n${y.gray}Content preview:${y.reset}\n${i}${a?`
15
+ ...`:``}`}let t=ue(e);return`${y.blue}File: ${e.file}${y.reset}\n${y.green}+ New file would be created from ${t}${y.reset}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}async function pe(e,n,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let i=e.file,a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);try{let t=await A(a,n,r),o=t.split(`
16
+ `).slice(0,10).join(`
17
+ `),s=t.split(`
18
+ `).length>10;return S(i)?`${y.blue}File: ${e.file}${y.reset}\n${y.green}+ Would append content${y.reset}\n${y.gray}Content preview:${y.reset}\n${o}${s?`
19
+ ...`:``}`:`${y.blue}File: ${e.file}${y.reset}\n${y.green}+ New file would be created with content${y.reset}\n${y.gray}Content preview:${y.reset}\n${o}${s?`
20
+ ...`:``}`}catch(e){return`${y.red}✗ Error: ${e instanceof Error?e.message:String(e)}${y.reset}`}}function j(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=e.paths.map(e=>p(e,n)).filter(e=>S(e));return r.length===0?`${y.cyan}→ No files/directories to delete${y.reset}`:`${y.red}Would delete:${y.reset}\n${r.map(e=>`${y.red} - ${e}${y.reset}`).join(`
21
+ `)}`}function M(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=p(e.from,n),i=p(e.to,n);return S(r)?S(i)?`${y.yellow}⚠ Destination already exists: ${i}${y.reset}\n${y.cyan}Would rename: ${r} → ${i}${y.reset}`:`${y.cyan}Would rename: ${r} → ${i}${y.reset}`:`${y.red}✗ Source not found: ${r}${y.reset}`}function me(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=p(e.from,n),i=p(e.to,n);return S(r)?S(i)?`${y.yellow}⚠ Destination already exists: ${i}${y.reset}\n${y.cyan}Would move: ${r} → ${i}${y.reset}`:`${y.cyan}Would move: ${r} → ${i}${y.reset}`:`${y.red}✗ Source not found: ${r}${y.reset}`}function he(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=p(e.from,n),i=p(e.to,n);if(!S(r))return`${y.red}✗ Source not found: ${r}${y.reset}`;let a=`file`;return S(i)?`${y.yellow}⚠ Destination already exists: ${i}${y.reset}\n${y.cyan}Would copy ${a}: ${r} → ${i}${y.reset}`:`${y.cyan}Would copy ${a}: ${r} → ${i}${y.reset}`}function ge(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=p(e.path,n);return S(r)?`${y.cyan}→ Directory already exists: ${r}${y.reset}`:`${y.green}+ Would create directory: ${r}${y.reset}`}function N(e){if(e.condition!=null&&e.condition!==``)return`${y.yellow}⊘ Condition check skipped in dry-run${y.reset}`;let t=S(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${y.red}Would remove existing .git directory${y.reset}`),n.push(`${y.green}Would initialize git repository${y.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${y.green}Would create initial commit: "${t}"${y.reset}`)}return n.join(`
22
+ `)}function P(e,n){if(e.condition!=null&&e.condition!==``&&!t(e.condition,n))return`${y.yellow}⊘ Condition not met - task would be skipped${y.reset}`;let r=p(e.command,n),i=e.cwd==null?g.cwd():p(e.cwd,n);return`${y.yellow}Would execute:${y.reset}\n${y.cyan} Command: ${r}${y.reset}\n${y.cyan} Working directory: ${i}${y.reset}`}async function F(e,t){try{switch(e.type){case`update-json`:return await w(e.config,t);case`write`:return await de(e.config,t);case`create`:return await fe(e.config,t,e);case`regex-replace`:return await T(e.config,t);case`replace-in-file`:return await E(e.config,t);case`delete`:return j(e.config,t);case`rename`:return M(e.config,t);case`move`:return me(e.config,t);case`copy`:return he(e.config,t);case`append`:return await pe(e.config,t,e);case`mkdir`:return ge(e.config,t);case`git-init`:return N(e.config);case`exec`:return P(e.config,t);case`exec-file`:return P(e.config,t);default:{let t=e.type;return`${y.yellow}⚠ Diff not available for task type: ${t}${y.reset}`}}}catch(e){return`${y.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${y.reset}`}}async function _e(e,t){console.log(`${y.blue}═══════════════════════════════════════════════════════${y.reset}`),console.log(`${y.blue} DRY RUN - Preview of changes${y.reset}`),console.log(`${y.blue}═══════════════════════════════════════════════════════${y.reset}`);for(let n of e){console.log(`${y.cyan}▶ Task: ${n.name}${y.reset}`),n.description!=null&&n.description!==``&&console.log(`${y.gray} ${n.description}${y.reset}`);let e=await F(n,t);console.log(e),console.log(`${y.gray}${`─`.repeat(55)}${y.reset}`)}console.log(`${y.blue}═══════════════════════════════════════════════════════${y.reset}`),console.log(`${y.yellow} No changes were applied (dry-run mode)${y.reset}`),console.log(`${y.blue}═══════════════════════════════════════════════════════${y.reset}`)}const I=new Map,L={},R=new Map;function ve(e){e.beforeAll!=null&&(L.beforeAll=e.beforeAll),e.afterAll!=null&&(L.afterAll=e.afterAll),e.beforeTask!=null&&(L.beforeTask=e.beforeTask),e.afterTask!=null&&(L.afterTask=e.afterTask),e.onError!=null&&(L.onError=e.onError)}async function z(e,...t){let r=L[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(t[0],t[1])}catch(t){n(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}function B(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(I.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(R.has(t)){let e=R.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}I.set(e.name,e);for(let t of e.taskTypes)R.set(t,e.name);ne(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function ye(e){let t=I.get(e);if(t!=null){for(let e of t.taskTypes)R.delete(e);I.delete(e)}}function be(e){return I.get(e)}function xe(){return Array.from(I.keys())}function Se(){I.clear(),R.clear()}function V(e){let t=R.get(e);if(t!=null)return I.get(t)}function H(e){return R.has(e)}async function U(e,t,n){let r=V(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function Ce(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function W(e,t,n,r){if(e!==void 0)return l(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function we(e,t=new Map,i={}){let a={};if(e.length===0)return a;for(let s of e){if(s.$configEnabled!=null&&!await o(s.$configEnabled,{...i,...a}))continue;let e={...i,...a};if(await o(s.enabled,e))try{let i,o=t.get(s.id);switch(s.default!==void 0&&(o=await W(s.default,s.id,e,s)),s.type){case`input`:{let t={message:s.message};o!==void 0&&(t.default=String(o));let a=await c(s.required,e);if(a!==void 0&&(t.required=a),i=await ie(t),a&&(i==null||typeof i==`string`&&i.trim()===``))throw n(`${s.message} is required`,`error`),r.required(s.id);break}case`password`:if(i=await oe({message:s.message,mask:`*`}),await c(s.required,e)&&(i==null||typeof i==`string`&&i.trim()===``))throw n(`${s.message} is required`,`error`),r.required(s.id);break;case`number`:{let t={message:s.message};o!==void 0&&(t.default=Number(o));let a=await c(s.required,e);if(a!==void 0&&(t.required=a),s.min!==void 0&&(t.min=s.min),s.max!==void 0&&(t.max=s.max),i=await ae(t),a&&i==null)throw n(`${s.message} is required`,`error`),r.required(s.id);break}case`select`:{let e={message:s.message,choices:s.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),i=await se(e);break}case`confirm`:{let e=o===void 0?!1:!!o;i=await re({message:s.message,default:e});break}default:throw n(`Unknown prompt type: ${s.type}`,`error`),r.unknownType(s.type)}s.transformers!==void 0&&(i=await f.apply(s.transformers,i,{...e,...a})),a[s.id]=i}catch(e){throw e instanceof Error&&n(`Failed to collect prompt "${s.id}": ${e.message}`,`error`),e}}return a}async function Te(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await W(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function Ee(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const G=_(h.appendFile),De=_(h.readFile),Oe=_(h.stat);async function ke(e,r,i){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping append task`,`info`);return}let a=m.join(g.cwd(),e.file),o={};e.content==null?e.template!=null&&(o.template=e.template):o.template=e.content,e.templateFile!=null&&(o.templateFile=e.templateFile);let s=k(o);if(!s.isValid)throw s.error?.includes(`cannot have both`)?d.templateHasBothTemplateAndFile():d.templateMissingTemplateOrFile();let c=await A(o,r,i),l=!1,u=!1;try{await Oe(a),l=!0;let t=await De(a,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(u=e.newline!==!1)}catch{}l&&u?await G(a,`\n${c}`):await G(a,c),n(`Appended content to ${e.file}`,`success`)}const Ae={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t,e)}},K=_(h.copyFile),je=_(h.stat),q=_(h.mkdir),Me=_(h.readdir);async function J(e,t){await q(t,{recursive:!0});let n=await Me(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=m.join(e,n.name),i=m.join(t,n.name);n.isDirectory()?await J(r,i):await K(r,i)}))}async function Ne(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping copy task`,`info`);return}let i=m.join(g.cwd(),e.from),a=m.join(g.cwd(),e.to),o;try{o=await je(i)}catch{n(`Source path does not exist: ${i}`,`warn`);return}await q(m.dirname(a),{recursive:!0}),o.isDirectory()?(await J(i,a),n(`Copied directory ${e.from} to ${e.to}`,`success`)):(await K(i,a),n(`Copied file ${e.from} to ${e.to}`,`success`))}const Pe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t)}},Fe=_(h.writeFile);async function Ie(e,r,i){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping create task`,`info`);return}let a=m.join(g.cwd(),e.file);if(h.existsSync(a)){n(`File already exists, skipping: ${e.file}`,`info`);return}let o=k(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?d.createHasBothTemplateAndFile():d.createMissingTemplateOrFile();let s=await A(e,r,i),c=m.dirname(a);h.existsSync(c)||h.mkdirSync(c,{recursive:!0}),await Fe(a,s),n(`Created file: ${e.file}`,`success`)}const Y={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ie(e.config,t,e)}};async function Le(e,r){let{paths:i,condition:a}=e;if(a!=null&&a!==``){if(!r){n(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!t(a,r)){n(`Condition not met, skipping deletion`,`info`);return}}for(let e of i){let t=m.join(g.cwd(),e);h.existsSync(t)&&h.rmSync(t,{recursive:!0,force:!0})}}const Re={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t)}};async function ze(e,n,r){e.condition!=null&&e.condition!==``&&!t(e.condition,n)||await u({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Be={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}};async function Ve(e,r){if(e.condition!=null&&e.condition!==``){if(!r){n(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!t(e.condition,r)){n(`Condition not met, skipping exec task`,`info`);return}}let i=e.cwd==null?g.cwd():m.join(g.cwd(),e.cwd);v(e.command,{cwd:i,stdio:`inherit`})}const He={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t)}};async function Ue(e,r){if(e.condition!=null&&e.condition!==``){if(!r){n(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!t(e.condition,r)){n(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=m.join(g.cwd(),`.git`);h.existsSync(e)&&h.rmSync(e,{recursive:!0,force:!0})}if(v(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;v(`git add .`,{stdio:`inherit`}),v(`git commit -m "${t}"`,{stdio:`inherit`})}}const We={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}},Ge=_(h.mkdir);async function Ke(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping mkdir task`,`info`);return}await Ge(m.join(g.cwd(),e.path),{recursive:!0}),n(`Created directory: ${e.path}`,`success`)}const qe={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=_(h.rename),Ye=_(h.stat),Xe=_(h.mkdir);async function Ze(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping move task`,`info`);return}let i=m.join(g.cwd(),e.from),a=m.join(g.cwd(),e.to);try{await Ye(i)}catch{n(`Source path does not exist: ${i}`,`warn`);return}await Xe(m.dirname(a),{recursive:!0}),await Je(i,a),n(`Moved ${e.from} to ${e.to}`,`success`)}const Qe={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}},$e=_(h.readFile),et=_(h.writeFile);async function tt(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping regex-replace task`,`info`);return}let i=m.join(g.cwd(),e.file),{pattern:a}=e,o=e.flags??``,s=e.replacement||``,c=await $e(i,`utf-8`),l=new RegExp(a,o);c=c.replace(l,p(s,r)),await et(i,c)}const nt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}},rt=_(h.rename);async function it(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping rename task`,`info`);return}let i=m.join(g.cwd(),p(e.from,r)),a=m.join(g.cwd(),p(e.to,r));if(!h.existsSync(i)){n(`Source path does not exist: ${i}`,`warn`);return}await rt(i,a)}const at={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await it(e.config,t)}},ot=_(h.readFile),st=_(h.writeFile);async function ct(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping replace-in-file task`,`info`);return}let i=m.join(g.cwd(),e.file),{replacements:a}=e;if(!h.existsSync(i)){n(`File not found: ${i}, skipping`,`warn`);return}let o=await ot(i,`utf-8`);for(let{find:e,replace:t}of a){let n=p(t,r);o=o.replace(new RegExp(e,`gu`),n)}await st(i,o)}const lt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=_(h.readFile),dt=_(h.writeFile);async function ft(e,r){if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping update-json task`,`info`);return}let i=m.join(g.cwd(),e.file),{updates:a}=e,o=await ut(i,`utf-8`),c=JSON.parse(o);function l(e){if(typeof e==`string`)return p(e,r);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,t]of Object.entries(a)){let n=l(t);e.includes(`.`)?s(c,e,n):c[e]=n}await dt(i,`${JSON.stringify(c,null,2)}\n`)}const pt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=_(h.writeFile);async function ht(e,r,i){let{allowCreate:a=!0}=e;if(e.condition!=null&&e.condition!==``&&!t(e.condition,r)){n(`Condition not met, skipping write task`,`info`);return}let o=m.join(g.cwd(),e.file);if(!h.existsSync(o)){if(a===!1)throw Error(`Write task failed: file does not exist (${e.file})`);n(`File not found, creating new file: ${e.file}`,`info`)}let s=k(e);if(!s.isValid)throw s.error?.includes(`cannot have both`)?d.templateHasBothTemplateAndFile():d.templateMissingTemplateOrFile();let c=await A(e,r,i),l=m.dirname(o);h.existsSync(l)||h.mkdirSync(l,{recursive:!0}),await mt(o,c)}const gt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t,e)}};function X(){H(`update-json`)||(B(pt),B(gt),B(Y),B(nt),B(lt),B(Re),B(at),B(We),B(He),B(Be),B(Qe),B(Pe),B(Ae),B(qe))}async function _t(e,t,r=!1){if(X(),r){n(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(H(e.type)){await U(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,r,i,a=!1){try{return n(`[${r}/${i}] Running: ${e.name}...`,`info`),await _t(e,t,a),n(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n(`Failed: ${e.name}`,`error`),t instanceof Error&&(n(` Reason: ${t.message}`,`error`),t.stack!=null&&g.env.DEBUG!=null&&console.error(t.stack)),!1}}async function vt(t,r,i){await z(`beforeAll`,r);let a=0,o=0,s=[];for(let n=0;n<t.length;n++){let l=t[n];l!=null&&(await z(`beforeTask`,l,r),await Z(l,r,n+1,t.length,i.dryRun)?(a++,await z(`afterTask`,l,r)):(await c(l.required,r)&&(o++,s.push(l.name)),await z(`onError`,Error(`Task ${l.name} failed`),l),e(`⚠️ Task "${l.name}" failed, continuing with remaining tasks...`)))}await z(`afterAll`,r),o>0&&(n(`\n❌ Task execution completed with ${o} error(s)`,`error`),n(`Completed: ${a}/${t.length} tasks`,`info`),n(`Failed tasks: ${s.join(`, `)}`,`error`),g.exit(1)),n(`Completed: ${a}/${t.length} tasks`,`success`)}function Q(e){let t=[],n=new Set,r=new Set,o=new Map(e.map(e=>[e.id,e]));function s(e){if(n.has(e))return;if(r.has(e))throw a.forTaskDependency(e);r.add(e);let c=o.get(e);if(!c)throw i.forId(e);if(c.dependencies)for(let e of c.dependencies)s(e);r.delete(e),n.add(e),t.push(c)}for(let t of e)n.has(t.id)||s(t.id);return t}function yt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=k({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function bt(e,t){let n=$(e);n.length>0&&(console.error(`❌ Task validation errors:`),n.forEach(e=>console.error(` - ${e}`)),g.exit(1));let r=[];for(let n of e)await o(n.enabled,t)&&r.push(n);return r}function xt(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!H(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=yt(n);t.push(...e)}return t}export{w as A,F as C,M as D,j as E,T as O,_e as S,N as T,xe as _,vt as a,z as b,Ee as c,Ce as d,U as f,be as g,Se as h,Q as i,E as k,Te as l,H as m,xt as n,X as o,V as p,bt as r,Z as s,$ as t,we as u,B as v,P as w,ve as x,ye as y};
@@ -0,0 +1,23 @@
1
+ const e=require(`./configurations-Dzwqq0PK.cjs`);let t=require(`node:fs`);t=e.I(t);let n=require(`node:path`);n=e.I(n);let r=require(`node:process`);r=e.I(r);let i=require(`node:util`);i=e.I(i);let a=require(`node:child_process`);a=e.I(a);let o=require(`@inquirer/prompts`);o=e.I(o);const s=(0,i.promisify)(t.default.readFile),c=2,l=10,u=55,d={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function f(e,t){switch(t){case`add`:return`${d.green}+ ${e}${d.reset}`;case`remove`:return`${d.red}- ${e}${d.reset}`;case`context`:return`${d.gray} ${e}${d.reset}`;default:return e}}function p(e,t){let n=e.split(`
2
+ `),r=t.split(`
3
+ `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(f(t,`context`)):(t!==void 0&&i.push(f(t,`remove`)),a!==void 0&&i.push(f(a,`add`)))}return i}function m(e){return t.default.existsSync(n.default.join(r.default.cwd(),e))}async function h(e){return s(n.default.join(r.default.cwd(),e),`utf-8`)}async function g(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=JSON.parse(i),o={...a};function s(t){if(typeof t==`string`)return e.u(t,n);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[n,r]of Object.entries(t.updates)){let t=s(r);n.includes(`.`)?e._(a,n,t):a[n]=t}let c=JSON.stringify(o,null,2),l=JSON.stringify(a,null,2);if(c===l)return`${d.cyan}→ No changes${d.reset}`;let u=p(c,l);return`${d.blue}File: ${t.file}${d.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function _(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=new RegExp(t.pattern,t.flags??`g`),o=e.u(t.replacement,n),s=i.replace(a,o);if(i===s)return`${d.cyan}→ No matches found${d.reset}`;let c=p(i,s);return`${d.blue}File: ${t.file}${d.reset}\n${c.join(`
5
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function v(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=i;for(let{find:r,replace:a}of t.replacements){let t=e.u(r,n),o=e.u(a,n);i=i.replace(t,o)}if(a===i)return`${d.cyan}→ No changes${d.reset}`;let o=p(a,i);return`${d.blue}File: ${t.file}${d.reset}\n${o.join(`
6
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function y(e){return e.template!=null&&e.template!==``}function b(e){return e.templateFile!=null&&e.templateFile!==``}function ee(e){return e.endsWith(`.hbs`)}function x(e){let t=y(e),n=b(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function te(e){return y(e)?`inline template`:b(e)?`template file: ${e.templateFile}`:`no template source`}async function S(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=y(t),c=b(t);if(s)return e.u(t.template,n);if(c){let r=t.templateFile,i=a&&ee(r),s=await e.l(e.h(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.u(s,n)}throw Error(`No template content available`)}async function C(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;if(t.template==null||t.template===``)return`${d.red}✗ No template content provided for file: ${t.file}${d.reset}`;let r=t.file,i=e.u(t.template,n);if(!m(r)){let e=i.split(`
7
+ `).slice(0,10).join(`
8
+ `),n=i.split(`
9
+ `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${e}${n?`
10
+ ...`:``}`}try{let e=await h(r);if(e===i)return`${d.cyan}→ No changes${d.reset}`;let n=p(e,i);return`${d.blue}File: ${t.file}${d.reset}\n${n.join(`
11
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function w(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file;if(m(i))return`${d.cyan}→ File already exists, would be skipped: ${t.file}${d.reset}`;try{if(y(t)){let e=await S(t,n,r),i=e.split(`
12
+ `).slice(0,10).join(`
13
+ `),a=e.split(`
14
+ `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${i}${a?`
15
+ ...`:``}`}let e=te(t);return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created from ${e}${d.reset}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function T(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await S(a,n,r),o=e.split(`
16
+ `).slice(0,10).join(`
17
+ `),s=e.split(`
18
+ `).length>10;return m(i)?`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ Would append content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
19
+ ...`:``}`:`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created with content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
20
+ ...`:``}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function E(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.paths.map(t=>e.u(t,n)).filter(e=>m(e));return r.length===0?`${d.cyan}→ No files/directories to delete${d.reset}`:`${d.red}Would delete:${d.reset}\n${r.map(e=>`${d.red} - ${e}${d.reset}`).join(`
21
+ `)}`}function D(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.u(t.from,n),i=e.u(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function ne(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.u(t.from,n),i=e.u(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function re(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.u(t.from,n),i=e.u(t.to,n);if(!m(r))return`${d.red}✗ Source not found: ${r}${d.reset}`;let a=`file`;return m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`:`${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`}function ie(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.u(t.path,n);return m(r)?`${d.cyan}→ Directory already exists: ${r}${d.reset}`:`${d.green}+ Would create directory: ${r}${d.reset}`}function O(e){if(e.condition!=null&&e.condition!==``)return`${d.yellow}⊘ Condition check skipped in dry-run${d.reset}`;let t=m(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${d.red}Would remove existing .git directory${d.reset}`),n.push(`${d.green}Would initialize git repository${d.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${d.green}Would create initial commit: "${t}"${d.reset}`)}return n.join(`
22
+ `)}function k(t,n){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=e.u(t.command,n),a=t.cwd==null?r.default.cwd():e.u(t.cwd,n);return`${d.yellow}Would execute:${d.reset}\n${d.cyan} Command: ${i}${d.reset}\n${d.cyan} Working directory: ${a}${d.reset}`}async function A(e,t){try{switch(e.type){case`update-json`:return await g(e.config,t);case`write`:return await C(e.config,t);case`create`:return await w(e.config,t,e);case`regex-replace`:return await _(e.config,t);case`replace-in-file`:return await v(e.config,t);case`delete`:return E(e.config,t);case`rename`:return D(e.config,t);case`move`:return ne(e.config,t);case`copy`:return re(e.config,t);case`append`:return await T(e.config,t,e);case`mkdir`:return ie(e.config,t);case`git-init`:return O(e.config);case`exec`:return k(e.config,t);case`exec-file`:return k(e.config,t);default:{let t=e.type;return`${d.yellow}⚠ Diff not available for task type: ${t}${d.reset}`}}}catch(e){return`${d.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function j(e,t){console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.blue} DRY RUN - Preview of changes${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`);for(let n of e){console.log(`${d.cyan}▶ Task: ${n.name}${d.reset}`),n.description!=null&&n.description!==``&&console.log(`${d.gray} ${n.description}${d.reset}`);let e=await A(n,t);console.log(e),console.log(`${d.gray}${`─`.repeat(55)}${d.reset}`)}console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.yellow} No changes were applied (dry-run mode)${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`)}const M=new Map,N={},P=new Map;function ae(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function F(t,...n){let r=N[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.D(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}function I(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(M.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(P.has(e)){let t=P.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}M.set(t.name,t);for(let e of t.taskTypes)P.set(e,t.name);e.w(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function oe(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function se(e){return M.get(e)}function ce(){return Array.from(M.keys())}function le(){M.clear(),P.clear()}function L(e){let t=P.get(e);if(t!=null)return M.get(t)}function R(e){return P.has(e)}async function z(e,t,n){let r=L(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function B(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function V(t,n,r,i){if(t!==void 0)return e.d(t,{id:n,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function H(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$configEnabled!=null&&!await e.S(a.$configEnabled,{...r,...i}))continue;let t={...r,...i};if(await e.S(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await V(a.default,a.id,t,a)),a.type){case`input`:{let n={message:a.message};s!==void 0&&(n.default=String(s));let i=await e.b(a.required,t);if(i!==void 0&&(n.required=i),r=await(0,o.input)(n),i&&(r==null||typeof r==`string`&&r.trim()===``))throw e.D(`${a.message} is required`,`error`),e.M.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),await e.b(a.required,t)&&(r==null||typeof r==`string`&&r.trim()===``))throw e.D(`${a.message} is required`,`error`),e.M.required(a.id);break;case`number`:{let n={message:a.message};s!==void 0&&(n.default=Number(s));let i=await e.b(a.required,t);if(i!==void 0&&(n.required=i),a.min!==void 0&&(n.min=a.min),a.max!==void 0&&(n.max=a.max),r=await(0,o.number)(n),i&&r==null)throw e.D(`${a.message} is required`,`error`),e.M.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(e.default=s),r=await(0,o.select)(e);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.D(`Unknown prompt type: ${a.type}`,`error`),e.M.unknownType(a.type)}a.transformers!==void 0&&(r=await e.s.apply(a.transformers,r,{...t,...i})),i[a.id]=r}catch(t){throw t instanceof Error&&e.D(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function U(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await V(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function W(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const G=(0,i.promisify)(t.default.appendFile),ue=(0,i.promisify)(t.default.readFile),de=(0,i.promisify)(t.default.stat);async function fe(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping append task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=x(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?e.j.templateHasBothTemplateAndFile():e.j.templateMissingTemplateOrFile();let l=await S(s,i,a),u=!1,d=!1;try{await de(o),u=!0;let e=await ue(o,`utf-8`);e.length>0&&!e.endsWith(`
23
+ `)&&(d=t.newline!==!1)}catch{}u&&d?await G(o,`\n${l}`):await G(o,l),e.D(`Appended content to ${t.file}`,`success`)}const pe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await fe(e.config,t,e)}},K=(0,i.promisify)(t.default.copyFile),me=(0,i.promisify)(t.default.stat),q=(0,i.promisify)(t.default.mkdir),he=(0,i.promisify)(t.default.readdir);async function J(e,t){await q(t,{recursive:!0});let r=await he(e,{withFileTypes:!0});await Promise.all(r.map(async r=>{let i=n.default.join(e,r.name),a=n.default.join(t,r.name);r.isDirectory()?await J(i,a):await K(i,a)}))}async function ge(t,i){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping copy task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to),s;try{s=await me(a)}catch{e.D(`Source path does not exist: ${a}`,`warn`);return}await q(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await J(a,o),e.D(`Copied directory ${t.from} to ${t.to}`,`success`)):(await K(a,o),e.D(`Copied file ${t.from} to ${t.to}`,`success`))}const _e={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ge(e.config,t)}},ve=(0,i.promisify)(t.default.writeFile);async function ye(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.C(i.condition,a)){e.D(`Condition not met, skipping create task`,`info`);return}let s=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(s)){e.D(`File already exists, skipping: ${i.file}`,`info`);return}let c=x(i);if(!c.isValid)throw c.error?.includes(`cannot have both`)?e.j.createHasBothTemplateAndFile():e.j.createMissingTemplateOrFile();let l=await S(i,a,o),u=n.default.dirname(s);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await ve(s,l),e.D(`Created file: ${i.file}`,`success`)}const be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t,e)}};async function xe(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.D(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.C(s,a)){e.D(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let i=n.default.join(r.default.cwd(),e);t.default.existsSync(i)&&t.default.rmSync(i,{recursive:!0,force:!0})}}const Se={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await xe(e.config,t)}};async function Ce(t,n,r){t.condition!=null&&t.condition!==``&&!e.C(t.condition,n)||await e.f({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const we={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t,e)}};async function Te(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.D(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.C(t.condition,i)){e.D(`Condition not met, skipping exec task`,`info`);return}}let o=t.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),t.cwd);(0,a.execSync)(t.command,{cwd:o,stdio:`inherit`})}const Ee={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}};async function De(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.D(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.C(i.condition,o)){e.D(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let e=n.default.join(r.default.cwd(),`.git`);t.default.existsSync(e)&&t.default.rmSync(e,{recursive:!0,force:!0})}if((0,a.execSync)(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;(0,a.execSync)(`git add .`,{stdio:`inherit`}),(0,a.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const Oe={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await De(e.config,t)}},ke=(0,i.promisify)(t.default.mkdir);async function Ae(t,i){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping mkdir task`,`info`);return}await ke(n.default.join(r.default.cwd(),t.path),{recursive:!0}),e.D(`Created directory: ${t.path}`,`success`)}const je={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t)}},Me=(0,i.promisify)(t.default.rename),Ne=(0,i.promisify)(t.default.stat),Pe=(0,i.promisify)(t.default.mkdir);async function Fe(t,i){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping move task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to);try{await Ne(a)}catch{e.D(`Source path does not exist: ${a}`,`warn`);return}await Pe(n.default.dirname(o),{recursive:!0}),await Me(a,o),e.D(`Moved ${t.from} to ${t.to}`,`success`)}const Ie={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}},Le=(0,i.promisify)(t.default.readFile),Re=(0,i.promisify)(t.default.writeFile);async function ze(t,i){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping regex-replace task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await Le(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.u(c,i)),await Re(a,l)}const Be={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t)}},Ve=(0,i.promisify)(t.default.rename);async function He(i,a){if(i.condition!=null&&i.condition!==``&&!e.C(i.condition,a)){e.D(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.u(i.from,a)),s=n.default.join(r.default.cwd(),e.u(i.to,a));if(!t.default.existsSync(o)){e.D(`Source path does not exist: ${o}`,`warn`);return}await Ve(o,s)}const Ue={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=(0,i.promisify)(t.default.readFile),Ge=(0,i.promisify)(t.default.writeFile);async function Ke(i,a){if(i.condition!=null&&i.condition!==``&&!e.C(i.condition,a)){e.D(`Condition not met, skipping replace-in-file task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file),{replacements:s}=i;if(!t.default.existsSync(o)){e.D(`File not found: ${o}, skipping`,`warn`);return}let c=await We(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.u(n,a);c=c.replace(new RegExp(t,`gu`),r)}await Ge(o,c)}const qe={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=(0,i.promisify)(t.default.readFile),Ye=(0,i.promisify)(t.default.writeFile),Xe=2;async function Ze(t,i){if(t.condition!=null&&t.condition!==``&&!e.C(t.condition,i)){e.D(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await Je(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.u(t,i);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e._(c,t,r):c[t]=r}await Ye(a,`${JSON.stringify(c,null,2)}\n`)}const Qe={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}},Y=(0,i.promisify)(t.default.writeFile);async function $e(i,a,o){let{allowCreate:s=!0}=i;if(i.condition!=null&&i.condition!==``&&!e.C(i.condition,a)){e.D(`Condition not met, skipping write task`,`info`);return}let c=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${i.file})`);e.D(`File not found, creating new file: ${i.file}`,`info`)}let l=x(i);if(!l.isValid)throw l.error?.includes(`cannot have both`)?e.j.templateHasBothTemplateAndFile():e.j.templateMissingTemplateOrFile();let u=await S(i,a,o),d=n.default.dirname(c);t.default.existsSync(d)||t.default.mkdirSync(d,{recursive:!0}),await Y(c,u)}const et={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};function X(){R(`update-json`)||(I(Qe),I(et),I(be),I(Be),I(qe),I(Se),I(Ue),I(Oe),I(Ee),I(we),I(Ie),I(_e),I(pe),I(je))}async function tt(t,n,r=!1){if(X(),r){e.D(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(R(t.type)){await z(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Z(t,n,i,a,o=!1){try{return e.D(`[${i}/${a}] Running: ${t.name}...`,`info`),await tt(t,n,o),e.D(`[${i}/${a}] Completed: ${t.name}...`,`success`),!0}catch(n){return e.D(`Failed: ${t.name}`,`error`),n instanceof Error&&(e.D(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),!1}}async function nt(t,n,i){await F(`beforeAll`,n);let a=0,o=0,s=[];for(let r=0;r<t.length;r++){let c=t[r];c!=null&&(await F(`beforeTask`,c,n),await Z(c,n,r+1,t.length,i.dryRun)?(a++,await F(`afterTask`,c,n)):(await e.b(c.required,n)&&(o++,s.push(c.name)),await F(`onError`,Error(`Task ${c.name} failed`),c),e.A(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await F(`afterAll`,n),o>0&&(e.D(`\n❌ Task execution completed with ${o} error(s)`,`error`),e.D(`Completed: ${a}/${t.length} tasks`,`info`),e.D(`Failed tasks: ${s.join(`, `)}`,`error`),r.default.exit(1)),e.D(`Completed: ${a}/${t.length} tasks`,`success`)}function Q(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.P.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw e.N.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function rt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=x({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function it(t,n){let i=$(t);i.length>0&&(console.error(`❌ Task validation errors:`),i.forEach(e=>console.error(` - ${e}`)),r.default.exit(1));let a=[];for(let r of t)await e.S(r.enabled,n)&&a.push(r);return a}function at(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!R(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=rt(n);t.push(...e)}return t}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return nt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return it}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return oe}});
@@ -0,0 +1 @@
1
+ import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,b as c,d as l,g as u,h as d,k as f,m as p,p as m,u as h,v as g,w as _,x as v,y}from"./configurations-CKshmsrJ.js";export{m as cleanupTempFile,_ as debug,o as error,o as logError,t as evaluateCondition,v as evaluateEnabled,a as evaluateEnabledAsync,c as evaluateRequiredAsync,u as getNestedProperty,g as getSourceDisplayName,r as info,r as logInfo,h as interpolateTemplate,y as isUrl,n as log,f as logSuccess,f as success,e as logWarn,e as warn,p as resolveAndFetchFile,d as resolveFilePath,l as resolveValue,i as setDebugMode,s as setNestedProperty};
@@ -0,0 +1 @@
1
+ const e=require(`./configurations-Dzwqq0PK.cjs`);exports.cleanupTempFile=e.p,exports.debug=e.w,exports.error=e.T,exports.logError=e.T,exports.evaluateCondition=e.C,exports.evaluateEnabled=e.x,exports.evaluateEnabledAsync=e.S,exports.evaluateRequiredAsync=e.b,exports.getNestedProperty=e.g,exports.getSourceDisplayName=e.v,exports.info=e.E,exports.logInfo=e.E,exports.interpolateTemplate=e.u,exports.isUrl=e.y,exports.log=e.D,exports.logSuccess=e.k,exports.success=e.k,exports.logWarn=e.A,exports.warn=e.A,exports.resolveAndFetchFile=e.m,exports.resolveFilePath=e.h,exports.resolveValue=e.d,exports.setDebugMode=e.O,exports.setNestedProperty=e._;
@@ -0,0 +1,38 @@
1
+ //#region src/scaffoldfy-config-validator/validate-scaffoldfy-json.d.ts
2
+ /**
3
+ * Unified schema validation for template tasks configuration
4
+ * Uses JSON Schema validation via Ajv to validate task configurations
5
+ * Supports both JSON file validation and in-memory config validation
6
+ */
7
+ /**
8
+ * Display validation errors in a user-friendly format
9
+ */
10
+ declare function displayValidationErrors(errors: string[]): void;
11
+ /**
12
+ * Validate a JSON file against its $schema property
13
+ * For validating JSON files with $schema property
14
+ *
15
+ * @param filePath - Path to the JSON file to validate
16
+ * @returns Validation result with success status and any errors
17
+ */
18
+ declare function validateScaffoldfyJsonFile(filePath: string): {
19
+ valid: boolean;
20
+ errors?: string[];
21
+ };
22
+ /**
23
+ * Validate a tasks configuration object against the JSON schema
24
+ * For validating in-memory task configurations
25
+ *
26
+ * @param tasksConfig - The full tasks configuration object to validate
27
+ * @param options - Validation options
28
+ * @param options.silent - If true, suppress error output to console
29
+ * @returns Validation result with success status and any errors
30
+ */
31
+ declare function validateTasksSchema(tasksConfig: unknown, options?: {
32
+ silent?: boolean;
33
+ }): {
34
+ valid: boolean;
35
+ errors: string[];
36
+ };
37
+ //#endregion
38
+ export { validateScaffoldfyJsonFile as n, validateTasksSchema as r, displayValidationErrors as t };
@@ -0,0 +1 @@
1
+ const e=require(`./configurations-Dzwqq0PK.cjs`);let t=require(`node:fs`);t=e.I(t);let n=require(`node:path`);n=e.I(n);let r=require(`node:process`);r=e.I(r);let i=require(`node:url`);i=e.I(i);let a=require(`ajv`);a=e.I(a);const o=(0,i.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),s=n.default.dirname(o);function c(){return new a.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function l(e){try{let n=t.default.readFileSync(e,`utf-8`);return JSON.parse(n)}catch(t){throw Error(`Failed to load schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function u(e,t,n={}){let r=c().compile(t);if(!r(e)&&r.errors){let e=n.filterOneOfErrors?p(r.errors):f(r.errors);return e.length===0?{valid:!0,errors:[]}:{valid:!1,errors:e}}return{valid:!0,errors:[]}}function d(e,t){return e.startsWith(`http`)?e.includes(`scaffoldfy/schema`)?n.default.join(s,`..`,`..`,`schema`,`scaffoldfy.schema.json`):null:e.startsWith(`../`)||e.startsWith(`./`)?n.default.resolve(n.default.dirname(t),e):e}function f(e){return e.map(e=>`${e.instancePath||`root`}: ${e.message}`)}function p(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function m(t){e.D(`❌ Schema validation failed:`,`error`),e.D(``,`error`),e.D(`The following validation errors were found:`,`error`),e.D(``,`error`);for(let n of t)e.D(` • ${n}`,`error`);e.D(``,`error`),e.D(`Please fix these errors in your template configuration file.`,`error`),e.D(``,`error`),e.D(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}function h(e){let i=n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);try{let e=t.default.readFileSync(i,`utf-8`),n=JSON.parse(e);if(!n||typeof n!=`object`||!(`$schema`in n))return{valid:!0};let r=n.$schema;if(typeof r!=`string`)return{valid:!0};let a=d(r,i);return a===null||!t.default.existsSync(a)?(console.warn(`Schema file not found: ${a}`),{valid:!0}):u(n,l(a))}catch(e){return{valid:!1,errors:[`Failed to parse JSON file ${i}: ${e instanceof Error?e.message:String(e)}`]}}}function g(t,r={}){try{let e=u(t,l(n.default.join(s,`..`,`..`,`schema`,`scaffoldfy.schema.json`)),{filterOneOfErrors:!0});return!e.valid&&!r.silent&&m(e.errors),e}catch(t){let n=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return r.silent||(e.D(`❌ Schema validation error:`,`error`),e.D(` ${n}`,`error`)),{valid:!1,errors:[n]}}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return m}});
@@ -0,0 +1,38 @@
1
+ //#region src/scaffoldfy-config-validator/validate-scaffoldfy-json.d.ts
2
+ /**
3
+ * Unified schema validation for template tasks configuration
4
+ * Uses JSON Schema validation via Ajv to validate task configurations
5
+ * Supports both JSON file validation and in-memory config validation
6
+ */
7
+ /**
8
+ * Display validation errors in a user-friendly format
9
+ */
10
+ declare function displayValidationErrors(errors: string[]): void;
11
+ /**
12
+ * Validate a JSON file against its $schema property
13
+ * For validating JSON files with $schema property
14
+ *
15
+ * @param filePath - Path to the JSON file to validate
16
+ * @returns Validation result with success status and any errors
17
+ */
18
+ declare function validateScaffoldfyJsonFile(filePath: string): {
19
+ valid: boolean;
20
+ errors?: string[];
21
+ };
22
+ /**
23
+ * Validate a tasks configuration object against the JSON schema
24
+ * For validating in-memory task configurations
25
+ *
26
+ * @param tasksConfig - The full tasks configuration object to validate
27
+ * @param options - Validation options
28
+ * @param options.silent - If true, suppress error output to console
29
+ * @returns Validation result with success status and any errors
30
+ */
31
+ declare function validateTasksSchema(tasksConfig: unknown, options?: {
32
+ silent?: boolean;
33
+ }): {
34
+ valid: boolean;
35
+ errors: string[];
36
+ };
37
+ //#endregion
38
+ export { validateScaffoldfyJsonFile as n, validateTasksSchema as r, displayValidationErrors as t };