@pixpilot/scaffoldfy 0.37.0 → 0.38.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.
package/dist/index.d.ts CHANGED
@@ -267,7 +267,7 @@ interface BasePrompt {
267
267
  required?: DynamicBooleanValue;
268
268
  enabled?: DynamicBooleanValue;
269
269
  override?: MergeStrategy;
270
- $templateEnabled?: DynamicBooleanValue;
270
+ $configEnabled?: DynamicBooleanValue;
271
271
  $sourceUrl?: string;
272
272
  transformers?: string[];
273
273
  }
@@ -307,7 +307,7 @@ interface VariableDefinition {
307
307
  enabled?: DynamicBooleanValue;
308
308
  required?: DynamicBooleanValue;
309
309
  override?: MergeStrategy;
310
- $templateEnabled?: DynamicBooleanValue;
310
+ $configEnabled?: DynamicBooleanValue;
311
311
  $sourceUrl?: string;
312
312
  transformers?: string[];
313
313
  }
@@ -342,7 +342,7 @@ interface TaskDefinition {
342
342
  rollback?: RollbackConfig;
343
343
  override?: MergeStrategy;
344
344
  $sourceUrl?: string;
345
- $templateEnabled?: DynamicBooleanValue;
345
+ $configEnabled?: DynamicBooleanValue;
346
346
  }
347
347
  /**
348
348
  * Configuration file structure for template tasks
@@ -382,19 +382,56 @@ interface PluginHooks {
382
382
  onError?: (error: Error, task?: TaskDefinition) => Promise<void>;
383
383
  }
384
384
  //#endregion
385
- //#region src/dry-run.d.ts
385
+ //#region src/config-inheritance.d.ts
386
386
  /**
387
- * Get diff for update-json task
387
+ * Load a configuration file from local path or remote URL
388
+ * @param configPath - Path or URL to the configuration file
389
+ * @param visitedPaths - Set of already visited paths to detect circular dependencies
390
+ * @returns The loaded configuration
388
391
  */
389
- declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
392
+ declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
390
393
  /**
391
- * Get diff for write task
394
+ * Recursively load and merge configurations
395
+ * @param configPath - Path or URL to the configuration file
396
+ * @param baseDir - Base directory or URL for resolving relative paths in extends
397
+ * @param visitedPaths - Set of already visited paths
398
+ * @returns Merged configuration
399
+ */
400
+ declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
401
+ /**
402
+ * Merge multiple configurations
403
+ * Later configurations override earlier ones for conflicting task IDs
404
+ * @param configurations - Array of configurations to merge (in priority order)
405
+ * @returns Merged configuration
392
406
  */
393
- declare function getWriteDiff(config: WriteConfig, initConfig: InitConfig): Promise<string>;
407
+ declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
394
408
  /**
395
- * Get diff for create task
409
+ * Clear the configuration cache (useful for testing)
396
410
  */
397
- declare function getCreateDiff(config: CreateConfig, initConfig: InitConfig, task?: TaskDefinition): Promise<string>;
411
+ declare function clearConfigurationCache(): void;
412
+ /**
413
+ * Load tasks from a configuration file with configuration inheritance support
414
+ * @param tasksFilePath - Path to the tasks configuration file
415
+ * @param options - Optional configuration
416
+ * @param options.sequential - If true, return configurations as separate items for sequential processing
417
+ * @returns Task configuration with tasks, optional variables, and optional prompts
418
+ */
419
+ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
420
+ sequential?: boolean;
421
+ }): Promise<{
422
+ tasks: TaskDefinition[];
423
+ variables?: VariableDefinition[];
424
+ prompts?: PromptDefinition[];
425
+ enabled?: EnabledValue;
426
+ templates?: TasksConfiguration[];
427
+ transformers?: Transformer[];
428
+ }>;
429
+ //#endregion
430
+ //#region src/dry-run.d.ts
431
+ /**
432
+ * Get diff for update-json task
433
+ */
434
+ declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
398
435
  /**
399
436
  * Get diff for regex-replace task
400
437
  */
@@ -471,26 +508,6 @@ declare function clearPlugins(): void;
471
508
  * @param hooks - Hook functions to register
472
509
  */
473
510
  declare function registerHooks(hooks: Partial<PluginHooks>): void;
474
- /**
475
- * Call a lifecycle hook
476
- * @param hookName - Name of the hook
477
- * @param config - Initialization config for beforeAll/afterAll
478
- */
479
- declare function callHook(hookName: 'beforeAll' | 'afterAll', config: InitConfig): Promise<void>;
480
- /**
481
- * Call a lifecycle hook
482
- * @param hookName - Name of the hook
483
- * @param task - Task definition for beforeTask/afterTask
484
- * @param config - Initialization config
485
- */
486
- declare function callHook(hookName: 'beforeTask' | 'afterTask', task: TaskDefinition, config: InitConfig): Promise<void>;
487
- /**
488
- * Call a lifecycle hook
489
- * @param hookName - Name of the hook
490
- * @param error - Error that occurred
491
- * @param task - Optional task definition
492
- */
493
- declare function callHook(hookName: 'onError', error: Error, task?: TaskDefinition): Promise<void>;
494
511
  /**
495
512
  * Execute a plugin task
496
513
  * @param task - The task to execute
@@ -502,19 +519,6 @@ declare function callHook(hookName: 'onError', error: Error, task?: TaskDefiniti
502
519
  declare function executePluginTask(task: TaskDefinition, config: InitConfig, options: {
503
520
  dryRun: boolean;
504
521
  }): Promise<void>;
505
- /**
506
- * Get diff for a plugin task
507
- * @param task - The task to generate diff for
508
- * @param config - The initialization config
509
- * @returns Diff string or undefined if not supported
510
- */
511
- declare function getPluginTaskDiff(task: TaskDefinition, config: InitConfig): Promise<string | undefined>;
512
- /**
513
- * Validate a plugin task
514
- * @param task - The task to validate
515
- * @returns Array of validation errors
516
- */
517
- declare function validatePluginTask(task: TaskDefinition): string[];
518
522
  /**
519
523
  * Create a simple task plugin
520
524
  * @param name - Plugin name
@@ -534,280 +538,27 @@ declare function createTaskPlugin(name: string, taskType: string, execute: (task
534
538
  validate?: (task: TaskDefinition) => string[];
535
539
  }): TaskPlugin;
536
540
  //#endregion
537
- //#region src/prompts/collect-prompts.d.ts
538
- /**
539
- * Collect prompt answers from task-defined prompts
540
- * Only prompts with enabled=true (or enabled condition that evaluates to true) will be shown
541
- * @param prompts - Array of prompt definitions from tasks
542
- * @param resolvedDefaults - Map of pre-resolved default values
543
- * @param config - Current configuration context (for evaluating enabled conditions)
544
- * @returns Object mapping prompt IDs to their values
545
- */
546
- declare function collectPrompts(prompts: PromptDefinition[], resolvedDefaults?: Map<string, unknown>, config?: InitConfig): Promise<Record<string, unknown>>;
547
- //#endregion
548
- //#region src/prompts/resolve-all-default-values.d.ts
549
- /**
550
- * Pre-resolve all executable default values in parallel
551
- * @param prompts - Array of prompt definitions
552
- * @param context - Optional context for interpolating template variables
553
- * @returns Map of prompt IDs to their resolved default values
554
- */
555
- declare function resolveAllDefaultValues(prompts: PromptDefinition[], context?: InitConfig): Promise<Map<string, unknown>>;
556
- //#endregion
557
- //#region src/prompts/resolve-default-value.d.ts
558
- /**
559
- * Resolve a default value that may be static or executable
560
- * @param defaultValue - The default value configuration
561
- * @param promptId - The prompt ID for error reporting
562
- * @param context - Optional context for interpolating template variables in string defaults
563
- * @param prompt - Optional prompt definition for accessing $sourceUrl
564
- * @returns The resolved default value
565
- */
566
- declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig, prompt?: PromptDefinition): Promise<T | undefined>;
567
- //#endregion
568
- //#region src/prompts/validate-prompts.d.ts
569
- /**
570
- * Validate prompt definitions
571
- * @param prompts - Array of prompt definitions to validate
572
- * @returns Array of validation error messages
573
- */
574
- declare function validatePrompts(prompts: PromptDefinition[]): string[];
575
- //#endregion
576
- //#region src/run-tasks.d.ts
577
- /**
578
- * Core task execution logic shared by both main() and runWithTasks()
579
- */
580
- declare function runTasks(tasks: TaskDefinition[], options: {
581
- dryRun: boolean;
582
- force: boolean;
583
- tasksFilePath: string | undefined;
584
- variables?: VariableDefinition[];
585
- prompts?: PromptDefinition[];
586
- templateEnabled?: EnabledValue;
587
- transformers?: Transformer[];
588
- }): Promise<void>;
589
- /**
590
- * Run templates sequentially for variables/prompts, then all tasks together
591
- * Phase 1: Process variables and prompts sequentially from each template
592
- * Phase 2: Collect all tasks from all enabled templates
593
- * Phase 3: Execute all tasks together at the end
594
- * This allows later templates to use values from earlier templates in their conditions,
595
- * while still executing all tasks together after all variables/prompts are resolved
596
- */
597
- declare function runTemplatesSequentially(templates: TasksConfiguration[], options: {
598
- dryRun: boolean;
599
- force: boolean;
600
- tasksFilePath: string | undefined;
601
- }, config?: InitConfig): Promise<void>;
602
- //#endregion
603
- //#region src/task-executors.d.ts
604
- declare function registerBuiltInPlugins(): void;
605
- /**
606
- * Execute a task based on its type
607
- */
608
- declare function executeTask(task: TaskDefinition, config: InitConfig, dryRun?: boolean): Promise<void>;
609
- /**
610
- * Run a single task with error handling
611
- */
612
- declare function runTask(task: TaskDefinition, config: InitConfig, taskNumber: number, totalTasks: number, dryRun?: boolean): Promise<boolean>;
613
- //#endregion
614
- //#region src/task-resolver.d.ts
615
- /**
616
- * Sort tasks by dependencies using topological sort
617
- */
618
- declare function topologicalSort(tasks: TaskDefinition[]): TaskDefinition[];
619
- //#endregion
620
- //#region src/template-inheritance.d.ts
621
- /**
622
- * Load a template configuration file from local path or remote URL
623
- * @param templatePath - Path or URL to the template file
624
- * @param visitedPaths - Set of already visited paths to detect circular dependencies
625
- * @returns The loaded template configuration
626
- */
627
- declare function loadTemplate(templatePath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
628
- /**
629
- * Load all templates in dependency order without merging
630
- * @param templatePath - Path or URL to the template file
631
- * @param baseDir - Base directory or URL for resolving relative paths in extends
632
- * @param visitedPaths - Set of already visited paths
633
- * @returns Array of sorted templates (in dependency order, ready for sequential processing)
634
- */
635
- declare function loadTemplatesInOrder(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration[]>;
636
- /**
637
- * Recursively load and merge templates
638
- * @param templatePath - Path or URL to the template file
639
- * @param baseDir - Base directory or URL for resolving relative paths in extends
640
- * @param visitedPaths - Set of already visited paths
641
- * @returns Merged template configuration
642
- */
643
- declare function loadAndMergeTemplate(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
644
- /**
645
- * Merge multiple template configurations
646
- * Later templates override earlier ones for conflicting task IDs
647
- * @param templates - Array of templates to merge (in priority order)
648
- * @returns Merged template configuration
649
- */
650
- declare function mergeTemplates(templates: TasksConfiguration[]): TasksConfiguration;
651
- /**
652
- * Clear the template cache (useful for testing)
653
- */
654
- declare function clearTemplateCache(): void;
655
- /**
656
- * Load tasks from a configuration file with template inheritance support
657
- * @param tasksFilePath - Path to the tasks configuration file
658
- * @param options - Optional configuration
659
- * @param options.sequential - If true, return templates as separate items for sequential processing
660
- * @returns Task configuration with tasks, optional variables, and optional prompts
661
- */
662
- declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
663
- sequential?: boolean;
664
- }): Promise<{
665
- tasks: TaskDefinition[];
666
- variables?: VariableDefinition[];
667
- prompts?: PromptDefinition[];
668
- enabled?: EnabledValue;
669
- templates?: TasksConfiguration[];
670
- transformers?: Transformer[];
671
- }>;
672
- //#endregion
673
- //#region src/template-utils.d.ts
674
- /**
675
- * Configuration for template/templateFile properties
676
- */
677
- interface TemplateSource {
678
- template?: string;
679
- templateFile?: string;
680
- }
681
- /**
682
- * Result of template validation
683
- */
684
- interface TemplateValidationResult {
685
- isValid: boolean;
686
- hasInlineTemplate: boolean;
687
- hasTemplateFile: boolean;
688
- error?: string;
689
- }
690
- /**
691
- * Options for processing templates
692
- */
693
- interface ProcessTemplateOptions {
694
- /** Enable Handlebars compilation for .hbs files */
695
- enableHandlebars?: boolean;
696
- /** Source URL for resolving relative template paths */
697
- sourceUrl?: string;
698
- }
699
- /**
700
- * Check if a config has an inline template
701
- * @param config - Configuration object with potential template property
702
- * @returns True if inline template is present and non-empty
703
- */
704
- declare function hasInlineTemplate(config: TemplateSource): boolean;
705
- /**
706
- * Check if a config has a template file reference
707
- * @param config - Configuration object with potential templateFile property
708
- * @returns True if templateFile is present and non-empty
709
- */
710
- declare function hasTemplateFile(config: TemplateSource): boolean;
711
- /**
712
- * Check if a template file should be processed with Handlebars
713
- * @param templateFile - Path to the template file
714
- * @returns True if the file has .hbs extension
715
- */
716
- declare function shouldUseHandlebars(templateFile: string): boolean;
717
- /**
718
- * Validate template configuration
719
- * @param config - Configuration object to validate
720
- * @returns Validation result with details
721
- */
722
- declare function validateTemplateConfig(config: TemplateSource): TemplateValidationResult;
723
- /**
724
- * Process a template and return the rendered content
725
- * @param config - Template configuration
726
- * @param initConfig - Initialization config with variable values
727
- * @param task - Optional task definition for $sourceUrl resolution
728
- * @param options - Processing options
729
- * @returns Processed template content
730
- */
731
- declare function processTemplate(config: TemplateSource, initConfig: InitConfig, task?: TaskDefinition, options?: ProcessTemplateOptions): Promise<string>;
732
- /**
733
- * Get a description of the template source for display purposes
734
- * @param config - Template configuration
735
- * @returns Human-readable description of the template source
736
- */
737
- declare function getTemplateSourceDescription(config: TemplateSource): string;
738
- //#endregion
739
- //#region src/variables/collect-variables.d.ts
740
- /**
741
- * Collect variable values from resolved variables
742
- * Variables don't require user interaction - they're just resolved from static
743
- * values or executable commands
744
- *
745
- * @param variables - Array of variable definitions
746
- * @param resolvedValues - Map of pre-resolved variable values
747
- * @param context - Current configuration context (for transformer evaluation)
748
- * @returns Object mapping variable IDs to their values
749
- */
750
- declare function collectVariables(variables: VariableDefinition[], resolvedValues?: Map<string, unknown>, context?: InitConfig): Promise<Record<string, unknown>>;
751
- //#endregion
752
- //#region src/variables/resolve-all-variable-values.d.ts
753
- /**
754
- * Resolve all variable values sequentially to allow lazy evaluation of template enabled conditions
755
- * Each variable can access values from previous variables and prompts
756
- * @param variables - Array of variable definitions
757
- * @param context - Optional context for evaluating conditional variables
758
- * @param options - Optional resolution options
759
- * @param options.skipConditional - If true, skip conditional variables (they will be resolved later)
760
- * @returns Map of variable IDs to their resolved values
761
- */
762
- declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig, options?: {
763
- skipConditional?: boolean;
764
- }): Promise<Map<string, unknown>>;
765
- //#endregion
766
- //#region src/variables/resolve-variable-value.d.ts
767
- /**
768
- * Resolve a variable value that may be static, executable, or conditional
769
- * @param value - The variable value configuration
770
- * @param variableId - The variable ID for error reporting
771
- * @param context - Optional context for evaluating conditional values
772
- * @param sourceUrl - Optional source URL for resolving relative file paths in exec-file
773
- * @returns The resolved variable value
774
- */
775
- declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig, sourceUrl?: string): Promise<T | undefined>;
776
- //#endregion
777
- //#region src/variables/validate-variables.d.ts
778
- /**
779
- * Validate variable definitions for duplicate IDs
780
- * @param variables - Array of variable definitions to validate
781
- * @returns Array of error messages (empty if no errors)
782
- */
783
- declare function validateVariables(variables: VariableDefinition[]): string[];
784
- //#endregion
785
541
  //#region src/index.d.ts
786
- /**
787
- * Main function for executing tasks with default/empty tasks array
788
- * For most use cases, you should use runWithTasks() with your custom tasks
789
- */
790
- declare function main(customTasks?: TaskDefinition[]): Promise<void>;
791
542
  /**
792
543
  * Execute tasks with custom task definitions
793
544
  * @param customTasks - Array of task definitions to execute
794
545
  * @param options - Optional configuration
795
546
  * @param options.dryRun - Preview changes without applying them
796
547
  * @param options.force - Force execution even if checks fail
797
- * @param options.tasksFilePath - Path to the tasks file
548
+ * @param options.configFilePath - Path to the tasks file
798
549
  * @param options.variables - Optional top-level global variables
799
550
  * @param options.prompts - Optional top-level global prompts
800
- * @param options.templateEnabled - Optional template-level enabled condition
551
+ * @param options.configEnabled - Optional config-level enabled condition
801
552
  * @param options.transformers - Optional transformer definitions
802
553
  */
803
554
  declare function runWithTasks(customTasks: TaskDefinition[], options?: {
804
555
  dryRun?: boolean | undefined;
805
556
  force?: boolean | undefined;
806
- tasksFilePath?: string | undefined;
557
+ configFilePath?: string | undefined;
807
558
  variables?: VariableDefinition[] | undefined;
808
559
  prompts?: PromptDefinition[] | undefined;
809
- templateEnabled?: EnabledValue | undefined;
560
+ configEnabled?: EnabledValue | undefined;
810
561
  transformers?: Transformer[] | undefined;
811
562
  }): Promise<void>;
812
563
  //#endregion
813
- 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, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, main, mergeTemplates, processTemplate, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
564
+ 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 };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import"./config-DfRbCqsT.js";import{a as e,i as t,o as n,r,s as i,t as a}from"./template-inheritance-BVct9RJf.js";import{A as o,B as s,C as c,D as l,E as u,F as d,H as f,I as p,L as m,M as h,N as g,O as _,P as v,R as y,S as b,T as x,U as S,V as C,W as w,_ as T,a as E,b as D,c as O,d as k,f as A,g as j,h as M,i as N,j as P,k as F,l as I,m as L,n as R,o as z,p as B,r as V,s as H,t as U,u as W,v as G,w as K,x as q,y as J,z as Y}from"./run-tasks-JGU1NDnc.js";import{t as X}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as Z,t as Q}from"./src-D4brxyaM.js";export{M as callHook,j as clearPlugins,a as clearTemplateCache,B as collectPrompts,z as collectVariables,T as createTaskPlugin,_ as displayTasksDiff,G as executePluginTask,O as executeTask,F as getCreateDiff,o as getDeleteDiff,P as getExecDiff,h as getGitInitDiff,J as getPlugin,D as getPluginForTaskType,q as getPluginTaskDiff,g as getRegexReplaceDiff,v as getRenameDiff,d as getReplaceInFileDiff,p as getTaskDiff,Y as getTemplateSourceDescription,m as getUpdateJsonDiff,y as getWriteDiff,s as hasInlineTemplate,C as hasTemplateFile,b as isPluginTaskType,c as listPlugins,r as loadAndMergeTemplate,t as loadTasksWithInheritance,e as loadTemplate,n as loadTemplatesInOrder,Q as main,i as mergeTemplates,f as processTemplate,I as registerBuiltInPlugins,K as registerHooks,x as registerPlugin,A as resolveAllDefaultValues,E as resolveAllVariableValues,L as resolveDefaultValue,N as resolveVariableValue,W as runTask,U as runTasks,R as runTemplatesSequentially,Z as runWithTasks,S as shouldUseHandlebars,H as topologicalSort,u as unregisterPlugin,l as validatePluginTask,k as validatePrompts,X as validateScaffoldfyJsonFile,w as validateTemplateConfig,V as validateVariables};
1
+ import{a as e,i as t,o as n,r,t as i}from"./config-inheritance-DLd3amMI.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-C0IZQ4SX.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-CfaEuN4Q.js";export{i as clearConfigurationCache,v as clearPlugins,p as createTaskPlugin,_ as displayTasksDiff,o as executePluginTask,h as getDeleteDiff,f as getExecDiff,d as getGitInitDiff,g as getPlugin,y as getPluginForTaskType,a as getRegexReplaceDiff,x as getRenameDiff,C as getReplaceInFileDiff,s as getTaskDiff,S as getUpdateJsonDiff,c as isPluginTaskType,m as listPlugins,r as loadAndMergeConfiguration,t as loadConfiguration,e as loadTasksWithInheritance,n as mergeConfigurations,b as registerHooks,l as registerPlugin,T as runWithTasks,u as unregisterPlugin,w as validateScaffoldfyJsonFile};
@@ -0,0 +1 @@
1
+ require(`./config-inheritance-CtSb5haE.cjs`);const e=require(`./run-tasks-CgFJyU4i.cjs`);require(`./config-CQ-mWBG5.cjs`),exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
@@ -0,0 +1,26 @@
1
+ import{C as e,D as t,M as n,O as r,S as i,T as a,_ as o,b as s,c,f as l,g as u,j as d,l as f,m as p,n as m,s as h,w as g,x as _,y as v}from"./config-inheritance-DLd3amMI.js";import{t as ee}from"./config-nfiOxhDM.js";import y from"node:path";import b from"node:fs";import x from"node:process";import{promisify as S}from"node:util";import{execSync as C}from"node:child_process";import{confirm as w,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";import{camelCase as ae,capitalCase as oe,constantCase as se,kebabCase as T,lowerCase as ce,pascalCase as le,snakeCase as E,upperCase as ue}from"case-anything";var de=class e extends n{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},D=class e extends n{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},O=class e extends n{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},k=class e extends n{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function A(e){return e.template!=null&&e.template!==``}function j(e){return e.templateFile!=null&&e.templateFile!==``}function fe(e){return e.endsWith(`.hbs`)}function M(e){let t=A(e),n=j(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}}async function N(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=A(e),s=j(e);if(o)return h(e.template,t);if(s){let n=e.templateFile,r=i&&fe(n),o=await m(l(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):h(o,t)}throw Error(`No template content available`)}function pe(e){return A(e)?`inline template`:j(e)?`template file: ${e.templateFile}`:`no template source`}const P=S(b.readFile),F={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function I(e,t){switch(t){case`add`:return`${F.green}+ ${e}${F.reset}`;case`remove`:return`${F.red}- ${e}${F.reset}`;case`context`:return`${F.gray} ${e}${F.reset}`;default:return e}}function L(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(I(t,`context`)):(t!==void 0&&i.push(I(t,`remove`)),a!==void 0&&i.push(I(a,`add`)))}return i}async function R(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return h(e,t);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(`.`)?p(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${F.cyan}→ No changes${F.reset}`;let l=L(s,c);return`${F.blue}File: ${e.file}${F.reset}\n${l.join(`
4
+ `)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function me(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;if(e.template==null||e.template===``)return`${F.red}✗ No template content provided for file: ${e.file}${F.reset}`;let n=y.join(x.cwd(),e.file),r=h(e.template,t);if(!b.existsSync(n)){let t=r.split(`
5
+ `).slice(0,10).join(`
6
+ `),n=r.split(`
7
+ `).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${t}${n?`
8
+ ...`:``}`}try{let t=await P(n,`utf-8`);if(t===r)return`${F.cyan}→ No changes${F.reset}`;let i=L(t,r);return`${F.blue}File: ${e.file}${F.reset}\n${i.join(`
9
+ `)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function he(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file);if(b.existsSync(r))return`${F.cyan}→ File already exists, would be skipped: ${e.file}${F.reset}`;try{if(A(e)){let r=await N(e,t,n),i=r.split(`
10
+ `).slice(0,10).join(`
11
+ `),a=r.split(`
12
+ `).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${i}${a?`
13
+ ...`:``}`}let r=pe(e);return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created from ${r}${F.reset}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function z(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=h(e.replacement,t),o=r.replace(i,a);if(r===o)return`${F.cyan}→ No matches found${F.reset}`;let s=L(r,o);return`${F.blue}File: ${e.file}${F.reset}\n${s.join(`
14
+ `)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function ge(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=h(n,t),a=h(i,t);r=r.replace(e,a)}if(i===r)return`${F.cyan}→ No changes${F.reset}`;let a=L(i,r);return`${F.blue}File: ${e.file}${F.reset}\n${a.join(`
15
+ `)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function _e(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=e.paths.map(e=>h(e,t)).filter(e=>b.existsSync(y.join(x.cwd(),e)));return n.length===0?`${F.cyan}→ No files/directories to delete${F.reset}`:`${F.red}Would delete:${F.reset}\n${n.map(e=>`${F.red} - ${e}${F.reset}`).join(`
16
+ `)}`}function ve(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${F.yellow}⊘ Condition check skipped in dry-run${F.reset}`;let t=y.join(x.cwd(),`.git`),n=b.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${F.red}Would remove existing .git directory${F.reset}`),r.push(`${F.green}Would initialize git repository${F.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${F.green}Would create initial commit: "${t}"${F.reset}`)}return r.join(`
17
+ `)}function B(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.command,t),r=e.cwd==null?x.cwd():h(e.cwd,t);return`${F.yellow}Would execute:${F.reset}\n${F.cyan} Command: ${n}${F.reset}\n${F.cyan} Working directory: ${r}${F.reset}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function xe(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);if(!b.existsSync(i))return`${F.red}✗ Source not found: ${n}${F.reset}`;let o=b.statSync(i).isDirectory()?`directory`:`file`;return b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`:`${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`}async function Se(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await N(i,t,n),o=a.split(`
18
+ `).slice(0,10).join(`
19
+ `),s=a.split(`
20
+ `).length>10;return b.existsSync(r)?`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ Would append content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
21
+ ...`:``}`:`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created with content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
22
+ ...`:``}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.path,t),r=y.join(x.cwd(),n);return b.existsSync(r)?`${F.cyan}→ Directory already exists: ${n}${F.reset}`:`${F.green}+ Would create directory: ${n}${F.reset}`}async function we(e,t){try{switch(e.type){case`update-json`:return await R(e.config,t);case`write`:return await me(e.config,t);case`create`:return await he(e.config,t,e);case`regex-replace`:return await z(e.config,t);case`replace-in-file`:return await ge(e.config,t);case`delete`:return _e(e.config,t);case`rename`:return ve(e.config,t);case`move`:return be(e.config,t);case`copy`:return xe(e.config,t);case`append`:return await Se(e.config,t,e);case`mkdir`:return Ce(e.config,t);case`git-init`:return ye(e.config);case`exec`:return B(e.config,t);case`exec-file`:return B(e.config,t);default:{let t=e.type;return`${F.yellow}⚠ Diff not available for task type: ${t}${F.reset}`}}}catch(e){return`${F.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function V(e,t){console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.blue} DRY RUN - Preview of changes${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`);for(let n of e){console.log(`${F.cyan}▶ Task: ${n.name}${F.reset}`),n.description!=null&&n.description!==``&&console.log(`${F.gray} ${n.description}${F.reset}`);let e=await we(n,t);console.log(e),console.log(`${F.gray}${`─`.repeat(55)}${F.reset}`)}console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.yellow} No changes were applied (dry-run mode)${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`)}const H=new Map,U={},W=new Map;function G(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(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Te(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Ee(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function De(){return Array.from(H.keys())}function Oe(){H.clear(),W.clear()}function ke(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let n=U[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ae(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function je(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}}}const Y=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw k.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof k?t:k.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw k.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw k.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw k.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return ue(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw k.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw k.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return oe(String(e))}executeTitlecase(e){return oe(String(e))}executeCamelcase(e){return ae(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return E(String(e))}executeKebabcase(e){return T(String(e))}executeConstantcase(e){return se(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return T(String(e))}executeUnderscore(e){return E(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};async function Me(e,t,n,r){if(e!==void 0)return c(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(t,n=new Map,i={}){let a={};if(t.length===0)return a;for(let o of t){if(o.$configEnabled!=null&&!await e(o.$configEnabled,{...i,...a}))continue;let t={...i,...a};if(await e(o.enabled,t))try{let e,i=n.get(o.id);switch(o.default!==void 0&&(i=await Me(o.default,o.id,t,o)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),e=await te(n),a&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`password`:if(e=await re({message:o.message,mask:`*`}),await _(o.required,t)&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),e=await ne(n),a&&e==null)throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`select`:{let t={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await ie(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await w({message:o.message,default:t});break}default:throw r(`Unknown prompt type: ${o.type}`,`error`),D.unknownType(o.type)}o.transformers!==void 0&&(e=await Y.apply(o.transformers,e,{...t,...a})),a[o.id]=e}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Pe(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await Me(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function Fe(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 Ie=S(b.appendFile),Le=S(b.readFile),Re=S(b.stat);async function ze(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=y.join(x.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=M(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(a,t,n),c=!1,l=!1;try{await Re(i),c=!0;let t=await Le(i,`utf-8`);t.length>0&&!t.endsWith(`
23
+ `)&&(l=e.newline!==!1)}catch{}c&&l?await Ie(i,`\n${s}`):await Ie(i,s),r(`Appended content to ${e.file}`,`success`)}const Be={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}},Ve=S(b.copyFile),He=S(b.stat),Ue=S(b.mkdir),We=S(b.readdir);async function Ge(e,t){await Ue(t,{recursive:!0});let n=await We(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=y.join(e,n.name),i=y.join(t,n.name);n.isDirectory()?await Ge(r,i):await Ve(r,i)}))}async function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to),a;try{a=await He(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Ue(y.dirname(i),{recursive:!0}),a.isDirectory()?(await Ge(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ve(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const qe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=S(b.writeFile);async function Ye(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=y.join(x.cwd(),e.file);if(b.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=M(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?O.createHasBothTemplateAndFile():O.createMissingTemplateOrFile();let o=await N(e,t,n),s=y.dirname(i);b.existsSync(s)||b.mkdirSync(s,{recursive:!0}),await Je(i,o),r(`Created file: ${e.file}`,`success`)}const Xe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!g(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=y.join(x.cwd(),e);b.existsSync(t)&&b.rmSync(t,{recursive:!0,force:!0})}}const Qe={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(e,t,n){e.condition!=null&&e.condition!==``&&!g(e.condition,t)||await f({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},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const et={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?x.cwd():y.join(x.cwd(),e.cwd);C(e.command,{cwd:n,stdio:`inherit`})}const nt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=y.join(x.cwd(),`.git`);b.existsSync(e)&&b.rmSync(e,{recursive:!0,force:!0})}if(C(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;C(`git add .`,{stdio:`inherit`}),C(`git commit -m "${t}"`,{stdio:`inherit`})}}const it={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=S(b.mkdir);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await at(y.join(x.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const st={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=S(b.rename),lt=S(b.stat),ut=S(b.mkdir);async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to);try{await lt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ut(y.dirname(i),{recursive:!0}),await ct(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const ft={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=S(b.readFile),mt=S(b.writeFile);async function ht(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=y.join(x.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await pt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,h(o,t)),await mt(n,s)}const gt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=S(b.rename);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=y.join(x.cwd(),h(e.from,t)),i=y.join(x.cwd(),h(e.to,t));if(!b.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await _t(n,i)}const yt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=S(b.readFile),xt=S(b.writeFile);async function St(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=y.join(x.cwd(),e.file),{replacements:i}=e;if(!b.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await bt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=h(n,t);a=a.replace(new RegExp(e,`gu`),r)}await xt(n,a)}const Ct={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=S(b.readFile),Tt=S(b.writeFile);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=y.join(x.cwd(),e.file),{updates:i}=e,a=await wt(n,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return h(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=s(t);e.includes(`.`)?p(o,e,n):o[e]=n}await Tt(n,`${JSON.stringify(o,null,2)}\n`)}const Dt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=S(b.writeFile);async function kt(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=y.join(x.cwd(),e.file);if(!b.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=M(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(e,t,n),c=y.dirname(a);b.existsSync(c)||b.mkdirSync(c,{recursive:!0}),await Ot(a,s)}const At={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t,e)}};function X(){q(`update-json`)||(G(Dt),G(At),G(Xe),G(gt),G(Ct),G(Qe),G(yt),G(it),G(nt),G(et),G(ft),G(qe),G(Be),G(st))}async function jt(e,t,n=!1){if(X(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Ae(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await jt(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&x.env.DEBUG!=null&&console.error(t.stack)),!1}}function Mt(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw d.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw de.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function Nt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Pt(n);t.push(...e)}return t}function Pt(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=M({...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}function Ft(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await Y.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function $(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e(a.$configEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await c(a.value,{id:a.id,contextType:`Variable`,context:t,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}function It(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Lt(t,n){let a=ee();if(!await e(n.configEnabled,a,{lazy:!0})){o(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(u(`Registering ${n.transformers.length} transformer(s)...`),Y.registerAll(n.transformers)),u(`Registering built-in plugins...`),X(),u(`Validating task configurations...`);let c=Nt(t);c.length>0&&(Ft(c),x.exit(1)),u(`All tasks validated successfully`);let l=t.filter(e=>i(e.enabled,ee(),{lazy:!0}));u(`Resolving task dependencies...`);let d=Mt(l);u(`Sorted ${d.length} task(s) by dependencies`),o(`Welcome! Let's execute your tasks.`),n.dryRun&&s(`🔍 DRY RUN MODE - No changes will be made`),o(`This will execute your project tasks based on the defined configuration.`);let f=a,p=[...n.variables??[]];if(p.length>0){let e=It(p);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving variable values...`);let t=await Q(p,await $(p,f,{skipConditional:!0}),f);Object.assign(f,t),Object.keys(t).length>0&&(u(`Resolved ${Object.keys(t).length} variable(s)`),u(`Variable values: ${JSON.stringify(t)}`))}let m=n.prompts??[],h=[...m];if(h.length>0){let e=Fe(h);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving prompt default values...`);let t=await Pe(h,f);if(m.length>0){o(`📋 Collecting prompts (available to all tasks):`);let e=await Ne(m,t,f);Object.assign(f,e)}}if(p.length>0){let e=p.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 Q(e,await $(e,f),f);Object.assign(f,t),Object.keys(t).length>0&&u(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await e(n.configEnabled,f)){o(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let g=[];for(let t of d)t.$configEnabled!=null&&!await e(t.$configEnabled,f)||await e(t.enabled,f)&&g.push(t);if(r(`${g.length} of ${d.length} task(s) enabled for execution`,`info`),n.dryRun){await V(g,f),o(`🔍 Dry run completed - no changes were made`),o(`Run without --dry-run to apply changes`);return}u(`Calling beforeAll hook...`),await J(`beforeAll`,f);let y=g.length,b=0,S=0,C=[],w=[];for(let e=0;e<g.length;e++){let t=g[e];t!=null&&(u(`Calling beforeTask hook for task: ${t.name}`),await J(`beforeTask`,t,f),await Z(t,f,e+1,y,n.dryRun)?(b++,C.push(t.id),u(`Calling afterTask hook for task: ${t.name}`),await J(`afterTask`,t,f)):(await _(t.required,f)&&(S++,w.push(t.name)),u(`Calling onError hook for task: ${t.name}`),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${b}/${y} tasks`,`info`),r(`Failed tasks: ${w.join(`, `)}`,`error`),x.exit(1)),u(`Calling afterAll hook...`),await J(`afterAll`,f),v(`✅ All tasks completed successfully!`),v(` Completed: ${b}/${y} tasks`)}async function Rt(n,i,a={}){u(`Running templates with sequential variable/prompt resolution...`),u(`Total templates to process: ${n.length}`),u(`Registering built-in plugins...`),X();let c=[];console.log(``),o(`📋 Collecting input...`),console.log(``);for(let t=0;t<n.length;t++){let i=n[t];if(i==null)continue;let s=`=`.repeat(60);if(u(`\n${s}`),u(`Processing template ${t+1}/${n.length}: "${i.name}"`),u(s),u(`Current config keys: ${Object.keys(a).join(`, `)}`),!await e(i.enabled,a)){o(`⊘ Template "${i.name}" is disabled - skipping`),u(` Enabled condition: ${JSON.stringify(i.enabled)}`);continue}let l=i.variables??[];if(l.length>0){u(`Processing ${l.length} variable(s) for template "${i.name}"...`);let e=It(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Q(l,await $(l,a,{skipConditional:!0}),a);Object.assign(a,t);let n=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),o=0;if(n.length>0){let e=await Q(n,await $(n,a),a);if(o=Object.keys(e).length,Object.assign(a,e),o>0){u(`Resolved ${o} conditional variable(s)`);for(let[t,n]of Object.entries(e))u(` ${t} = ${JSON.stringify(n)}`)}}let s=Object.keys(t).length+o;if(s>0){u(`Total variables resolved for template: ${s}`);for(let[e,n]of Object.entries(t))u(` ${e} = ${JSON.stringify(n)}`)}}let d=i.prompts??[];if(d.length>0){u(`Processing ${d.length} prompt(s) for template "${i.name}"...`);let e=Fe(d);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Ne(d,await Pe(d,a),a);Object.assign(a,t),u(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await e(i.enabled,a)){o(`⊘ Template "${i.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let f=i.tasks??[];f.length>0&&(u(`Found ${f.length} task(s) in template "${i.name}" (will execute later)`),c.push(...f))}if(u(`
24
+ 🔧 Validating and filtering all collected tasks...`),c.length===0){r(`No tasks found in any template`,`info`);return}let l=Nt(c);l.length>0&&(Ft(l),x.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let d=[];for(let t of c)await e(t.enabled,a)&&d.push(t);if(console.log(``),r(`Found ${c.length} tasks (${d.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),d.length===0){r(`No enabled tasks to execute`,`info`);return}let f=Mt(d);if(i.dryRun){r(`
25
+ 🔍 Dry run - showing task changes...`,`info`),await V(f,a),r(`
26
+ 🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,a);let p=0,m=0,h=[];for(let e=0;e<f.length;e++){let t=f[e];t!=null&&(await J(`beforeTask`,t,a),await Z(t,a,e+1,f.length,i.dryRun)?(p++,await J(`afterTask`,t,a)):(await _(t.required,a)&&(m++,h.push(t.name)),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,a),m>0&&(r(`\n❌ Task execution completed with ${m} error(s)`,`error`),r(`Completed: ${p}/${f.length} tasks`,`info`),r(`Failed tasks: ${h.join(`, `)}`,`error`),x.exit(1)),r(`Completed: ${p}/${f.length} tasks`,`success`)}export{z as _,Ae as a,we as b,q as c,G as d,Te as f,ye as g,B as h,je as i,De as l,_e as m,Rt as n,Ee as o,V as p,Oe as r,K as s,Lt as t,ke as u,ve as v,R as x,ge as y};