zcb 0.1.2 → 0.1.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/cjs/cli.cjs CHANGED
@@ -14,6 +14,7 @@ let NonEmumeralProperties = function (NonEmumeralProperties) {
14
14
  NonEmumeralProperties["CALLBACKS"] = "__callbacks";
15
15
  NonEmumeralProperties["DISABLED"] = "__disabled";
16
16
  NonEmumeralProperties["EXPERIMENT"] = "__experiment";
17
+ NonEmumeralProperties["TYPE"] = "__type";
17
18
  NonEmumeralProperties["ZCB"] = "__zcb";
18
19
  return NonEmumeralProperties;
19
20
  }({});
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","sources":["../zod-config-builder/src//types.ts","../zod-config-builder/src//transformers/removeDisabledSlices.ts","../zod-config-builder/src//transformers/setupExperiments.ts","../zod-config-builder/src//utils/transformConfig.ts","../zod-config-builder/src//utils/transformWriteConfig.ts","../zod-config-builder/src//utils/importValidateTransformWriteConfig.ts","../zod-config-builder/src//cli.ts"],"sourcesContent":["import type { List } from 'ts-toolbelt';\nimport type { Includes, Join } from 'type-fest';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRecord = Record<string, any>;\n\nexport type Buckets<Config extends AnyRecord> = Record<string, Experiment<Config>>;\n\nexport interface ConfigParserOptions {\n experimentsCallback?: RunExperimentsCallback;\n}\n\nexport interface Experiment<Config extends AnyRecord> {\n action?: TransformConfigHandlerAction;\n value?: Config;\n}\n\nexport enum NonEmumeralProperties {\n CALLBACKS = '__callbacks',\n DISABLED = '__disabled',\n EXPERIMENT = '__experiment',\n ZCB = '__zcb',\n}\n\nexport type Path<Config extends object> = Join<Leaves<Config>, '.'>;\n\nexport type RunExperimentsCallback = (id: string) => Promise<string>;\n\nexport type Scope<Config extends object> = Join<Paths<Config>, '.'>;\n\nexport type SetupExperimentsCallback = <Config extends AnyRecord>(\n id: string,\n clone: Config,\n config: Config\n) => Promise<Buckets<Config>>;\n\nexport type TransformConfigHandler = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => TransformConfigHandlerReturnType<Config> | Promise<TransformConfigHandlerReturnType<Config>>;\n\nexport type TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => TransformConfigHandlerReturnType<Config>;\n\nexport enum TransformConfigHandlerAction {\n DELETE_NODE = 'deleteNode',\n SKIP_NODE = 'skipNode',\n}\n\nexport interface TransformConfigHandlerReturnType<Config extends AnyRecord> {\n action?: TransformConfigHandlerAction;\n value?: Config;\n}\n\nexport interface WriteConfigOptions {\n experimentsCallback?: SetupExperimentsCallback;\n outputFile: string;\n}\n\nexport type Leaves<T, LeafPath extends string[] = []> = T extends string\n ? LeafPath\n : {\n [K in keyof T & string]: Leaves<T[K], [...LeafPath, K]>;\n }[keyof T & string];\n\nexport type Paths<T, LeafPath extends string[] = []> = T extends string\n ? LeafPath\n : {\n [K in keyof T & string]: T[K] extends object ? Paths<T[K], [...LeafPath, K]> : LeafPath;\n }[keyof T & string];\n\nexport type LeavesScopeDiffs<T1 extends readonly string[][], T2 extends string[]> = {\n [K1 in keyof T1]: List.Length<List.Intersect<T1[K1], T2, '<-contains'>> extends 1\n ? List.Length<T1[K1]> extends 1\n ? Includes<T2, T1[K1][0]> extends false\n ? T1[K1]\n : never\n : List.Diff<T1[K1], T2>\n : never;\n}[number];\n","import {\n type AnyRecord,\n NonEmumeralProperties,\n TransformConfigHandlerAction,\n type TransformConfigHandlerSync,\n} from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => {\n if (NonEmumeralProperties.DISABLED in config) {\n return {\n action: TransformConfigHandlerAction.DELETE_NODE,\n };\n }\n\n return {\n value: clone,\n };\n};\n","import {\n type AnyRecord,\n NonEmumeralProperties,\n type SetupExperimentsCallback,\n type TransformConfigHandler,\n} from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if (NonEmumeralProperties.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 { castArray, isPlainObject } from 'lodash-es';\nimport {\n type AnyRecord,\n type TransformConfigHandler,\n TransformConfigHandlerAction,\n type TransformConfigHandlerSync,\n} 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-return\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 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 === TransformConfigHandlerAction.DELETE_NODE) {\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === TransformConfigHandlerAction.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 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 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 === TransformConfigHandlerAction.DELETE_NODE) {\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === TransformConfigHandlerAction.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] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\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 { dirname, resolve } 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, 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) => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const template = Handlebars.compile(\n readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), './templates/config.ts.hbs'), { encoding: 'utf8' })\n );\n\n const output = template({ config: JSON.stringify(await transformConfig(config, handlers), undefined, 2) }).replaceAll(\n /\"([A-Za-z][\\dA-Za-z]+)\":/g,\n '$1:'\n );\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(resolve(process.cwd(), outputFile), output);\n};\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport type { Commands } 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: Commands,\n experimentCallbackFile?: string\n) => {\n import(resolve(process.cwd(), inputFile))\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 .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n .catch((error: unknown) => {\n if (error instanceof Error) {\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\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n .catch((error: unknown) => {\n if (error instanceof Error) {\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};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs from 'yargs';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport enum Commands {\n BUILD = 'build',\n WATCH = 'watch',\n}\n\nconst generateArguments = (cmdYargs: yargs.Argv) =>\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 = () => {\n yargs\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n argv => {\n shelljs.echo(`zcd watch => watching file: ${argv['input-file']}`);\n\n watchFile(resolve(process.cwd(), argv['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n argv['input-file'],\n argv['output-file'],\n Commands.WATCH,\n argv['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 argv => {\n shelljs.echo(`zcd build => building file: ${argv['input-file']}`);\n\n importValidateTransformWriteConfig(\n argv['input-file'],\n argv['output-file'],\n Commands.BUILD,\n argv['experiments-callback-file']\n );\n }\n )\n .help().argv;\n};\n"],"names":["NonEmumeralProperties","TransformConfigHandlerAction","removeDisabledSlices","clone","config","DISABLED","action","DELETE_NODE","value","setupExperiments","callback","EXPERIMENT","__experiment","buckets","id","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","transform","handlers","castArray","result","resolve","SKIP_NODE","key","transformWriteConfig","experimentsCallback","outputFile","push","template","Handlebars","compile","readFileSync","dirname","fileURLToPath","import","encoding","output","JSON","stringify","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","Commands","generateArguments","cmdYargs","positional","demandOption","desc","type","option","cli","yargs","argv","watchFile","WATCH","BUILD","help"],"mappings":"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"}
1
+ {"version":3,"file":"cli.cjs","sources":["../zod-config-builder/src//types.ts","../zod-config-builder/src//transformers/removeDisabledSlices.ts","../zod-config-builder/src//transformers/setupExperiments.ts","../zod-config-builder/src//utils/transformConfig.ts","../zod-config-builder/src//utils/transformWriteConfig.ts","../zod-config-builder/src//utils/importValidateTransformWriteConfig.ts","../zod-config-builder/src//cli.ts"],"sourcesContent":["import type { List } from 'ts-toolbelt';\nimport type { Includes, Join } from 'type-fest';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyRecord = Record<string, any>;\n\nexport type Buckets<Config extends AnyRecord> = Record<string, Experiment<Config>>;\n\nexport interface ConfigParserOptions {\n experimentsCallback?: RunExperimentsCallback;\n}\n\nexport interface Experiment<Config extends AnyRecord> {\n action?: TransformConfigHandlerAction;\n value?: Config;\n}\n\nexport enum NonEmumeralProperties {\n CALLBACKS = '__callbacks',\n DISABLED = '__disabled',\n EXPERIMENT = '__experiment',\n TYPE = '__type',\n ZCB = '__zcb',\n}\n\nexport type Path<Config extends object> = Join<Leaves<Config>, '.'>;\n\nexport type RunExperimentsCallback = (id: string) => Promise<string>;\n\nexport type Scope<Config extends object> = Join<Paths<Config>, '.'>;\n\nexport type SetupExperimentsCallback = <Config extends AnyRecord>(\n id: string,\n clone: Config,\n config: Config\n) => Promise<Buckets<Config>>;\n\nexport type TransformConfigHandler = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => TransformConfigHandlerReturnType<Config> | Promise<TransformConfigHandlerReturnType<Config>>;\n\nexport type TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => TransformConfigHandlerReturnType<Config>;\n\nexport enum TransformConfigHandlerAction {\n DELETE_NODE = 'deleteNode',\n SKIP_NODE = 'skipNode',\n}\n\nexport interface TransformConfigHandlerReturnType<Config extends AnyRecord> {\n action?: TransformConfigHandlerAction;\n value?: Config;\n}\n\nexport interface WriteConfigOptions {\n experimentsCallback?: SetupExperimentsCallback;\n outputFile: string;\n}\n\nexport type Leaves<T, LeafPath extends string[] = []> = T extends string\n ? LeafPath\n : {\n [K in keyof T & string]: Leaves<T[K], [...LeafPath, K]>;\n }[keyof T & string];\n\nexport type Paths<T, LeafPath extends string[] = []> = T extends string\n ? LeafPath\n : {\n [K in keyof T & string]: T[K] extends object ? Paths<T[K], [...LeafPath, K]> : LeafPath;\n }[keyof T & string];\n\nexport type LeavesScopeDiffs<T1 extends readonly string[][], T2 extends string[]> = {\n [K1 in keyof T1]: List.Length<List.Intersect<T1[K1], T2, '<-contains'>> extends 1\n ? List.Length<T1[K1]> extends 1\n ? Includes<T2, T1[K1][0]> extends false\n ? T1[K1]\n : never\n : List.Diff<T1[K1], T2>\n : never;\n}[number];\n","import {\n type AnyRecord,\n NonEmumeralProperties,\n TransformConfigHandlerAction,\n type TransformConfigHandlerSync,\n} from '../types.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const removeDisabledSlices: TransformConfigHandlerSync = <Config extends AnyRecord>(\n clone: Config,\n config: Config\n) => {\n if (NonEmumeralProperties.DISABLED in config) {\n return {\n action: TransformConfigHandlerAction.DELETE_NODE,\n };\n }\n\n return {\n value: clone,\n };\n};\n","import {\n type AnyRecord,\n NonEmumeralProperties,\n type SetupExperimentsCallback,\n type TransformConfigHandler,\n} from '../types.ts';\n\nexport const setupExperiments =\n (callback: SetupExperimentsCallback): TransformConfigHandler =>\n async <Config extends AnyRecord>(clone: Config, config: Config) => {\n if (NonEmumeralProperties.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 { castArray, isPlainObject } from 'lodash-es';\nimport {\n type AnyRecord,\n type TransformConfigHandler,\n TransformConfigHandlerAction,\n type TransformConfigHandlerSync,\n} 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 // eslint-disable-next-line @typescript-eslint/no-unsafe-return\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 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 === TransformConfigHandlerAction.DELETE_NODE) {\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === TransformConfigHandlerAction.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 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 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 === TransformConfigHandlerAction.DELETE_NODE) {\n return {} as Config;\n }\n\n if (result.value) {\n transform = result.value;\n }\n\n if (result.action === TransformConfigHandlerAction.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] = transformConfigSync(value, handler);\n } else if (Array.isArray(value)) {\n transform[key] = transformArraySync(value, handler) as Config[Extract<keyof Config, string>];\n } else {\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 { dirname, resolve } 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, 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) => {\n const handlers: TransformConfigHandler[] = [removeDisabledSlices];\n\n if (experimentsCallback) {\n handlers.push(setupExperiments(experimentsCallback));\n }\n\n const template = Handlebars.compile(\n readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), './templates/config.ts.hbs'), { encoding: 'utf8' })\n );\n\n const output = template({ config: JSON.stringify(await transformConfig(config, handlers), undefined, 2) }).replaceAll(\n /\"([A-Za-z][\\dA-Za-z]+)\":/g,\n '$1:'\n );\n\n shelljs.echo(`zcd watch => writing to file: ${outputFile}`);\n shelljs.echo(`zcd watch => content to write:\\n${output}\\n`);\n outputFileSync(resolve(process.cwd(), outputFile), output);\n};\n","import { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport type { Commands } 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: Commands,\n experimentCallbackFile?: string\n) => {\n import(resolve(process.cwd(), inputFile))\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 .then(({ default: experimentsCallback }: { default: SetupExperimentsCallback }) => {\n void transformWriteConfig(configBuilder.$values(), { experimentsCallback, outputFile });\n })\n .catch((error: unknown) => {\n if (error instanceof Error) {\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\n return;\n }\n\n void transformWriteConfig(configBuilder.$values(), { outputFile });\n })\n .catch((error: unknown) => {\n if (error instanceof Error) {\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};\n","import { watchFile } from 'node:fs';\nimport { resolve } from 'node:path';\nimport shelljs from 'shelljs';\nimport yargs from 'yargs';\nimport { importValidateTransformWriteConfig } from './utils/importValidateTransformWriteConfig.ts';\n\nexport enum Commands {\n BUILD = 'build',\n WATCH = 'watch',\n}\n\nconst generateArguments = (cmdYargs: yargs.Argv) =>\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 = () => {\n yargs\n .command(\n 'watch <input-file> <output-file>',\n 'Watch a config builder and write config',\n cmdYargs => generateArguments(cmdYargs),\n argv => {\n shelljs.echo(`zcd watch => watching file: ${argv['input-file']}`);\n\n watchFile(resolve(process.cwd(), argv['input-file']), () => {\n shelljs.echo('zcd watch => file change detected');\n\n importValidateTransformWriteConfig(\n argv['input-file'],\n argv['output-file'],\n Commands.WATCH,\n argv['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 argv => {\n shelljs.echo(`zcd build => building file: ${argv['input-file']}`);\n\n importValidateTransformWriteConfig(\n argv['input-file'],\n argv['output-file'],\n Commands.BUILD,\n argv['experiments-callback-file']\n );\n }\n )\n .help().argv;\n};\n"],"names":["NonEmumeralProperties","TransformConfigHandlerAction","removeDisabledSlices","clone","config","DISABLED","action","DELETE_NODE","value","setupExperiments","callback","EXPERIMENT","__experiment","buckets","id","transformArray","list","handler","Promise","all","map","entry","isPlainObject","transformConfig","Array","isArray","transform","handlers","castArray","result","resolve","SKIP_NODE","key","transformWriteConfig","experimentsCallback","outputFile","push","template","Handlebars","compile","readFileSync","dirname","fileURLToPath","import","encoding","output","JSON","stringify","undefined","replaceAll","shelljs","echo","outputFileSync","process","cwd","importValidateTransformWriteConfig","inputFile","command","experimentCallbackFile","then","default","configBuilder","$validate","$toJson","$errors","exit","$values","catch","error","Error","message","stack","Commands","generateArguments","cmdYargs","positional","demandOption","desc","type","option","cli","yargs","argv","watchFile","WATCH","BUILD","help"],"mappings":"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"}
@@ -9,6 +9,7 @@ let NonEmumeralProperties = function (NonEmumeralProperties) {
9
9
  NonEmumeralProperties["CALLBACKS"] = "__callbacks";
10
10
  NonEmumeralProperties["DISABLED"] = "__disabled";
11
11
  NonEmumeralProperties["EXPERIMENT"] = "__experiment";
12
+ NonEmumeralProperties["TYPE"] = "__type";
12
13
  NonEmumeralProperties["ZCB"] = "__zcb";
13
14
  return NonEmumeralProperties;
14
15
  }({});
@@ -62,17 +63,48 @@ const collateObjectPropertyDefaults = propertyDefinition => {
62
63
  }, {});
63
64
  };
64
65
 
66
+ const RESERVED_KEYWORDS = new Set(['$disable', '$errors', '$experiment', '$extend', '$flush', '$fork', '$toJson', '$validate', '$values']);
67
+ const isPropertyReservedWord = propertyName => RESERVED_KEYWORDS.has(propertyName);
68
+
69
+ const isValidPropertyDefinition = propertyDefinition => typeof propertyDefinition === 'object';
70
+
71
+ const recordHasInvalidDefaults = propertyDefinition => propertyDefinition.additionalProperties && typeof propertyDefinition.additionalProperties === 'object' && 'default' in propertyDefinition.additionalProperties;
72
+
73
+ const collateDefaultValues = jsonSchema => {
74
+ const defaultValues = {};
75
+ for (const propertyName in jsonSchema.properties) {
76
+ if (isPropertyReservedWord(propertyName)) {
77
+ throw new Error(`"${propertyName}" is a reserved keyword within the config builder. Please use a different property name. The full list of reserved keywords is: ${[...RESERVED_KEYWORDS].join(', ')}`);
78
+ }
79
+ const castPropertyName = propertyName;
80
+ const propertyDefinition = jsonSchema.properties[propertyName];
81
+ if (isValidPropertyDefinition(propertyDefinition)) {
82
+ if (propertyDefinition.default) {
83
+ defaultValues[castPropertyName] = propertyDefinition.default;
84
+ }
85
+ if (propertyDefinition.type === 'array' && arrayHasInvalidDefaults(propertyDefinition)) {
86
+ throw new Error(`When setting schema array defaults for the array assigned to "${String(castPropertyName)}", set them on the array and not the item.`);
87
+ }
88
+ if (propertyDefinition.type === 'object') {
89
+ if (recordHasInvalidDefaults(propertyDefinition)) {
90
+ throw new Error(`When setting schema property defaults for the value of the record assigned to "${String(castPropertyName)}", set them on the record and not the value.`);
91
+ }
92
+ const propertyDefaults = collateObjectPropertyDefaults(propertyDefinition);
93
+ if (propertyDefaults) {
94
+ defaultValues[castPropertyName] = propertyDefaults;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ return defaultValues;
100
+ };
101
+
65
102
  const isDerivedValueCallback = value => typeof value === 'function';
66
103
 
67
104
  const isInvalidPropertyOverride = (propertyValue, override = false) => !override && propertyValue !== undefined;
68
105
 
69
- const RESERVED_KEYWORDS = new Set(['$disable', '$errors', '$experiment', '$extend', '$flush', '$fork', '$toJson', '$validate', '$values']);
70
- const isPropertyReservedWord = propertyName => RESERVED_KEYWORDS.has(propertyName);
71
-
72
106
  const isSchemaValid = schema => schema.type !== 'object';
73
107
 
74
- const isValidPropertyDefinition = propertyDefinition => typeof propertyDefinition === 'object';
75
-
76
108
  const isValidValue = (value, depth = 0) => {
77
109
  if (lodashEs.isPlainObject(value)) {
78
110
  const object = value;
@@ -97,8 +129,6 @@ const jsonStringifyReplacer = (_key, value) => value instanceof zod.ZodType ? zo
97
129
  errorMessages: true
98
130
  }) : value;
99
131
 
100
- const recordHasInvalidDefaults = propertyDefinition => propertyDefinition.additionalProperties && typeof propertyDefinition.additionalProperties === 'object' && 'default' in propertyDefinition.additionalProperties;
101
-
102
132
  const transformArray = (list, handler) => Promise.all(list.map(entry => {
103
133
  if (lodashEs.isPlainObject(entry)) {
104
134
  return transformConfig(entry, handler);
@@ -172,14 +202,31 @@ const transformConfigSync = (config, handler = []) => {
172
202
  return transform;
173
203
  };
174
204
 
175
- const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValues = {}) => {
176
- let config = lodashEs.cloneDeep(initialValues);
177
- const defaultValues = {};
178
- Object.defineProperty(config, NonEmumeralProperties.ZCB, {
179
- configurable: false,
180
- enumerable: false,
181
- value: true
182
- });
205
+ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValues = {}, options = {}) => {
206
+ const jsonSchema = zodToJsonSchema.zodToJsonSchema(zodSchema);
207
+ if (isSchemaValid(jsonSchema)) {
208
+ throw new Error(`The root type of a config schema must be "object", but received "${String(jsonSchema.type)}"`);
209
+ }
210
+ const addNonEnumeralBaseProperties = conf => {
211
+ Object.defineProperty(conf, NonEmumeralProperties.ZCB, {
212
+ configurable: false,
213
+ enumerable: false,
214
+ value: true
215
+ });
216
+ if (options.type) {
217
+ Object.defineProperty(conf, NonEmumeralProperties.TYPE, {
218
+ configurable: false,
219
+ enumerable: false,
220
+ value: options.type
221
+ });
222
+ }
223
+ };
224
+ const createInitialConfig = () => {
225
+ const config = lodashEs.merge(lodashEs.cloneDeep(initialValues), collateDefaultValues(jsonSchema));
226
+ addNonEnumeralBaseProperties(config);
227
+ return config;
228
+ };
229
+ let config = createInitialConfig();
183
230
  let callbacks = {
184
231
  ...derivedValueCallbacks
185
232
  };
@@ -216,15 +263,10 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
216
263
  },
217
264
  $flush: () => {
218
265
  const values = configBuilder.$values();
219
- config = lodashEs.cloneDeep(defaultValues);
220
- Object.defineProperty(config, NonEmumeralProperties.ZCB, {
221
- configurable: false,
222
- enumerable: false,
223
- value: true
224
- });
266
+ config = createInitialConfig();
225
267
  return values;
226
268
  },
227
- $fork: () => createConfigBuilder(zodSchema, derivedValueCallbacks),
269
+ $fork: () => createConfigBuilder(zodSchema, derivedValueCallbacks, initialValues, options),
228
270
  $toJson: () => JSON.stringify(configBuilder.$values(), jsonStringifyReplacer, 2),
229
271
  $validate: () => {
230
272
  try {
@@ -250,50 +292,27 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
250
292
  enumerable: false,
251
293
  value: callbacks
252
294
  });
253
- const jsonSchema = zodToJsonSchema.zodToJsonSchema(zodSchema);
254
- if (isSchemaValid(jsonSchema)) {
255
- throw new Error(`The root type of a config schema must be "object", but received "${String(jsonSchema.type)}"`);
256
- }
257
295
  for (const propertyName in jsonSchema.properties) {
258
296
  if (isPropertyReservedWord(propertyName)) {
259
297
  throw new Error(`"${propertyName}" is a reserved keyword within the config builder. Please use a different property name. The full list of reserved keywords is: ${[...RESERVED_KEYWORDS].join(', ')}`);
260
298
  }
261
- const castProperty = propertyName;
262
- const propertyDefinition = jsonSchema.properties[propertyName];
263
- if (isValidPropertyDefinition(propertyDefinition)) {
264
- if (propertyDefinition.default) {
265
- defaultValues[castProperty] = propertyDefinition.default;
266
- }
267
- if (propertyDefinition.type === 'array' && arrayHasInvalidDefaults(propertyDefinition)) {
268
- throw new Error(`When setting schema array defaults for the array assigned to "${String(castProperty)}", set them on the array and not the item.`);
269
- }
270
- if (propertyDefinition.type === 'object') {
271
- if (recordHasInvalidDefaults(propertyDefinition)) {
272
- throw new Error(`When setting schema property defaults for the value of the record assigned to "${String(castProperty)}", set them on the record and not the value.`);
273
- }
274
- const propertyDefaults = collateObjectPropertyDefaults(propertyDefinition);
275
- if (propertyDefaults) {
276
- defaultValues[castProperty] = propertyDefaults;
277
- }
278
- }
279
- lodashEs.merge(config, lodashEs.cloneDeep(defaultValues));
280
- }
281
- configBuilder[castProperty] = (value, override) => {
282
- if (isInvalidPropertyOverride(config[castProperty], override)) {
283
- throw new Error(`A value already exists for "${String(castProperty)}". You may be trying to add a new values before flushing the old one. If you intended to override the existing value, pass in true as the second argument.`);
299
+ const castPropertyName = propertyName;
300
+ configBuilder[castPropertyName] = (value, override) => {
301
+ if (isInvalidPropertyOverride(config[castPropertyName], override)) {
302
+ throw new Error(`A value already exists for "${String(castPropertyName)}". You may be trying to add a new values before flushing the old one. If you intended to override the existing value, pass in true as the second argument.`);
284
303
  }
285
304
  let propertyValue;
286
305
  const MAX_DEPTH = 1;
287
306
  if (!isValidValue(value)) {
288
- throw new Error(`"${String(castProperty)}" value has a depth greater than ${MAX_DEPTH}. To pass in objects with a depth greater than ${MAX_DEPTH}, create a builder for that config slice.`);
307
+ throw new Error(`"${String(castPropertyName)}" value has a depth greater than ${MAX_DEPTH}. To pass in objects with a depth greater than ${MAX_DEPTH}, create a builder for that config slice.`);
289
308
  }
290
309
  if (isDerivedValueCallback(value)) {
291
- callbacks[castProperty] = value;
310
+ callbacks[castPropertyName] = value;
292
311
  propertyValue = value(config);
293
312
  } else {
294
313
  propertyValue = value;
295
314
  }
296
- config[castProperty] = propertyValue;
315
+ config[castPropertyName] = propertyValue;
297
316
  return configBuilder;
298
317
  };
299
318
  }