@autometa/config 1.0.0-rc.2 → 1.0.0-rc.3

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.cjs CHANGED
@@ -99,6 +99,10 @@ var ModuleDeclarationSchema = zod.z.lazy(
99
99
  );
100
100
  var ModulesConfigSchema = zod.z.object({
101
101
  stepScoping: zod.z.enum(["global", "scoped"]).optional(),
102
+ hoistedFeatures: zod.z.object({
103
+ scope: zod.z.enum(["tag", "directory"]).optional(),
104
+ strict: zod.z.boolean().optional()
105
+ }).optional(),
102
106
  relativeRoots: PartialRootSchema.optional(),
103
107
  groups: zod.z.record(
104
108
  zod.z.object({
@@ -135,13 +139,52 @@ var BuilderConfigSchema = zod.z.object({
135
139
  var ExecutorConfigSchema = zod.z.object({
136
140
  runner: RunnerSchema,
137
141
  test: TestSchema.optional(),
138
- roots: RootSchema,
142
+ roots: RootSchema.optional(),
139
143
  modules: ModulesConfigSchema.optional(),
140
144
  shim: ShimSchema.optional(),
141
145
  events: EventsSchema.optional(),
142
146
  builder: BuilderConfigSchema.optional(),
143
147
  logging: LoggingSchema.optional(),
144
148
  reporting: ReporterSchema.optional()
149
+ }).superRefine((value, ctx) => {
150
+ if (value.roots) {
151
+ return;
152
+ }
153
+ const modules = value.modules;
154
+ if (!modules) {
155
+ ctx.addIssue({
156
+ code: zod.z.ZodIssueCode.custom,
157
+ path: ["roots"],
158
+ message: '"roots" is required unless "modules.relativeRoots" defines at least "features" and "steps".'
159
+ });
160
+ return;
161
+ }
162
+ const declaredModules = (modules.explicit?.some((entry) => entry.trim().length > 0) ?? false) || (modules.groups ? Object.keys(modules.groups).length > 0 : false);
163
+ if (!declaredModules) {
164
+ ctx.addIssue({
165
+ code: zod.z.ZodIssueCode.custom,
166
+ path: ["modules"],
167
+ message: 'When omitting "roots", at least one module must be declared via "modules.groups" or "modules.explicit".'
168
+ });
169
+ }
170
+ const relativeRoots = modules.relativeRoots;
171
+ const hasFeatures = !!relativeRoots && Array.isArray(relativeRoots.features) && relativeRoots.features.length > 0;
172
+ const hasSteps = !!relativeRoots && Array.isArray(relativeRoots.steps) && relativeRoots.steps.length > 0;
173
+ if (!hasFeatures || !hasSteps) {
174
+ ctx.addIssue({
175
+ code: zod.z.ZodIssueCode.custom,
176
+ path: ["modules", "relativeRoots"],
177
+ message: 'When omitting "roots", "modules.relativeRoots" must include non-empty "features" and "steps" entries.'
178
+ });
179
+ }
180
+ }).transform((value) => {
181
+ return {
182
+ ...value,
183
+ roots: value.roots ?? {
184
+ features: [],
185
+ steps: []
186
+ }
187
+ };
145
188
  });
146
189
  var PartialExecutorConfigSchema = zod.z.object({
147
190
  runner: RunnerSchema.optional(),
@@ -670,6 +713,15 @@ var cloneGroups = (groups) => {
670
713
  };
671
714
  var cloneModules = (modules) => {
672
715
  const clone = {};
716
+ if (modules.stepScoping) {
717
+ clone.stepScoping = modules.stepScoping;
718
+ }
719
+ if (modules.hoistedFeatures) {
720
+ clone.hoistedFeatures = {
721
+ ...modules.hoistedFeatures.scope ? { scope: modules.hoistedFeatures.scope } : {},
722
+ ...modules.hoistedFeatures.strict !== void 0 ? { strict: modules.hoistedFeatures.strict } : {}
723
+ };
724
+ }
673
725
  if (modules.relativeRoots) {
674
726
  clone.relativeRoots = cloneRootRecord(modules.relativeRoots);
675
727
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/environment-selector.ts","../src/schema.ts"],"names":["name","match"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\n\nimport { posix as pathPosix } from \"node:path\";\n\nimport { EnvironmentSelector } from \"./environment-selector\";\nimport {\n ExecutorConfigSchema,\n PartialExecutorConfigSchema,\n} from \"./schema\";\nimport {\n ConfigDefinition,\n ConfigDefinitionInput,\n BuilderConfig,\n ExecutorConfig,\n PartialExecutorConfig,\n PartialRootsConfig,\n ModulesConfig,\n ResolveOptions,\n ResolvedConfig,\n RootsConfig,\n ShimConfig,\n TestConfig,\n LoggingConfig,\n ReporterConfig,\n TimeoutSetting,\n} from \"./types\";\n\nexport class Config {\n private readonly definition: ConfigDefinition;\n\n constructor(definition: ConfigDefinition) {\n this.definition = definition;\n }\n\n resolve(options: ResolveOptions = {}): ResolvedConfig {\n const environment = this.resolveEnvironment(options);\n const override = this.definition.environments[environment] ?? {};\n const merged = mergeExecutorConfig(this.definition.default, override);\n const validated = ExecutorConfigSchema.parse(merged);\n const expanded = expandModules(validated, options.modules, options.groups);\n return {\n environment,\n config: deepFreeze(expanded),\n };\n }\n\n current(options?: ResolveOptions): ExecutorConfig {\n return this.resolve(options).config;\n }\n\n get environment(): string {\n return this.resolve().environment;\n }\n\n forEnvironment(environment: string): ExecutorConfig {\n return this.resolve({ environment }).config;\n }\n\n private resolveEnvironment(options: ResolveOptions): string {\n if (options.environment) {\n return this.assertEnvironment(options.environment);\n }\n const detected = this.definition.selector.resolve();\n return this.assertEnvironment(detected);\n }\n\n private assertEnvironment(environment: string): string {\n if (environment === \"default\") {\n return environment;\n }\n if (!this.definition.environments[environment]) {\n const available = [\n \"default\",\n ...Object.keys(this.definition.environments).filter(\n (name) => name !== \"default\"\n ),\n ];\n const options = available.length\n ? available.join(\", \")\n : \"(define environments to extend the default profile)\";\n throw new AutomationError(\n `Environment \"${environment}\" is not defined. Available environments: ${options}`\n );\n }\n return environment;\n }\n}\n\nexport const defineConfig = (input: ConfigDefinitionInput): Config => {\n const selector = new EnvironmentSelector();\n selector.defaultTo(\"default\");\n if (input.environment) {\n input.environment(selector);\n }\n\n const defaultConfig = deepFreeze(ExecutorConfigSchema.parse(input.default));\n const environments: Record<string, PartialExecutorConfig> = {};\n\n for (const [name, rawOverride] of Object.entries(input.environments ?? {})) {\n if (!name.trim()) {\n throw new AutomationError(\"Environment name must be a non-empty string\");\n }\n const override = rawOverride\n ? PartialExecutorConfigSchema.parse(rawOverride)\n : {};\n environments[name] = deepFreeze(override);\n }\n\n return new Config({\n default: defaultConfig,\n environments,\n selector,\n });\n};\n\nconst mergeExecutorConfig = (\n base: ExecutorConfig,\n override: PartialExecutorConfig\n): ExecutorConfig => {\n const result = cloneConfig(base);\n\n if (override.runner) {\n result.runner = override.runner;\n }\n\n if (override.test !== undefined) {\n result.test = mergeTest(result.test, override.test);\n }\n\n if (override.roots !== undefined) {\n result.roots = mergeRoots(result.roots, override.roots);\n }\n\n if (override.modules !== undefined) {\n result.modules = cloneModules(override.modules);\n }\n\n if (override.shim !== undefined) {\n result.shim = mergeShim(result.shim, override.shim);\n }\n\n if (override.events !== undefined) {\n result.events = cloneArray(override.events);\n }\n\n if (override.builder !== undefined) {\n result.builder = mergeBuilder(result.builder, override.builder);\n }\n\n if (override.logging !== undefined) {\n result.logging = mergeLogging(result.logging, override.logging);\n }\n\n if (override.reporting !== undefined) {\n result.reporting = mergeReporting(result.reporting, override.reporting);\n }\n\n return result;\n};\nconst expandModules = (\n config: ExecutorConfig,\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): ExecutorConfig => {\n const modulesConfig = config.modules;\n if (!modulesConfig) {\n return config;\n }\n\n const relativeRoots = modulesConfig.relativeRoots;\n const hasRelativeRoots = !!relativeRoots && Object.keys(relativeRoots).length > 0;\n if (!hasRelativeRoots) {\n const hasFilters =\n (moduleFilters?.some((m) => m.trim().length > 0) ?? false) ||\n (groupFilters?.some((g) => g.trim().length > 0) ?? false);\n\n // Allow \"modules\" to act as a module registry even when everything is hoisted,\n // but fail fast if the user provided filters expecting module expansion.\n if (hasFilters) {\n throw new AutomationError(\n 'Module filters were provided, but \"modules.relativeRoots\" is not configured. ' +\n 'Configure at least one relative root (e.g. { steps: [\"steps/**/*.ts\"] }) or remove -m/-g.'\n );\n }\n\n return config;\n }\n\n const moduleEntries = collectModuleEntries(modulesConfig);\n if (moduleEntries.length === 0) {\n throw new AutomationError(\n 'When \"modules\" is provided, at least one module must be declared via \"groups\" or \"explicit\".'\n );\n }\n\n const selectedModules = selectModules(moduleEntries, moduleFilters, groupFilters);\n const expandedByKey: Record<string, string[]> = {};\n\n for (const [key, entries] of Object.entries(relativeRoots)) {\n if (!entries || entries.length === 0) {\n continue;\n }\n\n const expanded: string[] = [];\n for (const moduleDir of selectedModules) {\n for (const entry of entries) {\n const joined = joinModuleEntry(moduleDir, entry);\n if (joined) {\n expanded.push(joined);\n }\n }\n }\n\n if (expanded.length > 0) {\n expandedByKey[key] = expanded;\n }\n }\n\n if (Object.keys(expandedByKey).length === 0) {\n return config;\n }\n\n const roots = cloneRoots(config.roots);\n for (const [key, expanded] of Object.entries(expandedByKey)) {\n const existing = roots[key] ?? [];\n roots[key] = [...expanded, ...existing];\n }\n\n return {\n ...config,\n roots,\n };\n};\n\ninterface ModuleEntry {\n readonly id: string;\n readonly dir: string;\n}\n\ntype ModuleDeclaration = NonNullable<NonNullable<ModulesConfig[\"groups\"]>[string][\"modules\"]>[number];\n\nconst flattenModuleDeclarations = (\n declarations: readonly ModuleDeclaration[],\n prefix = \"\"\n): string[] => {\n const flattened: string[] = [];\n\n const walk = (items: readonly ModuleDeclaration[], currentPrefix: string): void => {\n for (const item of items) {\n if (typeof item === \"string\") {\n const name = normalizeSlashes(item.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n flattened.push(normalizeSlashes(pathPosix.join(currentPrefix, name)));\n continue;\n }\n\n const name = normalizeSlashes(item.name.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n\n const nextPrefix = normalizeSlashes(pathPosix.join(currentPrefix, name));\n // Always include the parent module path itself.\n flattened.push(nextPrefix);\n\n if (item.submodules && item.submodules.length > 0) {\n walk(item.submodules as readonly ModuleDeclaration[], nextPrefix);\n }\n }\n };\n\n const cleanedPrefix = normalizeSlashes(prefix.trim()).replace(/\\/+$/u, \"\");\n walk(declarations, cleanedPrefix);\n\n return Array.from(new Set(flattened));\n};\n\nconst collectModuleEntries = (modulesConfig: ModulesConfig): ModuleEntry[] => {\n const entries: ModuleEntry[] = [];\n const seen = new Set<string>();\n\n for (const [groupId, group] of Object.entries(modulesConfig.groups ?? {})) {\n const normalizedGroupId = groupId.trim();\n if (!normalizedGroupId) {\n continue;\n }\n\n const root = normalizeSlashes(group.root.trim()).replace(/\\/+$/u, \"\");\n if (!root) {\n continue;\n }\n\n const modulePaths = flattenModuleDeclarations(group.modules);\n\n for (const modulePath of modulePaths) {\n const cleaned = normalizeSlashes(modulePath.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!cleaned) {\n continue;\n }\n\n const dir = normalizeSlashes(pathPosix.join(root, cleaned));\n const id = `${normalizedGroupId}/${cleaned}`;\n const key = `${id}::${dir}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir });\n }\n }\n\n for (const explicit of modulesConfig.explicit ?? []) {\n const normalized = normalizeSlashes(explicit.trim());\n if (!normalized) {\n continue;\n }\n const id = normalized;\n const key = `${id}::${normalized}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir: normalized });\n }\n\n return entries;\n};\n\nconst selectModules = (\n moduleEntries: readonly ModuleEntry[],\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): string[] => {\n const options = moduleEntries.map((m) => ({\n id: normalizeSlashes(m.id),\n dir: normalizeSlashes(m.dir),\n group: normalizeSlashes(m.id.split(\"/\")[0] ?? \"\"),\n }));\n\n const groupFilterSet = new Set(\n (groupFilters ?? []).map((g) => normalizeSlashes(g.trim())).filter(Boolean)\n );\n\n const inGroupScope = (candidate: (typeof options)[number]): boolean => {\n if (groupFilterSet.size === 0) {\n return true;\n }\n return groupFilterSet.has(candidate.group);\n };\n\n const scopedOptions = options.filter(inGroupScope);\n if (groupFilterSet.size > 0 && scopedOptions.length === 0) {\n throw new AutomationError(\n `No modules found for group filter(s): ${Array.from(groupFilterSet).join(\", \")}. ` +\n `Available groups: ${Array.from(new Set(options.map((o) => o.group))).filter(Boolean).join(\", \")}`\n );\n }\n\n if (!moduleFilters || moduleFilters.length === 0) {\n return scopedOptions.map((o) => o.dir);\n }\n\n const scopedGroups = new Set(scopedOptions.map((o) => o.group).filter(Boolean));\n\n const selected = new Set<string>();\n\n for (const rawFilter of moduleFilters) {\n const filter = normalizeSlashes(rawFilter.trim());\n if (!filter) {\n continue;\n }\n\n const parsed = parseModuleSelector(filter, scopedGroups);\n\n // Exact selector: group/module[/...] or group:module[:...]\n if (parsed) {\n const wantedId = `${parsed.group}/${parsed.modulePath}`;\n const exact = scopedOptions.filter((o) => o.id === wantedId);\n if (exact.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n const match = exact[0];\n if (match) {\n selected.add(match.dir);\n }\n continue;\n }\n\n // Path/suffix selector: (must be unambiguous)\n // - \"orders\" matches \"<group>/orders\"\n // - \"orders/cancellations\" matches \"<group>/orders/cancellations\"\n // - \"orders:cancellations\" is treated as a path selector (\":\" => \"/\")\n const pathSelector = filter.includes(\":\") ? filter.split(\":\").join(\"/\") : filter;\n const suffixMatches = scopedOptions.filter((o) => o.id.endsWith(`/${pathSelector}`));\n if (suffixMatches.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n if (suffixMatches.length > 1) {\n throw new AutomationError(\n `Module filter \"${rawFilter}\" is ambiguous. Candidates: ${suffixMatches.map((m) => m.id).join(\", \")}. ` +\n `Use \"<group>/<module>\" or \"<group>:<module>\" to disambiguate.`\n );\n }\n const match = suffixMatches[0];\n if (match) {\n selected.add(match.dir);\n }\n }\n\n return scopedOptions.map((o) => o.dir).filter((dir) => selected.has(dir));\n};\n\nconst parseModuleSelector = (\n selector: string,\n knownGroups: ReadonlySet<string>\n): { readonly group: string; readonly modulePath: string } | undefined => {\n if (!selector) {\n return undefined;\n }\n\n // Prefer ':' for deep exact selectors: group:module[:submodule...]\n if (selector.includes(\":\")) {\n const parts = selector.split(\":\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n // Also allow '/' for deep exact selectors: group/module[/submodule...]\n if (selector.includes(\"/\")) {\n const parts = selector.split(\"/\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst joinModuleEntry = (moduleDir: string, entry: string): string | undefined => {\n const moduleTrimmed = normalizeSlashes(moduleDir.trim()).replace(/\\/+$/u, \"\");\n if (!moduleTrimmed) {\n return undefined;\n }\n\n const entryTrimmed = normalizeSlashes(entry.trim());\n if (!entryTrimmed) {\n return undefined;\n }\n\n const negated = entryTrimmed.startsWith(\"!\");\n const raw = negated ? entryTrimmed.slice(1).trim() : entryTrimmed;\n\n if (!raw || raw === \".\") {\n return negated ? `!${moduleTrimmed}` : moduleTrimmed;\n }\n\n if (raw.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(raw)) {\n return negated ? `!${raw}` : raw;\n }\n\n const joined = normalizeSlashes(pathPosix.join(moduleTrimmed, raw));\n return negated ? `!${joined}` : joined;\n};\n\nconst normalizeSlashes = (value: string): string => value.replace(/\\\\/gu, \"/\");\n\ntype LoggingConfigValue = NonNullable<LoggingConfig>;\ntype ReportingConfigValue = NonNullable<ReporterConfig>;\n\nconst mergeTest = (\n base: TestConfig | undefined,\n override: PartialExecutorConfig[\"test\"]\n): TestConfig | undefined => {\n if (override === undefined) {\n return base ? cloneTest(base) : undefined;\n }\n const result = base ? cloneTest(base) : {};\n\n if (override.timeout !== undefined) {\n result.timeout = cloneTimeout(override.timeout);\n }\n\n if (override.tagFilter !== undefined) {\n result.tagFilter = override.tagFilter;\n }\n\n if (override.groupLogging !== undefined) {\n result.groupLogging = override.groupLogging;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeShim = (\n base: ShimConfig | undefined,\n override: PartialExecutorConfig[\"shim\"]\n): ShimConfig | undefined => {\n if (override === undefined) {\n return base ? cloneShim(base) : undefined;\n }\n const result = base ? cloneShim(base) : {};\n\n if (override.errorCause !== undefined) {\n result.errorCause = override.errorCause;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeLogging = (\n base: LoggingConfig | undefined,\n override: PartialExecutorConfig[\"logging\"]\n): LoggingConfig | undefined => {\n if (override === undefined) {\n return base ? cloneLogging(base) : undefined;\n }\n\n const result: LoggingConfigValue = base ? cloneLogging(base) : {};\n\n if (override.http !== undefined) {\n result.http = override.http;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeReporting = (\n base: ReporterConfig | undefined,\n override: PartialExecutorConfig[\"reporting\"]\n): ReporterConfig | undefined => {\n if (override === undefined) {\n return base ? cloneReporting(base) : undefined;\n }\n\n const result: ReportingConfigValue = base ? cloneReporting(base) : {};\n\n if (override.hierarchical !== undefined) {\n const hierarchicalOverride = override.hierarchical;\n if (hierarchicalOverride) {\n const hierarchical = result.hierarchical ? { ...result.hierarchical } : {};\n if (hierarchicalOverride.bufferOutput !== undefined) {\n hierarchical.bufferOutput = hierarchicalOverride.bufferOutput;\n }\n if (Object.keys(hierarchical).length > 0) {\n result.hierarchical = hierarchical;\n } else {\n delete result.hierarchical;\n }\n } else {\n delete result.hierarchical;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeRoots = (\n base: RootsConfig,\n override: PartialRootsConfig | undefined\n): RootsConfig => {\n const result = cloneRoots(base);\n\n if (!override) {\n return result;\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) {\n continue;\n }\n result[key] = cloneArray(value);\n }\n\n if (!result.features) {\n throw new AutomationError(\n 'Environment overrides removed required root \"features\"'\n );\n }\n\n if (!result.steps) {\n throw new AutomationError(\n 'Environment overrides removed required root \"steps\"'\n );\n }\n\n return result;\n};\n\nconst mergeBuilder = (\n base: BuilderConfig | undefined,\n override: BuilderConfig | undefined\n): BuilderConfig | undefined => {\n if (override === undefined) {\n return base ? cloneBuilder(base) : undefined;\n }\n\n const result = base ? cloneBuilder(base) : {};\n\n if (override.format !== undefined) {\n result.format = override.format;\n }\n\n if (override.target !== undefined) {\n result.target = Array.isArray(override.target)\n ? [...override.target]\n : override.target;\n }\n\n if (override.sourcemap !== undefined) {\n result.sourcemap = override.sourcemap;\n }\n\n if (override.tsconfig !== undefined) {\n result.tsconfig = override.tsconfig;\n }\n\n if (override.external !== undefined) {\n result.external = cloneArray(override.external);\n }\n\n if (override.outDir !== undefined) {\n result.outDir = override.outDir;\n }\n\n if (override.hooks !== undefined) {\n const clonedHooks = cloneBuilderHooks(override.hooks);\n if (clonedHooks) {\n result.hooks = clonedHooks;\n } else {\n delete result.hooks;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst cloneConfig = (config: ExecutorConfig): ExecutorConfig => ({\n runner: config.runner,\n roots: cloneRoots(config.roots),\n modules: config.modules ? cloneModules(config.modules) : undefined,\n test: config.test ? cloneTest(config.test) : undefined,\n shim: config.shim ? cloneShim(config.shim) : undefined,\n events: cloneOptionalArray(config.events),\n builder: config.builder ? cloneBuilder(config.builder) : undefined,\n logging: config.logging ? cloneLogging(config.logging) : undefined,\n reporting: config.reporting ? cloneReporting(config.reporting) : undefined,\n});\n\nconst cloneRoots = (roots: RootsConfig): RootsConfig => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (value) {\n cloned[key] = cloneArray(value);\n }\n }\n return cloned as RootsConfig;\n};\n\nconst cloneRootRecord = (\n roots: Record<string, readonly string[] | undefined>\n): Record<string, string[]> => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (!value) {\n continue;\n }\n cloned[key] = cloneArray(value);\n }\n return cloned;\n};\n\nconst cloneGroups = (\n groups: NonNullable<ModulesConfig[\"groups\"]>\n): NonNullable<ModulesConfig[\"groups\"]> => {\n const cloneModuleDeclaration = (value: ModuleDeclaration): ModuleDeclaration => {\n if (typeof value === \"string\") {\n return value;\n }\n return {\n name: value.name,\n submodules: value.submodules\n ? (value.submodules.map((child) => cloneModuleDeclaration(child as ModuleDeclaration)) as ModuleDeclaration[])\n : undefined,\n };\n };\n\n const cloned: Record<\n string,\n { root: string; modules: [ModuleDeclaration, ...ModuleDeclaration[]] }\n > = {};\n for (const [key, group] of Object.entries(groups)) {\n cloned[key] = {\n root: group.root,\n modules: group.modules.map((m) => cloneModuleDeclaration(m as ModuleDeclaration)) as [\n ModuleDeclaration,\n ...ModuleDeclaration[]\n ],\n };\n }\n return cloned as NonNullable<ModulesConfig[\"groups\"]>;\n};\n\nconst cloneModules = (modules: ModulesConfig): ModulesConfig => {\n const clone: ModulesConfig = {};\n\n if (modules.relativeRoots) {\n clone.relativeRoots = cloneRootRecord(modules.relativeRoots);\n }\n\n if (modules.groups) {\n clone.groups = cloneGroups(modules.groups);\n }\n\n if (modules.explicit) {\n clone.explicit = cloneArray(modules.explicit);\n }\n\n return clone;\n};\n\nconst cloneTest = (test: TestConfig): TestConfig => {\n const clone: TestConfig = {};\n if (test.timeout !== undefined) {\n clone.timeout = cloneTimeout(test.timeout);\n }\n if (test.tagFilter !== undefined) {\n clone.tagFilter = test.tagFilter;\n }\n if (test.groupLogging !== undefined) {\n clone.groupLogging = test.groupLogging;\n }\n return clone;\n};\n\nconst cloneShim = (shim: ShimConfig): ShimConfig => {\n const clone: ShimConfig = {};\n if (shim.errorCause !== undefined) {\n clone.errorCause = shim.errorCause;\n }\n return clone;\n};\n\nconst cloneLogging = (\n logging: LoggingConfigValue\n): LoggingConfigValue => {\n const clone: LoggingConfigValue = {};\n if (logging.http !== undefined) {\n clone.http = logging.http;\n }\n return clone;\n};\n\nconst cloneReporting = (\n reporting: ReportingConfigValue\n): ReportingConfigValue => {\n const clone: ReportingConfigValue = {};\n if (reporting.hierarchical) {\n clone.hierarchical = { ...reporting.hierarchical };\n }\n return clone;\n};\n\nconst cloneBuilder = (config: BuilderConfig): BuilderConfig => {\n const clone: BuilderConfig = {};\n\n if (config.format !== undefined) {\n clone.format = config.format;\n }\n\n if (config.target !== undefined) {\n clone.target = Array.isArray(config.target)\n ? [...config.target]\n : config.target;\n }\n\n if (config.sourcemap !== undefined) {\n clone.sourcemap = config.sourcemap;\n }\n\n if (config.tsconfig !== undefined) {\n clone.tsconfig = config.tsconfig;\n }\n\n if (config.external !== undefined) {\n clone.external = cloneArray(config.external);\n }\n\n if (config.outDir !== undefined) {\n clone.outDir = config.outDir;\n }\n\n if (config.hooks) {\n const clonedHooks = cloneBuilderHooks(config.hooks);\n if (clonedHooks) {\n clone.hooks = clonedHooks;\n }\n }\n\n return clone;\n};\n\nconst cloneBuilderHooks = (\n hooks: NonNullable<BuilderConfig[\"hooks\"]>\n): NonNullable<BuilderConfig[\"hooks\"]> | undefined => {\n const clone: NonNullable<BuilderConfig[\"hooks\"]> = {};\n\n if (hooks.before && hooks.before.length > 0) {\n clone.before = [...hooks.before];\n }\n\n if (hooks.after && hooks.after.length > 0) {\n clone.after = [...hooks.after];\n }\n\n return Object.keys(clone).length === 0 ? undefined : clone;\n};\n\nconst cloneTimeout = (\n timeout: TimeoutSetting | undefined\n): TimeoutSetting | undefined => {\n if (timeout === undefined) {\n return undefined;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n if (Array.isArray(timeout)) {\n const [value, unit] = timeout;\n return [value, unit] as TimeoutSetting;\n }\n return { ...timeout } as TimeoutSetting;\n};\n\nconst cloneArray = (value: readonly string[]): string[] => [...value];\n\nconst cloneOptionalArray = (\n value: readonly string[] | undefined\n): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return [...value];\n};\n\nconst deepFreeze = <T>(value: T): T => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n const propertyNames = Object.getOwnPropertyNames(value);\n for (const name of propertyNames) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const property = (value as any)[name];\n if (property && typeof property === \"object\") {\n deepFreeze(property);\n }\n }\n\n return Object.freeze(value);\n};\n","export type EnvironmentFactory = () => string | undefined;\n\nconst sanitize = (value: string | undefined | null) => {\n if (value == null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n};\n\nexport class EnvironmentSelector {\n private readonly detectors: EnvironmentFactory[] = [];\n private fallback = \"default\";\n\n byLiteral(name: string): this {\n this.detectors.push(() => sanitize(name));\n return this;\n }\n\n byEnvironmentVariable(variable: string): this {\n this.detectors.push(() => sanitize(process.env[variable]));\n return this;\n }\n\n byFactory(factory: EnvironmentFactory): this {\n this.detectors.push(() => sanitize(factory()));\n return this;\n }\n\n defaultTo(name: string): this {\n const sanitized = sanitize(name);\n if (!sanitized) {\n throw new Error(\"Default environment name must be a non-empty string\");\n }\n this.fallback = sanitized;\n return this;\n }\n\n resolve(): string {\n for (const detector of this.detectors) {\n const detected = detector();\n if (detected) {\n return detected;\n }\n }\n return this.fallback;\n }\n}\n","import { z } from \"zod\";\n\nimport type { BuildHook, BuilderConfig, BuilderHooks, ModuleFormat, SourceMapSetting } from \"./builder-types\";\n\nexport const TimeUnitSchema = z.enum([\"ms\", \"s\", \"m\", \"h\"]);\n\nexport const TimeoutSchema = z\n .union([\n z.number().nonnegative(),\n z.tuple([z.number().nonnegative(), TimeUnitSchema]),\n z.object({\n value: z.number().nonnegative(),\n unit: TimeUnitSchema.optional(),\n }),\n ])\n .optional();\n\nexport const RunnerSchema = z.union([z.literal(\"jest\"), z.literal(\"vitest\"), z.literal(\"playwright\")]);\n\nexport const TagFilterSchema = z\n .string()\n .refine(\n (value) => value.startsWith(\"@\") || value.startsWith(\"not @\"),\n \"tag filter must start with `@` or `not @`\"\n )\n .optional();\n\nexport const TestSchema = z\n .object({\n timeout: TimeoutSchema,\n tagFilter: TagFilterSchema,\n groupLogging: z.boolean().optional(),\n })\n .partial();\n\nexport const ShimSchema = z.object({\n errorCause: z.boolean().optional(),\n});\n\nexport const PathSchema = z.array(z.string());\n\nexport const RootSchema = z\n .object({\n features: PathSchema,\n steps: PathSchema,\n support: PathSchema.optional(),\n })\n .catchall(PathSchema);\n\nexport const EventsSchema = z.array(z.string());\n\nexport const LoggingSchema = z\n .object({\n http: z.boolean().optional(),\n })\n .optional();\n\nexport const ReporterSchema = z\n .object({\n hierarchical: z\n .object({\n bufferOutput: z.boolean().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const ModuleFormatSchema: z.ZodType<ModuleFormat> = z.enum([\"cjs\", \"esm\"]);\n\nexport const PartialRootSchema = RootSchema.partial();\n\ntype ModuleDeclaration =\n | string\n | { readonly name: string; readonly submodules?: ModuleDeclaration[] | undefined };\n\nconst ModuleDeclarationSchema: z.ZodType<ModuleDeclaration> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n name: z.string().min(1),\n submodules: z.array(ModuleDeclarationSchema).optional(),\n }),\n ])\n);\n\nexport const ModulesConfigSchema = z.object({\n stepScoping: z.enum([\"global\", \"scoped\"]).optional(),\n relativeRoots: PartialRootSchema.optional(),\n groups: z\n .record(\n z.object({\n root: z.string(),\n modules: z.array(ModuleDeclarationSchema).nonempty(),\n })\n )\n .optional(),\n explicit: z.array(z.string()).optional(),\n});\n\nconst SourceMapSchema: z.ZodType<SourceMapSetting> = z.union([\n z.literal(true),\n z.literal(false),\n z.literal(\"inline\"),\n z.literal(\"external\"),\n]);\n\nconst BuildHookSchema: z.ZodType<BuildHook> = z.custom<BuildHook>((value) => {\n return typeof value === \"function\";\n}, {\n message: \"build hooks must be functions\",\n});\n\nconst BuilderHooksSchema: z.ZodType<BuilderHooks> = z.object({\n before: z.array(BuildHookSchema).optional(),\n after: z.array(BuildHookSchema).optional(),\n});\n\nexport const BuilderConfigSchema: z.ZodType<BuilderConfig> = z\n .object({\n format: ModuleFormatSchema.optional(),\n target: z.union([z.string(), z.array(z.string()).nonempty()]).optional(),\n sourcemap: SourceMapSchema.optional(),\n tsconfig: z.string().optional(),\n external: z.array(z.string()).optional(),\n outDir: z.string().optional(),\n hooks: BuilderHooksSchema.optional(),\n });\n\nexport const ExecutorConfigSchema = z.object({\n runner: RunnerSchema,\n test: TestSchema.optional(),\n roots: RootSchema,\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n\nexport const PartialExecutorConfigSchema = z.object({\n runner: RunnerSchema.optional(),\n test: TestSchema.optional(),\n roots: PartialRootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/environment-selector.ts","../src/schema.ts"],"names":["name","match"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\n\nimport { posix as pathPosix } from \"node:path\";\n\nimport { EnvironmentSelector } from \"./environment-selector\";\nimport {\n ExecutorConfigSchema,\n PartialExecutorConfigSchema,\n} from \"./schema\";\nimport {\n ConfigDefinition,\n ConfigDefinitionInput,\n BuilderConfig,\n ExecutorConfig,\n PartialExecutorConfig,\n PartialRootsConfig,\n ModulesConfig,\n ResolveOptions,\n ResolvedConfig,\n RootsConfig,\n ShimConfig,\n TestConfig,\n LoggingConfig,\n ReporterConfig,\n TimeoutSetting,\n} from \"./types\";\n\nexport class Config {\n private readonly definition: ConfigDefinition;\n\n constructor(definition: ConfigDefinition) {\n this.definition = definition;\n }\n\n resolve(options: ResolveOptions = {}): ResolvedConfig {\n const environment = this.resolveEnvironment(options);\n const override = this.definition.environments[environment] ?? {};\n const merged = mergeExecutorConfig(this.definition.default, override);\n const validated = ExecutorConfigSchema.parse(merged);\n const expanded = expandModules(validated, options.modules, options.groups);\n return {\n environment,\n config: deepFreeze(expanded),\n };\n }\n\n current(options?: ResolveOptions): ExecutorConfig {\n return this.resolve(options).config;\n }\n\n get environment(): string {\n return this.resolve().environment;\n }\n\n forEnvironment(environment: string): ExecutorConfig {\n return this.resolve({ environment }).config;\n }\n\n private resolveEnvironment(options: ResolveOptions): string {\n if (options.environment) {\n return this.assertEnvironment(options.environment);\n }\n const detected = this.definition.selector.resolve();\n return this.assertEnvironment(detected);\n }\n\n private assertEnvironment(environment: string): string {\n if (environment === \"default\") {\n return environment;\n }\n if (!this.definition.environments[environment]) {\n const available = [\n \"default\",\n ...Object.keys(this.definition.environments).filter(\n (name) => name !== \"default\"\n ),\n ];\n const options = available.length\n ? available.join(\", \")\n : \"(define environments to extend the default profile)\";\n throw new AutomationError(\n `Environment \"${environment}\" is not defined. Available environments: ${options}`\n );\n }\n return environment;\n }\n}\n\nexport const defineConfig = (input: ConfigDefinitionInput): Config => {\n const selector = new EnvironmentSelector();\n selector.defaultTo(\"default\");\n if (input.environment) {\n input.environment(selector);\n }\n\n const defaultConfig = deepFreeze(ExecutorConfigSchema.parse(input.default));\n const environments: Record<string, PartialExecutorConfig> = {};\n\n for (const [name, rawOverride] of Object.entries(input.environments ?? {})) {\n if (!name.trim()) {\n throw new AutomationError(\"Environment name must be a non-empty string\");\n }\n const override = rawOverride\n ? PartialExecutorConfigSchema.parse(rawOverride)\n : {};\n environments[name] = deepFreeze(override);\n }\n\n return new Config({\n default: defaultConfig,\n environments,\n selector,\n });\n};\n\nconst mergeExecutorConfig = (\n base: ExecutorConfig,\n override: PartialExecutorConfig\n): ExecutorConfig => {\n const result = cloneConfig(base);\n\n if (override.runner) {\n result.runner = override.runner;\n }\n\n if (override.test !== undefined) {\n result.test = mergeTest(result.test, override.test);\n }\n\n if (override.roots !== undefined) {\n result.roots = mergeRoots(result.roots, override.roots);\n }\n\n if (override.modules !== undefined) {\n result.modules = cloneModules(override.modules);\n }\n\n if (override.shim !== undefined) {\n result.shim = mergeShim(result.shim, override.shim);\n }\n\n if (override.events !== undefined) {\n result.events = cloneArray(override.events);\n }\n\n if (override.builder !== undefined) {\n result.builder = mergeBuilder(result.builder, override.builder);\n }\n\n if (override.logging !== undefined) {\n result.logging = mergeLogging(result.logging, override.logging);\n }\n\n if (override.reporting !== undefined) {\n result.reporting = mergeReporting(result.reporting, override.reporting);\n }\n\n return result;\n};\nconst expandModules = (\n config: ExecutorConfig,\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): ExecutorConfig => {\n const modulesConfig = config.modules;\n if (!modulesConfig) {\n return config;\n }\n\n const relativeRoots = modulesConfig.relativeRoots;\n const hasRelativeRoots = !!relativeRoots && Object.keys(relativeRoots).length > 0;\n if (!hasRelativeRoots) {\n const hasFilters =\n (moduleFilters?.some((m) => m.trim().length > 0) ?? false) ||\n (groupFilters?.some((g) => g.trim().length > 0) ?? false);\n\n // Allow \"modules\" to act as a module registry even when everything is hoisted,\n // but fail fast if the user provided filters expecting module expansion.\n if (hasFilters) {\n throw new AutomationError(\n 'Module filters were provided, but \"modules.relativeRoots\" is not configured. ' +\n 'Configure at least one relative root (e.g. { steps: [\"steps/**/*.ts\"] }) or remove -m/-g.'\n );\n }\n\n return config;\n }\n\n const moduleEntries = collectModuleEntries(modulesConfig);\n if (moduleEntries.length === 0) {\n throw new AutomationError(\n 'When \"modules\" is provided, at least one module must be declared via \"groups\" or \"explicit\".'\n );\n }\n\n const selectedModules = selectModules(moduleEntries, moduleFilters, groupFilters);\n const expandedByKey: Record<string, string[]> = {};\n\n for (const [key, entries] of Object.entries(relativeRoots)) {\n if (!entries || entries.length === 0) {\n continue;\n }\n\n const expanded: string[] = [];\n for (const moduleDir of selectedModules) {\n for (const entry of entries) {\n const joined = joinModuleEntry(moduleDir, entry);\n if (joined) {\n expanded.push(joined);\n }\n }\n }\n\n if (expanded.length > 0) {\n expandedByKey[key] = expanded;\n }\n }\n\n if (Object.keys(expandedByKey).length === 0) {\n return config;\n }\n\n const roots = cloneRoots(config.roots);\n for (const [key, expanded] of Object.entries(expandedByKey)) {\n const existing = roots[key] ?? [];\n roots[key] = [...expanded, ...existing];\n }\n\n return {\n ...config,\n roots,\n };\n};\n\ninterface ModuleEntry {\n readonly id: string;\n readonly dir: string;\n}\n\ntype ModuleDeclaration = NonNullable<NonNullable<ModulesConfig[\"groups\"]>[string][\"modules\"]>[number];\n\nconst flattenModuleDeclarations = (\n declarations: readonly ModuleDeclaration[],\n prefix = \"\"\n): string[] => {\n const flattened: string[] = [];\n\n const walk = (items: readonly ModuleDeclaration[], currentPrefix: string): void => {\n for (const item of items) {\n if (typeof item === \"string\") {\n const name = normalizeSlashes(item.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n flattened.push(normalizeSlashes(pathPosix.join(currentPrefix, name)));\n continue;\n }\n\n const name = normalizeSlashes(item.name.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n\n const nextPrefix = normalizeSlashes(pathPosix.join(currentPrefix, name));\n // Always include the parent module path itself.\n flattened.push(nextPrefix);\n\n if (item.submodules && item.submodules.length > 0) {\n walk(item.submodules as readonly ModuleDeclaration[], nextPrefix);\n }\n }\n };\n\n const cleanedPrefix = normalizeSlashes(prefix.trim()).replace(/\\/+$/u, \"\");\n walk(declarations, cleanedPrefix);\n\n return Array.from(new Set(flattened));\n};\n\nconst collectModuleEntries = (modulesConfig: ModulesConfig): ModuleEntry[] => {\n const entries: ModuleEntry[] = [];\n const seen = new Set<string>();\n\n for (const [groupId, group] of Object.entries(modulesConfig.groups ?? {})) {\n const normalizedGroupId = groupId.trim();\n if (!normalizedGroupId) {\n continue;\n }\n\n const root = normalizeSlashes(group.root.trim()).replace(/\\/+$/u, \"\");\n if (!root) {\n continue;\n }\n\n const modulePaths = flattenModuleDeclarations(group.modules);\n\n for (const modulePath of modulePaths) {\n const cleaned = normalizeSlashes(modulePath.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!cleaned) {\n continue;\n }\n\n const dir = normalizeSlashes(pathPosix.join(root, cleaned));\n const id = `${normalizedGroupId}/${cleaned}`;\n const key = `${id}::${dir}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir });\n }\n }\n\n for (const explicit of modulesConfig.explicit ?? []) {\n const normalized = normalizeSlashes(explicit.trim());\n if (!normalized) {\n continue;\n }\n const id = normalized;\n const key = `${id}::${normalized}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir: normalized });\n }\n\n return entries;\n};\n\nconst selectModules = (\n moduleEntries: readonly ModuleEntry[],\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): string[] => {\n const options = moduleEntries.map((m) => ({\n id: normalizeSlashes(m.id),\n dir: normalizeSlashes(m.dir),\n group: normalizeSlashes(m.id.split(\"/\")[0] ?? \"\"),\n }));\n\n const groupFilterSet = new Set(\n (groupFilters ?? []).map((g) => normalizeSlashes(g.trim())).filter(Boolean)\n );\n\n const inGroupScope = (candidate: (typeof options)[number]): boolean => {\n if (groupFilterSet.size === 0) {\n return true;\n }\n return groupFilterSet.has(candidate.group);\n };\n\n const scopedOptions = options.filter(inGroupScope);\n if (groupFilterSet.size > 0 && scopedOptions.length === 0) {\n throw new AutomationError(\n `No modules found for group filter(s): ${Array.from(groupFilterSet).join(\", \")}. ` +\n `Available groups: ${Array.from(new Set(options.map((o) => o.group))).filter(Boolean).join(\", \")}`\n );\n }\n\n if (!moduleFilters || moduleFilters.length === 0) {\n return scopedOptions.map((o) => o.dir);\n }\n\n const scopedGroups = new Set(scopedOptions.map((o) => o.group).filter(Boolean));\n\n const selected = new Set<string>();\n\n for (const rawFilter of moduleFilters) {\n const filter = normalizeSlashes(rawFilter.trim());\n if (!filter) {\n continue;\n }\n\n const parsed = parseModuleSelector(filter, scopedGroups);\n\n // Exact selector: group/module[/...] or group:module[:...]\n if (parsed) {\n const wantedId = `${parsed.group}/${parsed.modulePath}`;\n const exact = scopedOptions.filter((o) => o.id === wantedId);\n if (exact.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n const match = exact[0];\n if (match) {\n selected.add(match.dir);\n }\n continue;\n }\n\n // Path/suffix selector: (must be unambiguous)\n // - \"orders\" matches \"<group>/orders\"\n // - \"orders/cancellations\" matches \"<group>/orders/cancellations\"\n // - \"orders:cancellations\" is treated as a path selector (\":\" => \"/\")\n const pathSelector = filter.includes(\":\") ? filter.split(\":\").join(\"/\") : filter;\n const suffixMatches = scopedOptions.filter((o) => o.id.endsWith(`/${pathSelector}`));\n if (suffixMatches.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n if (suffixMatches.length > 1) {\n throw new AutomationError(\n `Module filter \"${rawFilter}\" is ambiguous. Candidates: ${suffixMatches.map((m) => m.id).join(\", \")}. ` +\n `Use \"<group>/<module>\" or \"<group>:<module>\" to disambiguate.`\n );\n }\n const match = suffixMatches[0];\n if (match) {\n selected.add(match.dir);\n }\n }\n\n return scopedOptions.map((o) => o.dir).filter((dir) => selected.has(dir));\n};\n\nconst parseModuleSelector = (\n selector: string,\n knownGroups: ReadonlySet<string>\n): { readonly group: string; readonly modulePath: string } | undefined => {\n if (!selector) {\n return undefined;\n }\n\n // Prefer ':' for deep exact selectors: group:module[:submodule...]\n if (selector.includes(\":\")) {\n const parts = selector.split(\":\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n // Also allow '/' for deep exact selectors: group/module[/submodule...]\n if (selector.includes(\"/\")) {\n const parts = selector.split(\"/\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst joinModuleEntry = (moduleDir: string, entry: string): string | undefined => {\n const moduleTrimmed = normalizeSlashes(moduleDir.trim()).replace(/\\/+$/u, \"\");\n if (!moduleTrimmed) {\n return undefined;\n }\n\n const entryTrimmed = normalizeSlashes(entry.trim());\n if (!entryTrimmed) {\n return undefined;\n }\n\n const negated = entryTrimmed.startsWith(\"!\");\n const raw = negated ? entryTrimmed.slice(1).trim() : entryTrimmed;\n\n if (!raw || raw === \".\") {\n return negated ? `!${moduleTrimmed}` : moduleTrimmed;\n }\n\n if (raw.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(raw)) {\n return negated ? `!${raw}` : raw;\n }\n\n const joined = normalizeSlashes(pathPosix.join(moduleTrimmed, raw));\n return negated ? `!${joined}` : joined;\n};\n\nconst normalizeSlashes = (value: string): string => value.replace(/\\\\/gu, \"/\");\n\ntype LoggingConfigValue = NonNullable<LoggingConfig>;\ntype ReportingConfigValue = NonNullable<ReporterConfig>;\n\nconst mergeTest = (\n base: TestConfig | undefined,\n override: PartialExecutorConfig[\"test\"]\n): TestConfig | undefined => {\n if (override === undefined) {\n return base ? cloneTest(base) : undefined;\n }\n const result = base ? cloneTest(base) : {};\n\n if (override.timeout !== undefined) {\n result.timeout = cloneTimeout(override.timeout);\n }\n\n if (override.tagFilter !== undefined) {\n result.tagFilter = override.tagFilter;\n }\n\n if (override.groupLogging !== undefined) {\n result.groupLogging = override.groupLogging;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeShim = (\n base: ShimConfig | undefined,\n override: PartialExecutorConfig[\"shim\"]\n): ShimConfig | undefined => {\n if (override === undefined) {\n return base ? cloneShim(base) : undefined;\n }\n const result = base ? cloneShim(base) : {};\n\n if (override.errorCause !== undefined) {\n result.errorCause = override.errorCause;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeLogging = (\n base: LoggingConfig | undefined,\n override: PartialExecutorConfig[\"logging\"]\n): LoggingConfig | undefined => {\n if (override === undefined) {\n return base ? cloneLogging(base) : undefined;\n }\n\n const result: LoggingConfigValue = base ? cloneLogging(base) : {};\n\n if (override.http !== undefined) {\n result.http = override.http;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeReporting = (\n base: ReporterConfig | undefined,\n override: PartialExecutorConfig[\"reporting\"]\n): ReporterConfig | undefined => {\n if (override === undefined) {\n return base ? cloneReporting(base) : undefined;\n }\n\n const result: ReportingConfigValue = base ? cloneReporting(base) : {};\n\n if (override.hierarchical !== undefined) {\n const hierarchicalOverride = override.hierarchical;\n if (hierarchicalOverride) {\n const hierarchical = result.hierarchical ? { ...result.hierarchical } : {};\n if (hierarchicalOverride.bufferOutput !== undefined) {\n hierarchical.bufferOutput = hierarchicalOverride.bufferOutput;\n }\n if (Object.keys(hierarchical).length > 0) {\n result.hierarchical = hierarchical;\n } else {\n delete result.hierarchical;\n }\n } else {\n delete result.hierarchical;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeRoots = (\n base: RootsConfig,\n override: PartialRootsConfig | undefined\n): RootsConfig => {\n const result = cloneRoots(base);\n\n if (!override) {\n return result;\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) {\n continue;\n }\n result[key] = cloneArray(value);\n }\n\n if (!result.features) {\n throw new AutomationError(\n 'Environment overrides removed required root \"features\"'\n );\n }\n\n if (!result.steps) {\n throw new AutomationError(\n 'Environment overrides removed required root \"steps\"'\n );\n }\n\n return result;\n};\n\nconst mergeBuilder = (\n base: BuilderConfig | undefined,\n override: BuilderConfig | undefined\n): BuilderConfig | undefined => {\n if (override === undefined) {\n return base ? cloneBuilder(base) : undefined;\n }\n\n const result = base ? cloneBuilder(base) : {};\n\n if (override.format !== undefined) {\n result.format = override.format;\n }\n\n if (override.target !== undefined) {\n result.target = Array.isArray(override.target)\n ? [...override.target]\n : override.target;\n }\n\n if (override.sourcemap !== undefined) {\n result.sourcemap = override.sourcemap;\n }\n\n if (override.tsconfig !== undefined) {\n result.tsconfig = override.tsconfig;\n }\n\n if (override.external !== undefined) {\n result.external = cloneArray(override.external);\n }\n\n if (override.outDir !== undefined) {\n result.outDir = override.outDir;\n }\n\n if (override.hooks !== undefined) {\n const clonedHooks = cloneBuilderHooks(override.hooks);\n if (clonedHooks) {\n result.hooks = clonedHooks;\n } else {\n delete result.hooks;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst cloneConfig = (config: ExecutorConfig): ExecutorConfig => ({\n runner: config.runner,\n roots: cloneRoots(config.roots),\n modules: config.modules ? cloneModules(config.modules) : undefined,\n test: config.test ? cloneTest(config.test) : undefined,\n shim: config.shim ? cloneShim(config.shim) : undefined,\n events: cloneOptionalArray(config.events),\n builder: config.builder ? cloneBuilder(config.builder) : undefined,\n logging: config.logging ? cloneLogging(config.logging) : undefined,\n reporting: config.reporting ? cloneReporting(config.reporting) : undefined,\n});\n\nconst cloneRoots = (roots: RootsConfig): RootsConfig => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (value) {\n cloned[key] = cloneArray(value);\n }\n }\n return cloned as RootsConfig;\n};\n\nconst cloneRootRecord = (\n roots: Record<string, readonly string[] | undefined>\n): Record<string, string[]> => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (!value) {\n continue;\n }\n cloned[key] = cloneArray(value);\n }\n return cloned;\n};\n\nconst cloneGroups = (\n groups: NonNullable<ModulesConfig[\"groups\"]>\n): NonNullable<ModulesConfig[\"groups\"]> => {\n const cloneModuleDeclaration = (value: ModuleDeclaration): ModuleDeclaration => {\n if (typeof value === \"string\") {\n return value;\n }\n return {\n name: value.name,\n submodules: value.submodules\n ? (value.submodules.map((child) => cloneModuleDeclaration(child as ModuleDeclaration)) as ModuleDeclaration[])\n : undefined,\n };\n };\n\n const cloned: Record<\n string,\n { root: string; modules: [ModuleDeclaration, ...ModuleDeclaration[]] }\n > = {};\n for (const [key, group] of Object.entries(groups)) {\n cloned[key] = {\n root: group.root,\n modules: group.modules.map((m) => cloneModuleDeclaration(m as ModuleDeclaration)) as [\n ModuleDeclaration,\n ...ModuleDeclaration[]\n ],\n };\n }\n return cloned as NonNullable<ModulesConfig[\"groups\"]>;\n};\n\nconst cloneModules = (modules: ModulesConfig): ModulesConfig => {\n const clone: ModulesConfig = {};\n\n if (modules.stepScoping) {\n clone.stepScoping = modules.stepScoping;\n }\n\n if (modules.hoistedFeatures) {\n clone.hoistedFeatures = {\n ...(modules.hoistedFeatures.scope ? { scope: modules.hoistedFeatures.scope } : {}),\n ...(modules.hoistedFeatures.strict !== undefined ? { strict: modules.hoistedFeatures.strict } : {}),\n };\n }\n\n if (modules.relativeRoots) {\n clone.relativeRoots = cloneRootRecord(modules.relativeRoots);\n }\n\n if (modules.groups) {\n clone.groups = cloneGroups(modules.groups);\n }\n\n if (modules.explicit) {\n clone.explicit = cloneArray(modules.explicit);\n }\n\n return clone;\n};\n\nconst cloneTest = (test: TestConfig): TestConfig => {\n const clone: TestConfig = {};\n if (test.timeout !== undefined) {\n clone.timeout = cloneTimeout(test.timeout);\n }\n if (test.tagFilter !== undefined) {\n clone.tagFilter = test.tagFilter;\n }\n if (test.groupLogging !== undefined) {\n clone.groupLogging = test.groupLogging;\n }\n return clone;\n};\n\nconst cloneShim = (shim: ShimConfig): ShimConfig => {\n const clone: ShimConfig = {};\n if (shim.errorCause !== undefined) {\n clone.errorCause = shim.errorCause;\n }\n return clone;\n};\n\nconst cloneLogging = (\n logging: LoggingConfigValue\n): LoggingConfigValue => {\n const clone: LoggingConfigValue = {};\n if (logging.http !== undefined) {\n clone.http = logging.http;\n }\n return clone;\n};\n\nconst cloneReporting = (\n reporting: ReportingConfigValue\n): ReportingConfigValue => {\n const clone: ReportingConfigValue = {};\n if (reporting.hierarchical) {\n clone.hierarchical = { ...reporting.hierarchical };\n }\n return clone;\n};\n\nconst cloneBuilder = (config: BuilderConfig): BuilderConfig => {\n const clone: BuilderConfig = {};\n\n if (config.format !== undefined) {\n clone.format = config.format;\n }\n\n if (config.target !== undefined) {\n clone.target = Array.isArray(config.target)\n ? [...config.target]\n : config.target;\n }\n\n if (config.sourcemap !== undefined) {\n clone.sourcemap = config.sourcemap;\n }\n\n if (config.tsconfig !== undefined) {\n clone.tsconfig = config.tsconfig;\n }\n\n if (config.external !== undefined) {\n clone.external = cloneArray(config.external);\n }\n\n if (config.outDir !== undefined) {\n clone.outDir = config.outDir;\n }\n\n if (config.hooks) {\n const clonedHooks = cloneBuilderHooks(config.hooks);\n if (clonedHooks) {\n clone.hooks = clonedHooks;\n }\n }\n\n return clone;\n};\n\nconst cloneBuilderHooks = (\n hooks: NonNullable<BuilderConfig[\"hooks\"]>\n): NonNullable<BuilderConfig[\"hooks\"]> | undefined => {\n const clone: NonNullable<BuilderConfig[\"hooks\"]> = {};\n\n if (hooks.before && hooks.before.length > 0) {\n clone.before = [...hooks.before];\n }\n\n if (hooks.after && hooks.after.length > 0) {\n clone.after = [...hooks.after];\n }\n\n return Object.keys(clone).length === 0 ? undefined : clone;\n};\n\nconst cloneTimeout = (\n timeout: TimeoutSetting | undefined\n): TimeoutSetting | undefined => {\n if (timeout === undefined) {\n return undefined;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n if (Array.isArray(timeout)) {\n const [value, unit] = timeout;\n return [value, unit] as TimeoutSetting;\n }\n return { ...timeout } as TimeoutSetting;\n};\n\nconst cloneArray = (value: readonly string[]): string[] => [...value];\n\nconst cloneOptionalArray = (\n value: readonly string[] | undefined\n): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return [...value];\n};\n\nconst deepFreeze = <T>(value: T): T => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n const propertyNames = Object.getOwnPropertyNames(value);\n for (const name of propertyNames) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const property = (value as any)[name];\n if (property && typeof property === \"object\") {\n deepFreeze(property);\n }\n }\n\n return Object.freeze(value);\n};\n","export type EnvironmentFactory = () => string | undefined;\n\nconst sanitize = (value: string | undefined | null) => {\n if (value == null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n};\n\nexport class EnvironmentSelector {\n private readonly detectors: EnvironmentFactory[] = [];\n private fallback = \"default\";\n\n byLiteral(name: string): this {\n this.detectors.push(() => sanitize(name));\n return this;\n }\n\n byEnvironmentVariable(variable: string): this {\n this.detectors.push(() => sanitize(process.env[variable]));\n return this;\n }\n\n byFactory(factory: EnvironmentFactory): this {\n this.detectors.push(() => sanitize(factory()));\n return this;\n }\n\n defaultTo(name: string): this {\n const sanitized = sanitize(name);\n if (!sanitized) {\n throw new Error(\"Default environment name must be a non-empty string\");\n }\n this.fallback = sanitized;\n return this;\n }\n\n resolve(): string {\n for (const detector of this.detectors) {\n const detected = detector();\n if (detected) {\n return detected;\n }\n }\n return this.fallback;\n }\n}\n","import { z } from \"zod\";\n\nimport type { BuildHook, BuilderConfig, BuilderHooks, ModuleFormat, SourceMapSetting } from \"./builder-types\";\n\nexport const TimeUnitSchema = z.enum([\"ms\", \"s\", \"m\", \"h\"]);\n\nexport const TimeoutSchema = z\n .union([\n z.number().nonnegative(),\n z.tuple([z.number().nonnegative(), TimeUnitSchema]),\n z.object({\n value: z.number().nonnegative(),\n unit: TimeUnitSchema.optional(),\n }),\n ])\n .optional();\n\nexport const RunnerSchema = z.union([z.literal(\"jest\"), z.literal(\"vitest\"), z.literal(\"playwright\")]);\n\nexport const TagFilterSchema = z\n .string()\n .refine(\n (value) => value.startsWith(\"@\") || value.startsWith(\"not @\"),\n \"tag filter must start with `@` or `not @`\"\n )\n .optional();\n\nexport const TestSchema = z\n .object({\n timeout: TimeoutSchema,\n tagFilter: TagFilterSchema,\n groupLogging: z.boolean().optional(),\n })\n .partial();\n\nexport const ShimSchema = z.object({\n errorCause: z.boolean().optional(),\n});\n\nexport const PathSchema = z.array(z.string());\n\nexport const RootSchema = z\n .object({\n features: PathSchema,\n steps: PathSchema,\n support: PathSchema.optional(),\n })\n .catchall(PathSchema);\n\nexport const EventsSchema = z.array(z.string());\n\nexport const LoggingSchema = z\n .object({\n http: z.boolean().optional(),\n })\n .optional();\n\nexport const ReporterSchema = z\n .object({\n hierarchical: z\n .object({\n bufferOutput: z.boolean().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const ModuleFormatSchema: z.ZodType<ModuleFormat> = z.enum([\"cjs\", \"esm\"]);\n\nexport const PartialRootSchema = RootSchema.partial();\n\ntype ModuleDeclaration =\n | string\n | { readonly name: string; readonly submodules?: ModuleDeclaration[] | undefined };\n\nconst ModuleDeclarationSchema: z.ZodType<ModuleDeclaration> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n name: z.string().min(1),\n submodules: z.array(ModuleDeclarationSchema).optional(),\n }),\n ])\n);\n\nexport const ModulesConfigSchema = z.object({\n stepScoping: z.enum([\"global\", \"scoped\"]).optional(),\n hoistedFeatures: z\n .object({\n scope: z.enum([\"tag\", \"directory\"]).optional(),\n strict: z.boolean().optional(),\n })\n .optional(),\n relativeRoots: PartialRootSchema.optional(),\n groups: z\n .record(\n z.object({\n root: z.string(),\n modules: z.array(ModuleDeclarationSchema).nonempty(),\n })\n )\n .optional(),\n explicit: z.array(z.string()).optional(),\n});\n\nconst SourceMapSchema: z.ZodType<SourceMapSetting> = z.union([\n z.literal(true),\n z.literal(false),\n z.literal(\"inline\"),\n z.literal(\"external\"),\n]);\n\nconst BuildHookSchema: z.ZodType<BuildHook> = z.custom<BuildHook>((value) => {\n return typeof value === \"function\";\n}, {\n message: \"build hooks must be functions\",\n});\n\nconst BuilderHooksSchema: z.ZodType<BuilderHooks> = z.object({\n before: z.array(BuildHookSchema).optional(),\n after: z.array(BuildHookSchema).optional(),\n});\n\nexport const BuilderConfigSchema: z.ZodType<BuilderConfig> = z\n .object({\n format: ModuleFormatSchema.optional(),\n target: z.union([z.string(), z.array(z.string()).nonempty()]).optional(),\n sourcemap: SourceMapSchema.optional(),\n tsconfig: z.string().optional(),\n external: z.array(z.string()).optional(),\n outDir: z.string().optional(),\n hooks: BuilderHooksSchema.optional(),\n });\n\nexport const ExecutorConfigSchema = z.object({\n runner: RunnerSchema,\n test: TestSchema.optional(),\n roots: RootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n}).superRefine((value, ctx) => {\n if (value.roots) {\n return;\n }\n\n const modules = value.modules;\n if (!modules) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"roots\"],\n message: '\"roots\" is required unless \"modules.relativeRoots\" defines at least \"features\" and \"steps\".',\n });\n return;\n }\n\n const declaredModules =\n (modules.explicit?.some((entry) => entry.trim().length > 0) ?? false) ||\n (modules.groups ? Object.keys(modules.groups).length > 0 : false);\n\n if (!declaredModules) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"modules\"],\n message:\n 'When omitting \"roots\", at least one module must be declared via \"modules.groups\" or \"modules.explicit\".',\n });\n }\n\n const relativeRoots = modules.relativeRoots;\n const hasFeatures =\n !!relativeRoots && Array.isArray(relativeRoots.features) && relativeRoots.features.length > 0;\n const hasSteps =\n !!relativeRoots && Array.isArray(relativeRoots.steps) && relativeRoots.steps.length > 0;\n\n if (!hasFeatures || !hasSteps) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"modules\", \"relativeRoots\"],\n message:\n 'When omitting \"roots\", \"modules.relativeRoots\" must include non-empty \"features\" and \"steps\" entries.',\n });\n }\n}).transform((value) => {\n return {\n ...value,\n roots: value.roots ?? {\n features: [],\n steps: [],\n },\n };\n});\n\nexport const PartialExecutorConfigSchema = z.object({\n runner: RunnerSchema.optional(),\n test: TestSchema.optional(),\n roots: PartialRootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n"]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { Config, defineConfig } from "./config";
2
2
  export { EnvironmentSelector } from "./environment-selector";
3
3
  export { ExecutorConfigSchema, EventsSchema, PathSchema, PartialRootSchema, RootSchema, RunnerSchema, BuilderConfigSchema, ModuleFormatSchema, ShimSchema, TagFilterSchema, TestSchema, TimeUnitSchema, TimeoutSchema, PartialExecutorConfigSchema, ReporterSchema, } from "./schema";
4
- export type { ConfigDefinition, ConfigDefinitionInput, ExecutorConfig, PartialExecutorConfig, BuilderConfig, BuilderHooks, PartialRootsConfig, ResolveOptions, ResolvedConfig, RootsConfig, ShimConfig, TestConfig, TimeoutSetting, ModuleFormat, BuildHook, BuildHookContext, SourceMapSetting, LoggingConfig, ReporterConfig, } from "./types";
4
+ export type { ConfigDefinition, ConfigDefinitionInput, ExecutorConfig, ExecutorConfigInput, PartialExecutorConfig, BuilderConfig, BuilderHooks, PartialRootsConfig, ResolveOptions, ResolvedConfig, RootsConfig, ShimConfig, TestConfig, TimeoutSetting, ModuleFormat, BuildHook, BuildHookContext, SourceMapSetting, LoggingConfig, ReporterConfig, } from "./types";
package/dist/index.js CHANGED
@@ -97,6 +97,10 @@ var ModuleDeclarationSchema = z.lazy(
97
97
  );
98
98
  var ModulesConfigSchema = z.object({
99
99
  stepScoping: z.enum(["global", "scoped"]).optional(),
100
+ hoistedFeatures: z.object({
101
+ scope: z.enum(["tag", "directory"]).optional(),
102
+ strict: z.boolean().optional()
103
+ }).optional(),
100
104
  relativeRoots: PartialRootSchema.optional(),
101
105
  groups: z.record(
102
106
  z.object({
@@ -133,13 +137,52 @@ var BuilderConfigSchema = z.object({
133
137
  var ExecutorConfigSchema = z.object({
134
138
  runner: RunnerSchema,
135
139
  test: TestSchema.optional(),
136
- roots: RootSchema,
140
+ roots: RootSchema.optional(),
137
141
  modules: ModulesConfigSchema.optional(),
138
142
  shim: ShimSchema.optional(),
139
143
  events: EventsSchema.optional(),
140
144
  builder: BuilderConfigSchema.optional(),
141
145
  logging: LoggingSchema.optional(),
142
146
  reporting: ReporterSchema.optional()
147
+ }).superRefine((value, ctx) => {
148
+ if (value.roots) {
149
+ return;
150
+ }
151
+ const modules = value.modules;
152
+ if (!modules) {
153
+ ctx.addIssue({
154
+ code: z.ZodIssueCode.custom,
155
+ path: ["roots"],
156
+ message: '"roots" is required unless "modules.relativeRoots" defines at least "features" and "steps".'
157
+ });
158
+ return;
159
+ }
160
+ const declaredModules = (modules.explicit?.some((entry) => entry.trim().length > 0) ?? false) || (modules.groups ? Object.keys(modules.groups).length > 0 : false);
161
+ if (!declaredModules) {
162
+ ctx.addIssue({
163
+ code: z.ZodIssueCode.custom,
164
+ path: ["modules"],
165
+ message: 'When omitting "roots", at least one module must be declared via "modules.groups" or "modules.explicit".'
166
+ });
167
+ }
168
+ const relativeRoots = modules.relativeRoots;
169
+ const hasFeatures = !!relativeRoots && Array.isArray(relativeRoots.features) && relativeRoots.features.length > 0;
170
+ const hasSteps = !!relativeRoots && Array.isArray(relativeRoots.steps) && relativeRoots.steps.length > 0;
171
+ if (!hasFeatures || !hasSteps) {
172
+ ctx.addIssue({
173
+ code: z.ZodIssueCode.custom,
174
+ path: ["modules", "relativeRoots"],
175
+ message: 'When omitting "roots", "modules.relativeRoots" must include non-empty "features" and "steps" entries.'
176
+ });
177
+ }
178
+ }).transform((value) => {
179
+ return {
180
+ ...value,
181
+ roots: value.roots ?? {
182
+ features: [],
183
+ steps: []
184
+ }
185
+ };
143
186
  });
144
187
  var PartialExecutorConfigSchema = z.object({
145
188
  runner: RunnerSchema.optional(),
@@ -668,6 +711,15 @@ var cloneGroups = (groups) => {
668
711
  };
669
712
  var cloneModules = (modules) => {
670
713
  const clone = {};
714
+ if (modules.stepScoping) {
715
+ clone.stepScoping = modules.stepScoping;
716
+ }
717
+ if (modules.hoistedFeatures) {
718
+ clone.hoistedFeatures = {
719
+ ...modules.hoistedFeatures.scope ? { scope: modules.hoistedFeatures.scope } : {},
720
+ ...modules.hoistedFeatures.strict !== void 0 ? { strict: modules.hoistedFeatures.strict } : {}
721
+ };
722
+ }
671
723
  if (modules.relativeRoots) {
672
724
  clone.relativeRoots = cloneRootRecord(modules.relativeRoots);
673
725
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/environment-selector.ts","../src/schema.ts"],"names":["name","match"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\n\nimport { posix as pathPosix } from \"node:path\";\n\nimport { EnvironmentSelector } from \"./environment-selector\";\nimport {\n ExecutorConfigSchema,\n PartialExecutorConfigSchema,\n} from \"./schema\";\nimport {\n ConfigDefinition,\n ConfigDefinitionInput,\n BuilderConfig,\n ExecutorConfig,\n PartialExecutorConfig,\n PartialRootsConfig,\n ModulesConfig,\n ResolveOptions,\n ResolvedConfig,\n RootsConfig,\n ShimConfig,\n TestConfig,\n LoggingConfig,\n ReporterConfig,\n TimeoutSetting,\n} from \"./types\";\n\nexport class Config {\n private readonly definition: ConfigDefinition;\n\n constructor(definition: ConfigDefinition) {\n this.definition = definition;\n }\n\n resolve(options: ResolveOptions = {}): ResolvedConfig {\n const environment = this.resolveEnvironment(options);\n const override = this.definition.environments[environment] ?? {};\n const merged = mergeExecutorConfig(this.definition.default, override);\n const validated = ExecutorConfigSchema.parse(merged);\n const expanded = expandModules(validated, options.modules, options.groups);\n return {\n environment,\n config: deepFreeze(expanded),\n };\n }\n\n current(options?: ResolveOptions): ExecutorConfig {\n return this.resolve(options).config;\n }\n\n get environment(): string {\n return this.resolve().environment;\n }\n\n forEnvironment(environment: string): ExecutorConfig {\n return this.resolve({ environment }).config;\n }\n\n private resolveEnvironment(options: ResolveOptions): string {\n if (options.environment) {\n return this.assertEnvironment(options.environment);\n }\n const detected = this.definition.selector.resolve();\n return this.assertEnvironment(detected);\n }\n\n private assertEnvironment(environment: string): string {\n if (environment === \"default\") {\n return environment;\n }\n if (!this.definition.environments[environment]) {\n const available = [\n \"default\",\n ...Object.keys(this.definition.environments).filter(\n (name) => name !== \"default\"\n ),\n ];\n const options = available.length\n ? available.join(\", \")\n : \"(define environments to extend the default profile)\";\n throw new AutomationError(\n `Environment \"${environment}\" is not defined. Available environments: ${options}`\n );\n }\n return environment;\n }\n}\n\nexport const defineConfig = (input: ConfigDefinitionInput): Config => {\n const selector = new EnvironmentSelector();\n selector.defaultTo(\"default\");\n if (input.environment) {\n input.environment(selector);\n }\n\n const defaultConfig = deepFreeze(ExecutorConfigSchema.parse(input.default));\n const environments: Record<string, PartialExecutorConfig> = {};\n\n for (const [name, rawOverride] of Object.entries(input.environments ?? {})) {\n if (!name.trim()) {\n throw new AutomationError(\"Environment name must be a non-empty string\");\n }\n const override = rawOverride\n ? PartialExecutorConfigSchema.parse(rawOverride)\n : {};\n environments[name] = deepFreeze(override);\n }\n\n return new Config({\n default: defaultConfig,\n environments,\n selector,\n });\n};\n\nconst mergeExecutorConfig = (\n base: ExecutorConfig,\n override: PartialExecutorConfig\n): ExecutorConfig => {\n const result = cloneConfig(base);\n\n if (override.runner) {\n result.runner = override.runner;\n }\n\n if (override.test !== undefined) {\n result.test = mergeTest(result.test, override.test);\n }\n\n if (override.roots !== undefined) {\n result.roots = mergeRoots(result.roots, override.roots);\n }\n\n if (override.modules !== undefined) {\n result.modules = cloneModules(override.modules);\n }\n\n if (override.shim !== undefined) {\n result.shim = mergeShim(result.shim, override.shim);\n }\n\n if (override.events !== undefined) {\n result.events = cloneArray(override.events);\n }\n\n if (override.builder !== undefined) {\n result.builder = mergeBuilder(result.builder, override.builder);\n }\n\n if (override.logging !== undefined) {\n result.logging = mergeLogging(result.logging, override.logging);\n }\n\n if (override.reporting !== undefined) {\n result.reporting = mergeReporting(result.reporting, override.reporting);\n }\n\n return result;\n};\nconst expandModules = (\n config: ExecutorConfig,\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): ExecutorConfig => {\n const modulesConfig = config.modules;\n if (!modulesConfig) {\n return config;\n }\n\n const relativeRoots = modulesConfig.relativeRoots;\n const hasRelativeRoots = !!relativeRoots && Object.keys(relativeRoots).length > 0;\n if (!hasRelativeRoots) {\n const hasFilters =\n (moduleFilters?.some((m) => m.trim().length > 0) ?? false) ||\n (groupFilters?.some((g) => g.trim().length > 0) ?? false);\n\n // Allow \"modules\" to act as a module registry even when everything is hoisted,\n // but fail fast if the user provided filters expecting module expansion.\n if (hasFilters) {\n throw new AutomationError(\n 'Module filters were provided, but \"modules.relativeRoots\" is not configured. ' +\n 'Configure at least one relative root (e.g. { steps: [\"steps/**/*.ts\"] }) or remove -m/-g.'\n );\n }\n\n return config;\n }\n\n const moduleEntries = collectModuleEntries(modulesConfig);\n if (moduleEntries.length === 0) {\n throw new AutomationError(\n 'When \"modules\" is provided, at least one module must be declared via \"groups\" or \"explicit\".'\n );\n }\n\n const selectedModules = selectModules(moduleEntries, moduleFilters, groupFilters);\n const expandedByKey: Record<string, string[]> = {};\n\n for (const [key, entries] of Object.entries(relativeRoots)) {\n if (!entries || entries.length === 0) {\n continue;\n }\n\n const expanded: string[] = [];\n for (const moduleDir of selectedModules) {\n for (const entry of entries) {\n const joined = joinModuleEntry(moduleDir, entry);\n if (joined) {\n expanded.push(joined);\n }\n }\n }\n\n if (expanded.length > 0) {\n expandedByKey[key] = expanded;\n }\n }\n\n if (Object.keys(expandedByKey).length === 0) {\n return config;\n }\n\n const roots = cloneRoots(config.roots);\n for (const [key, expanded] of Object.entries(expandedByKey)) {\n const existing = roots[key] ?? [];\n roots[key] = [...expanded, ...existing];\n }\n\n return {\n ...config,\n roots,\n };\n};\n\ninterface ModuleEntry {\n readonly id: string;\n readonly dir: string;\n}\n\ntype ModuleDeclaration = NonNullable<NonNullable<ModulesConfig[\"groups\"]>[string][\"modules\"]>[number];\n\nconst flattenModuleDeclarations = (\n declarations: readonly ModuleDeclaration[],\n prefix = \"\"\n): string[] => {\n const flattened: string[] = [];\n\n const walk = (items: readonly ModuleDeclaration[], currentPrefix: string): void => {\n for (const item of items) {\n if (typeof item === \"string\") {\n const name = normalizeSlashes(item.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n flattened.push(normalizeSlashes(pathPosix.join(currentPrefix, name)));\n continue;\n }\n\n const name = normalizeSlashes(item.name.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n\n const nextPrefix = normalizeSlashes(pathPosix.join(currentPrefix, name));\n // Always include the parent module path itself.\n flattened.push(nextPrefix);\n\n if (item.submodules && item.submodules.length > 0) {\n walk(item.submodules as readonly ModuleDeclaration[], nextPrefix);\n }\n }\n };\n\n const cleanedPrefix = normalizeSlashes(prefix.trim()).replace(/\\/+$/u, \"\");\n walk(declarations, cleanedPrefix);\n\n return Array.from(new Set(flattened));\n};\n\nconst collectModuleEntries = (modulesConfig: ModulesConfig): ModuleEntry[] => {\n const entries: ModuleEntry[] = [];\n const seen = new Set<string>();\n\n for (const [groupId, group] of Object.entries(modulesConfig.groups ?? {})) {\n const normalizedGroupId = groupId.trim();\n if (!normalizedGroupId) {\n continue;\n }\n\n const root = normalizeSlashes(group.root.trim()).replace(/\\/+$/u, \"\");\n if (!root) {\n continue;\n }\n\n const modulePaths = flattenModuleDeclarations(group.modules);\n\n for (const modulePath of modulePaths) {\n const cleaned = normalizeSlashes(modulePath.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!cleaned) {\n continue;\n }\n\n const dir = normalizeSlashes(pathPosix.join(root, cleaned));\n const id = `${normalizedGroupId}/${cleaned}`;\n const key = `${id}::${dir}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir });\n }\n }\n\n for (const explicit of modulesConfig.explicit ?? []) {\n const normalized = normalizeSlashes(explicit.trim());\n if (!normalized) {\n continue;\n }\n const id = normalized;\n const key = `${id}::${normalized}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir: normalized });\n }\n\n return entries;\n};\n\nconst selectModules = (\n moduleEntries: readonly ModuleEntry[],\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): string[] => {\n const options = moduleEntries.map((m) => ({\n id: normalizeSlashes(m.id),\n dir: normalizeSlashes(m.dir),\n group: normalizeSlashes(m.id.split(\"/\")[0] ?? \"\"),\n }));\n\n const groupFilterSet = new Set(\n (groupFilters ?? []).map((g) => normalizeSlashes(g.trim())).filter(Boolean)\n );\n\n const inGroupScope = (candidate: (typeof options)[number]): boolean => {\n if (groupFilterSet.size === 0) {\n return true;\n }\n return groupFilterSet.has(candidate.group);\n };\n\n const scopedOptions = options.filter(inGroupScope);\n if (groupFilterSet.size > 0 && scopedOptions.length === 0) {\n throw new AutomationError(\n `No modules found for group filter(s): ${Array.from(groupFilterSet).join(\", \")}. ` +\n `Available groups: ${Array.from(new Set(options.map((o) => o.group))).filter(Boolean).join(\", \")}`\n );\n }\n\n if (!moduleFilters || moduleFilters.length === 0) {\n return scopedOptions.map((o) => o.dir);\n }\n\n const scopedGroups = new Set(scopedOptions.map((o) => o.group).filter(Boolean));\n\n const selected = new Set<string>();\n\n for (const rawFilter of moduleFilters) {\n const filter = normalizeSlashes(rawFilter.trim());\n if (!filter) {\n continue;\n }\n\n const parsed = parseModuleSelector(filter, scopedGroups);\n\n // Exact selector: group/module[/...] or group:module[:...]\n if (parsed) {\n const wantedId = `${parsed.group}/${parsed.modulePath}`;\n const exact = scopedOptions.filter((o) => o.id === wantedId);\n if (exact.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n const match = exact[0];\n if (match) {\n selected.add(match.dir);\n }\n continue;\n }\n\n // Path/suffix selector: (must be unambiguous)\n // - \"orders\" matches \"<group>/orders\"\n // - \"orders/cancellations\" matches \"<group>/orders/cancellations\"\n // - \"orders:cancellations\" is treated as a path selector (\":\" => \"/\")\n const pathSelector = filter.includes(\":\") ? filter.split(\":\").join(\"/\") : filter;\n const suffixMatches = scopedOptions.filter((o) => o.id.endsWith(`/${pathSelector}`));\n if (suffixMatches.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n if (suffixMatches.length > 1) {\n throw new AutomationError(\n `Module filter \"${rawFilter}\" is ambiguous. Candidates: ${suffixMatches.map((m) => m.id).join(\", \")}. ` +\n `Use \"<group>/<module>\" or \"<group>:<module>\" to disambiguate.`\n );\n }\n const match = suffixMatches[0];\n if (match) {\n selected.add(match.dir);\n }\n }\n\n return scopedOptions.map((o) => o.dir).filter((dir) => selected.has(dir));\n};\n\nconst parseModuleSelector = (\n selector: string,\n knownGroups: ReadonlySet<string>\n): { readonly group: string; readonly modulePath: string } | undefined => {\n if (!selector) {\n return undefined;\n }\n\n // Prefer ':' for deep exact selectors: group:module[:submodule...]\n if (selector.includes(\":\")) {\n const parts = selector.split(\":\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n // Also allow '/' for deep exact selectors: group/module[/submodule...]\n if (selector.includes(\"/\")) {\n const parts = selector.split(\"/\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst joinModuleEntry = (moduleDir: string, entry: string): string | undefined => {\n const moduleTrimmed = normalizeSlashes(moduleDir.trim()).replace(/\\/+$/u, \"\");\n if (!moduleTrimmed) {\n return undefined;\n }\n\n const entryTrimmed = normalizeSlashes(entry.trim());\n if (!entryTrimmed) {\n return undefined;\n }\n\n const negated = entryTrimmed.startsWith(\"!\");\n const raw = negated ? entryTrimmed.slice(1).trim() : entryTrimmed;\n\n if (!raw || raw === \".\") {\n return negated ? `!${moduleTrimmed}` : moduleTrimmed;\n }\n\n if (raw.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(raw)) {\n return negated ? `!${raw}` : raw;\n }\n\n const joined = normalizeSlashes(pathPosix.join(moduleTrimmed, raw));\n return negated ? `!${joined}` : joined;\n};\n\nconst normalizeSlashes = (value: string): string => value.replace(/\\\\/gu, \"/\");\n\ntype LoggingConfigValue = NonNullable<LoggingConfig>;\ntype ReportingConfigValue = NonNullable<ReporterConfig>;\n\nconst mergeTest = (\n base: TestConfig | undefined,\n override: PartialExecutorConfig[\"test\"]\n): TestConfig | undefined => {\n if (override === undefined) {\n return base ? cloneTest(base) : undefined;\n }\n const result = base ? cloneTest(base) : {};\n\n if (override.timeout !== undefined) {\n result.timeout = cloneTimeout(override.timeout);\n }\n\n if (override.tagFilter !== undefined) {\n result.tagFilter = override.tagFilter;\n }\n\n if (override.groupLogging !== undefined) {\n result.groupLogging = override.groupLogging;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeShim = (\n base: ShimConfig | undefined,\n override: PartialExecutorConfig[\"shim\"]\n): ShimConfig | undefined => {\n if (override === undefined) {\n return base ? cloneShim(base) : undefined;\n }\n const result = base ? cloneShim(base) : {};\n\n if (override.errorCause !== undefined) {\n result.errorCause = override.errorCause;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeLogging = (\n base: LoggingConfig | undefined,\n override: PartialExecutorConfig[\"logging\"]\n): LoggingConfig | undefined => {\n if (override === undefined) {\n return base ? cloneLogging(base) : undefined;\n }\n\n const result: LoggingConfigValue = base ? cloneLogging(base) : {};\n\n if (override.http !== undefined) {\n result.http = override.http;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeReporting = (\n base: ReporterConfig | undefined,\n override: PartialExecutorConfig[\"reporting\"]\n): ReporterConfig | undefined => {\n if (override === undefined) {\n return base ? cloneReporting(base) : undefined;\n }\n\n const result: ReportingConfigValue = base ? cloneReporting(base) : {};\n\n if (override.hierarchical !== undefined) {\n const hierarchicalOverride = override.hierarchical;\n if (hierarchicalOverride) {\n const hierarchical = result.hierarchical ? { ...result.hierarchical } : {};\n if (hierarchicalOverride.bufferOutput !== undefined) {\n hierarchical.bufferOutput = hierarchicalOverride.bufferOutput;\n }\n if (Object.keys(hierarchical).length > 0) {\n result.hierarchical = hierarchical;\n } else {\n delete result.hierarchical;\n }\n } else {\n delete result.hierarchical;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeRoots = (\n base: RootsConfig,\n override: PartialRootsConfig | undefined\n): RootsConfig => {\n const result = cloneRoots(base);\n\n if (!override) {\n return result;\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) {\n continue;\n }\n result[key] = cloneArray(value);\n }\n\n if (!result.features) {\n throw new AutomationError(\n 'Environment overrides removed required root \"features\"'\n );\n }\n\n if (!result.steps) {\n throw new AutomationError(\n 'Environment overrides removed required root \"steps\"'\n );\n }\n\n return result;\n};\n\nconst mergeBuilder = (\n base: BuilderConfig | undefined,\n override: BuilderConfig | undefined\n): BuilderConfig | undefined => {\n if (override === undefined) {\n return base ? cloneBuilder(base) : undefined;\n }\n\n const result = base ? cloneBuilder(base) : {};\n\n if (override.format !== undefined) {\n result.format = override.format;\n }\n\n if (override.target !== undefined) {\n result.target = Array.isArray(override.target)\n ? [...override.target]\n : override.target;\n }\n\n if (override.sourcemap !== undefined) {\n result.sourcemap = override.sourcemap;\n }\n\n if (override.tsconfig !== undefined) {\n result.tsconfig = override.tsconfig;\n }\n\n if (override.external !== undefined) {\n result.external = cloneArray(override.external);\n }\n\n if (override.outDir !== undefined) {\n result.outDir = override.outDir;\n }\n\n if (override.hooks !== undefined) {\n const clonedHooks = cloneBuilderHooks(override.hooks);\n if (clonedHooks) {\n result.hooks = clonedHooks;\n } else {\n delete result.hooks;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst cloneConfig = (config: ExecutorConfig): ExecutorConfig => ({\n runner: config.runner,\n roots: cloneRoots(config.roots),\n modules: config.modules ? cloneModules(config.modules) : undefined,\n test: config.test ? cloneTest(config.test) : undefined,\n shim: config.shim ? cloneShim(config.shim) : undefined,\n events: cloneOptionalArray(config.events),\n builder: config.builder ? cloneBuilder(config.builder) : undefined,\n logging: config.logging ? cloneLogging(config.logging) : undefined,\n reporting: config.reporting ? cloneReporting(config.reporting) : undefined,\n});\n\nconst cloneRoots = (roots: RootsConfig): RootsConfig => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (value) {\n cloned[key] = cloneArray(value);\n }\n }\n return cloned as RootsConfig;\n};\n\nconst cloneRootRecord = (\n roots: Record<string, readonly string[] | undefined>\n): Record<string, string[]> => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (!value) {\n continue;\n }\n cloned[key] = cloneArray(value);\n }\n return cloned;\n};\n\nconst cloneGroups = (\n groups: NonNullable<ModulesConfig[\"groups\"]>\n): NonNullable<ModulesConfig[\"groups\"]> => {\n const cloneModuleDeclaration = (value: ModuleDeclaration): ModuleDeclaration => {\n if (typeof value === \"string\") {\n return value;\n }\n return {\n name: value.name,\n submodules: value.submodules\n ? (value.submodules.map((child) => cloneModuleDeclaration(child as ModuleDeclaration)) as ModuleDeclaration[])\n : undefined,\n };\n };\n\n const cloned: Record<\n string,\n { root: string; modules: [ModuleDeclaration, ...ModuleDeclaration[]] }\n > = {};\n for (const [key, group] of Object.entries(groups)) {\n cloned[key] = {\n root: group.root,\n modules: group.modules.map((m) => cloneModuleDeclaration(m as ModuleDeclaration)) as [\n ModuleDeclaration,\n ...ModuleDeclaration[]\n ],\n };\n }\n return cloned as NonNullable<ModulesConfig[\"groups\"]>;\n};\n\nconst cloneModules = (modules: ModulesConfig): ModulesConfig => {\n const clone: ModulesConfig = {};\n\n if (modules.relativeRoots) {\n clone.relativeRoots = cloneRootRecord(modules.relativeRoots);\n }\n\n if (modules.groups) {\n clone.groups = cloneGroups(modules.groups);\n }\n\n if (modules.explicit) {\n clone.explicit = cloneArray(modules.explicit);\n }\n\n return clone;\n};\n\nconst cloneTest = (test: TestConfig): TestConfig => {\n const clone: TestConfig = {};\n if (test.timeout !== undefined) {\n clone.timeout = cloneTimeout(test.timeout);\n }\n if (test.tagFilter !== undefined) {\n clone.tagFilter = test.tagFilter;\n }\n if (test.groupLogging !== undefined) {\n clone.groupLogging = test.groupLogging;\n }\n return clone;\n};\n\nconst cloneShim = (shim: ShimConfig): ShimConfig => {\n const clone: ShimConfig = {};\n if (shim.errorCause !== undefined) {\n clone.errorCause = shim.errorCause;\n }\n return clone;\n};\n\nconst cloneLogging = (\n logging: LoggingConfigValue\n): LoggingConfigValue => {\n const clone: LoggingConfigValue = {};\n if (logging.http !== undefined) {\n clone.http = logging.http;\n }\n return clone;\n};\n\nconst cloneReporting = (\n reporting: ReportingConfigValue\n): ReportingConfigValue => {\n const clone: ReportingConfigValue = {};\n if (reporting.hierarchical) {\n clone.hierarchical = { ...reporting.hierarchical };\n }\n return clone;\n};\n\nconst cloneBuilder = (config: BuilderConfig): BuilderConfig => {\n const clone: BuilderConfig = {};\n\n if (config.format !== undefined) {\n clone.format = config.format;\n }\n\n if (config.target !== undefined) {\n clone.target = Array.isArray(config.target)\n ? [...config.target]\n : config.target;\n }\n\n if (config.sourcemap !== undefined) {\n clone.sourcemap = config.sourcemap;\n }\n\n if (config.tsconfig !== undefined) {\n clone.tsconfig = config.tsconfig;\n }\n\n if (config.external !== undefined) {\n clone.external = cloneArray(config.external);\n }\n\n if (config.outDir !== undefined) {\n clone.outDir = config.outDir;\n }\n\n if (config.hooks) {\n const clonedHooks = cloneBuilderHooks(config.hooks);\n if (clonedHooks) {\n clone.hooks = clonedHooks;\n }\n }\n\n return clone;\n};\n\nconst cloneBuilderHooks = (\n hooks: NonNullable<BuilderConfig[\"hooks\"]>\n): NonNullable<BuilderConfig[\"hooks\"]> | undefined => {\n const clone: NonNullable<BuilderConfig[\"hooks\"]> = {};\n\n if (hooks.before && hooks.before.length > 0) {\n clone.before = [...hooks.before];\n }\n\n if (hooks.after && hooks.after.length > 0) {\n clone.after = [...hooks.after];\n }\n\n return Object.keys(clone).length === 0 ? undefined : clone;\n};\n\nconst cloneTimeout = (\n timeout: TimeoutSetting | undefined\n): TimeoutSetting | undefined => {\n if (timeout === undefined) {\n return undefined;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n if (Array.isArray(timeout)) {\n const [value, unit] = timeout;\n return [value, unit] as TimeoutSetting;\n }\n return { ...timeout } as TimeoutSetting;\n};\n\nconst cloneArray = (value: readonly string[]): string[] => [...value];\n\nconst cloneOptionalArray = (\n value: readonly string[] | undefined\n): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return [...value];\n};\n\nconst deepFreeze = <T>(value: T): T => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n const propertyNames = Object.getOwnPropertyNames(value);\n for (const name of propertyNames) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const property = (value as any)[name];\n if (property && typeof property === \"object\") {\n deepFreeze(property);\n }\n }\n\n return Object.freeze(value);\n};\n","export type EnvironmentFactory = () => string | undefined;\n\nconst sanitize = (value: string | undefined | null) => {\n if (value == null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n};\n\nexport class EnvironmentSelector {\n private readonly detectors: EnvironmentFactory[] = [];\n private fallback = \"default\";\n\n byLiteral(name: string): this {\n this.detectors.push(() => sanitize(name));\n return this;\n }\n\n byEnvironmentVariable(variable: string): this {\n this.detectors.push(() => sanitize(process.env[variable]));\n return this;\n }\n\n byFactory(factory: EnvironmentFactory): this {\n this.detectors.push(() => sanitize(factory()));\n return this;\n }\n\n defaultTo(name: string): this {\n const sanitized = sanitize(name);\n if (!sanitized) {\n throw new Error(\"Default environment name must be a non-empty string\");\n }\n this.fallback = sanitized;\n return this;\n }\n\n resolve(): string {\n for (const detector of this.detectors) {\n const detected = detector();\n if (detected) {\n return detected;\n }\n }\n return this.fallback;\n }\n}\n","import { z } from \"zod\";\n\nimport type { BuildHook, BuilderConfig, BuilderHooks, ModuleFormat, SourceMapSetting } from \"./builder-types\";\n\nexport const TimeUnitSchema = z.enum([\"ms\", \"s\", \"m\", \"h\"]);\n\nexport const TimeoutSchema = z\n .union([\n z.number().nonnegative(),\n z.tuple([z.number().nonnegative(), TimeUnitSchema]),\n z.object({\n value: z.number().nonnegative(),\n unit: TimeUnitSchema.optional(),\n }),\n ])\n .optional();\n\nexport const RunnerSchema = z.union([z.literal(\"jest\"), z.literal(\"vitest\"), z.literal(\"playwright\")]);\n\nexport const TagFilterSchema = z\n .string()\n .refine(\n (value) => value.startsWith(\"@\") || value.startsWith(\"not @\"),\n \"tag filter must start with `@` or `not @`\"\n )\n .optional();\n\nexport const TestSchema = z\n .object({\n timeout: TimeoutSchema,\n tagFilter: TagFilterSchema,\n groupLogging: z.boolean().optional(),\n })\n .partial();\n\nexport const ShimSchema = z.object({\n errorCause: z.boolean().optional(),\n});\n\nexport const PathSchema = z.array(z.string());\n\nexport const RootSchema = z\n .object({\n features: PathSchema,\n steps: PathSchema,\n support: PathSchema.optional(),\n })\n .catchall(PathSchema);\n\nexport const EventsSchema = z.array(z.string());\n\nexport const LoggingSchema = z\n .object({\n http: z.boolean().optional(),\n })\n .optional();\n\nexport const ReporterSchema = z\n .object({\n hierarchical: z\n .object({\n bufferOutput: z.boolean().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const ModuleFormatSchema: z.ZodType<ModuleFormat> = z.enum([\"cjs\", \"esm\"]);\n\nexport const PartialRootSchema = RootSchema.partial();\n\ntype ModuleDeclaration =\n | string\n | { readonly name: string; readonly submodules?: ModuleDeclaration[] | undefined };\n\nconst ModuleDeclarationSchema: z.ZodType<ModuleDeclaration> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n name: z.string().min(1),\n submodules: z.array(ModuleDeclarationSchema).optional(),\n }),\n ])\n);\n\nexport const ModulesConfigSchema = z.object({\n stepScoping: z.enum([\"global\", \"scoped\"]).optional(),\n relativeRoots: PartialRootSchema.optional(),\n groups: z\n .record(\n z.object({\n root: z.string(),\n modules: z.array(ModuleDeclarationSchema).nonempty(),\n })\n )\n .optional(),\n explicit: z.array(z.string()).optional(),\n});\n\nconst SourceMapSchema: z.ZodType<SourceMapSetting> = z.union([\n z.literal(true),\n z.literal(false),\n z.literal(\"inline\"),\n z.literal(\"external\"),\n]);\n\nconst BuildHookSchema: z.ZodType<BuildHook> = z.custom<BuildHook>((value) => {\n return typeof value === \"function\";\n}, {\n message: \"build hooks must be functions\",\n});\n\nconst BuilderHooksSchema: z.ZodType<BuilderHooks> = z.object({\n before: z.array(BuildHookSchema).optional(),\n after: z.array(BuildHookSchema).optional(),\n});\n\nexport const BuilderConfigSchema: z.ZodType<BuilderConfig> = z\n .object({\n format: ModuleFormatSchema.optional(),\n target: z.union([z.string(), z.array(z.string()).nonempty()]).optional(),\n sourcemap: SourceMapSchema.optional(),\n tsconfig: z.string().optional(),\n external: z.array(z.string()).optional(),\n outDir: z.string().optional(),\n hooks: BuilderHooksSchema.optional(),\n });\n\nexport const ExecutorConfigSchema = z.object({\n runner: RunnerSchema,\n test: TestSchema.optional(),\n roots: RootSchema,\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n\nexport const PartialExecutorConfigSchema = z.object({\n runner: RunnerSchema.optional(),\n test: TestSchema.optional(),\n roots: PartialRootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/environment-selector.ts","../src/schema.ts"],"names":["name","match"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\n\nimport { posix as pathPosix } from \"node:path\";\n\nimport { EnvironmentSelector } from \"./environment-selector\";\nimport {\n ExecutorConfigSchema,\n PartialExecutorConfigSchema,\n} from \"./schema\";\nimport {\n ConfigDefinition,\n ConfigDefinitionInput,\n BuilderConfig,\n ExecutorConfig,\n PartialExecutorConfig,\n PartialRootsConfig,\n ModulesConfig,\n ResolveOptions,\n ResolvedConfig,\n RootsConfig,\n ShimConfig,\n TestConfig,\n LoggingConfig,\n ReporterConfig,\n TimeoutSetting,\n} from \"./types\";\n\nexport class Config {\n private readonly definition: ConfigDefinition;\n\n constructor(definition: ConfigDefinition) {\n this.definition = definition;\n }\n\n resolve(options: ResolveOptions = {}): ResolvedConfig {\n const environment = this.resolveEnvironment(options);\n const override = this.definition.environments[environment] ?? {};\n const merged = mergeExecutorConfig(this.definition.default, override);\n const validated = ExecutorConfigSchema.parse(merged);\n const expanded = expandModules(validated, options.modules, options.groups);\n return {\n environment,\n config: deepFreeze(expanded),\n };\n }\n\n current(options?: ResolveOptions): ExecutorConfig {\n return this.resolve(options).config;\n }\n\n get environment(): string {\n return this.resolve().environment;\n }\n\n forEnvironment(environment: string): ExecutorConfig {\n return this.resolve({ environment }).config;\n }\n\n private resolveEnvironment(options: ResolveOptions): string {\n if (options.environment) {\n return this.assertEnvironment(options.environment);\n }\n const detected = this.definition.selector.resolve();\n return this.assertEnvironment(detected);\n }\n\n private assertEnvironment(environment: string): string {\n if (environment === \"default\") {\n return environment;\n }\n if (!this.definition.environments[environment]) {\n const available = [\n \"default\",\n ...Object.keys(this.definition.environments).filter(\n (name) => name !== \"default\"\n ),\n ];\n const options = available.length\n ? available.join(\", \")\n : \"(define environments to extend the default profile)\";\n throw new AutomationError(\n `Environment \"${environment}\" is not defined. Available environments: ${options}`\n );\n }\n return environment;\n }\n}\n\nexport const defineConfig = (input: ConfigDefinitionInput): Config => {\n const selector = new EnvironmentSelector();\n selector.defaultTo(\"default\");\n if (input.environment) {\n input.environment(selector);\n }\n\n const defaultConfig = deepFreeze(ExecutorConfigSchema.parse(input.default));\n const environments: Record<string, PartialExecutorConfig> = {};\n\n for (const [name, rawOverride] of Object.entries(input.environments ?? {})) {\n if (!name.trim()) {\n throw new AutomationError(\"Environment name must be a non-empty string\");\n }\n const override = rawOverride\n ? PartialExecutorConfigSchema.parse(rawOverride)\n : {};\n environments[name] = deepFreeze(override);\n }\n\n return new Config({\n default: defaultConfig,\n environments,\n selector,\n });\n};\n\nconst mergeExecutorConfig = (\n base: ExecutorConfig,\n override: PartialExecutorConfig\n): ExecutorConfig => {\n const result = cloneConfig(base);\n\n if (override.runner) {\n result.runner = override.runner;\n }\n\n if (override.test !== undefined) {\n result.test = mergeTest(result.test, override.test);\n }\n\n if (override.roots !== undefined) {\n result.roots = mergeRoots(result.roots, override.roots);\n }\n\n if (override.modules !== undefined) {\n result.modules = cloneModules(override.modules);\n }\n\n if (override.shim !== undefined) {\n result.shim = mergeShim(result.shim, override.shim);\n }\n\n if (override.events !== undefined) {\n result.events = cloneArray(override.events);\n }\n\n if (override.builder !== undefined) {\n result.builder = mergeBuilder(result.builder, override.builder);\n }\n\n if (override.logging !== undefined) {\n result.logging = mergeLogging(result.logging, override.logging);\n }\n\n if (override.reporting !== undefined) {\n result.reporting = mergeReporting(result.reporting, override.reporting);\n }\n\n return result;\n};\nconst expandModules = (\n config: ExecutorConfig,\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): ExecutorConfig => {\n const modulesConfig = config.modules;\n if (!modulesConfig) {\n return config;\n }\n\n const relativeRoots = modulesConfig.relativeRoots;\n const hasRelativeRoots = !!relativeRoots && Object.keys(relativeRoots).length > 0;\n if (!hasRelativeRoots) {\n const hasFilters =\n (moduleFilters?.some((m) => m.trim().length > 0) ?? false) ||\n (groupFilters?.some((g) => g.trim().length > 0) ?? false);\n\n // Allow \"modules\" to act as a module registry even when everything is hoisted,\n // but fail fast if the user provided filters expecting module expansion.\n if (hasFilters) {\n throw new AutomationError(\n 'Module filters were provided, but \"modules.relativeRoots\" is not configured. ' +\n 'Configure at least one relative root (e.g. { steps: [\"steps/**/*.ts\"] }) or remove -m/-g.'\n );\n }\n\n return config;\n }\n\n const moduleEntries = collectModuleEntries(modulesConfig);\n if (moduleEntries.length === 0) {\n throw new AutomationError(\n 'When \"modules\" is provided, at least one module must be declared via \"groups\" or \"explicit\".'\n );\n }\n\n const selectedModules = selectModules(moduleEntries, moduleFilters, groupFilters);\n const expandedByKey: Record<string, string[]> = {};\n\n for (const [key, entries] of Object.entries(relativeRoots)) {\n if (!entries || entries.length === 0) {\n continue;\n }\n\n const expanded: string[] = [];\n for (const moduleDir of selectedModules) {\n for (const entry of entries) {\n const joined = joinModuleEntry(moduleDir, entry);\n if (joined) {\n expanded.push(joined);\n }\n }\n }\n\n if (expanded.length > 0) {\n expandedByKey[key] = expanded;\n }\n }\n\n if (Object.keys(expandedByKey).length === 0) {\n return config;\n }\n\n const roots = cloneRoots(config.roots);\n for (const [key, expanded] of Object.entries(expandedByKey)) {\n const existing = roots[key] ?? [];\n roots[key] = [...expanded, ...existing];\n }\n\n return {\n ...config,\n roots,\n };\n};\n\ninterface ModuleEntry {\n readonly id: string;\n readonly dir: string;\n}\n\ntype ModuleDeclaration = NonNullable<NonNullable<ModulesConfig[\"groups\"]>[string][\"modules\"]>[number];\n\nconst flattenModuleDeclarations = (\n declarations: readonly ModuleDeclaration[],\n prefix = \"\"\n): string[] => {\n const flattened: string[] = [];\n\n const walk = (items: readonly ModuleDeclaration[], currentPrefix: string): void => {\n for (const item of items) {\n if (typeof item === \"string\") {\n const name = normalizeSlashes(item.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n flattened.push(normalizeSlashes(pathPosix.join(currentPrefix, name)));\n continue;\n }\n\n const name = normalizeSlashes(item.name.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!name) {\n continue;\n }\n\n const nextPrefix = normalizeSlashes(pathPosix.join(currentPrefix, name));\n // Always include the parent module path itself.\n flattened.push(nextPrefix);\n\n if (item.submodules && item.submodules.length > 0) {\n walk(item.submodules as readonly ModuleDeclaration[], nextPrefix);\n }\n }\n };\n\n const cleanedPrefix = normalizeSlashes(prefix.trim()).replace(/\\/+$/u, \"\");\n walk(declarations, cleanedPrefix);\n\n return Array.from(new Set(flattened));\n};\n\nconst collectModuleEntries = (modulesConfig: ModulesConfig): ModuleEntry[] => {\n const entries: ModuleEntry[] = [];\n const seen = new Set<string>();\n\n for (const [groupId, group] of Object.entries(modulesConfig.groups ?? {})) {\n const normalizedGroupId = groupId.trim();\n if (!normalizedGroupId) {\n continue;\n }\n\n const root = normalizeSlashes(group.root.trim()).replace(/\\/+$/u, \"\");\n if (!root) {\n continue;\n }\n\n const modulePaths = flattenModuleDeclarations(group.modules);\n\n for (const modulePath of modulePaths) {\n const cleaned = normalizeSlashes(modulePath.trim()).replace(/^\\/+|\\/+$/gu, \"\");\n if (!cleaned) {\n continue;\n }\n\n const dir = normalizeSlashes(pathPosix.join(root, cleaned));\n const id = `${normalizedGroupId}/${cleaned}`;\n const key = `${id}::${dir}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir });\n }\n }\n\n for (const explicit of modulesConfig.explicit ?? []) {\n const normalized = normalizeSlashes(explicit.trim());\n if (!normalized) {\n continue;\n }\n const id = normalized;\n const key = `${id}::${normalized}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n entries.push({ id, dir: normalized });\n }\n\n return entries;\n};\n\nconst selectModules = (\n moduleEntries: readonly ModuleEntry[],\n moduleFilters: readonly string[] | undefined,\n groupFilters: readonly string[] | undefined\n): string[] => {\n const options = moduleEntries.map((m) => ({\n id: normalizeSlashes(m.id),\n dir: normalizeSlashes(m.dir),\n group: normalizeSlashes(m.id.split(\"/\")[0] ?? \"\"),\n }));\n\n const groupFilterSet = new Set(\n (groupFilters ?? []).map((g) => normalizeSlashes(g.trim())).filter(Boolean)\n );\n\n const inGroupScope = (candidate: (typeof options)[number]): boolean => {\n if (groupFilterSet.size === 0) {\n return true;\n }\n return groupFilterSet.has(candidate.group);\n };\n\n const scopedOptions = options.filter(inGroupScope);\n if (groupFilterSet.size > 0 && scopedOptions.length === 0) {\n throw new AutomationError(\n `No modules found for group filter(s): ${Array.from(groupFilterSet).join(\", \")}. ` +\n `Available groups: ${Array.from(new Set(options.map((o) => o.group))).filter(Boolean).join(\", \")}`\n );\n }\n\n if (!moduleFilters || moduleFilters.length === 0) {\n return scopedOptions.map((o) => o.dir);\n }\n\n const scopedGroups = new Set(scopedOptions.map((o) => o.group).filter(Boolean));\n\n const selected = new Set<string>();\n\n for (const rawFilter of moduleFilters) {\n const filter = normalizeSlashes(rawFilter.trim());\n if (!filter) {\n continue;\n }\n\n const parsed = parseModuleSelector(filter, scopedGroups);\n\n // Exact selector: group/module[/...] or group:module[:...]\n if (parsed) {\n const wantedId = `${parsed.group}/${parsed.modulePath}`;\n const exact = scopedOptions.filter((o) => o.id === wantedId);\n if (exact.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n const match = exact[0];\n if (match) {\n selected.add(match.dir);\n }\n continue;\n }\n\n // Path/suffix selector: (must be unambiguous)\n // - \"orders\" matches \"<group>/orders\"\n // - \"orders/cancellations\" matches \"<group>/orders/cancellations\"\n // - \"orders:cancellations\" is treated as a path selector (\":\" => \"/\")\n const pathSelector = filter.includes(\":\") ? filter.split(\":\").join(\"/\") : filter;\n const suffixMatches = scopedOptions.filter((o) => o.id.endsWith(`/${pathSelector}`));\n if (suffixMatches.length === 0) {\n throw new AutomationError(\n `Module \"${rawFilter}\" not found. Available modules: ${scopedOptions.map((o) => o.id).join(\", \")}`\n );\n }\n if (suffixMatches.length > 1) {\n throw new AutomationError(\n `Module filter \"${rawFilter}\" is ambiguous. Candidates: ${suffixMatches.map((m) => m.id).join(\", \")}. ` +\n `Use \"<group>/<module>\" or \"<group>:<module>\" to disambiguate.`\n );\n }\n const match = suffixMatches[0];\n if (match) {\n selected.add(match.dir);\n }\n }\n\n return scopedOptions.map((o) => o.dir).filter((dir) => selected.has(dir));\n};\n\nconst parseModuleSelector = (\n selector: string,\n knownGroups: ReadonlySet<string>\n): { readonly group: string; readonly modulePath: string } | undefined => {\n if (!selector) {\n return undefined;\n }\n\n // Prefer ':' for deep exact selectors: group:module[:submodule...]\n if (selector.includes(\":\")) {\n const parts = selector.split(\":\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n // Also allow '/' for deep exact selectors: group/module[/submodule...]\n if (selector.includes(\"/\")) {\n const parts = selector.split(\"/\").map((p) => p.trim()).filter(Boolean);\n if (parts.length >= 2) {\n const group = parts[0];\n if (!group) {\n return undefined;\n }\n if (knownGroups.has(group)) {\n const modulePath = normalizeSlashes(parts.slice(1).join(\"/\")).replace(/^\\/+|\\/+$/gu, \"\");\n if (modulePath) {\n return { group, modulePath };\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst joinModuleEntry = (moduleDir: string, entry: string): string | undefined => {\n const moduleTrimmed = normalizeSlashes(moduleDir.trim()).replace(/\\/+$/u, \"\");\n if (!moduleTrimmed) {\n return undefined;\n }\n\n const entryTrimmed = normalizeSlashes(entry.trim());\n if (!entryTrimmed) {\n return undefined;\n }\n\n const negated = entryTrimmed.startsWith(\"!\");\n const raw = negated ? entryTrimmed.slice(1).trim() : entryTrimmed;\n\n if (!raw || raw === \".\") {\n return negated ? `!${moduleTrimmed}` : moduleTrimmed;\n }\n\n if (raw.startsWith(\"/\") || /^[A-Za-z]:\\//u.test(raw)) {\n return negated ? `!${raw}` : raw;\n }\n\n const joined = normalizeSlashes(pathPosix.join(moduleTrimmed, raw));\n return negated ? `!${joined}` : joined;\n};\n\nconst normalizeSlashes = (value: string): string => value.replace(/\\\\/gu, \"/\");\n\ntype LoggingConfigValue = NonNullable<LoggingConfig>;\ntype ReportingConfigValue = NonNullable<ReporterConfig>;\n\nconst mergeTest = (\n base: TestConfig | undefined,\n override: PartialExecutorConfig[\"test\"]\n): TestConfig | undefined => {\n if (override === undefined) {\n return base ? cloneTest(base) : undefined;\n }\n const result = base ? cloneTest(base) : {};\n\n if (override.timeout !== undefined) {\n result.timeout = cloneTimeout(override.timeout);\n }\n\n if (override.tagFilter !== undefined) {\n result.tagFilter = override.tagFilter;\n }\n\n if (override.groupLogging !== undefined) {\n result.groupLogging = override.groupLogging;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeShim = (\n base: ShimConfig | undefined,\n override: PartialExecutorConfig[\"shim\"]\n): ShimConfig | undefined => {\n if (override === undefined) {\n return base ? cloneShim(base) : undefined;\n }\n const result = base ? cloneShim(base) : {};\n\n if (override.errorCause !== undefined) {\n result.errorCause = override.errorCause;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeLogging = (\n base: LoggingConfig | undefined,\n override: PartialExecutorConfig[\"logging\"]\n): LoggingConfig | undefined => {\n if (override === undefined) {\n return base ? cloneLogging(base) : undefined;\n }\n\n const result: LoggingConfigValue = base ? cloneLogging(base) : {};\n\n if (override.http !== undefined) {\n result.http = override.http;\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeReporting = (\n base: ReporterConfig | undefined,\n override: PartialExecutorConfig[\"reporting\"]\n): ReporterConfig | undefined => {\n if (override === undefined) {\n return base ? cloneReporting(base) : undefined;\n }\n\n const result: ReportingConfigValue = base ? cloneReporting(base) : {};\n\n if (override.hierarchical !== undefined) {\n const hierarchicalOverride = override.hierarchical;\n if (hierarchicalOverride) {\n const hierarchical = result.hierarchical ? { ...result.hierarchical } : {};\n if (hierarchicalOverride.bufferOutput !== undefined) {\n hierarchical.bufferOutput = hierarchicalOverride.bufferOutput;\n }\n if (Object.keys(hierarchical).length > 0) {\n result.hierarchical = hierarchical;\n } else {\n delete result.hierarchical;\n }\n } else {\n delete result.hierarchical;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst mergeRoots = (\n base: RootsConfig,\n override: PartialRootsConfig | undefined\n): RootsConfig => {\n const result = cloneRoots(base);\n\n if (!override) {\n return result;\n }\n\n for (const [key, value] of Object.entries(override)) {\n if (value === undefined) {\n continue;\n }\n result[key] = cloneArray(value);\n }\n\n if (!result.features) {\n throw new AutomationError(\n 'Environment overrides removed required root \"features\"'\n );\n }\n\n if (!result.steps) {\n throw new AutomationError(\n 'Environment overrides removed required root \"steps\"'\n );\n }\n\n return result;\n};\n\nconst mergeBuilder = (\n base: BuilderConfig | undefined,\n override: BuilderConfig | undefined\n): BuilderConfig | undefined => {\n if (override === undefined) {\n return base ? cloneBuilder(base) : undefined;\n }\n\n const result = base ? cloneBuilder(base) : {};\n\n if (override.format !== undefined) {\n result.format = override.format;\n }\n\n if (override.target !== undefined) {\n result.target = Array.isArray(override.target)\n ? [...override.target]\n : override.target;\n }\n\n if (override.sourcemap !== undefined) {\n result.sourcemap = override.sourcemap;\n }\n\n if (override.tsconfig !== undefined) {\n result.tsconfig = override.tsconfig;\n }\n\n if (override.external !== undefined) {\n result.external = cloneArray(override.external);\n }\n\n if (override.outDir !== undefined) {\n result.outDir = override.outDir;\n }\n\n if (override.hooks !== undefined) {\n const clonedHooks = cloneBuilderHooks(override.hooks);\n if (clonedHooks) {\n result.hooks = clonedHooks;\n } else {\n delete result.hooks;\n }\n }\n\n return Object.keys(result).length === 0 ? undefined : result;\n};\n\nconst cloneConfig = (config: ExecutorConfig): ExecutorConfig => ({\n runner: config.runner,\n roots: cloneRoots(config.roots),\n modules: config.modules ? cloneModules(config.modules) : undefined,\n test: config.test ? cloneTest(config.test) : undefined,\n shim: config.shim ? cloneShim(config.shim) : undefined,\n events: cloneOptionalArray(config.events),\n builder: config.builder ? cloneBuilder(config.builder) : undefined,\n logging: config.logging ? cloneLogging(config.logging) : undefined,\n reporting: config.reporting ? cloneReporting(config.reporting) : undefined,\n});\n\nconst cloneRoots = (roots: RootsConfig): RootsConfig => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (value) {\n cloned[key] = cloneArray(value);\n }\n }\n return cloned as RootsConfig;\n};\n\nconst cloneRootRecord = (\n roots: Record<string, readonly string[] | undefined>\n): Record<string, string[]> => {\n const cloned: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(roots)) {\n if (!value) {\n continue;\n }\n cloned[key] = cloneArray(value);\n }\n return cloned;\n};\n\nconst cloneGroups = (\n groups: NonNullable<ModulesConfig[\"groups\"]>\n): NonNullable<ModulesConfig[\"groups\"]> => {\n const cloneModuleDeclaration = (value: ModuleDeclaration): ModuleDeclaration => {\n if (typeof value === \"string\") {\n return value;\n }\n return {\n name: value.name,\n submodules: value.submodules\n ? (value.submodules.map((child) => cloneModuleDeclaration(child as ModuleDeclaration)) as ModuleDeclaration[])\n : undefined,\n };\n };\n\n const cloned: Record<\n string,\n { root: string; modules: [ModuleDeclaration, ...ModuleDeclaration[]] }\n > = {};\n for (const [key, group] of Object.entries(groups)) {\n cloned[key] = {\n root: group.root,\n modules: group.modules.map((m) => cloneModuleDeclaration(m as ModuleDeclaration)) as [\n ModuleDeclaration,\n ...ModuleDeclaration[]\n ],\n };\n }\n return cloned as NonNullable<ModulesConfig[\"groups\"]>;\n};\n\nconst cloneModules = (modules: ModulesConfig): ModulesConfig => {\n const clone: ModulesConfig = {};\n\n if (modules.stepScoping) {\n clone.stepScoping = modules.stepScoping;\n }\n\n if (modules.hoistedFeatures) {\n clone.hoistedFeatures = {\n ...(modules.hoistedFeatures.scope ? { scope: modules.hoistedFeatures.scope } : {}),\n ...(modules.hoistedFeatures.strict !== undefined ? { strict: modules.hoistedFeatures.strict } : {}),\n };\n }\n\n if (modules.relativeRoots) {\n clone.relativeRoots = cloneRootRecord(modules.relativeRoots);\n }\n\n if (modules.groups) {\n clone.groups = cloneGroups(modules.groups);\n }\n\n if (modules.explicit) {\n clone.explicit = cloneArray(modules.explicit);\n }\n\n return clone;\n};\n\nconst cloneTest = (test: TestConfig): TestConfig => {\n const clone: TestConfig = {};\n if (test.timeout !== undefined) {\n clone.timeout = cloneTimeout(test.timeout);\n }\n if (test.tagFilter !== undefined) {\n clone.tagFilter = test.tagFilter;\n }\n if (test.groupLogging !== undefined) {\n clone.groupLogging = test.groupLogging;\n }\n return clone;\n};\n\nconst cloneShim = (shim: ShimConfig): ShimConfig => {\n const clone: ShimConfig = {};\n if (shim.errorCause !== undefined) {\n clone.errorCause = shim.errorCause;\n }\n return clone;\n};\n\nconst cloneLogging = (\n logging: LoggingConfigValue\n): LoggingConfigValue => {\n const clone: LoggingConfigValue = {};\n if (logging.http !== undefined) {\n clone.http = logging.http;\n }\n return clone;\n};\n\nconst cloneReporting = (\n reporting: ReportingConfigValue\n): ReportingConfigValue => {\n const clone: ReportingConfigValue = {};\n if (reporting.hierarchical) {\n clone.hierarchical = { ...reporting.hierarchical };\n }\n return clone;\n};\n\nconst cloneBuilder = (config: BuilderConfig): BuilderConfig => {\n const clone: BuilderConfig = {};\n\n if (config.format !== undefined) {\n clone.format = config.format;\n }\n\n if (config.target !== undefined) {\n clone.target = Array.isArray(config.target)\n ? [...config.target]\n : config.target;\n }\n\n if (config.sourcemap !== undefined) {\n clone.sourcemap = config.sourcemap;\n }\n\n if (config.tsconfig !== undefined) {\n clone.tsconfig = config.tsconfig;\n }\n\n if (config.external !== undefined) {\n clone.external = cloneArray(config.external);\n }\n\n if (config.outDir !== undefined) {\n clone.outDir = config.outDir;\n }\n\n if (config.hooks) {\n const clonedHooks = cloneBuilderHooks(config.hooks);\n if (clonedHooks) {\n clone.hooks = clonedHooks;\n }\n }\n\n return clone;\n};\n\nconst cloneBuilderHooks = (\n hooks: NonNullable<BuilderConfig[\"hooks\"]>\n): NonNullable<BuilderConfig[\"hooks\"]> | undefined => {\n const clone: NonNullable<BuilderConfig[\"hooks\"]> = {};\n\n if (hooks.before && hooks.before.length > 0) {\n clone.before = [...hooks.before];\n }\n\n if (hooks.after && hooks.after.length > 0) {\n clone.after = [...hooks.after];\n }\n\n return Object.keys(clone).length === 0 ? undefined : clone;\n};\n\nconst cloneTimeout = (\n timeout: TimeoutSetting | undefined\n): TimeoutSetting | undefined => {\n if (timeout === undefined) {\n return undefined;\n }\n if (typeof timeout === \"number\") {\n return timeout;\n }\n if (Array.isArray(timeout)) {\n const [value, unit] = timeout;\n return [value, unit] as TimeoutSetting;\n }\n return { ...timeout } as TimeoutSetting;\n};\n\nconst cloneArray = (value: readonly string[]): string[] => [...value];\n\nconst cloneOptionalArray = (\n value: readonly string[] | undefined\n): string[] | undefined => {\n if (value === undefined) {\n return undefined;\n }\n return [...value];\n};\n\nconst deepFreeze = <T>(value: T): T => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n const propertyNames = Object.getOwnPropertyNames(value);\n for (const name of propertyNames) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const property = (value as any)[name];\n if (property && typeof property === \"object\") {\n deepFreeze(property);\n }\n }\n\n return Object.freeze(value);\n};\n","export type EnvironmentFactory = () => string | undefined;\n\nconst sanitize = (value: string | undefined | null) => {\n if (value == null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n};\n\nexport class EnvironmentSelector {\n private readonly detectors: EnvironmentFactory[] = [];\n private fallback = \"default\";\n\n byLiteral(name: string): this {\n this.detectors.push(() => sanitize(name));\n return this;\n }\n\n byEnvironmentVariable(variable: string): this {\n this.detectors.push(() => sanitize(process.env[variable]));\n return this;\n }\n\n byFactory(factory: EnvironmentFactory): this {\n this.detectors.push(() => sanitize(factory()));\n return this;\n }\n\n defaultTo(name: string): this {\n const sanitized = sanitize(name);\n if (!sanitized) {\n throw new Error(\"Default environment name must be a non-empty string\");\n }\n this.fallback = sanitized;\n return this;\n }\n\n resolve(): string {\n for (const detector of this.detectors) {\n const detected = detector();\n if (detected) {\n return detected;\n }\n }\n return this.fallback;\n }\n}\n","import { z } from \"zod\";\n\nimport type { BuildHook, BuilderConfig, BuilderHooks, ModuleFormat, SourceMapSetting } from \"./builder-types\";\n\nexport const TimeUnitSchema = z.enum([\"ms\", \"s\", \"m\", \"h\"]);\n\nexport const TimeoutSchema = z\n .union([\n z.number().nonnegative(),\n z.tuple([z.number().nonnegative(), TimeUnitSchema]),\n z.object({\n value: z.number().nonnegative(),\n unit: TimeUnitSchema.optional(),\n }),\n ])\n .optional();\n\nexport const RunnerSchema = z.union([z.literal(\"jest\"), z.literal(\"vitest\"), z.literal(\"playwright\")]);\n\nexport const TagFilterSchema = z\n .string()\n .refine(\n (value) => value.startsWith(\"@\") || value.startsWith(\"not @\"),\n \"tag filter must start with `@` or `not @`\"\n )\n .optional();\n\nexport const TestSchema = z\n .object({\n timeout: TimeoutSchema,\n tagFilter: TagFilterSchema,\n groupLogging: z.boolean().optional(),\n })\n .partial();\n\nexport const ShimSchema = z.object({\n errorCause: z.boolean().optional(),\n});\n\nexport const PathSchema = z.array(z.string());\n\nexport const RootSchema = z\n .object({\n features: PathSchema,\n steps: PathSchema,\n support: PathSchema.optional(),\n })\n .catchall(PathSchema);\n\nexport const EventsSchema = z.array(z.string());\n\nexport const LoggingSchema = z\n .object({\n http: z.boolean().optional(),\n })\n .optional();\n\nexport const ReporterSchema = z\n .object({\n hierarchical: z\n .object({\n bufferOutput: z.boolean().optional(),\n })\n .optional(),\n })\n .optional();\n\nexport const ModuleFormatSchema: z.ZodType<ModuleFormat> = z.enum([\"cjs\", \"esm\"]);\n\nexport const PartialRootSchema = RootSchema.partial();\n\ntype ModuleDeclaration =\n | string\n | { readonly name: string; readonly submodules?: ModuleDeclaration[] | undefined };\n\nconst ModuleDeclarationSchema: z.ZodType<ModuleDeclaration> = z.lazy(() =>\n z.union([\n z.string(),\n z.object({\n name: z.string().min(1),\n submodules: z.array(ModuleDeclarationSchema).optional(),\n }),\n ])\n);\n\nexport const ModulesConfigSchema = z.object({\n stepScoping: z.enum([\"global\", \"scoped\"]).optional(),\n hoistedFeatures: z\n .object({\n scope: z.enum([\"tag\", \"directory\"]).optional(),\n strict: z.boolean().optional(),\n })\n .optional(),\n relativeRoots: PartialRootSchema.optional(),\n groups: z\n .record(\n z.object({\n root: z.string(),\n modules: z.array(ModuleDeclarationSchema).nonempty(),\n })\n )\n .optional(),\n explicit: z.array(z.string()).optional(),\n});\n\nconst SourceMapSchema: z.ZodType<SourceMapSetting> = z.union([\n z.literal(true),\n z.literal(false),\n z.literal(\"inline\"),\n z.literal(\"external\"),\n]);\n\nconst BuildHookSchema: z.ZodType<BuildHook> = z.custom<BuildHook>((value) => {\n return typeof value === \"function\";\n}, {\n message: \"build hooks must be functions\",\n});\n\nconst BuilderHooksSchema: z.ZodType<BuilderHooks> = z.object({\n before: z.array(BuildHookSchema).optional(),\n after: z.array(BuildHookSchema).optional(),\n});\n\nexport const BuilderConfigSchema: z.ZodType<BuilderConfig> = z\n .object({\n format: ModuleFormatSchema.optional(),\n target: z.union([z.string(), z.array(z.string()).nonempty()]).optional(),\n sourcemap: SourceMapSchema.optional(),\n tsconfig: z.string().optional(),\n external: z.array(z.string()).optional(),\n outDir: z.string().optional(),\n hooks: BuilderHooksSchema.optional(),\n });\n\nexport const ExecutorConfigSchema = z.object({\n runner: RunnerSchema,\n test: TestSchema.optional(),\n roots: RootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n}).superRefine((value, ctx) => {\n if (value.roots) {\n return;\n }\n\n const modules = value.modules;\n if (!modules) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"roots\"],\n message: '\"roots\" is required unless \"modules.relativeRoots\" defines at least \"features\" and \"steps\".',\n });\n return;\n }\n\n const declaredModules =\n (modules.explicit?.some((entry) => entry.trim().length > 0) ?? false) ||\n (modules.groups ? Object.keys(modules.groups).length > 0 : false);\n\n if (!declaredModules) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"modules\"],\n message:\n 'When omitting \"roots\", at least one module must be declared via \"modules.groups\" or \"modules.explicit\".',\n });\n }\n\n const relativeRoots = modules.relativeRoots;\n const hasFeatures =\n !!relativeRoots && Array.isArray(relativeRoots.features) && relativeRoots.features.length > 0;\n const hasSteps =\n !!relativeRoots && Array.isArray(relativeRoots.steps) && relativeRoots.steps.length > 0;\n\n if (!hasFeatures || !hasSteps) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"modules\", \"relativeRoots\"],\n message:\n 'When omitting \"roots\", \"modules.relativeRoots\" must include non-empty \"features\" and \"steps\" entries.',\n });\n }\n}).transform((value) => {\n return {\n ...value,\n roots: value.roots ?? {\n features: [],\n steps: [],\n },\n };\n});\n\nexport const PartialExecutorConfigSchema = z.object({\n runner: RunnerSchema.optional(),\n test: TestSchema.optional(),\n roots: PartialRootSchema.optional(),\n modules: ModulesConfigSchema.optional(),\n shim: ShimSchema.optional(),\n events: EventsSchema.optional(),\n builder: BuilderConfigSchema.optional(),\n logging: LoggingSchema.optional(),\n reporting: ReporterSchema.optional(),\n});\n"]}
package/dist/schema.d.ts CHANGED
@@ -107,6 +107,16 @@ type ModuleDeclaration = string | {
107
107
  };
108
108
  export declare const ModulesConfigSchema: z.ZodObject<{
109
109
  stepScoping: z.ZodOptional<z.ZodEnum<["global", "scoped"]>>;
110
+ hoistedFeatures: z.ZodOptional<z.ZodObject<{
111
+ scope: z.ZodOptional<z.ZodEnum<["tag", "directory"]>>;
112
+ strict: z.ZodOptional<z.ZodBoolean>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ scope?: "tag" | "directory" | undefined;
115
+ strict?: boolean | undefined;
116
+ }, {
117
+ scope?: "tag" | "directory" | undefined;
118
+ strict?: boolean | undefined;
119
+ }>>;
110
120
  relativeRoots: z.ZodOptional<z.ZodObject<{
111
121
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
112
122
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -133,6 +143,10 @@ export declare const ModulesConfigSchema: z.ZodObject<{
133
143
  explicit: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
134
144
  }, "strip", z.ZodTypeAny, {
135
145
  stepScoping?: "global" | "scoped" | undefined;
146
+ hoistedFeatures?: {
147
+ scope?: "tag" | "directory" | undefined;
148
+ strict?: boolean | undefined;
149
+ } | undefined;
136
150
  relativeRoots?: z.objectOutputType<{
137
151
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
138
152
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -145,6 +159,10 @@ export declare const ModulesConfigSchema: z.ZodObject<{
145
159
  explicit?: string[] | undefined;
146
160
  }, {
147
161
  stepScoping?: "global" | "scoped" | undefined;
162
+ hoistedFeatures?: {
163
+ scope?: "tag" | "directory" | undefined;
164
+ strict?: boolean | undefined;
165
+ } | undefined;
148
166
  relativeRoots?: z.objectInputType<{
149
167
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
150
168
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -157,7 +175,7 @@ export declare const ModulesConfigSchema: z.ZodObject<{
157
175
  explicit?: string[] | undefined;
158
176
  }>;
159
177
  export declare const BuilderConfigSchema: z.ZodType<BuilderConfig>;
160
- export declare const ExecutorConfigSchema: z.ZodObject<{
178
+ export declare const ExecutorConfigSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
161
179
  runner: z.ZodUnion<[z.ZodLiteral<"jest">, z.ZodLiteral<"vitest">, z.ZodLiteral<"playwright">]>;
162
180
  test: z.ZodOptional<z.ZodObject<{
163
181
  timeout: z.ZodOptional<z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodTuple<[z.ZodNumber, z.ZodEnum<["ms", "s", "m", "h"]>], null>, z.ZodObject<{
@@ -187,7 +205,7 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
187
205
  tagFilter?: string | undefined;
188
206
  groupLogging?: boolean | undefined;
189
207
  }>>;
190
- roots: z.ZodObject<{
208
+ roots: z.ZodOptional<z.ZodObject<{
191
209
  features: z.ZodArray<z.ZodString, "many">;
192
210
  steps: z.ZodArray<z.ZodString, "many">;
193
211
  support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -199,9 +217,19 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
199
217
  features: z.ZodArray<z.ZodString, "many">;
200
218
  steps: z.ZodArray<z.ZodString, "many">;
201
219
  support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
202
- }, z.ZodArray<z.ZodString, "many">, "strip">>;
220
+ }, z.ZodArray<z.ZodString, "many">, "strip">>>;
203
221
  modules: z.ZodOptional<z.ZodObject<{
204
222
  stepScoping: z.ZodOptional<z.ZodEnum<["global", "scoped"]>>;
223
+ hoistedFeatures: z.ZodOptional<z.ZodObject<{
224
+ scope: z.ZodOptional<z.ZodEnum<["tag", "directory"]>>;
225
+ strict: z.ZodOptional<z.ZodBoolean>;
226
+ }, "strip", z.ZodTypeAny, {
227
+ scope?: "tag" | "directory" | undefined;
228
+ strict?: boolean | undefined;
229
+ }, {
230
+ scope?: "tag" | "directory" | undefined;
231
+ strict?: boolean | undefined;
232
+ }>>;
205
233
  relativeRoots: z.ZodOptional<z.ZodObject<{
206
234
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
207
235
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -228,6 +256,10 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
228
256
  explicit: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
229
257
  }, "strip", z.ZodTypeAny, {
230
258
  stepScoping?: "global" | "scoped" | undefined;
259
+ hoistedFeatures?: {
260
+ scope?: "tag" | "directory" | undefined;
261
+ strict?: boolean | undefined;
262
+ } | undefined;
231
263
  relativeRoots?: z.objectOutputType<{
232
264
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
233
265
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -240,6 +272,10 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
240
272
  explicit?: string[] | undefined;
241
273
  }, {
242
274
  stepScoping?: "global" | "scoped" | undefined;
275
+ hoistedFeatures?: {
276
+ scope?: "tag" | "directory" | undefined;
277
+ strict?: boolean | undefined;
278
+ } | undefined;
243
279
  relativeRoots?: z.objectInputType<{
244
280
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
245
281
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -286,15 +322,12 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
286
322
  }>>>;
287
323
  }, "strip", z.ZodTypeAny, {
288
324
  runner: "jest" | "vitest" | "playwright";
289
- roots: {
290
- features: string[];
291
- steps: string[];
292
- support?: string[] | undefined;
293
- } & {
294
- [k: string]: string[];
295
- };
296
325
  modules?: {
297
326
  stepScoping?: "global" | "scoped" | undefined;
327
+ hoistedFeatures?: {
328
+ scope?: "tag" | "directory" | undefined;
329
+ strict?: boolean | undefined;
330
+ } | undefined;
298
331
  relativeRoots?: z.objectOutputType<{
299
332
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
300
333
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -314,6 +347,11 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
314
347
  tagFilter?: string | undefined;
315
348
  groupLogging?: boolean | undefined;
316
349
  } | undefined;
350
+ roots?: z.objectOutputType<{
351
+ features: z.ZodArray<z.ZodString, "many">;
352
+ steps: z.ZodArray<z.ZodString, "many">;
353
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
354
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
317
355
  shim?: {
318
356
  errorCause?: boolean | undefined;
319
357
  } | undefined;
@@ -329,15 +367,12 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
329
367
  } | undefined;
330
368
  }, {
331
369
  runner: "jest" | "vitest" | "playwright";
332
- roots: {
333
- features: string[];
334
- steps: string[];
335
- support?: string[] | undefined;
336
- } & {
337
- [k: string]: string[];
338
- };
339
370
  modules?: {
340
371
  stepScoping?: "global" | "scoped" | undefined;
372
+ hoistedFeatures?: {
373
+ scope?: "tag" | "directory" | undefined;
374
+ strict?: boolean | undefined;
375
+ } | undefined;
341
376
  relativeRoots?: z.objectInputType<{
342
377
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
343
378
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -357,6 +392,191 @@ export declare const ExecutorConfigSchema: z.ZodObject<{
357
392
  tagFilter?: string | undefined;
358
393
  groupLogging?: boolean | undefined;
359
394
  } | undefined;
395
+ roots?: z.objectInputType<{
396
+ features: z.ZodArray<z.ZodString, "many">;
397
+ steps: z.ZodArray<z.ZodString, "many">;
398
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
399
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
400
+ shim?: {
401
+ errorCause?: boolean | undefined;
402
+ } | undefined;
403
+ events?: string[] | undefined;
404
+ builder?: BuilderConfig | undefined;
405
+ logging?: {
406
+ http?: boolean | undefined;
407
+ } | undefined;
408
+ reporting?: {
409
+ hierarchical?: {
410
+ bufferOutput?: boolean | undefined;
411
+ } | undefined;
412
+ } | undefined;
413
+ }>, {
414
+ runner: "jest" | "vitest" | "playwright";
415
+ modules?: {
416
+ stepScoping?: "global" | "scoped" | undefined;
417
+ hoistedFeatures?: {
418
+ scope?: "tag" | "directory" | undefined;
419
+ strict?: boolean | undefined;
420
+ } | undefined;
421
+ relativeRoots?: z.objectOutputType<{
422
+ features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
423
+ steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
424
+ support: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
425
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
426
+ groups?: Record<string, {
427
+ root: string;
428
+ modules: [ModuleDeclaration, ...ModuleDeclaration[]];
429
+ }> | undefined;
430
+ explicit?: string[] | undefined;
431
+ } | undefined;
432
+ test?: {
433
+ timeout?: number | [number, "ms" | "s" | "m" | "h"] | {
434
+ value: number;
435
+ unit?: "ms" | "s" | "m" | "h" | undefined;
436
+ } | undefined;
437
+ tagFilter?: string | undefined;
438
+ groupLogging?: boolean | undefined;
439
+ } | undefined;
440
+ roots?: z.objectOutputType<{
441
+ features: z.ZodArray<z.ZodString, "many">;
442
+ steps: z.ZodArray<z.ZodString, "many">;
443
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
444
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
445
+ shim?: {
446
+ errorCause?: boolean | undefined;
447
+ } | undefined;
448
+ events?: string[] | undefined;
449
+ builder?: BuilderConfig | undefined;
450
+ logging?: {
451
+ http?: boolean | undefined;
452
+ } | undefined;
453
+ reporting?: {
454
+ hierarchical?: {
455
+ bufferOutput?: boolean | undefined;
456
+ } | undefined;
457
+ } | undefined;
458
+ }, {
459
+ runner: "jest" | "vitest" | "playwright";
460
+ modules?: {
461
+ stepScoping?: "global" | "scoped" | undefined;
462
+ hoistedFeatures?: {
463
+ scope?: "tag" | "directory" | undefined;
464
+ strict?: boolean | undefined;
465
+ } | undefined;
466
+ relativeRoots?: z.objectInputType<{
467
+ features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
468
+ steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
469
+ support: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
470
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
471
+ groups?: Record<string, {
472
+ root: string;
473
+ modules: [ModuleDeclaration, ...ModuleDeclaration[]];
474
+ }> | undefined;
475
+ explicit?: string[] | undefined;
476
+ } | undefined;
477
+ test?: {
478
+ timeout?: number | [number, "ms" | "s" | "m" | "h"] | {
479
+ value: number;
480
+ unit?: "ms" | "s" | "m" | "h" | undefined;
481
+ } | undefined;
482
+ tagFilter?: string | undefined;
483
+ groupLogging?: boolean | undefined;
484
+ } | undefined;
485
+ roots?: z.objectInputType<{
486
+ features: z.ZodArray<z.ZodString, "many">;
487
+ steps: z.ZodArray<z.ZodString, "many">;
488
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
489
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
490
+ shim?: {
491
+ errorCause?: boolean | undefined;
492
+ } | undefined;
493
+ events?: string[] | undefined;
494
+ builder?: BuilderConfig | undefined;
495
+ logging?: {
496
+ http?: boolean | undefined;
497
+ } | undefined;
498
+ reporting?: {
499
+ hierarchical?: {
500
+ bufferOutput?: boolean | undefined;
501
+ } | undefined;
502
+ } | undefined;
503
+ }>, {
504
+ roots: z.objectOutputType<{
505
+ features: z.ZodArray<z.ZodString, "many">;
506
+ steps: z.ZodArray<z.ZodString, "many">;
507
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
508
+ }, z.ZodArray<z.ZodString, "many">, "strip">;
509
+ runner: "jest" | "vitest" | "playwright";
510
+ modules?: {
511
+ stepScoping?: "global" | "scoped" | undefined;
512
+ hoistedFeatures?: {
513
+ scope?: "tag" | "directory" | undefined;
514
+ strict?: boolean | undefined;
515
+ } | undefined;
516
+ relativeRoots?: z.objectOutputType<{
517
+ features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
518
+ steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
519
+ support: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
520
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
521
+ groups?: Record<string, {
522
+ root: string;
523
+ modules: [ModuleDeclaration, ...ModuleDeclaration[]];
524
+ }> | undefined;
525
+ explicit?: string[] | undefined;
526
+ } | undefined;
527
+ test?: {
528
+ timeout?: number | [number, "ms" | "s" | "m" | "h"] | {
529
+ value: number;
530
+ unit?: "ms" | "s" | "m" | "h" | undefined;
531
+ } | undefined;
532
+ tagFilter?: string | undefined;
533
+ groupLogging?: boolean | undefined;
534
+ } | undefined;
535
+ shim?: {
536
+ errorCause?: boolean | undefined;
537
+ } | undefined;
538
+ events?: string[] | undefined;
539
+ builder?: BuilderConfig | undefined;
540
+ logging?: {
541
+ http?: boolean | undefined;
542
+ } | undefined;
543
+ reporting?: {
544
+ hierarchical?: {
545
+ bufferOutput?: boolean | undefined;
546
+ } | undefined;
547
+ } | undefined;
548
+ }, {
549
+ runner: "jest" | "vitest" | "playwright";
550
+ modules?: {
551
+ stepScoping?: "global" | "scoped" | undefined;
552
+ hoistedFeatures?: {
553
+ scope?: "tag" | "directory" | undefined;
554
+ strict?: boolean | undefined;
555
+ } | undefined;
556
+ relativeRoots?: z.objectInputType<{
557
+ features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
558
+ steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
559
+ support: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
560
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
561
+ groups?: Record<string, {
562
+ root: string;
563
+ modules: [ModuleDeclaration, ...ModuleDeclaration[]];
564
+ }> | undefined;
565
+ explicit?: string[] | undefined;
566
+ } | undefined;
567
+ test?: {
568
+ timeout?: number | [number, "ms" | "s" | "m" | "h"] | {
569
+ value: number;
570
+ unit?: "ms" | "s" | "m" | "h" | undefined;
571
+ } | undefined;
572
+ tagFilter?: string | undefined;
573
+ groupLogging?: boolean | undefined;
574
+ } | undefined;
575
+ roots?: z.objectInputType<{
576
+ features: z.ZodArray<z.ZodString, "many">;
577
+ steps: z.ZodArray<z.ZodString, "many">;
578
+ support: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
579
+ }, z.ZodArray<z.ZodString, "many">, "strip"> | undefined;
360
580
  shim?: {
361
581
  errorCause?: boolean | undefined;
362
582
  } | undefined;
@@ -416,6 +636,16 @@ export declare const PartialExecutorConfigSchema: z.ZodObject<{
416
636
  }, z.ZodArray<z.ZodString, "many">, "strip">>>;
417
637
  modules: z.ZodOptional<z.ZodObject<{
418
638
  stepScoping: z.ZodOptional<z.ZodEnum<["global", "scoped"]>>;
639
+ hoistedFeatures: z.ZodOptional<z.ZodObject<{
640
+ scope: z.ZodOptional<z.ZodEnum<["tag", "directory"]>>;
641
+ strict: z.ZodOptional<z.ZodBoolean>;
642
+ }, "strip", z.ZodTypeAny, {
643
+ scope?: "tag" | "directory" | undefined;
644
+ strict?: boolean | undefined;
645
+ }, {
646
+ scope?: "tag" | "directory" | undefined;
647
+ strict?: boolean | undefined;
648
+ }>>;
419
649
  relativeRoots: z.ZodOptional<z.ZodObject<{
420
650
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
421
651
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -442,6 +672,10 @@ export declare const PartialExecutorConfigSchema: z.ZodObject<{
442
672
  explicit: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
443
673
  }, "strip", z.ZodTypeAny, {
444
674
  stepScoping?: "global" | "scoped" | undefined;
675
+ hoistedFeatures?: {
676
+ scope?: "tag" | "directory" | undefined;
677
+ strict?: boolean | undefined;
678
+ } | undefined;
445
679
  relativeRoots?: z.objectOutputType<{
446
680
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
447
681
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -454,6 +688,10 @@ export declare const PartialExecutorConfigSchema: z.ZodObject<{
454
688
  explicit?: string[] | undefined;
455
689
  }, {
456
690
  stepScoping?: "global" | "scoped" | undefined;
691
+ hoistedFeatures?: {
692
+ scope?: "tag" | "directory" | undefined;
693
+ strict?: boolean | undefined;
694
+ } | undefined;
457
695
  relativeRoots?: z.objectInputType<{
458
696
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
459
697
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -501,6 +739,10 @@ export declare const PartialExecutorConfigSchema: z.ZodObject<{
501
739
  }, "strip", z.ZodTypeAny, {
502
740
  modules?: {
503
741
  stepScoping?: "global" | "scoped" | undefined;
742
+ hoistedFeatures?: {
743
+ scope?: "tag" | "directory" | undefined;
744
+ strict?: boolean | undefined;
745
+ } | undefined;
504
746
  relativeRoots?: z.objectOutputType<{
505
747
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
506
748
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
@@ -542,6 +784,10 @@ export declare const PartialExecutorConfigSchema: z.ZodObject<{
542
784
  }, {
543
785
  modules?: {
544
786
  stepScoping?: "global" | "scoped" | undefined;
787
+ hoistedFeatures?: {
788
+ scope?: "tag" | "directory" | undefined;
789
+ strict?: boolean | undefined;
790
+ } | undefined;
545
791
  relativeRoots?: z.objectInputType<{
546
792
  features: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
547
793
  steps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
package/dist/types.d.ts CHANGED
@@ -2,7 +2,8 @@ import { z } from "zod";
2
2
  import { EnvironmentSelector } from "./environment-selector";
3
3
  import { ExecutorConfigSchema, PartialExecutorConfigSchema, PartialRootSchema, ModulesConfigSchema } from "./schema";
4
4
  import type { BuilderConfig, BuilderHooks, BuildHook, BuildHookContext, ModuleFormat, SourceMapSetting } from "./builder-types";
5
- export type ExecutorConfig = z.infer<typeof ExecutorConfigSchema>;
5
+ export type ExecutorConfig = z.output<typeof ExecutorConfigSchema>;
6
+ export type ExecutorConfigInput = z.input<typeof ExecutorConfigSchema>;
6
7
  export type PartialExecutorConfig = z.infer<typeof PartialExecutorConfigSchema>;
7
8
  export type PartialRootsConfig = z.infer<typeof PartialRootSchema>;
8
9
  export type ModulesConfig = z.infer<typeof ModulesConfigSchema>;
@@ -15,7 +16,7 @@ export type RootsConfig = ExecutorConfig["roots"];
15
16
  export type LoggingConfig = ExecutorConfig["logging"];
16
17
  export type ReporterConfig = ExecutorConfig["reporting"];
17
18
  export interface ConfigDefinitionInput {
18
- default: ExecutorConfig;
19
+ default: ExecutorConfigInput;
19
20
  environments?: Record<string, PartialExecutorConfig | undefined>;
20
21
  environment?: (selector: EnvironmentSelector) => void;
21
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autometa/config",
3
- "version": "1.0.0-rc.2",
3
+ "version": "1.0.0-rc.3",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -26,9 +26,9 @@
26
26
  "tsup": "^7.2.0",
27
27
  "typescript": "^4.9.5",
28
28
  "vitest": "1.4.0",
29
+ "tsconfig": "0.7.0",
29
30
  "eslint-config-custom": "0.6.0",
30
- "tsup-config": "0.1.0",
31
- "tsconfig": "0.7.0"
31
+ "tsup-config": "0.1.0"
32
32
  },
33
33
  "dependencies": {
34
34
  "zod": "^3.25.76",