zcb 0.3.7 → 0.3.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","sources":["../../src/transformers/removeDisabledSlices.ts","../../src/utils/transformConfig.ts","../../src/utils/transformWriteConfig.ts","../../src/transformers/setupExperiments.ts","../../src/utils/importValidateTransformWriteConfig.ts","../../src/cli.ts"],"sourcesContent":["import { type AnyRecord, type TransformConfigHandlerSync } from '../types.ts';\n\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config,\n) => {\n if ('__disabled' in config) {\n return {\n action: 'DELETE_NODE',\n };\n }\n\n return {\n value: clone,\n };\n};\n","import { castArray, isPlainObject } from 'lodash-es';\nimport { type AnyRecord, type TransformConfigHandler, type TransformConfigHandlerSync } from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArray = (list: any[], handler: TransformConfigHandler | TransformConfigHandler[]): Promise<any[]> =>\n Promise.all(\n list.map(entry => {\n if (isPlainObject(entry)) {\n return transformConfig(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n return transformArray(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n }),\n );\n\nexport const transformConfig = async <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandler | TransformConfigHandler[] = [],\n): Promise<Config> => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = await Promise.resolve(callback(transform, config));\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n const value = config[key];\n\n if (isPlainObject(value)) {\n transform[key] = await transformConfig(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = (await transformArray(value, handler)) as Config[Extract<keyof Config, string>];\n } else {\n transform[key] = value;\n }\n }\n\n return transform;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArraySync = (list: any[], handler: TransformConfigHandlerSync | TransformConfigHandlerSync[]): any[] =>\n list.map(entry => {\n if (isPlainObject(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformConfigSync(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformArraySync(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n });\n\nexport const transformConfigSync = <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandlerSync | TransformConfigHandlerSync[] = [],\n): Config => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = callback(transform, config);\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n // TODO: Need to look at this\n\n const value = config[key];\n\n if (isPlainObject(value)) {\n // TODO: Need to look at this\n\n transform[key] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\n // TODO: Need to look at this\n\n transform[key] = value;\n }\n }\n\n return transform;\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport Handlebars from 'handlebars';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport shelljs from 'shelljs';\nimport { removeDisabledSlices } from '../transformers/removeDisabledSlices.ts';\nimport { setupExperiments } from '../transformers/setupExperiments.ts';\nimport { type TransformConfigHandler, type WriteConfigOptions } from '../types.ts';\nimport { transformConfig } from './transformConfig.ts';\n\nexport const transformWriteConfig = async <Config extends object>(\n config: Config,\n { experimentsCallback, outputFile }: WriteConfigOptions,\n): Promise<void> => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n\n const template = Handlebars.compile(\n readFileSync(path.resolve(dirname, '../templates/config.ts.hbs'), { encoding: 'utf8' }),\n );\n\n const output = template({\n config: JSON.stringify(\n await transformConfig(config, handlers),\n (_k, v: unknown) => (v === undefined ? 'undefined' : v),\n 2,\n ),\n })\n .replaceAll(/\"([A-Za-z][\\dA-Za-z]+)\":/g, '$1:')\n .replaceAll('\"undefined\"', 'undefined');\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(path.resolve(process.cwd(), outputFile), output);\n};\n","import { type AnyRecord, type SetupExperimentsCallback, type TransformConfigHandler } from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if ('__experiment' in config && typeof config.__experiment === 'string') {\n const buckets = await callback(config.__experiment, clone, config);\n\n // @ts-expect-error private property\n clone.__experiment = {\n buckets,\n id: config.__experiment,\n };\n\n return {\n value: clone,\n };\n }\n\n return {\n value: clone,\n };\n };\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport { type CliCommands } from '../cli.ts';\nimport { type ConfigBuilder } from '../createConfigBuilder.ts';\nimport { type SetupExperimentsCallback } from '../types.ts';\nimport { transformWriteConfig } from './transformWriteConfig.ts';\n\nexport const importValidateTransformWriteConfig = (\n inputFile: string,\n outputFile: string,\n command: CliCommands,\n experimentCallbackFile?: string,\n): void => {\n import(resolve(process.cwd(), inputFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: configBuilder }: { default: ConfigBuilder<object> }) => {\n if (!configBuilder.$validate()) {\n shelljs.echo(`zcd ${command} => invalid config`);\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n shelljs.echo(`zcd ${command} => errors:\\n${JSON.stringify(configBuilder.$errors(), undefined, 2)}\\n`);\n shelljs.exit(1);\n }\n\n shelljs.echo('zcd ${command} => valid config');\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n\n if (experimentCallbackFile) {\n import(resolve(process.cwd(), experimentCallbackFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs, { type Argv } from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport type CliCommands = 'build' | 'watch';\n\nexport type CliArguments = Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n}>;\n\nconst generateArguments = (cmdYargs: Argv): CliArguments =>\n cmdYargs\n .positional('input-file', {\n demandOption: true,\n desc: 'The relative path to the config builder root file',\n type: 'string',\n })\n .positional('output-file', {\n demandOption: true,\n desc: 'The relative path to the output config file',\n type: 'string',\n })\n .option('experiments-callback-file', {\n desc: 'The relative path to the experiment callback file',\n type: 'string',\n });\n\nexport const cli = (): void => {\n // yargs does not provide a way to pass generic to type args.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const argv = yargs(hideBin(process.argv)) as Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n }>;\n\n void argv\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd watch => watching file: ${cmdYargs['input-file']}`);\n\n watchFile(resolve(process.cwd(), cmdYargs['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'watch',\n cmdYargs['experiments-callback-file'],\n );\n });\n },\n )\n .command(\n 'build <input-file> <output-file>',\n 'Write config from a config builder',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd build => building file: ${cmdYargs['input-file']}`);\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'build',\n cmdYargs['experiments-callback-file'],\n );\n },\n )\n .help()\n .parseAsync();\n};\n"],"names":["removeDisabledSlices","clone","config","action","value","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","async","transform","handlers","castArray","callback","result","resolve","key","transformWriteConfig","experimentsCallback","outputFile","push","__experiment","buckets","id","dirname","path","fileURLToPath","document","require","pathToFileURL","__filename","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","output","Handlebars","compile","readFileSync","encoding","template","JSON","stringify","_k","v","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","import","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","generateArguments","cmdYargs","positional","demandOption","desc","type","option","yargs","hideBin","argv","watchFile","help","parseAsync"],"mappings":"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"}
1
+ {"version":3,"file":"cli.cjs","sources":["../../src/transformers/removeDisabledSlices.ts","../../src/utils/transformConfig.ts","../../src/utils/transformWriteConfig.ts","../../src/transformers/setupExperiments.ts","../../src/utils/importValidateTransformWriteConfig.ts","../../src/cli.ts"],"sourcesContent":["import { type AnyRecord, type TransformConfigHandlerSync } from '../types.ts';\n\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config,\n) => {\n if ('__disabled' in config) {\n return {\n action: 'DELETE_NODE',\n };\n }\n\n return {\n value: clone,\n };\n};\n","import { castArray, isPlainObject } from 'lodash-es';\nimport { type AnyRecord, type TransformConfigHandler, type TransformConfigHandlerSync } from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArray = (list: any[], handler: TransformConfigHandler | TransformConfigHandler[]): Promise<any[]> =>\n Promise.all(\n list.map(entry => {\n if (isPlainObject(entry)) {\n return transformConfig(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n return transformArray(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n }),\n );\n\nexport const transformConfig = async <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandler | TransformConfigHandler[] = [],\n): Promise<Config> => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = await Promise.resolve(callback(transform, config));\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n const value = config[key];\n\n if (isPlainObject(value)) {\n transform[key] = await transformConfig(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = (await transformArray(value, handler)) as Config[Extract<keyof Config, string>];\n } else {\n transform[key] = value;\n }\n }\n\n return transform;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArraySync = (list: any[], handler: TransformConfigHandlerSync | TransformConfigHandlerSync[]): any[] =>\n list.map(entry => {\n if (isPlainObject(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformConfigSync(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformArraySync(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n });\n\nexport const transformConfigSync = <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandlerSync | TransformConfigHandlerSync[] = [],\n): Config => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = callback(transform, config);\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n // TODO: Need to look at this\n\n const value = config[key];\n\n if (isPlainObject(value)) {\n // TODO: Need to look at this\n\n transform[key] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\n // TODO: Need to look at this\n\n transform[key] = value;\n }\n }\n\n return transform;\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport Handlebars from 'handlebars';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport shelljs from 'shelljs';\nimport { removeDisabledSlices } from '../transformers/removeDisabledSlices.ts';\nimport { setupExperiments } from '../transformers/setupExperiments.ts';\nimport { type TransformConfigHandler, type WriteConfigOptions } from '../types.ts';\nimport { transformConfig } from './transformConfig.ts';\n\nexport const transformWriteConfig = async <Config extends object>(\n config: Config,\n { experimentsCallback, outputFile }: WriteConfigOptions,\n): Promise<void> => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n\n const template = Handlebars.compile(\n readFileSync(path.resolve(dirname, '../templates/config.ts.hbs'), { encoding: 'utf8' }),\n );\n\n const output = template({\n config: JSON.stringify(\n await transformConfig(config, handlers),\n (_k, v: unknown) => (v === undefined ? 'undefined' : v),\n 2,\n ),\n })\n .replaceAll(/\"([A-Za-z][\\dA-Za-z]+)\":/g, '$1:')\n .replaceAll('\"undefined\"', 'undefined');\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(path.resolve(process.cwd(), outputFile), output);\n};\n","import { type AnyRecord, type SetupExperimentsCallback, type TransformConfigHandler } from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if ('__experiment' in config && typeof config.__experiment === 'string') {\n const buckets = await callback(config.__experiment, clone, config);\n\n // @ts-expect-error private property\n clone.__experiment = {\n buckets,\n id: config.__experiment,\n };\n\n return {\n value: clone,\n };\n }\n\n return {\n value: clone,\n };\n };\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport { type CliCommands } from '../cli.ts';\nimport { type ConfigBuilder } from '../createConfigBuilder.ts';\nimport { type SetupExperimentsCallback } from '../types.ts';\nimport { transformWriteConfig } from './transformWriteConfig.ts';\n\nexport const importValidateTransformWriteConfig = (\n inputFile: string,\n outputFile: string,\n command: CliCommands,\n experimentCallbackFile?: string,\n): void => {\n import(resolve(process.cwd(), inputFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: configBuilder }: { default: ConfigBuilder<object> }) => {\n if (!configBuilder.$validate()) {\n shelljs.echo(`zcd ${command} => invalid config`);\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n shelljs.echo(`zcd ${command} => errors:\\n${JSON.stringify(configBuilder.$errors(), undefined, 2)}\\n`);\n shelljs.exit(1);\n }\n\n shelljs.echo('zcd ${command} => valid config');\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n\n if (experimentCallbackFile) {\n import(resolve(process.cwd(), experimentCallbackFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs, { type Argv } from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport type CliCommands = 'build' | 'watch';\n\nexport type CliArguments = Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n}>;\n\nconst generateArguments = (cmdYargs: Argv): CliArguments =>\n cmdYargs\n .positional('input-file', {\n demandOption: true,\n desc: 'The relative path to the config builder root file',\n type: 'string',\n })\n .positional('output-file', {\n demandOption: true,\n desc: 'The relative path to the output config file',\n type: 'string',\n })\n .option('experiments-callback-file', {\n desc: 'The relative path to the experiment callback file',\n type: 'string',\n });\n\nexport const cli = (): void => {\n // yargs does not provide a way to pass generic to type args.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const argv = yargs(hideBin(process.argv)) as Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n }>;\n\n void argv\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd watch => watching file: ${cmdYargs['input-file']}`);\n\n watchFile(resolve(process.cwd(), cmdYargs['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'watch',\n cmdYargs['experiments-callback-file'],\n );\n });\n },\n )\n .command(\n 'build <input-file> <output-file>',\n 'Write config from a config builder',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd build => building file: ${cmdYargs['input-file']}`);\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'build',\n cmdYargs['experiments-callback-file'],\n );\n },\n )\n .help()\n .parseAsync();\n};\n"],"names":["removeDisabledSlices","clone","config","action","value","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","async","transform","handlers","castArray","callback","result","resolve","key","transformWriteConfig","experimentsCallback","outputFile","push","__experiment","buckets","id","dirname","path","fileURLToPath","document","require","pathToFileURL","__filename","href","_documentCurrentScript","tagName","toUpperCase","src","URL","baseURI","output","Handlebars","compile","readFileSync","encoding","template","JSON","stringify","_k","v","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","generateArguments","cmdYargs","positional","demandOption","desc","type","option","yargs","hideBin","argv","watchFile","help","parseAsync"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","sources":["../../src/transformers/removeDisabledSlices.ts","../../src/utils/transformConfig.ts","../../src/utils/transformWriteConfig.ts","../../src/transformers/setupExperiments.ts","../../src/utils/importValidateTransformWriteConfig.ts","../../src/cli.ts"],"sourcesContent":["import { type AnyRecord, type TransformConfigHandlerSync } from '../types.ts';\n\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config,\n) => {\n if ('__disabled' in config) {\n return {\n action: 'DELETE_NODE',\n };\n }\n\n return {\n value: clone,\n };\n};\n","import { castArray, isPlainObject } from 'lodash-es';\nimport { type AnyRecord, type TransformConfigHandler, type TransformConfigHandlerSync } from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArray = (list: any[], handler: TransformConfigHandler | TransformConfigHandler[]): Promise<any[]> =>\n Promise.all(\n list.map(entry => {\n if (isPlainObject(entry)) {\n return transformConfig(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n return transformArray(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n }),\n );\n\nexport const transformConfig = async <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandler | TransformConfigHandler[] = [],\n): Promise<Config> => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = await Promise.resolve(callback(transform, config));\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n const value = config[key];\n\n if (isPlainObject(value)) {\n transform[key] = await transformConfig(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = (await transformArray(value, handler)) as Config[Extract<keyof Config, string>];\n } else {\n transform[key] = value;\n }\n }\n\n return transform;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArraySync = (list: any[], handler: TransformConfigHandlerSync | TransformConfigHandlerSync[]): any[] =>\n list.map(entry => {\n if (isPlainObject(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformConfigSync(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformArraySync(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n });\n\nexport const transformConfigSync = <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandlerSync | TransformConfigHandlerSync[] = [],\n): Config => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = callback(transform, config);\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n // TODO: Need to look at this\n\n const value = config[key];\n\n if (isPlainObject(value)) {\n // TODO: Need to look at this\n\n transform[key] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\n // TODO: Need to look at this\n\n transform[key] = value;\n }\n }\n\n return transform;\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport Handlebars from 'handlebars';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport shelljs from 'shelljs';\nimport { removeDisabledSlices } from '../transformers/removeDisabledSlices.ts';\nimport { setupExperiments } from '../transformers/setupExperiments.ts';\nimport { type TransformConfigHandler, type WriteConfigOptions } from '../types.ts';\nimport { transformConfig } from './transformConfig.ts';\n\nexport const transformWriteConfig = async <Config extends object>(\n config: Config,\n { experimentsCallback, outputFile }: WriteConfigOptions,\n): Promise<void> => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n\n const template = Handlebars.compile(\n readFileSync(path.resolve(dirname, '../templates/config.ts.hbs'), { encoding: 'utf8' }),\n );\n\n const output = template({\n config: JSON.stringify(\n await transformConfig(config, handlers),\n (_k, v: unknown) => (v === undefined ? 'undefined' : v),\n 2,\n ),\n })\n .replaceAll(/\"([A-Za-z][\\dA-Za-z]+)\":/g, '$1:')\n .replaceAll('\"undefined\"', 'undefined');\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(path.resolve(process.cwd(), outputFile), output);\n};\n","import { type AnyRecord, type SetupExperimentsCallback, type TransformConfigHandler } from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if ('__experiment' in config && typeof config.__experiment === 'string') {\n const buckets = await callback(config.__experiment, clone, config);\n\n // @ts-expect-error private property\n clone.__experiment = {\n buckets,\n id: config.__experiment,\n };\n\n return {\n value: clone,\n };\n }\n\n return {\n value: clone,\n };\n };\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport { type CliCommands } from '../cli.ts';\nimport { type ConfigBuilder } from '../createConfigBuilder.ts';\nimport { type SetupExperimentsCallback } from '../types.ts';\nimport { transformWriteConfig } from './transformWriteConfig.ts';\n\nexport const importValidateTransformWriteConfig = (\n inputFile: string,\n outputFile: string,\n command: CliCommands,\n experimentCallbackFile?: string,\n): void => {\n import(resolve(process.cwd(), inputFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: configBuilder }: { default: ConfigBuilder<object> }) => {\n if (!configBuilder.$validate()) {\n shelljs.echo(`zcd ${command} => invalid config`);\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n shelljs.echo(`zcd ${command} => errors:\\n${JSON.stringify(configBuilder.$errors(), undefined, 2)}\\n`);\n shelljs.exit(1);\n }\n\n shelljs.echo('zcd ${command} => valid config');\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n\n if (experimentCallbackFile) {\n import(resolve(process.cwd(), experimentCallbackFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs, { type Argv } from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport type CliCommands = 'build' | 'watch';\n\nexport type CliArguments = Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n}>;\n\nconst generateArguments = (cmdYargs: Argv): CliArguments =>\n cmdYargs\n .positional('input-file', {\n demandOption: true,\n desc: 'The relative path to the config builder root file',\n type: 'string',\n })\n .positional('output-file', {\n demandOption: true,\n desc: 'The relative path to the output config file',\n type: 'string',\n })\n .option('experiments-callback-file', {\n desc: 'The relative path to the experiment callback file',\n type: 'string',\n });\n\nexport const cli = (): void => {\n // yargs does not provide a way to pass generic to type args.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const argv = yargs(hideBin(process.argv)) as Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n }>;\n\n void argv\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd watch => watching file: ${cmdYargs['input-file']}`);\n\n watchFile(resolve(process.cwd(), cmdYargs['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'watch',\n cmdYargs['experiments-callback-file'],\n );\n });\n },\n )\n .command(\n 'build <input-file> <output-file>',\n 'Write config from a config builder',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd build => building file: ${cmdYargs['input-file']}`);\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'build',\n cmdYargs['experiments-callback-file'],\n );\n },\n )\n .help()\n .parseAsync();\n};\n"],"names":["removeDisabledSlices","clone","config","action","value","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","async","transform","handlers","castArray","callback","result","resolve","key","transformWriteConfig","experimentsCallback","outputFile","push","__experiment","buckets","id","dirname","path","fileURLToPath","url","output","Handlebars","compile","readFileSync","encoding","template","JSON","stringify","_k","v","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","import","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","generateArguments","cmdYargs","positional","demandOption","desc","type","option","cli","yargs","hideBin","argv","watchFile","help","parseAsync"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","sources":["../../src/transformers/removeDisabledSlices.ts","../../src/utils/transformConfig.ts","../../src/utils/transformWriteConfig.ts","../../src/transformers/setupExperiments.ts","../../src/utils/importValidateTransformWriteConfig.ts","../../src/cli.ts"],"sourcesContent":["import { type AnyRecord, type TransformConfigHandlerSync } from '../types.ts';\n\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config,\n) => {\n if ('__disabled' in config) {\n return {\n action: 'DELETE_NODE',\n };\n }\n\n return {\n value: clone,\n };\n};\n","import { castArray, isPlainObject } from 'lodash-es';\nimport { type AnyRecord, type TransformConfigHandler, type TransformConfigHandlerSync } from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArray = (list: any[], handler: TransformConfigHandler | TransformConfigHandler[]): Promise<any[]> =>\n Promise.all(\n list.map(entry => {\n if (isPlainObject(entry)) {\n return transformConfig(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n return transformArray(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n }),\n );\n\nexport const transformConfig = async <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandler | TransformConfigHandler[] = [],\n): Promise<Config> => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = await Promise.resolve(callback(transform, config));\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n const value = config[key];\n\n if (isPlainObject(value)) {\n transform[key] = await transformConfig(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = (await transformArray(value, handler)) as Config[Extract<keyof Config, string>];\n } else {\n transform[key] = value;\n }\n }\n\n return transform;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformArraySync = (list: any[], handler: TransformConfigHandlerSync | TransformConfigHandlerSync[]): any[] =>\n list.map(entry => {\n if (isPlainObject(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformConfigSync(entry, handler);\n }\n\n if (Array.isArray(entry)) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return transformArraySync(entry, handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return entry;\n });\n\nexport const transformConfigSync = <Config extends AnyRecord>(\n config: Config,\n handler: TransformConfigHandlerSync | TransformConfigHandlerSync[] = [],\n): Config => {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n let transform = {} as Config;\n const handlers = castArray(handler);\n\n for (const callback of handlers) {\n const result = callback(transform, config);\n\n if (result.action === 'DELETE_NODE') {\n // Typing gets too complicated without casting.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === 'SKIP_NODE') {\n return transform;\n }\n }\n\n for (const key in config) {\n // TODO: Need to look at this\n\n const value = config[key];\n\n if (isPlainObject(value)) {\n // TODO: Need to look at this\n\n transform[key] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n // TODO: Need to look at this\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\n // TODO: Need to look at this\n\n transform[key] = value;\n }\n }\n\n return transform;\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport Handlebars from 'handlebars';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport shelljs from 'shelljs';\nimport { removeDisabledSlices } from '../transformers/removeDisabledSlices.ts';\nimport { setupExperiments } from '../transformers/setupExperiments.ts';\nimport { type TransformConfigHandler, type WriteConfigOptions } from '../types.ts';\nimport { transformConfig } from './transformConfig.ts';\n\nexport const transformWriteConfig = async <Config extends object>(\n config: Config,\n { experimentsCallback, outputFile }: WriteConfigOptions,\n): Promise<void> => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const dirname = path.dirname(fileURLToPath(import.meta.url));\n\n const template = Handlebars.compile(\n readFileSync(path.resolve(dirname, '../templates/config.ts.hbs'), { encoding: 'utf8' }),\n );\n\n const output = template({\n config: JSON.stringify(\n await transformConfig(config, handlers),\n (_k, v: unknown) => (v === undefined ? 'undefined' : v),\n 2,\n ),\n })\n .replaceAll(/\"([A-Za-z][\\dA-Za-z]+)\":/g, '$1:')\n .replaceAll('\"undefined\"', 'undefined');\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(path.resolve(process.cwd(), outputFile), output);\n};\n","import { type AnyRecord, type SetupExperimentsCallback, type TransformConfigHandler } from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if ('__experiment' in config && typeof config.__experiment === 'string') {\n const buckets = await callback(config.__experiment, clone, config);\n\n // @ts-expect-error private property\n clone.__experiment = {\n buckets,\n id: config.__experiment,\n };\n\n return {\n value: clone,\n };\n }\n\n return {\n value: clone,\n };\n };\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport { type CliCommands } from '../cli.ts';\nimport { type ConfigBuilder } from '../createConfigBuilder.ts';\nimport { type SetupExperimentsCallback } from '../types.ts';\nimport { transformWriteConfig } from './transformWriteConfig.ts';\n\nexport const importValidateTransformWriteConfig = (\n inputFile: string,\n outputFile: string,\n command: CliCommands,\n experimentCallbackFile?: string,\n): void => {\n import(resolve(process.cwd(), inputFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: configBuilder }: { default: ConfigBuilder<object> }) => {\n if (!configBuilder.$validate()) {\n shelljs.echo(`zcd ${command} => invalid config`);\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n shelljs.echo(`zcd ${command} => errors:\\n${JSON.stringify(configBuilder.$errors(), undefined, 2)}\\n`);\n shelljs.exit(1);\n }\n\n shelljs.echo('zcd ${command} => valid config');\n shelljs.echo(`zcd ${command} => config values:\\n${configBuilder.$toJson()}\\n`);\n\n if (experimentCallbackFile) {\n import(resolve(process.cwd(), experimentCallbackFile))\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n // TODO: Will revisit\n // eslint-disable-next-line unicorn/prefer-await\n .catch((error: unknown) => {\n if (!(error instanceof Error)) {\n return;\n }\n\n shelljs.echo(`zcd ${command} => error message: ${error.message}`);\n\n if (error.stack) {\n shelljs.echo(`zcd ${command} => error stack:\\n${error.stack}\\n`);\n }\n });\n};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs, { type Argv } from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport type CliCommands = 'build' | 'watch';\n\nexport type CliArguments = Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n}>;\n\nconst generateArguments = (cmdYargs: Argv): CliArguments =>\n cmdYargs\n .positional('input-file', {\n demandOption: true,\n desc: 'The relative path to the config builder root file',\n type: 'string',\n })\n .positional('output-file', {\n demandOption: true,\n desc: 'The relative path to the output config file',\n type: 'string',\n })\n .option('experiments-callback-file', {\n desc: 'The relative path to the experiment callback file',\n type: 'string',\n });\n\nexport const cli = (): void => {\n // yargs does not provide a way to pass generic to type args.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const argv = yargs(hideBin(process.argv)) as Argv<{\n 'experiments-callback-file'?: string;\n 'input-file': string;\n 'output-file': string;\n }>;\n\n void argv\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd watch => watching file: ${cmdYargs['input-file']}`);\n\n watchFile(resolve(process.cwd(), cmdYargs['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'watch',\n cmdYargs['experiments-callback-file'],\n );\n });\n },\n )\n .command(\n 'build <input-file> <output-file>',\n 'Write config from a config builder',\n cmdYargs => generateArguments(cmdYargs),\n cmdYargs => {\n shelljs.echo(`zcd build => building file: ${cmdYargs['input-file']}`);\n\n importValidateTransformWriteConfig(\n cmdYargs['input-file'],\n cmdYargs['output-file'],\n 'build',\n cmdYargs['experiments-callback-file'],\n );\n },\n )\n .help()\n .parseAsync();\n};\n"],"names":["removeDisabledSlices","clone","config","action","value","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","async","transform","handlers","castArray","callback","result","resolve","key","transformWriteConfig","experimentsCallback","outputFile","push","__experiment","buckets","id","dirname","path","fileURLToPath","url","output","Handlebars","compile","readFileSync","encoding","template","JSON","stringify","_k","v","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","generateArguments","cmdYargs","positional","demandOption","desc","type","option","cli","yargs","hideBin","argv","watchFile","help","parseAsync"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zcb",
3
3
  "description": "Build configs with type safety from zod schema.",
4
- "version": "0.3.7",
4
+ "version": "0.3.9",
5
5
  "author": "miami-man",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/badbatch/zod-config-builder",
@@ -50,7 +50,7 @@
50
50
  "@types/shelljs": "^0.10.0",
51
51
  "@types/uuid": "^11.0.0",
52
52
  "@types/yargs": "^17.0.35",
53
- "core-js": "^3.49.0",
53
+ "core-js": "^3.50.0",
54
54
  "fs-extra": "^11.4.0",
55
55
  "handlebars": "^4.7.9",
56
56
  "json-schema": "^0.4.0",
@@ -67,23 +67,23 @@
67
67
  "devDependencies": {
68
68
  "@commitlint/cli": "^21.2.1",
69
69
  "@jest/globals": "^30.4.1",
70
- "@repodog/cli": "^1.7.0",
71
- "@repodog/commitlint-config": "^21.0.3",
72
- "@repodog/eslint-config": "^9.0.30",
73
- "@repodog/eslint-config-jest": "^9.0.10",
74
- "@repodog/jest-config": "^30.0.4",
75
- "@repodog/markdownlint-config": "^1.2.7",
76
- "@repodog/prettier-config": "^3.0.5",
77
- "@repodog/rollup-config": "^4.0.18",
78
- "@repodog/swc-config": "^1.0.16",
79
- "@repodog/syncpack-config": "^15.0.4",
80
- "@repodog/ts-config": "^6.0.3",
70
+ "@repodog/cli": "^1.7.1",
71
+ "@repodog/commitlint-config": "^21.0.4",
72
+ "@repodog/eslint-config": "^9.0.33",
73
+ "@repodog/eslint-config-jest": "^9.0.11",
74
+ "@repodog/jest-config": "^30.0.5",
75
+ "@repodog/markdownlint-config": "^1.2.8",
76
+ "@repodog/prettier-config": "^3.0.6",
77
+ "@repodog/rollup-config": "^4.0.19",
78
+ "@repodog/swc-config": "^1.0.17",
79
+ "@repodog/syncpack-config": "^15.0.5",
80
+ "@repodog/ts-config": "^6.0.4",
81
81
  "@rollup/plugin-swc": "^0.4.1",
82
82
  "@swc/core": "^1.15.47",
83
83
  "@swc/jest": "^0.2.39",
84
84
  "@types/jest": "^30.0.0",
85
85
  "@types/node": "^26.1.2",
86
- "cts-types": "^0.0.11",
86
+ "cts-types": "^0.0.15",
87
87
  "del-cli": "^7.0.0",
88
88
  "eslint": "^10.8.0",
89
89
  "generate-changelog": "^1.8.0",
@@ -91,8 +91,10 @@
91
91
  "jest": "^30.4.2",
92
92
  "jest-environment-node": "^30.4.1",
93
93
  "markdownlint-cli2": "^0.23.2",
94
+ "nyc": "^18.0.0",
95
+ "open-cli": "^9.0.0",
94
96
  "prettier": "^3.9.6",
95
- "rollup": "^4.62.3",
97
+ "rollup": "^4.62.4",
96
98
  "suppress-experimental-warnings": "^2.0.0",
97
99
  "syncpack": "^15.3.2",
98
100
  "typescript": "^6.0.3"
@@ -111,6 +113,8 @@
111
113
  "compile:cjs": "MODULE_SYSTEM=cjs rollup -c ./rollup.config.mjs",
112
114
  "compile:esm": "rollup -c ./rollup.config.mjs",
113
115
  "compile:types": "tsc --project ./tsconfig.build.json && cts-types build dist/types/esm dist/types/cjs",
116
+ "coverage-generate": "nyc report --reporter=lcov -t coverage --report-dir coverage",
117
+ "coverage-open": "open-cli ./coverage/lcov-report/index.html",
114
118
  "cut:changelog": "changelog",
115
119
  "installActivateMise": "sh shellScripts/installActivateMise.sh",
116
120
  "lint": "pnpm run /^lint:.*/",
@@ -3,20 +3,7 @@ allowBuilds:
3
3
  core-js: false
4
4
  unrs-resolver: false
5
5
 
6
- minimumReleaseAgeExclude:
7
- - '@repodog/cli-cut@1.4.30'
8
- - '@repodog/cli-new@1.6.0'
9
- - '@repodog/cli-postinstall@0.4.26'
10
- - '@repodog/cli-publish@1.4.30'
11
- - '@repodog/cli-setup@1.4.27'
12
- - '@repodog/cli-utils@1.4.25'
13
- - '@repodog/cli@1.7.0'
14
- - '@repodog/commitlint-config@21.0.3'
15
- - '@repodog/eslint-config-jest@9.0.10'
16
- - '@repodog/eslint-config@9.0.30'
17
- - '@repodog/rollup-config@4.0.18'
18
- - '@repodog/swc-config@1.0.16'
19
- - '@repodog/syncpack-config@15.0.4'
6
+ minimumReleaseAge: 0
20
7
 
21
8
  overrides:
22
9
  'body-parser@<1.20.6': '>=1.20.6'