@autometa/config 1.0.0-rc.1 → 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 +53 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +53 -1
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +263 -17
- package/dist/types.d.ts +7 -6
- package/package.json +3 -3
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
|
}
|
package/dist/index.cjs.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/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.
|
|
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:
|
|
19
|
+
default: ExecutorConfigInput;
|
|
19
20
|
environments?: Record<string, PartialExecutorConfig | undefined>;
|
|
20
21
|
environment?: (selector: EnvironmentSelector) => void;
|
|
21
22
|
}
|
|
@@ -28,10 +29,10 @@ export interface ResolveOptions {
|
|
|
28
29
|
environment?: string;
|
|
29
30
|
/**
|
|
30
31
|
* Module selectors. Accepted forms:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
* - "<group>/<modulePath>" (exact; supports deep paths)
|
|
33
|
+
* - "<group>:<modulePath>" (exact; supports deep paths via ":" segments)
|
|
34
|
+
* - "<modulePath>" (suffix/path match, must be unambiguous; can be combined with group filters)
|
|
35
|
+
* - Examples: "orders", "orders/cancellations", "orders:cancellations"
|
|
35
36
|
*/
|
|
36
37
|
modules?: readonly string[];
|
|
37
38
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@autometa/config",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
"tsup": "^7.2.0",
|
|
27
27
|
"typescript": "^4.9.5",
|
|
28
28
|
"vitest": "1.4.0",
|
|
29
|
-
"eslint-config-custom": "0.6.0",
|
|
30
29
|
"tsconfig": "0.7.0",
|
|
30
|
+
"eslint-config-custom": "0.6.0",
|
|
31
31
|
"tsup-config": "0.1.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"zod": "^3.25.76",
|
|
35
|
-
"@autometa/errors": "1.0.0-rc.
|
|
35
|
+
"@autometa/errors": "1.0.0-rc.2"
|
|
36
36
|
},
|
|
37
37
|
"scripts": {
|
|
38
38
|
"type-check": "tsc --noEmit -p tsconfig.dev.json",
|