zcb 0.0.26 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/dist/cjs/cli.cjs +6 -6
- package/dist/cjs/cli.cjs.map +1 -1
- package/dist/cjs/index.cjs +19 -14
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/cli.mjs +6 -6
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/index.mjs +19 -14
- package/dist/esm/index.mjs.map +1 -1
- package/dist/types/cjs/createConfigBuilder.d.cts +9 -9
- package/dist/types/cjs/createConfigBuilder.d.cts.map +1 -1
- package/dist/types/cjs/utils/jsonStringifyReplacer.d.cts +15 -0
- package/dist/types/cjs/utils/jsonStringifyReplacer.d.cts.map +1 -0
- package/dist/types/esm/createConfigBuilder.d.ts +9 -9
- package/dist/types/esm/createConfigBuilder.d.ts.map +1 -1
- package/dist/types/esm/utils/jsonStringifyReplacer.d.ts +15 -0
- package/dist/types/esm/utils/jsonStringifyReplacer.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +16 -15
- package/src/__snapshots__/createConfigBuilder.test.ts.snap +30 -0
- package/src/__testUtils__/configBuilder.ts +12 -12
- package/src/createConfigBuilder.test.ts +78 -53
- package/src/createConfigBuilder.ts +23 -22
- package/src/utils/importValidateTransformWriteConfig.ts +6 -6
- package/src/utils/isPropertyReservedWord.ts +9 -9
- package/src/utils/jsonStringifyReplacer.ts +6 -0
- package/src/utils/transformConfig.test.ts +2 -2
- package/tsconfig.build.json +1 -4
- package/tsconfig.json +0 -3
package/README.md
CHANGED
|
@@ -115,7 +115,7 @@ const configBuilder = createConfigBuilder<ConfigType>(configSchema);
|
|
|
115
115
|
const routeBuilder = createConfigBuilder<RouteType>(routeSchema, { path: ({ page }) => kebabCase(page) });
|
|
116
116
|
const pageBuilder = createConfigBuilder<PageType>(pageSchema);
|
|
117
117
|
const sectionBuilder = createConfigBuilder<SectionType>(sectionSchema);
|
|
118
|
-
const subsectionBuilder = sectionBuilder
|
|
118
|
+
const subsectionBuilder = sectionBuilder.$fork();
|
|
119
119
|
|
|
120
120
|
configBuilder
|
|
121
121
|
.countryCode('GB')
|
|
@@ -130,27 +130,27 @@ configBuilder
|
|
|
130
130
|
contactDetails: pageBuilder
|
|
131
131
|
.name('contactDetails')
|
|
132
132
|
.sections([
|
|
133
|
-
sectionBuilder.name('header')
|
|
133
|
+
sectionBuilder.name('header').$flush(),
|
|
134
134
|
sectionBuilder
|
|
135
135
|
.name('body')
|
|
136
|
-
.sections([subsectionBuilder.name('main')
|
|
137
|
-
|
|
138
|
-
sectionBuilder.name('footer')
|
|
136
|
+
.sections([subsectionBuilder.name('main').$flush(), subsectionBuilder.name('sidebar').$flush()])
|
|
137
|
+
.$flush(),
|
|
138
|
+
sectionBuilder.name('footer').$flush(),
|
|
139
139
|
])
|
|
140
|
-
|
|
140
|
+
.$flush(),
|
|
141
141
|
personalDetails: pageBuilder
|
|
142
142
|
.name('personalDetails')
|
|
143
143
|
.sections([
|
|
144
|
-
sectionBuilder.name('header')
|
|
144
|
+
sectionBuilder.name('header').$flush(),
|
|
145
145
|
sectionBuilder
|
|
146
146
|
.name('body')
|
|
147
|
-
.sections([subsectionBuilder.name('main')
|
|
148
|
-
|
|
149
|
-
sectionBuilder.name('footer')
|
|
147
|
+
.sections([subsectionBuilder.name('main').$flush(), subsectionBuilder.name('sidebar').$flush()])
|
|
148
|
+
.$flush(),
|
|
149
|
+
sectionBuilder.name('footer').$flush(),
|
|
150
150
|
])
|
|
151
|
-
|
|
151
|
+
.$flush(),
|
|
152
152
|
})
|
|
153
|
-
.routes([routeBuilder.page('personalDetails')
|
|
153
|
+
.routes([routeBuilder.page('personalDetails').$flush(), routeBuilder.page('contactDetails').$flush()])
|
|
154
154
|
.timeouts({ apollo: 10_000 })
|
|
155
155
|
.timezone('Europe/London');
|
|
156
156
|
|
|
@@ -159,39 +159,39 @@ export default configBuilder;
|
|
|
159
159
|
|
|
160
160
|
#### builder API
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
**$disable: `() => ConfigBuilder`**
|
|
163
163
|
|
|
164
164
|
Use to disable a slice of config. Disabled slices are removed from the config when the config builder is transformed into a literally typed object in the cli build/watch step.
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
**$errors: `() => ZodIssue[]`**
|
|
167
167
|
|
|
168
168
|
Use to validate the config against the schema and return any errors. The primary use for this is internal within the cli build/watch step.
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
**$experiment: `() => ConfigBuilder`**
|
|
171
171
|
|
|
172
172
|
Use to assign an experiment ID to a slice of config. If an experiment callback file is provided to the cli build/watch step, this ID is used as a marker for where to inject experiment configuration.
|
|
173
173
|
|
|
174
|
-
|
|
174
|
+
**$extend: `(value: ConfigBuilder) => void`**
|
|
175
175
|
|
|
176
176
|
Use to extend an existing config builder.
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
**$flush: `() => JsonObject`**
|
|
179
179
|
|
|
180
180
|
Use to flush the values from a config builder so that it can be immediately reused.
|
|
181
181
|
|
|
182
|
-
|
|
182
|
+
**$fork: `() => ConfigBuilder`**
|
|
183
183
|
|
|
184
184
|
Create a clone of a config builder. Useful if you need to use the same config builder within itself.
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
**$toJson: `() => string`**
|
|
187
187
|
|
|
188
188
|
Returns the config values as a pretty-printed JSON string.
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
**$validate: `() => boolean`**
|
|
191
191
|
|
|
192
192
|
Use to validate the config against the schema and return true/false. The primary use for this is internal within the cli build/watch step.
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
**$values: `() => JsonObject`**
|
|
195
195
|
|
|
196
196
|
Use to return the config values as an object.
|
|
197
197
|
|
|
@@ -209,7 +209,7 @@ NODE_OPTIONS="--loader ts-node/register" npx zcb watch ./configBuilder.ts ./buil
|
|
|
209
209
|
|
|
210
210
|
```ts
|
|
211
211
|
// ./builtConfig.ts
|
|
212
|
-
/* eslint-disable
|
|
212
|
+
/* eslint-disable */
|
|
213
213
|
/* This file is autogenerated, do not edit directly, your changes will not perist. */
|
|
214
214
|
|
|
215
215
|
export default {
|
|
@@ -343,8 +343,8 @@ import configReader from './configReader.ts';
|
|
|
343
343
|
|
|
344
344
|
// scope config path autocompletion and validation
|
|
345
345
|
const scopedReader = configReader.scope('pages.contactDetails')
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
.scope('sections.1.sections')
|
|
347
|
+
.scope('0');
|
|
348
348
|
// reader config path autocompletion and validation
|
|
349
349
|
// value and type preview
|
|
350
350
|
const value = scopedReader.read('name');
|
package/dist/cjs/cli.cjs
CHANGED
|
@@ -110,19 +110,19 @@ const importValidateTransformWriteConfig = (inputFile, outputFile, command, expe
|
|
|
110
110
|
import(node_path.resolve(process.cwd(), inputFile)).then(({
|
|
111
111
|
default: configBuilder
|
|
112
112
|
}) => {
|
|
113
|
-
if (!configBuilder
|
|
113
|
+
if (!configBuilder.$validate()) {
|
|
114
114
|
shelljs.echo(`zcd ${command} => invalid config`);
|
|
115
|
-
shelljs.echo(`zcd ${command} => config values:\n${configBuilder
|
|
116
|
-
shelljs.echo(`zcd ${command} => errors:\n${JSON.stringify(configBuilder
|
|
115
|
+
shelljs.echo(`zcd ${command} => config values:\n${configBuilder.$toJson()}\n`);
|
|
116
|
+
shelljs.echo(`zcd ${command} => errors:\n${JSON.stringify(configBuilder.$errors(), undefined, 2)}\n`);
|
|
117
117
|
shelljs.exit(1);
|
|
118
118
|
}
|
|
119
119
|
shelljs.echo('zcd ${command} => valid config');
|
|
120
|
-
shelljs.echo(`zcd ${command} => config values:\n${configBuilder
|
|
120
|
+
shelljs.echo(`zcd ${command} => config values:\n${configBuilder.$toJson()}\n`);
|
|
121
121
|
if (experimentCallbackFile) {
|
|
122
122
|
import(node_path.resolve(process.cwd(), experimentCallbackFile)).then(({
|
|
123
123
|
default: experimentsCallback
|
|
124
124
|
}) => {
|
|
125
|
-
void transformWriteConfig(configBuilder
|
|
125
|
+
void transformWriteConfig(configBuilder.$values(), {
|
|
126
126
|
experimentsCallback,
|
|
127
127
|
outputFile
|
|
128
128
|
});
|
|
@@ -136,7 +136,7 @@ const importValidateTransformWriteConfig = (inputFile, outputFile, command, expe
|
|
|
136
136
|
});
|
|
137
137
|
return;
|
|
138
138
|
}
|
|
139
|
-
void transformWriteConfig(configBuilder
|
|
139
|
+
void transformWriteConfig(configBuilder.$values(), {
|
|
140
140
|
outputFile
|
|
141
141
|
});
|
|
142
142
|
}).catch(error => {
|
package/dist/cjs/cli.cjs.map
CHANGED
|
@@ -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 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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"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var zodToJsonSchema = require('zod-to-json-schema');
|
|
4
4
|
var lodashEs = require('lodash-es');
|
|
5
|
+
var zod = require('zod');
|
|
5
6
|
require('core-js/modules/es.array.push.js');
|
|
6
7
|
|
|
7
8
|
let NonEmumeralProperties = function (NonEmumeralProperties) {
|
|
@@ -44,7 +45,7 @@ const isDerivedValueCallback = value => typeof value === 'function';
|
|
|
44
45
|
|
|
45
46
|
const isInvalidPropertyOverride = (propertyValue, override = false) => !override && propertyValue !== undefined;
|
|
46
47
|
|
|
47
|
-
const RESERVED_KEYWORDS = new Set(['disable', 'errors', 'experiment', 'extend', 'flush', 'fork', 'toJson', 'validate', 'values']);
|
|
48
|
+
const RESERVED_KEYWORDS = new Set(['$disable', '$errors', '$experiment', '$extend', '$flush', '$fork', '$toJson', '$validate', '$values']);
|
|
48
49
|
const isPropertyReservedWord = propertyName => RESERVED_KEYWORDS.has(propertyName);
|
|
49
50
|
|
|
50
51
|
const isSchemaValid = schema => schema.type !== 'object';
|
|
@@ -71,6 +72,10 @@ const isValidValue = (value, depth = 0) => {
|
|
|
71
72
|
return true;
|
|
72
73
|
};
|
|
73
74
|
|
|
75
|
+
const jsonStringifyReplacer = (_key, value) => value instanceof zod.ZodType ? zodToJsonSchema.zodToJsonSchema(value, {
|
|
76
|
+
errorMessages: true
|
|
77
|
+
}) : value;
|
|
78
|
+
|
|
74
79
|
const objectHasInvalidDefaults = propertyDefinition => propertyDefinition.properties && Object.values(propertyDefinition.properties).some(value => typeof value === 'object' && 'default' in value);
|
|
75
80
|
|
|
76
81
|
const recordHasInvalidDefaults = propertyDefinition => propertyDefinition.additionalProperties && typeof propertyDefinition.additionalProperties === 'object' && 'default' in propertyDefinition.additionalProperties;
|
|
@@ -159,7 +164,7 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
|
|
|
159
164
|
...derivedValueCallbacks
|
|
160
165
|
};
|
|
161
166
|
const configBuilder = {
|
|
162
|
-
disable: () => {
|
|
167
|
+
$disable: () => {
|
|
163
168
|
Object.defineProperty(config, NonEmumeralProperties.DISABLED, {
|
|
164
169
|
configurable: false,
|
|
165
170
|
enumerable: false,
|
|
@@ -167,15 +172,15 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
|
|
|
167
172
|
});
|
|
168
173
|
return configBuilder;
|
|
169
174
|
},
|
|
170
|
-
errors: () => {
|
|
175
|
+
$errors: () => {
|
|
171
176
|
try {
|
|
172
|
-
zodSchema.parse(configBuilder
|
|
177
|
+
zodSchema.parse(configBuilder.$values());
|
|
173
178
|
return [];
|
|
174
179
|
} catch (error) {
|
|
175
180
|
return error.errors;
|
|
176
181
|
}
|
|
177
182
|
},
|
|
178
|
-
experiment: key => {
|
|
183
|
+
$experiment: key => {
|
|
179
184
|
Object.defineProperty(config, NonEmumeralProperties.EXPERIMENT, {
|
|
180
185
|
configurable: false,
|
|
181
186
|
enumerable: false,
|
|
@@ -183,14 +188,14 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
|
|
|
183
188
|
});
|
|
184
189
|
return configBuilder;
|
|
185
190
|
},
|
|
186
|
-
extend: builder => {
|
|
187
|
-
config = transformConfigSync(builder
|
|
191
|
+
$extend: builder => {
|
|
192
|
+
config = transformConfigSync(builder.$values(), [cloneNonEnumerableValues]);
|
|
188
193
|
callbacks = {
|
|
189
194
|
...builder.__callbacks
|
|
190
195
|
};
|
|
191
196
|
},
|
|
192
|
-
flush: () => {
|
|
193
|
-
const values = configBuilder
|
|
197
|
+
$flush: () => {
|
|
198
|
+
const values = configBuilder.$values();
|
|
194
199
|
config = {};
|
|
195
200
|
Object.defineProperty(config, NonEmumeralProperties.ZCB, {
|
|
196
201
|
configurable: false,
|
|
@@ -199,18 +204,18 @@ const createConfigBuilder = (zodSchema, derivedValueCallbacks = {}, initialValue
|
|
|
199
204
|
});
|
|
200
205
|
return values;
|
|
201
206
|
},
|
|
202
|
-
fork: () => createConfigBuilder(zodSchema, derivedValueCallbacks),
|
|
203
|
-
toJson: () => JSON.stringify(configBuilder
|
|
204
|
-
validate: () => {
|
|
207
|
+
$fork: () => createConfigBuilder(zodSchema, derivedValueCallbacks),
|
|
208
|
+
$toJson: () => JSON.stringify(configBuilder.$values(), jsonStringifyReplacer, 2),
|
|
209
|
+
$validate: () => {
|
|
205
210
|
try {
|
|
206
|
-
zodSchema.parse(configBuilder
|
|
211
|
+
zodSchema.parse(configBuilder.$values());
|
|
207
212
|
return true;
|
|
208
213
|
} catch (error) {
|
|
209
214
|
console.error(error);
|
|
210
215
|
return false;
|
|
211
216
|
}
|
|
212
217
|
},
|
|
213
|
-
values: () => {
|
|
218
|
+
$values: () => {
|
|
214
219
|
for (const property in callbacks) {
|
|
215
220
|
const callback = callbacks[property];
|
|
216
221
|
if (callback) {
|