@powerlines/schema 0.11.88 → 0.11.90

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/bundle.cjs CHANGED
@@ -36,7 +36,10 @@ async function bundle(context, file, options = {}) {
36
36
  }, (0, _powerlines_unplugin_esbuild.resolveOptions)(context), { plugins: [(0, unplugin.createEsbuildPlugin)((0, _powerlines_core_lib_unplugin.createUnpluginResolver)(context, {
37
37
  name: options.name ?? `${(0, _stryke_path_file_path_fns.findFileName)(file)} Bundler`,
38
38
  prefix: false,
39
- overrides: (0, defu.default)(options.resolve ?? {}, { skipNodeModulesBundle: false }),
39
+ overrides: (0, defu.default)(options.resolve ?? {}, {
40
+ skipNodeModulesBundle: false,
41
+ external: ["@alloy-js/*"]
42
+ }),
40
43
  silenceHookLogging: true
41
44
  }))()] }));
42
45
  if (result.errors.length > 0) throw new Error(`Failed to bundle ${file}: ${result.errors.map((error) => error.text).join(", ")}`);
package/dist/bundle.mjs CHANGED
@@ -34,7 +34,10 @@ async function bundle(context, file, options = {}) {
34
34
  }, resolveOptions(context), { plugins: [createEsbuildPlugin(createUnpluginResolver(context, {
35
35
  name: options.name ?? `${findFileName(file)} Bundler`,
36
36
  prefix: false,
37
- overrides: defu(options.resolve ?? {}, { skipNodeModulesBundle: false }),
37
+ overrides: defu(options.resolve ?? {}, {
38
+ skipNodeModulesBundle: false,
39
+ external: ["@alloy-js/*"]
40
+ }),
38
41
  silenceHookLogging: true
39
42
  }))()] }));
40
43
  if (result.errors.length > 0) throw new Error(`Failed to bundle ${file}: ${result.errors.map((error) => error.text).join(", ")}`);
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.mjs","names":[],"sources":["../src/bundle.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { ResolveOptions, UnresolvedContext } from \"@powerlines/core\";\nimport { createUnpluginResolver } from \"@powerlines/core/lib/unplugin\";\nimport { resolveOptions } from \"@powerlines/unplugin/esbuild\";\nimport { omit } from \"@stryke/helpers/omit\";\nimport { findFileName } from \"@stryke/path/file-path-fns\";\nimport { DeepPartial } from \"@stryke/types/base\";\nimport defu from \"defu\";\nimport type { BuildOptions } from \"esbuild\";\nimport { build, OutputFile } from \"esbuild\";\nimport { createEsbuildPlugin } from \"unplugin\";\n\nexport type BundleOptions = DeepPartial<BuildOptions> & {\n name?: string;\n resolve?: DeepPartial<ResolveOptions>;\n};\n\n/**\n * Bundle a type definition to a module.\n *\n * @param context - The context object containing the environment paths.\n * @param file - The file path to bundle.\n * @param options - Optional overrides for the ESBuild configuration.\n * @returns A promise that resolves to the bundled module.\n */\nexport async function bundle<TContext extends UnresolvedContext>(\n context: TContext,\n file: string,\n options: BundleOptions = {}\n): Promise<OutputFile> {\n const path = await context.fs.resolve(file);\n if (!path || !context.fs.existsSync(path)) {\n throw new Error(\n `Module not found: \"${file}\". Please check the path and try again.`\n );\n }\n\n const result = await build(\n defu(\n {\n platform: \"node\",\n ...omit(options, [\"name\", \"resolve\"]),\n logLevel: \"silent\",\n entryPoints: [path],\n write: false,\n sourcemap: false,\n splitting: false,\n treeShaking: false,\n bundle: true,\n packages: \"bundle\",\n keepNames: true,\n metafile: false\n },\n resolveOptions(context),\n {\n plugins: [\n createEsbuildPlugin(\n createUnpluginResolver(context, {\n name: options.name ?? `${findFileName(file)} Bundler`,\n prefix: false,\n overrides: defu(options.resolve ?? {}, {\n skipNodeModulesBundle: false\n }),\n silenceHookLogging: true\n })\n )()\n ]\n }\n )\n );\n if (result.errors.length > 0) {\n throw new Error(\n `Failed to bundle ${file}: ${result.errors\n .map(error => error.text)\n .join(\", \")}`\n );\n }\n if (result.warnings.length > 0) {\n context.warn(\n `Warnings while bundling ${file}: ${result.warnings\n .map(warning => warning.text)\n .join(\", \")}`\n );\n }\n if (!result.outputFiles || result.outputFiles.filter(Boolean).length === 0) {\n throw new Error(\n `No output files generated for ${\n file\n }. Please check the configuration and try again.`\n );\n }\n\n return result.outputFiles.filter(Boolean)[0]!;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CA,eAAsB,OACpB,SACA,MACA,UAAyB,CAAC,GACL;CACrB,MAAM,OAAO,MAAM,QAAQ,GAAG,QAAQ,IAAI;CAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,IAAI,GACtC,MAAM,IAAI,MACR,sBAAsB,KAAK,wCAC7B;CAGF,MAAM,SAAS,MAAM,MACnB,KACE;EACE,UAAU;EACV,GAAG,KAAK,SAAS,CAAC,QAAQ,SAAS,CAAC;EACpC,UAAU;EACV,aAAa,CAAC,IAAI;EAClB,OAAO;EACP,WAAW;EACX,WAAW;EACX,aAAa;EACb,QAAQ;EACR,UAAU;EACV,WAAW;EACX,UAAU;CACZ,GACA,eAAe,OAAO,GACtB,EACE,SAAS,CACP,oBACE,uBAAuB,SAAS;EAC9B,MAAM,QAAQ,QAAQ,GAAG,aAAa,IAAI,EAAE;EAC5C,QAAQ;EACR,WAAW,KAAK,QAAQ,WAAW,CAAC,GAAG,EACrC,uBAAuB,MACzB,CAAC;EACD,oBAAoB;CACtB,CAAC,CACH,EAAE,CACJ,EACF,CACF,CACF;CACA,IAAI,OAAO,OAAO,SAAS,GACzB,MAAM,IAAI,MACR,oBAAoB,KAAK,IAAI,OAAO,OACjC,KAAI,UAAS,MAAM,IAAI,EACvB,KAAK,IAAI,GACd;CAEF,IAAI,OAAO,SAAS,SAAS,GAC3B,QAAQ,KACN,2BAA2B,KAAK,IAAI,OAAO,SACxC,KAAI,YAAW,QAAQ,IAAI,EAC3B,KAAK,IAAI,GACd;CAEF,IAAI,CAAC,OAAO,eAAe,OAAO,YAAY,OAAO,OAAO,EAAE,WAAW,GACvE,MAAM,IAAI,MACR,iCACE,KACD,gDACH;CAGF,OAAO,OAAO,YAAY,OAAO,OAAO,EAAE;AAC5C"}
1
+ {"version":3,"file":"bundle.mjs","names":[],"sources":["../src/bundle.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport type { ResolveOptions, UnresolvedContext } from \"@powerlines/core\";\nimport { createUnpluginResolver } from \"@powerlines/core/lib/unplugin\";\nimport { resolveOptions } from \"@powerlines/unplugin/esbuild\";\nimport { omit } from \"@stryke/helpers/omit\";\nimport { findFileName } from \"@stryke/path/file-path-fns\";\nimport { DeepPartial } from \"@stryke/types/base\";\nimport defu from \"defu\";\nimport type { BuildOptions } from \"esbuild\";\nimport { build, OutputFile } from \"esbuild\";\nimport { createEsbuildPlugin } from \"unplugin\";\n\nexport type BundleOptions = DeepPartial<BuildOptions> & {\n name?: string;\n resolve?: DeepPartial<ResolveOptions>;\n};\n\n/**\n * Bundle a type definition to a module.\n *\n * @param context - The context object containing the environment paths.\n * @param file - The file path to bundle.\n * @param options - Optional overrides for the ESBuild configuration.\n * @returns A promise that resolves to the bundled module.\n */\nexport async function bundle<TContext extends UnresolvedContext>(\n context: TContext,\n file: string,\n options: BundleOptions = {}\n): Promise<OutputFile> {\n const path = await context.fs.resolve(file);\n if (!path || !context.fs.existsSync(path)) {\n throw new Error(\n `Module not found: \"${file}\". Please check the path and try again.`\n );\n }\n\n const result = await build(\n defu(\n {\n platform: \"node\",\n ...omit(options, [\"name\", \"resolve\"]),\n logLevel: \"silent\",\n entryPoints: [path],\n write: false,\n sourcemap: false,\n splitting: false,\n treeShaking: false,\n bundle: true,\n packages: \"bundle\",\n keepNames: true,\n metafile: false\n },\n resolveOptions(context),\n {\n plugins: [\n createEsbuildPlugin(\n createUnpluginResolver(context, {\n name: options.name ?? `${findFileName(file)} Bundler`,\n prefix: false,\n overrides: defu(options.resolve ?? {}, {\n skipNodeModulesBundle: false,\n external: [\"@alloy-js/*\"],\n }),\n silenceHookLogging: true\n })\n )()\n ]\n }\n )\n );\n if (result.errors.length > 0) {\n throw new Error(\n `Failed to bundle ${file}: ${result.errors\n .map(error => error.text)\n .join(\", \")}`\n );\n }\n if (result.warnings.length > 0) {\n context.warn(\n `Warnings while bundling ${file}: ${result.warnings\n .map(warning => warning.text)\n .join(\", \")}`\n );\n }\n if (!result.outputFiles || result.outputFiles.filter(Boolean).length === 0) {\n throw new Error(\n `No output files generated for ${\n file\n }. Please check the configuration and try again.`\n );\n }\n\n return result.outputFiles.filter(Boolean)[0]!;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CA,eAAsB,OACpB,SACA,MACA,UAAyB,CAAC,GACL;CACrB,MAAM,OAAO,MAAM,QAAQ,GAAG,QAAQ,IAAI;CAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,WAAW,IAAI,GACtC,MAAM,IAAI,MACR,sBAAsB,KAAK,wCAC7B;CAGF,MAAM,SAAS,MAAM,MACnB,KACE;EACE,UAAU;EACV,GAAG,KAAK,SAAS,CAAC,QAAQ,SAAS,CAAC;EACpC,UAAU;EACV,aAAa,CAAC,IAAI;EAClB,OAAO;EACP,WAAW;EACX,WAAW;EACX,aAAa;EACb,QAAQ;EACR,UAAU;EACV,WAAW;EACX,UAAU;CACZ,GACA,eAAe,OAAO,GACtB,EACE,SAAS,CACP,oBACE,uBAAuB,SAAS;EAC9B,MAAM,QAAQ,QAAQ,GAAG,aAAa,IAAI,EAAE;EAC5C,QAAQ;EACR,WAAW,KAAK,QAAQ,WAAW,CAAC,GAAG;GACrC,uBAAuB;GACvB,UAAU,CAAC,aAAa;EAC1B,CAAC;EACD,oBAAoB;CACtB,CAAC,CACH,EAAE,CACJ,EACF,CACF,CACF;CACA,IAAI,OAAO,OAAO,SAAS,GACzB,MAAM,IAAI,MACR,oBAAoB,KAAK,IAAI,OAAO,OACjC,KAAI,UAAS,MAAM,IAAI,EACvB,KAAK,IAAI,GACd;CAEF,IAAI,OAAO,SAAS,SAAS,GAC3B,QAAQ,KACN,2BAA2B,KAAK,IAAI,OAAO,SACxC,KAAI,YAAW,QAAQ,IAAI,EAC3B,KAAK,IAAI,GACd;CAEF,IAAI,CAAC,OAAO,eAAe,OAAO,YAAY,OAAO,OAAO,EAAE,WAAW,GACvE,MAAM,IAAI,MACR,iCACE,KACD,gDACH;CAGF,OAAO,OAAO,YAAY,OAAO,OAAO,EAAE;AAC5C"}
package/dist/codegen.cjs CHANGED
@@ -156,25 +156,25 @@ function generateParserCode(schema) {
156
156
  /**
157
157
  * Generates inline parsing statements assuming `value` is already defined.
158
158
  */
159
- function generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar) {
159
+ function generateCoreStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
160
160
  const lines = [];
161
- if (view.const !== void 0) {
162
- const constValue = JSON.stringify(view.const);
161
+ if (schema.const !== void 0) {
162
+ const constValue = JSON.stringify(schema.const);
163
163
  lines.push(`if (JSON.stringify(${valueVar}) !== ${constValue}) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected the constant value " + ${constValue} }); }`, `${targetVar} = ${constValue};`);
164
164
  return lines;
165
165
  }
166
- if (Array.isArray(view.enum)) {
167
- const enumValues = JSON.stringify(view.enum);
166
+ if (Array.isArray(schema.enum)) {
167
+ const enumValues = JSON.stringify(schema.enum);
168
168
  lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${valueVar}))) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected one of " + ${enumValues} }); }`, `${targetVar} = ${valueVar};`);
169
169
  return lines;
170
170
  }
171
- if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
172
- const branches = view.oneOf ?? view.anyOf ?? [];
173
- const matchedVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Matched` : "matched");
171
+ if (Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf)) {
172
+ const branches = schema.oneOf ?? schema.anyOf ?? [];
173
+ const matchedVar = nextTemp(schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(schema.name)}Matched` : "matched");
174
174
  lines.push(`let ${matchedVar} = false;`);
175
175
  for (const branch of branches) {
176
- const branchErrorsVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}BranchErrors` : "branchErrors");
177
- const branchResultVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}BranchResult` : "branchResult");
176
+ const branchErrorsVar = nextTemp(schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(schema.name)}BranchErrors` : "branchErrors");
177
+ const branchResultVar = nextTemp(schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(schema.name)}BranchResult` : "branchResult");
178
178
  lines.push(`if (!${matchedVar}) {`);
179
179
  lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
180
180
  lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
@@ -183,19 +183,19 @@ function generateParserCode(schema) {
183
183
  lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
184
184
  return lines;
185
185
  }
186
- if (Array.isArray(view.allOf)) {
187
- const { allOf, ...rest } = view;
186
+ if (Array.isArray(schema.allOf)) {
187
+ const { allOf, ...rest } = schema;
188
188
  const merged = require_helpers.merge(rest, ...allOf);
189
189
  lines.push(...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar));
190
190
  return lines;
191
191
  }
192
- const declaredTypes = readDeclaredTypes(view);
193
- switch (require_metadata.getPrimarySchemaType(view) ?? declaredTypes.find((type) => type !== "null") ?? (view.properties ? "object" : view.items ? "array" : void 0)) {
192
+ const declaredTypes = readDeclaredTypes(schema);
193
+ switch (require_metadata.getPrimarySchemaType(schema) ?? declaredTypes.find((type) => type !== "null") ?? (schema.properties ? "object" : schema.items ? "array" : void 0)) {
194
194
  case "object":
195
- lines.push(...generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar));
195
+ lines.push(...generateObjectStatements(schema, valueVar, pathVar, targetVar, errorsVar));
196
196
  break;
197
197
  case "array":
198
- lines.push(...generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar));
198
+ lines.push(...generateArrayStatements(schema, valueVar, pathVar, targetVar, errorsVar));
199
199
  break;
200
200
  case "string":
201
201
  lines.push(`if (typeof ${valueVar} === "string") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "number" || typeof ${valueVar} === "boolean") {`, ` ${targetVar} = String(${valueVar});`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a string value" });`, ` ${targetVar} = ${valueVar};`, `}`);
@@ -223,38 +223,42 @@ function generateParserCode(schema) {
223
223
  * Generates the parsing statements for an `object` schema, applying property
224
224
  * defaults and recursing into each declared property.
225
225
  */
226
- function generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar) {
227
- const type = stringifyType(view);
226
+ function generateObjectStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
227
+ const type = stringifyType(schema);
228
228
  const lines = [
229
229
  `if (typeof ${valueVar} !== "object" || ${valueVar} === null || Array.isArray(${valueVar})) {`,
230
230
  ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an object value" });`,
231
231
  ` ${targetVar} = ${valueVar};`,
232
232
  `} else {`
233
233
  ];
234
- const resultVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Schema` : "schema");
234
+ const resultVar = nextTemp(type || schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || schema.name)}Schema` : "schema");
235
235
  lines.push(`const ${resultVar} = {} as Record<string, any>`);
236
- const properties = require_type_checks.isJsonSchemaObject(view) ? require_helpers.getPropertiesList(view) : [];
237
- const propertyNames = /* @__PURE__ */ new Set();
238
- for (const property of properties) {
239
- const name = property.name;
240
- propertyNames.add(name);
241
- const accessor = property.alias?.length ? `(${valueVar}[${JSON.stringify(name)}] ?? ${property.alias.map((alias) => `${valueVar}[${JSON.stringify(alias)}]`).join(" ?? ")})` : `${valueVar}[${JSON.stringify(name)}]`;
242
- const propertyPath = childPath(pathVar, `.${name}`);
243
- const propertyVar = nextTemp(name ? `${(0, _stryke_string_format_camel_case.camelCase)(name)}Property` : "property");
244
- const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : "";
245
- lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
246
- lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
247
- lines.push(`${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
248
- if (missingBranch) lines.push(`} else { ${missingBranch} }`);
249
- else lines.push("}");
236
+ if (require_type_checks.isJsonSchemaObject(schema)) {
237
+ const propertyNames = /* @__PURE__ */ new Set();
238
+ for (const property of require_helpers.getPropertiesList(schema)) {
239
+ propertyNames.add(property.name);
240
+ let accessor;
241
+ if ((0, _stryke_type_checks.isSetArray)(property.alias)) {
242
+ accessor = `(${valueVar}[${JSON.stringify(property.name)}] ${require_type_checks.isJsonSchemaString(property) ? "||" : "??"} ${property.alias.map((alias) => `${valueVar}[${JSON.stringify(alias)}]`).join(` ${require_type_checks.isJsonSchemaString(property) ? "||" : "??"} `)})`;
243
+ property.alias.forEach((alias) => propertyNames.add(alias));
244
+ } else accessor = `${valueVar}[${JSON.stringify(property.name)}]`;
245
+ const propertyPath = childPath(pathVar, `.${property.name}`);
246
+ const propertyVar = nextTemp(property.name ? `${(0, _stryke_string_format_camel_case.camelCase)(property.name)}Property` : "property");
247
+ const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(property.name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : "";
248
+ lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
249
+ lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
250
+ lines.push(`${resultVar}[${JSON.stringify(property.name)}] = ${propertyVar};`);
251
+ if (missingBranch) lines.push(`} else { ${missingBranch} }`);
252
+ else lines.push("}");
253
+ }
254
+ const additional = schema.additionalProperties;
255
+ if (require_type_checks.isJsonSchema(additional)) {
256
+ const additionalVar = nextTemp(type || schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || schema.name)}AdditionalProperties` : "additionalProperties");
257
+ lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
258
+ lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
259
+ lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
260
+ } else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
250
261
  }
251
- const additional = view.additionalProperties;
252
- if (require_type_checks.isJsonSchema(additional)) {
253
- const additionalVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}AdditionalProperties` : "additionalProperties");
254
- lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
255
- lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
256
- lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
257
- } else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
258
262
  lines.push(`${targetVar} = ${resultVar};`, `}`);
259
263
  return lines;
260
264
  }
@@ -262,21 +266,21 @@ function generateParserCode(schema) {
262
266
  * Generates the parsing statements for an `array` schema, recursing into each
263
267
  * item (supporting both list and tuple `items`/`prefixItems` forms).
264
268
  */
265
- function generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar) {
269
+ function generateArrayStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
266
270
  const lines = [
267
271
  `if (!Array.isArray(${valueVar})) {`,
268
272
  ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an array value" });`,
269
273
  ` ${targetVar} = ${valueVar};`,
270
274
  `} else {`
271
275
  ];
272
- const resultVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Array` : "array");
273
- lines.push(` const ${resultVar}: unknown[] = [];`);
274
- const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
276
+ const resultVar = nextTemp(schema.name ? `${(0, _stryke_string_format_camel_case.camelCase)(schema.name)}Array` : "array");
277
+ lines.push(`const ${resultVar}: unknown[] = [];`);
278
+ const tupleItems = schema.prefixItems ?? (Array.isArray(schema.items) ? schema.items : void 0);
275
279
  if (tupleItems) {
276
- const listItems = !Array.isArray(view.items) ? view.items : void 0;
280
+ const listItems = !Array.isArray(schema.items) ? schema.items : void 0;
277
281
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
278
282
  tupleItems.forEach((item, index) => {
279
- lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
283
+ lines.push(` ${index === 0 ? "if" : "else if"} (index === ${index}) {`);
280
284
  lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
281
285
  lines.push("}");
282
286
  });
@@ -288,7 +292,7 @@ function generateParserCode(schema) {
288
292
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
289
293
  return lines;
290
294
  }
291
- const itemSchema = view.items ?? true;
295
+ const itemSchema = schema.items ?? true;
292
296
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
293
297
  lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
294
298
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.cts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;AAoCA;iBAAgB,cAAA,CACd,KAAA,YACA,IAAA,GAAO,cAAc;;;;iBAsBP,aAAA,CAAc,MAAmB,GAAV,UAAU;;;AAtBjB;AAsBhC;;;iBA8FgB,iBAAA,CAAkB,KAAA,aAAkB,cAAc;AA9FjB;AA8FjD;;;;AAAkE;AA0ElE;;;;AAAqD;AAinBrD;;;;;;;;;AAzxBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAmnBA;AAiBrD;;;;;iBAnBgB,sBAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA;;;;;;;;;AAmBkB;;;;iBAFrC,YAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA"}
1
+ {"version":3,"file":"codegen.d.cts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;AAwCA;iBAAgB,cAAA,CACd,KAAA,YACA,IAAA,GAAO,cAAc;;;;iBAsBP,aAAA,CAAc,MAAmB,GAAV,UAAU;;;AAtBjB;AAsBhC;;;iBA8FgB,iBAAA,CAAkB,KAAA,aAAkB,cAAc;AA9FjB;AA8FjD;;;;AAAkE;AA0ElE;;;;AAAqD;AAunBrD;;;;;;;;;AA/xBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAynBA;AAiBrD;;;;;iBAnBgB,sBAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA;;;;;;;;;AAmBkB;;;;iBAFrC,YAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.mts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;AAoCA;iBAAgB,cAAA,CACd,KAAA,YACA,IAAA,GAAO,cAAc;;;;iBAsBP,aAAA,CAAc,MAAmB,GAAV,UAAU;;;AAtBjB;AAsBhC;;;iBA8FgB,iBAAA,CAAkB,KAAA,aAAkB,cAAc;AA9FjB;AA8FjD;;;;AAAkE;AA0ElE;;;;AAAqD;AAinBrD;;;;;;;;;AAzxBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAmnBA;AAiBrD;;;;;iBAnBgB,sBAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA;;;;;;;;;AAmBkB;;;;iBAFrC,YAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA"}
1
+ {"version":3,"file":"codegen.d.mts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;AAwCA;iBAAgB,cAAA,CACd,KAAA,YACA,IAAA,GAAO,cAAc;;;;iBAsBP,aAAA,CAAc,MAAmB,GAAV,UAAU;;;AAtBjB;AAsBhC;;;iBA8FgB,iBAAA,CAAkB,KAAA,aAAkB,cAAc;AA9FjB;AA8FjD;;;;AAAkE;AA0ElE;;;;AAAqD;AAunBrD;;;;;;;;;AA/xBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAynBA;AAiBrD;;;;;iBAnBgB,sBAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA;;;;;;;;;AAmBkB;;;;iBAFrC,YAAA,CACd,MAAA,EAAQ,UAAA,EACR,YAAA,GAAe,UAAA,QAAkB,cAAA"}
package/dist/codegen.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  import { getPrimarySchemaType } from "./metadata.mjs";
2
- import { isJsonSchema, isJsonSchemaObject } from "./type-checks.mjs";
2
+ import { isJsonSchema, isJsonSchemaObject, isJsonSchemaString } from "./type-checks.mjs";
3
3
  import { getPropertiesList, isSchemaNullable, merge } from "./helpers.mjs";
4
4
  import { getValidator } from "./validate.mjs";
5
5
  import { toBool } from "@stryke/convert/to-bool";
6
6
  import { camelCase } from "@stryke/string-format/camel-case";
7
- import { isInteger, isObject, isString } from "@stryke/type-checks";
7
+ import { isInteger, isObject, isSetArray, isString } from "@stryke/type-checks";
8
8
  import { isBoolean as isBoolean$1 } from "@stryke/type-checks/is-boolean";
9
9
  import { isNull as isNull$1 } from "@stryke/type-checks/is-null";
10
10
  import { isNumber as isNumber$1 } from "@stryke/type-checks/is-number";
@@ -154,25 +154,25 @@ function generateParserCode(schema) {
154
154
  /**
155
155
  * Generates inline parsing statements assuming `value` is already defined.
156
156
  */
157
- function generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar) {
157
+ function generateCoreStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
158
158
  const lines = [];
159
- if (view.const !== void 0) {
160
- const constValue = JSON.stringify(view.const);
159
+ if (schema.const !== void 0) {
160
+ const constValue = JSON.stringify(schema.const);
161
161
  lines.push(`if (JSON.stringify(${valueVar}) !== ${constValue}) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected the constant value " + ${constValue} }); }`, `${targetVar} = ${constValue};`);
162
162
  return lines;
163
163
  }
164
- if (Array.isArray(view.enum)) {
165
- const enumValues = JSON.stringify(view.enum);
164
+ if (Array.isArray(schema.enum)) {
165
+ const enumValues = JSON.stringify(schema.enum);
166
166
  lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${valueVar}))) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected one of " + ${enumValues} }); }`, `${targetVar} = ${valueVar};`);
167
167
  return lines;
168
168
  }
169
- if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
170
- const branches = view.oneOf ?? view.anyOf ?? [];
171
- const matchedVar = nextTemp(view.name ? `${camelCase(view.name)}Matched` : "matched");
169
+ if (Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf)) {
170
+ const branches = schema.oneOf ?? schema.anyOf ?? [];
171
+ const matchedVar = nextTemp(schema.name ? `${camelCase(schema.name)}Matched` : "matched");
172
172
  lines.push(`let ${matchedVar} = false;`);
173
173
  for (const branch of branches) {
174
- const branchErrorsVar = nextTemp(view.name ? `${camelCase(view.name)}BranchErrors` : "branchErrors");
175
- const branchResultVar = nextTemp(view.name ? `${camelCase(view.name)}BranchResult` : "branchResult");
174
+ const branchErrorsVar = nextTemp(schema.name ? `${camelCase(schema.name)}BranchErrors` : "branchErrors");
175
+ const branchResultVar = nextTemp(schema.name ? `${camelCase(schema.name)}BranchResult` : "branchResult");
176
176
  lines.push(`if (!${matchedVar}) {`);
177
177
  lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
178
178
  lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
@@ -181,19 +181,19 @@ function generateParserCode(schema) {
181
181
  lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
182
182
  return lines;
183
183
  }
184
- if (Array.isArray(view.allOf)) {
185
- const { allOf, ...rest } = view;
184
+ if (Array.isArray(schema.allOf)) {
185
+ const { allOf, ...rest } = schema;
186
186
  const merged = merge(rest, ...allOf);
187
187
  lines.push(...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar));
188
188
  return lines;
189
189
  }
190
- const declaredTypes = readDeclaredTypes(view);
191
- switch (getPrimarySchemaType(view) ?? declaredTypes.find((type) => type !== "null") ?? (view.properties ? "object" : view.items ? "array" : void 0)) {
190
+ const declaredTypes = readDeclaredTypes(schema);
191
+ switch (getPrimarySchemaType(schema) ?? declaredTypes.find((type) => type !== "null") ?? (schema.properties ? "object" : schema.items ? "array" : void 0)) {
192
192
  case "object":
193
- lines.push(...generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar));
193
+ lines.push(...generateObjectStatements(schema, valueVar, pathVar, targetVar, errorsVar));
194
194
  break;
195
195
  case "array":
196
- lines.push(...generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar));
196
+ lines.push(...generateArrayStatements(schema, valueVar, pathVar, targetVar, errorsVar));
197
197
  break;
198
198
  case "string":
199
199
  lines.push(`if (typeof ${valueVar} === "string") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "number" || typeof ${valueVar} === "boolean") {`, ` ${targetVar} = String(${valueVar});`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a string value" });`, ` ${targetVar} = ${valueVar};`, `}`);
@@ -221,38 +221,42 @@ function generateParserCode(schema) {
221
221
  * Generates the parsing statements for an `object` schema, applying property
222
222
  * defaults and recursing into each declared property.
223
223
  */
224
- function generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar) {
225
- const type = stringifyType(view);
224
+ function generateObjectStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
225
+ const type = stringifyType(schema);
226
226
  const lines = [
227
227
  `if (typeof ${valueVar} !== "object" || ${valueVar} === null || Array.isArray(${valueVar})) {`,
228
228
  ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an object value" });`,
229
229
  ` ${targetVar} = ${valueVar};`,
230
230
  `} else {`
231
231
  ];
232
- const resultVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Schema` : "schema");
232
+ const resultVar = nextTemp(type || schema.name ? `${camelCase(type || schema.name)}Schema` : "schema");
233
233
  lines.push(`const ${resultVar} = {} as Record<string, any>`);
234
- const properties = isJsonSchemaObject(view) ? getPropertiesList(view) : [];
235
- const propertyNames = /* @__PURE__ */ new Set();
236
- for (const property of properties) {
237
- const name = property.name;
238
- propertyNames.add(name);
239
- const accessor = property.alias?.length ? `(${valueVar}[${JSON.stringify(name)}] ?? ${property.alias.map((alias) => `${valueVar}[${JSON.stringify(alias)}]`).join(" ?? ")})` : `${valueVar}[${JSON.stringify(name)}]`;
240
- const propertyPath = childPath(pathVar, `.${name}`);
241
- const propertyVar = nextTemp(name ? `${camelCase(name)}Property` : "property");
242
- const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : "";
243
- lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
244
- lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
245
- lines.push(`${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
246
- if (missingBranch) lines.push(`} else { ${missingBranch} }`);
247
- else lines.push("}");
234
+ if (isJsonSchemaObject(schema)) {
235
+ const propertyNames = /* @__PURE__ */ new Set();
236
+ for (const property of getPropertiesList(schema)) {
237
+ propertyNames.add(property.name);
238
+ let accessor;
239
+ if (isSetArray(property.alias)) {
240
+ accessor = `(${valueVar}[${JSON.stringify(property.name)}] ${isJsonSchemaString(property) ? "||" : "??"} ${property.alias.map((alias) => `${valueVar}[${JSON.stringify(alias)}]`).join(` ${isJsonSchemaString(property) ? "||" : "??"} `)})`;
241
+ property.alias.forEach((alias) => propertyNames.add(alias));
242
+ } else accessor = `${valueVar}[${JSON.stringify(property.name)}]`;
243
+ const propertyPath = childPath(pathVar, `.${property.name}`);
244
+ const propertyVar = nextTemp(property.name ? `${camelCase(property.name)}Property` : "property");
245
+ const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(property.name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : "";
246
+ lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
247
+ lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
248
+ lines.push(`${resultVar}[${JSON.stringify(property.name)}] = ${propertyVar};`);
249
+ if (missingBranch) lines.push(`} else { ${missingBranch} }`);
250
+ else lines.push("}");
251
+ }
252
+ const additional = schema.additionalProperties;
253
+ if (isJsonSchema(additional)) {
254
+ const additionalVar = nextTemp(type || schema.name ? `${camelCase(type || schema.name)}AdditionalProperties` : "additionalProperties");
255
+ lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
256
+ lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
257
+ lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
258
+ } else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
248
259
  }
249
- const additional = view.additionalProperties;
250
- if (isJsonSchema(additional)) {
251
- const additionalVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}AdditionalProperties` : "additionalProperties");
252
- lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
253
- lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
254
- lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
255
- } else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
256
260
  lines.push(`${targetVar} = ${resultVar};`, `}`);
257
261
  return lines;
258
262
  }
@@ -260,21 +264,21 @@ function generateParserCode(schema) {
260
264
  * Generates the parsing statements for an `array` schema, recursing into each
261
265
  * item (supporting both list and tuple `items`/`prefixItems` forms).
262
266
  */
263
- function generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar) {
267
+ function generateArrayStatements(schema, valueVar, pathVar, targetVar, errorsVar) {
264
268
  const lines = [
265
269
  `if (!Array.isArray(${valueVar})) {`,
266
270
  ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an array value" });`,
267
271
  ` ${targetVar} = ${valueVar};`,
268
272
  `} else {`
269
273
  ];
270
- const resultVar = nextTemp(view.name ? `${camelCase(view.name)}Array` : "array");
271
- lines.push(` const ${resultVar}: unknown[] = [];`);
272
- const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
274
+ const resultVar = nextTemp(schema.name ? `${camelCase(schema.name)}Array` : "array");
275
+ lines.push(`const ${resultVar}: unknown[] = [];`);
276
+ const tupleItems = schema.prefixItems ?? (Array.isArray(schema.items) ? schema.items : void 0);
273
277
  if (tupleItems) {
274
- const listItems = !Array.isArray(view.items) ? view.items : void 0;
278
+ const listItems = !Array.isArray(schema.items) ? schema.items : void 0;
275
279
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
276
280
  tupleItems.forEach((item, index) => {
277
- lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
281
+ lines.push(` ${index === 0 ? "if" : "else if"} (index === ${index}) {`);
278
282
  lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
279
283
  lines.push("}");
280
284
  });
@@ -286,7 +290,7 @@ function generateParserCode(schema) {
286
290
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
287
291
  return lines;
288
292
  }
289
- const itemSchema = view.items ?? true;
293
+ const itemSchema = schema.items ?? true;
290
294
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
291
295
  lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
292
296
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.mjs","names":["isUndefined","isNull","isBoolean","isNumber","isSetString"],"sources":["../src/codegen.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { toBool } from \"@stryke/convert/to-bool\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { isInteger, isObject, isString } from \"@stryke/type-checks\";\nimport { isBoolean } from \"@stryke/type-checks/is-boolean\";\nimport { isNull } from \"@stryke/type-checks/is-null\";\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { isUndefined } from \"@stryke/type-checks/is-undefined\";\nimport standaloneCode from \"ajv/dist/standalone\";\nimport { getPropertiesList, isSchemaNullable, merge } from \"./helpers\";\nimport { getPrimarySchemaType } from \"./metadata\";\nimport { isJsonSchema, isJsonSchemaObject } from \"./type-checks\";\nimport { JsonSchema, JsonSchemaLike, JsonSchemaType } from \"./types\";\nimport { getValidator } from \"./validate\";\n\n/**\n * Stringifies a value for generated TypeScript code.\n */\nexport function stringifyValue(\n value?: unknown,\n type?: JsonSchemaType | string\n): string {\n return isUndefined(value)\n ? \"undefined\"\n : isNull(value)\n ? \"null\"\n : type === \"boolean\" || isBoolean(value)\n ? String(toBool(value))\n : type === \"number\" || isNumber(value)\n ? Number.parseFloat(String(value)).toLocaleString(undefined, {\n maximumFractionDigits: 20\n })\n : type === \"integer\"\n ? Number.parseInt(String(value)).toLocaleString()\n : type === \"string\" || type === \"object\" || type === \"array\"\n ? JSON.stringify(value)\n : String(value);\n}\n\n/**\n * Stringifies a JSON Schema fragment into a TypeScript-like type string.\n */\nexport function stringifyType(schema?: JsonSchema): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (typeof schema === \"boolean\") {\n return schema ? \"unknown\" : \"never\";\n }\n\n if (isJsonSchemaObject(schema) && isSetString(schema.name)) {\n return schema.name;\n }\n\n const objectSchema = schema as JsonSchemaLike;\n\n if (isSetString(objectSchema.$ref)) {\n const match = /^#\\/(?:definitions|\\$defs)\\/(.+)$/.exec(objectSchema.$ref);\n\n return match?.[1] ?? objectSchema.$ref;\n }\n\n const primaryType = getPrimarySchemaType(schema);\n if (primaryType) {\n if (primaryType === \"integer\" || primaryType === \"number\") {\n return \"number\";\n }\n\n return primaryType;\n }\n\n if (objectSchema.type === \"array\" && Array.isArray(objectSchema.enum)) {\n const enumValues = objectSchema.enum as readonly unknown[];\n\n return enumValues\n .map((value: unknown) => JSON.stringify(value))\n .join(\" | \");\n }\n\n if (objectSchema.const !== undefined) {\n return JSON.stringify(objectSchema.const);\n }\n\n if (objectSchema.type === \"array\" || objectSchema.items) {\n const items = Array.isArray(objectSchema.items)\n ? objectSchema.items[0]\n : objectSchema.items;\n\n return `${stringifyType(items)}[]`;\n }\n\n if (\n objectSchema.type === \"object\" ||\n objectSchema.properties ||\n objectSchema.additionalProperties\n ) {\n if (isJsonSchema(objectSchema.additionalProperties)) {\n return `{ [key: string]: ${stringifyType(objectSchema.additionalProperties)} }`;\n }\n\n if (isJsonSchemaObject(objectSchema)) {\n const required = objectSchema.required ?? [];\n\n return `{ ${getPropertiesList(objectSchema)\n .map(property => {\n const suffix =\n !required.includes(property.name) || isSchemaNullable(property)\n ? `${!required.includes(property.name) ? \"?\" : \"\"}${isSchemaNullable(property) ? \" | null\" : \"\"}`\n : \"\";\n\n return `${property.name}${suffix}: ${stringifyType(property)}`;\n })\n .join(\";\\n\")} }`;\n }\n }\n\n if (objectSchema.oneOf || objectSchema.anyOf) {\n return (objectSchema.oneOf ?? objectSchema.anyOf ?? [])\n .map(branch => stringifyType(branch))\n .join(\" | \");\n }\n\n if (objectSchema.allOf) {\n return \"object\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Returns a string type representation of a value based on its type and an optional JSON Schema primitive type hint.\n *\n * @param value - The value whose type is to be represented as a string.\n * @returns A string representation of the value's type, which may be influenced by the provided JSON Schema primitive type hint. The function handles various JavaScript types and formats them accordingly, including special handling for `undefined`, `null`, booleans, numbers (with formatting), strings, objects, and arrays. If a specific type hint is provided, it will take precedence in determining the string representation of the value.\n */\nexport function getJsonSchemaType(value?: unknown): JsonSchemaType | undefined {\n return isNull(value)\n ? \"null\"\n : isBoolean(value)\n ? \"boolean\"\n : isInteger(value)\n ? \"integer\"\n : isNumber(value)\n ? \"number\"\n : isString(value)\n ? \"string\"\n : isObject(value)\n ? \"object\"\n : Array.isArray(value)\n ? \"array\"\n : undefined;\n}\n\n/**\n * Resolves a local JSON Schema `$ref` (e.g. `#/$defs/Name`) to the referenced definition name.\n */\nfunction resolveLocalRefName(ref: string): string | undefined {\n return /^#\\/(?:definitions|\\$defs)\\/(.+)$/.exec(ref)?.[1];\n}\n\n/**\n * Converts an arbitrary definition name into a safe JavaScript identifier suffix.\n */\nfunction toParserIdentifier(name: string): string {\n const cleaned = name.replace(/[^\\w$]/gu, \"_\");\n\n return `parse_${/^\\d/u.test(cleaned) ? `_${cleaned}` : cleaned}`;\n}\n\n/**\n * Returns the list of JSON Schema `type` keyword values declared on a fragment,\n * preserving `object` and `array` (which {@link readSchemaTypes} intentionally drops).\n */\nfunction readDeclaredTypes(schema: JsonSchemaLike): JsonSchemaType[] {\n const type = schema.type;\n if (Array.isArray(type)) {\n return [...type];\n }\n\n return type ? [type] : [];\n}\n\n/**\n * Generates a JavaScript expression that builds a path string for a child element.\n */\nfunction childPath(pathExpr: string, segment: string): string {\n return `${pathExpr} + ${JSON.stringify(segment)}`;\n}\n\n/**\n * Generates standalone parser code for a JSON Schema.\n *\n * @remarks\n * The generated `parse` function reads an arbitrary input value and converts it\n * into the shape described by the schema. It walks the schema recursively to:\n *\n * - resolve local `$ref` pointers (`#/$defs/*` and `#/definitions/*`) into\n * dedicated parser functions so recursive schemas are supported,\n * - apply `default` values for object properties (and root/array values) that\n * are missing from the input,\n * - coerce primitive values to the declared type (for example `\"42\"` to `42`\n * for an `integer` schema, or `1` to `true` for a `boolean` schema),\n * - validate `const`, `enum`, `oneOf`/`anyOf` and `allOf` constraints, and\n * - collect detailed, path-aware errors and throw a `ParserError` when the\n * input cannot be converted into a valid value.\n *\n * @param schema - The JSON Schema to generate parser code for.\n * @returns The generated standalone parser code as a string.\n */\nexport function generateParserCode(schema: JsonSchema): string {\n const rootSchema =\n typeof schema === \"boolean\" ? schema : (schema as JsonSchemaLike);\n\n const definitions: Record<string, JsonSchema> =\n typeof rootSchema === \"boolean\"\n ? {}\n : {\n ...(\n rootSchema as {\n definitions?: Record<string, JsonSchema>;\n }\n ).definitions,\n ...rootSchema.$defs\n };\n\n const tempCounter = {} as Record<string, number>;\n function nextTemp(prefix: string): string {\n const id = tempCounter[prefix] ?? 0;\n tempCounter[prefix] = id + 1;\n\n return `${prefix}${id > 0 ? `${id}` : \"\"}`;\n }\n\n /**\n * Generates inline parsing statements for a schema fragment.\n */\n function generateStatements(\n fragment: JsonSchemaLike,\n valueExpr: string,\n pathExpr: string,\n targetVar: string,\n errorsVar = \"errors\"\n ): string[] {\n if (typeof fragment === \"boolean\") {\n return fragment\n ? [`${targetVar} = ${valueExpr};`]\n : [\n `${errorsVar}.push({ path: ${pathExpr}, message: \"No value is allowed at this location\" });`,\n `${targetVar} = ${valueExpr};`\n ];\n }\n\n if (isSetString(fragment.$ref)) {\n const refName = resolveLocalRefName(fragment.$ref);\n if (refName && refName in definitions) {\n return [\n `${targetVar} = ${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, ${errorsVar});`\n ];\n }\n\n // Unknown / external reference — pass the value through unchanged.\n return [`${targetVar} = ${valueExpr};`];\n }\n\n const valueVar = nextTemp(\n fragment.name ? `${camelCase(fragment.name)}Value` : \"value\"\n );\n const pathVar = nextTemp(\n fragment.name ? `${camelCase(fragment.name)}Path` : \"path\"\n );\n const lines: string[] = [\n `const ${valueVar} = ${valueExpr};`,\n `const ${pathVar} = ${pathExpr};`\n ];\n\n if (fragment.default !== undefined) {\n lines.push(\n `if (${valueVar} === undefined) {`,\n ` ${targetVar} = ${JSON.stringify(fragment.default)};`,\n `} else {`\n );\n\n if (isSchemaNullable(fragment)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n }\n\n lines.push(`}`);\n\n return lines;\n }\n\n lines.push(\n `if (${valueVar} === undefined) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"A value is required\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n );\n\n if (isSchemaNullable(fragment)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n }\n\n lines.push(`}`);\n\n return lines;\n }\n\n /**\n * Generates inline parsing statements assuming `value` is already defined.\n */\n function generateCoreStatements(\n view: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const lines: string[] = [];\n\n if (view.const !== undefined) {\n const constValue = JSON.stringify(view.const);\n lines.push(\n `if (JSON.stringify(${valueVar}) !== ${constValue}) { ${\n errorsVar\n }.push({ path: ${pathVar}, message: \"Expected the constant value \" + ${\n constValue\n } }); }`,\n `${targetVar} = ${constValue};`\n );\n\n return lines;\n }\n\n if (Array.isArray(view.enum)) {\n const enumValues = JSON.stringify(view.enum);\n lines.push(\n `if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${\n valueVar\n }))) { ${errorsVar}.push({ path: ${\n pathVar\n }, message: \"Expected one of \" + ${enumValues} }); }`,\n `${targetVar} = ${valueVar};`\n );\n\n return lines;\n }\n\n if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {\n const branches = view.oneOf ?? view.anyOf ?? [];\n const matchedVar = nextTemp(\n view.name ? `${camelCase(view.name)}Matched` : \"matched\"\n );\n\n lines.push(`let ${matchedVar} = false;`);\n\n for (const branch of branches) {\n const branchErrorsVar = nextTemp(\n view.name ? `${camelCase(view.name)}BranchErrors` : \"branchErrors\"\n );\n const branchResultVar = nextTemp(\n view.name ? `${camelCase(view.name)}BranchResult` : \"branchResult\"\n );\n\n lines.push(`if (!${matchedVar}) {`);\n lines.push(\n ` const ${branchErrorsVar}: { path: string; message: string }[] = [];`,\n ` let ${branchResultVar};`\n );\n lines.push(\n ...generateStatements(\n branch,\n valueVar,\n pathVar,\n branchResultVar,\n branchErrorsVar\n )\n );\n lines.push(\n ` if (${branchErrorsVar}.length === 0) {`,\n ` ${targetVar} = ${branchResultVar};`,\n ` ${matchedVar} = true;`,\n ` }`,\n `}`\n );\n }\n\n lines.push(\n `if (!${matchedVar}) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Value does not match any of the allowed schemas\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n\n return lines;\n }\n\n if (Array.isArray(view.allOf)) {\n const { allOf, ...rest } = view;\n const merged = merge(rest, ...allOf);\n lines.push(\n ...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar)\n );\n\n return lines;\n }\n\n const declaredTypes = readDeclaredTypes(view);\n const primaryType =\n getPrimarySchemaType(view) ??\n declaredTypes.find(type => type !== \"null\") ??\n (view.properties ? \"object\" : view.items ? \"array\" : undefined);\n\n switch (primaryType) {\n case \"object\":\n lines.push(\n ...generateObjectStatements(\n view,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n break;\n case \"array\":\n lines.push(\n ...generateArrayStatements(\n view,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n break;\n case \"string\":\n lines.push(\n `if (typeof ${valueVar} === \"string\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"number\" || typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = String(${valueVar});`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a string value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"integer\":\n lines.push(\n `if (typeof ${valueVar} === \"number\" && Number.isInteger(${valueVar})) {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"string\" && ${valueVar}.trim() !== \"\" && Number.isInteger(Number(${valueVar}))) {`,\n ` ${targetVar} = Number(${valueVar});`,\n `} else if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar} ? 1 : 0;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an integer value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"number\":\n lines.push(\n `if (typeof ${valueVar} === \"number\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"string\" && ${valueVar}.trim() !== \"\" && !Number.isNaN(Number(${valueVar}))) {`,\n ` ${targetVar} = Number(${valueVar});`,\n `} else if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar} ? 1 : 0;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a number value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"boolean\":\n lines.push(\n `if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (${valueVar} === \"true\" || ${valueVar} === 1) {`,\n ` ${targetVar} = true;`,\n `} else if (${valueVar} === \"false\" || ${valueVar} === 0) {`,\n ` ${targetVar} = false;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a boolean value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"null\":\n lines.push(\n `if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a null value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case undefined:\n default:\n lines.push(`${targetVar} = ${valueVar};`);\n break;\n }\n\n return lines;\n }\n\n /**\n * Generates the parsing statements for an `object` schema, applying property\n * defaults and recursing into each declared property.\n */\n function generateObjectStatements(\n view: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const type = stringifyType(view);\n\n const lines: string[] = [\n `if (typeof ${valueVar} !== \"object\" || ${valueVar} === null || Array.isArray(${valueVar})) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an object value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n ];\n\n const resultVar = nextTemp(\n type || view.name ? `${camelCase(type || view.name)}Schema` : \"schema\"\n );\n lines.push(`const ${resultVar} = {} as Record<string, any>`);\n\n const properties = isJsonSchemaObject(view) ? getPropertiesList(view) : [];\n const propertyNames = new Set<string>();\n\n for (const property of properties) {\n const name = property.name;\n propertyNames.add(name);\n\n const accessor = property.alias?.length\n ? `(${valueVar}[${JSON.stringify(name)}] ?? ${property.alias\n .map(alias => `${valueVar}[${JSON.stringify(alias)}]`)\n .join(\" ?? \")})`\n : `${valueVar}[${JSON.stringify(name)}]`;\n const propertyPath = childPath(pathVar, `.${name}`);\n const propertyVar = nextTemp(\n name ? `${camelCase(name)}Property` : \"property\"\n );\n\n const missingBranch =\n property.default !== undefined\n ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(\n property.default\n )};`\n : property.required\n ? `errors.push({ path: ${propertyPath}, message: \"Required property is missing\" });`\n : \"\";\n\n lines.push(\n ` if (${accessor} !== undefined) {`,\n ` let ${propertyVar};`\n );\n lines.push(\n ...generateStatements(\n property as JsonSchemaLike,\n accessor,\n propertyPath,\n propertyVar,\n errorsVar\n )\n );\n lines.push(`${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);\n if (missingBranch) {\n lines.push(`} else { ${missingBranch} }`);\n } else {\n lines.push(\"}\");\n }\n }\n\n const additional = view.additionalProperties;\n if (isJsonSchema(additional)) {\n const additionalVar = nextTemp(\n type || view.name\n ? `${camelCase(type || view.name)}AdditionalProperties`\n : \"additionalProperties\"\n );\n\n lines.push(\n ` for (const key of Object.keys(${valueVar})) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` let ${additionalVar};`\n );\n lines.push(\n ...generateStatements(\n additional,\n `${valueVar}[key]`,\n `${pathVar} + \".\" + key`,\n additionalVar,\n errorsVar\n )\n );\n lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);\n } else if (additional !== false) {\n lines.push(\n ` for (const key of Object.keys(${valueVar})) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` ${resultVar}[key] = ${valueVar}[key];`,\n `}`\n );\n }\n\n lines.push(`${targetVar} = ${resultVar};`, `}`);\n\n return lines;\n }\n\n /**\n * Generates the parsing statements for an `array` schema, recursing into each\n * item (supporting both list and tuple `items`/`prefixItems` forms).\n */\n function generateArrayStatements(\n view: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const lines: string[] = [\n `if (!Array.isArray(${valueVar})) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an array value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n ];\n\n const resultVar = nextTemp(\n view.name ? `${camelCase(view.name)}Array` : \"array\"\n );\n lines.push(` const ${resultVar}: unknown[] = [];`);\n\n const tupleItems =\n view.prefixItems ?? (Array.isArray(view.items) ? view.items : undefined);\n\n if (tupleItems) {\n const listItems = !Array.isArray(view.items) ? view.items : undefined;\n lines.push(\n ` for (let index = 0; index < ${valueVar}.length; index += 1) {`,\n ` const item = ${valueVar}[index];`,\n ` let itemResult;`\n );\n\n tupleItems.forEach((item, index) => {\n lines.push(\n `${index === 0 ? \" if\" : \" else if\"} (index === ${index}) {`\n );\n lines.push(\n ...generateStatements(\n item,\n \"item\",\n childPath(pathVar, `[${index}]`),\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\"}\");\n });\n\n if (listItems) {\n lines.push(\"else {\");\n lines.push(\n ...generateStatements(\n listItems as JsonSchemaLike,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\"}\");\n } else {\n lines.push(\"else { itemResult = item; }\");\n }\n\n lines.push(\n ` ${resultVar}.push(itemResult);`,\n ` }`,\n ` ${targetVar} = ${resultVar};`,\n `}`\n );\n\n return lines;\n }\n\n const itemSchema = (view.items ?? true) as JsonSchema;\n lines.push(\n ` for (let index = 0; index < ${valueVar}.length; index += 1) {`,\n ` const item = ${valueVar}[index];`,\n ` let itemResult;`\n );\n lines.push(\n ...generateStatements(\n itemSchema,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\n ` ${resultVar}.push(itemResult);`,\n ` }`,\n ` ${targetVar} = ${resultVar};`,\n `}`\n );\n\n return lines;\n }\n\n const parserFunctions = Object.entries(definitions).map(\n ([name, definition]) =>\n `function ${toParserIdentifier(name)}(value, path, errors) {\\nlet result;\\n${generateStatements(\n definition,\n \"value\",\n \"path\",\n \"result\",\n \"errors\"\n ).join(\"\\n\")}\\n\\n return result${\n definition.name ? ` as ${stringifyType(definition)}` : \"\"\n };\\n}`\n );\n\n return `/**\n * Error thrown when an input value cannot be parsed into the type described by the JSON Schema.\n */\nexport class ParserError extends Error {\n public override name = \"ParserError\";\n\n public errors: { path: string; message: string }[];\n\n public constructor(errors: { path: string; message: string }[]) {\n super(\n \"Failed to parse the provided value against the JSON Schema:\\\\n\" +\n errors.map(error => \" - \" + error.path + \": \" + error.message).join(\"\\\\n\")\n );\n\n this.errors = errors;\n }\n}\n\n${parserFunctions.join(\"\\n\\n\")}\n\n/**\n * Parses an input value into the type described by the JSON Schema.\n *\n * @remarks\n * The parser applies default values for missing properties, coerces primitive values to the declared type, and throws a {@link ParserError} (containing a detailed list of validation errors) when the value cannot be converted into a valid result.\n *\n * @param value - The input value to parse.\n * @returns The parsed value conforming to the schema.\n */\nexport function parse(value: Record<string, unknown>)${\n schema.name ? `: ${stringifyType(schema)}` : \"\"\n } {\n const errors: { path: string; message: string }[] = [];\n\n let result;\n${generateStatements(schema, \"value\", '\"$\"', \"result\", \"errors\").join(\"\\n\")}\n\n if (errors.length > 0) {\n throw new ParserError(errors);\n }\n\n return result${schema.name ? ` as ${stringifyType(schema)}` : \"\"};\n}`;\n}\n\n/**\n * Generates standalone JSON Schema validation code using Ajv.\n *\n * @remarks\n * The generated code includes a validation function that can be used to validate data against the provided JSON Schema at runtime. The validation function will throw an error if the data does not conform to the schema, providing detailed information about the validation errors.\n *\n * @param schema - The JSON Schema to generate validation code for.\n * @param refsOrFuncts - Optional additional references or functions for Ajv's standalone code generation.\n * @returns The generated standalone validation code as a string.\n */\nexport function generateValidationCode(\n schema: JsonSchema,\n refsOrFuncts?: Parameters<typeof standaloneCode>[1]\n) {\n return standaloneCode(getValidator(schema), refsOrFuncts);\n}\n\n/**\n * Generates standalone JavaScript code for validating and parsing data according to a JSON Schema.\n *\n * @remarks\n * The generated code includes:\n * - Validation code generated by Ajv for the provided JSON Schema, which can be used to validate data against the schema at runtime. The validation function will throw an error if the data does not conform to the schema, providing detailed information about the validation errors.\n * - Parsing code generated for the provided JSON Schema, which can be used to parse and validate data against the schema at runtime. The parsing function will apply default values specified in the schema if they are not present in the input data, throw an error if the input data does not conform to the schema (providing detailed information about the validation errors), and return the parsed data if it is valid according to the schema.\n *\n * @param schema - The JSON Schema to generate code for.\n * @param refsOrFuncts - Optional additional references or functions for Ajv's standalone code generation.\n * @returns The generated standalone validation and parsing code as a string.\n */\nexport function generateCode(\n schema: JsonSchema,\n refsOrFuncts?: Parameters<typeof standaloneCode>[1]\n) {\n return `${generateValidationCode(\n schema,\n refsOrFuncts\n )}\\n\\n${generateParserCode(schema)}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"codegen.mjs","names":["isUndefined","isNull","isBoolean","isNumber","isSetString"],"sources":["../src/codegen.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Powerlines\n\n This code was released as part of the Powerlines project. Powerlines\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/powerlines.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/powerlines\n Documentation: https://docs.stormsoftware.com/projects/powerlines\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { toBool } from \"@stryke/convert/to-bool\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { isInteger, isObject, isSetArray, isString } from \"@stryke/type-checks\";\nimport { isBoolean } from \"@stryke/type-checks/is-boolean\";\nimport { isNull } from \"@stryke/type-checks/is-null\";\nimport { isNumber } from \"@stryke/type-checks/is-number\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { isUndefined } from \"@stryke/type-checks/is-undefined\";\nimport standaloneCode from \"ajv/dist/standalone\";\nimport { getPropertiesList, isSchemaNullable, merge } from \"./helpers\";\nimport { getPrimarySchemaType } from \"./metadata\";\nimport {\n isJsonSchema,\n isJsonSchemaObject,\n isJsonSchemaString\n} from \"./type-checks\";\nimport { JsonSchema, JsonSchemaLike, JsonSchemaType } from \"./types\";\nimport { getValidator } from \"./validate\";\n\n/**\n * Stringifies a value for generated TypeScript code.\n */\nexport function stringifyValue(\n value?: unknown,\n type?: JsonSchemaType | string\n): string {\n return isUndefined(value)\n ? \"undefined\"\n : isNull(value)\n ? \"null\"\n : type === \"boolean\" || isBoolean(value)\n ? String(toBool(value))\n : type === \"number\" || isNumber(value)\n ? Number.parseFloat(String(value)).toLocaleString(undefined, {\n maximumFractionDigits: 20\n })\n : type === \"integer\"\n ? Number.parseInt(String(value)).toLocaleString()\n : type === \"string\" || type === \"object\" || type === \"array\"\n ? JSON.stringify(value)\n : String(value);\n}\n\n/**\n * Stringifies a JSON Schema fragment into a TypeScript-like type string.\n */\nexport function stringifyType(schema?: JsonSchema): string {\n if (!schema) {\n return \"unknown\";\n }\n\n if (typeof schema === \"boolean\") {\n return schema ? \"unknown\" : \"never\";\n }\n\n if (isJsonSchemaObject(schema) && isSetString(schema.name)) {\n return schema.name;\n }\n\n const objectSchema = schema as JsonSchemaLike;\n\n if (isSetString(objectSchema.$ref)) {\n const match = /^#\\/(?:definitions|\\$defs)\\/(.+)$/.exec(objectSchema.$ref);\n\n return match?.[1] ?? objectSchema.$ref;\n }\n\n const primaryType = getPrimarySchemaType(schema);\n if (primaryType) {\n if (primaryType === \"integer\" || primaryType === \"number\") {\n return \"number\";\n }\n\n return primaryType;\n }\n\n if (objectSchema.type === \"array\" && Array.isArray(objectSchema.enum)) {\n const enumValues = objectSchema.enum as readonly unknown[];\n\n return enumValues\n .map((value: unknown) => JSON.stringify(value))\n .join(\" | \");\n }\n\n if (objectSchema.const !== undefined) {\n return JSON.stringify(objectSchema.const);\n }\n\n if (objectSchema.type === \"array\" || objectSchema.items) {\n const items = Array.isArray(objectSchema.items)\n ? objectSchema.items[0]\n : objectSchema.items;\n\n return `${stringifyType(items)}[]`;\n }\n\n if (\n objectSchema.type === \"object\" ||\n objectSchema.properties ||\n objectSchema.additionalProperties\n ) {\n if (isJsonSchema(objectSchema.additionalProperties)) {\n return `{ [key: string]: ${stringifyType(objectSchema.additionalProperties)} }`;\n }\n\n if (isJsonSchemaObject(objectSchema)) {\n const required = objectSchema.required ?? [];\n\n return `{ ${getPropertiesList(objectSchema)\n .map(property => {\n const suffix =\n !required.includes(property.name) || isSchemaNullable(property)\n ? `${!required.includes(property.name) ? \"?\" : \"\"}${isSchemaNullable(property) ? \" | null\" : \"\"}`\n : \"\";\n\n return `${property.name}${suffix}: ${stringifyType(property)}`;\n })\n .join(\";\\n\")} }`;\n }\n }\n\n if (objectSchema.oneOf || objectSchema.anyOf) {\n return (objectSchema.oneOf ?? objectSchema.anyOf ?? [])\n .map(branch => stringifyType(branch))\n .join(\" | \");\n }\n\n if (objectSchema.allOf) {\n return \"object\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Returns a string type representation of a value based on its type and an optional JSON Schema primitive type hint.\n *\n * @param value - The value whose type is to be represented as a string.\n * @returns A string representation of the value's type, which may be influenced by the provided JSON Schema primitive type hint. The function handles various JavaScript types and formats them accordingly, including special handling for `undefined`, `null`, booleans, numbers (with formatting), strings, objects, and arrays. If a specific type hint is provided, it will take precedence in determining the string representation of the value.\n */\nexport function getJsonSchemaType(value?: unknown): JsonSchemaType | undefined {\n return isNull(value)\n ? \"null\"\n : isBoolean(value)\n ? \"boolean\"\n : isInteger(value)\n ? \"integer\"\n : isNumber(value)\n ? \"number\"\n : isString(value)\n ? \"string\"\n : isObject(value)\n ? \"object\"\n : Array.isArray(value)\n ? \"array\"\n : undefined;\n}\n\n/**\n * Resolves a local JSON Schema `$ref` (e.g. `#/$defs/Name`) to the referenced definition name.\n */\nfunction resolveLocalRefName(ref: string): string | undefined {\n return /^#\\/(?:definitions|\\$defs)\\/(.+)$/.exec(ref)?.[1];\n}\n\n/**\n * Converts an arbitrary definition name into a safe JavaScript identifier suffix.\n */\nfunction toParserIdentifier(name: string): string {\n const cleaned = name.replace(/[^\\w$]/gu, \"_\");\n\n return `parse_${/^\\d/u.test(cleaned) ? `_${cleaned}` : cleaned}`;\n}\n\n/**\n * Returns the list of JSON Schema `type` keyword values declared on a fragment,\n * preserving `object` and `array` (which {@link readSchemaTypes} intentionally drops).\n */\nfunction readDeclaredTypes(schema: JsonSchemaLike): JsonSchemaType[] {\n const type = schema.type;\n if (Array.isArray(type)) {\n return [...type];\n }\n\n return type ? [type] : [];\n}\n\n/**\n * Generates a JavaScript expression that builds a path string for a child element.\n */\nfunction childPath(pathExpr: string, segment: string): string {\n return `${pathExpr} + ${JSON.stringify(segment)}`;\n}\n\n/**\n * Generates standalone parser code for a JSON Schema.\n *\n * @remarks\n * The generated `parse` function reads an arbitrary input value and converts it\n * into the shape described by the schema. It walks the schema recursively to:\n *\n * - resolve local `$ref` pointers (`#/$defs/*` and `#/definitions/*`) into\n * dedicated parser functions so recursive schemas are supported,\n * - apply `default` values for object properties (and root/array values) that\n * are missing from the input,\n * - coerce primitive values to the declared type (for example `\"42\"` to `42`\n * for an `integer` schema, or `1` to `true` for a `boolean` schema),\n * - validate `const`, `enum`, `oneOf`/`anyOf` and `allOf` constraints, and\n * - collect detailed, path-aware errors and throw a `ParserError` when the\n * input cannot be converted into a valid value.\n *\n * @param schema - The JSON Schema to generate parser code for.\n * @returns The generated standalone parser code as a string.\n */\nexport function generateParserCode(schema: JsonSchema): string {\n const rootSchema =\n typeof schema === \"boolean\" ? schema : (schema as JsonSchemaLike);\n\n const definitions: Record<string, JsonSchema> =\n typeof rootSchema === \"boolean\"\n ? {}\n : {\n ...(\n rootSchema as {\n definitions?: Record<string, JsonSchema>;\n }\n ).definitions,\n ...rootSchema.$defs\n };\n\n const tempCounter = {} as Record<string, number>;\n function nextTemp(prefix: string): string {\n const id = tempCounter[prefix] ?? 0;\n tempCounter[prefix] = id + 1;\n\n return `${prefix}${id > 0 ? `${id}` : \"\"}`;\n }\n\n /**\n * Generates inline parsing statements for a schema fragment.\n */\n function generateStatements(\n fragment: JsonSchemaLike,\n valueExpr: string,\n pathExpr: string,\n targetVar: string,\n errorsVar = \"errors\"\n ): string[] {\n if (typeof fragment === \"boolean\") {\n return fragment\n ? [`${targetVar} = ${valueExpr};`]\n : [\n `${errorsVar}.push({ path: ${pathExpr}, message: \"No value is allowed at this location\" });`,\n `${targetVar} = ${valueExpr};`\n ];\n }\n\n if (isSetString(fragment.$ref)) {\n const refName = resolveLocalRefName(fragment.$ref);\n if (refName && refName in definitions) {\n return [\n `${targetVar} = ${toParserIdentifier(\n refName\n )}(${valueExpr}, ${pathExpr}, ${errorsVar});`\n ];\n }\n\n // Unknown / external reference — pass the value through unchanged.\n return [`${targetVar} = ${valueExpr};`];\n }\n\n const valueVar = nextTemp(\n fragment.name ? `${camelCase(fragment.name)}Value` : \"value\"\n );\n const pathVar = nextTemp(\n fragment.name ? `${camelCase(fragment.name)}Path` : \"path\"\n );\n const lines: string[] = [\n `const ${valueVar} = ${valueExpr};`,\n `const ${pathVar} = ${pathExpr};`\n ];\n\n if (fragment.default !== undefined) {\n lines.push(\n `if (${valueVar} === undefined) {`,\n ` ${targetVar} = ${JSON.stringify(fragment.default)};`,\n `} else {`\n );\n\n if (isSchemaNullable(fragment)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n }\n\n lines.push(`}`);\n\n return lines;\n }\n\n lines.push(\n `if (${valueVar} === undefined) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"A value is required\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n );\n\n if (isSchemaNullable(fragment)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...generateCoreStatements(\n fragment,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n }\n\n lines.push(`}`);\n\n return lines;\n }\n\n /**\n * Generates inline parsing statements assuming `value` is already defined.\n */\n function generateCoreStatements(\n schema: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const lines: string[] = [];\n if (schema.const !== undefined) {\n const constValue = JSON.stringify(schema.const);\n lines.push(\n `if (JSON.stringify(${valueVar}) !== ${constValue}) { ${\n errorsVar\n }.push({ path: ${pathVar}, message: \"Expected the constant value \" + ${\n constValue\n } }); }`,\n `${targetVar} = ${constValue};`\n );\n\n return lines;\n }\n\n if (Array.isArray(schema.enum)) {\n const enumValues = JSON.stringify(schema.enum);\n lines.push(\n `if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${\n valueVar\n }))) { ${errorsVar}.push({ path: ${\n pathVar\n }, message: \"Expected one of \" + ${enumValues} }); }`,\n `${targetVar} = ${valueVar};`\n );\n\n return lines;\n }\n\n if (Array.isArray(schema.oneOf) || Array.isArray(schema.anyOf)) {\n const branches = schema.oneOf ?? schema.anyOf ?? [];\n const matchedVar = nextTemp(\n schema.name ? `${camelCase(schema.name)}Matched` : \"matched\"\n );\n\n lines.push(`let ${matchedVar} = false;`);\n\n for (const branch of branches) {\n const branchErrorsVar = nextTemp(\n schema.name ? `${camelCase(schema.name)}BranchErrors` : \"branchErrors\"\n );\n const branchResultVar = nextTemp(\n schema.name ? `${camelCase(schema.name)}BranchResult` : \"branchResult\"\n );\n\n lines.push(`if (!${matchedVar}) {`);\n lines.push(\n ` const ${branchErrorsVar}: { path: string; message: string }[] = [];`,\n ` let ${branchResultVar};`\n );\n lines.push(\n ...generateStatements(\n branch,\n valueVar,\n pathVar,\n branchResultVar,\n branchErrorsVar\n )\n );\n lines.push(\n ` if (${branchErrorsVar}.length === 0) {`,\n ` ${targetVar} = ${branchResultVar};`,\n ` ${matchedVar} = true;`,\n ` }`,\n `}`\n );\n }\n\n lines.push(\n `if (!${matchedVar}) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Value does not match any of the allowed schemas\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n\n return lines;\n }\n\n if (Array.isArray(schema.allOf)) {\n const { allOf, ...rest } = schema;\n const merged = merge(rest, ...allOf);\n lines.push(\n ...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar)\n );\n\n return lines;\n }\n\n const declaredTypes = readDeclaredTypes(schema);\n const primaryType =\n getPrimarySchemaType(schema) ??\n declaredTypes.find(type => type !== \"null\") ??\n (schema.properties ? \"object\" : schema.items ? \"array\" : undefined);\n\n switch (primaryType) {\n case \"object\":\n lines.push(\n ...generateObjectStatements(\n schema,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n break;\n case \"array\":\n lines.push(\n ...generateArrayStatements(\n schema,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n )\n );\n break;\n case \"string\":\n lines.push(\n `if (typeof ${valueVar} === \"string\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"number\" || typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = String(${valueVar});`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a string value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"integer\":\n lines.push(\n `if (typeof ${valueVar} === \"number\" && Number.isInteger(${valueVar})) {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"string\" && ${valueVar}.trim() !== \"\" && Number.isInteger(Number(${valueVar}))) {`,\n ` ${targetVar} = Number(${valueVar});`,\n `} else if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar} ? 1 : 0;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an integer value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"number\":\n lines.push(\n `if (typeof ${valueVar} === \"number\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (typeof ${valueVar} === \"string\" && ${valueVar}.trim() !== \"\" && !Number.isNaN(Number(${valueVar}))) {`,\n ` ${targetVar} = Number(${valueVar});`,\n `} else if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar} ? 1 : 0;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a number value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"boolean\":\n lines.push(\n `if (typeof ${valueVar} === \"boolean\") {`,\n ` ${targetVar} = ${valueVar};`,\n `} else if (${valueVar} === \"true\" || ${valueVar} === 1) {`,\n ` ${targetVar} = true;`,\n `} else if (${valueVar} === \"false\" || ${valueVar} === 0) {`,\n ` ${targetVar} = false;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a boolean value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case \"null\":\n lines.push(\n `if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n `} else {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected a null value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `}`\n );\n break;\n case undefined:\n default:\n lines.push(`${targetVar} = ${valueVar};`);\n break;\n }\n\n return lines;\n }\n\n /**\n * Generates the parsing statements for an `object` schema, applying property\n * defaults and recursing into each declared property.\n */\n function generateObjectStatements(\n schema: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const type = stringifyType(schema);\n const lines: string[] = [\n `if (typeof ${valueVar} !== \"object\" || ${valueVar} === null || Array.isArray(${valueVar})) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an object value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n ];\n\n const resultVar = nextTemp(\n type || schema.name ? `${camelCase(type || schema.name)}Schema` : \"schema\"\n );\n lines.push(`const ${resultVar} = {} as Record<string, any>`);\n\n if (isJsonSchemaObject(schema)) {\n const propertyNames = new Set<string>();\n for (const property of getPropertiesList(schema)) {\n propertyNames.add(property.name);\n\n let accessor!: string;\n if (isSetArray(property.alias)) {\n accessor = `(${valueVar}[${JSON.stringify(property.name)}] ${\n isJsonSchemaString(property) ? \"||\" : \"??\"\n } ${property\n .alias!.map(alias => `${valueVar}[${JSON.stringify(alias)}]`)\n .join(` ${isJsonSchemaString(property) ? \"||\" : \"??\"} `)})`;\n property.alias!.forEach(alias => propertyNames.add(alias));\n } else {\n accessor = `${valueVar}[${JSON.stringify(property.name)}]`;\n }\n\n const propertyPath = childPath(pathVar, `.${property.name}`);\n const propertyVar = nextTemp(\n property.name ? `${camelCase(property.name)}Property` : \"property\"\n );\n\n const missingBranch =\n property.default !== undefined\n ? `${resultVar}[${JSON.stringify(property.name)}] = ${JSON.stringify(\n property.default\n )};`\n : property.required\n ? `errors.push({ path: ${propertyPath}, message: \"Required property is missing\" });`\n : \"\";\n\n lines.push(\n ` if (${accessor} !== undefined) {`,\n ` let ${propertyVar};`\n );\n lines.push(\n ...generateStatements(\n property as JsonSchemaLike,\n accessor,\n propertyPath,\n propertyVar,\n errorsVar\n )\n );\n lines.push(\n `${resultVar}[${JSON.stringify(property.name)}] = ${propertyVar};`\n );\n if (missingBranch) {\n lines.push(`} else { ${missingBranch} }`);\n } else {\n lines.push(\"}\");\n }\n }\n\n const additional = schema.additionalProperties;\n if (isJsonSchema(additional)) {\n const additionalVar = nextTemp(\n type || schema.name\n ? `${camelCase(type || schema.name)}AdditionalProperties`\n : \"additionalProperties\"\n );\n\n lines.push(\n ` for (const key of Object.keys(${valueVar})) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` let ${additionalVar};`\n );\n lines.push(\n ...generateStatements(\n additional,\n `${valueVar}[key]`,\n `${pathVar} + \".\" + key`,\n additionalVar,\n errorsVar\n )\n );\n lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);\n } else if (additional !== false) {\n lines.push(\n ` for (const key of Object.keys(${valueVar})) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` ${resultVar}[key] = ${valueVar}[key];`,\n `}`\n );\n }\n }\n\n lines.push(`${targetVar} = ${resultVar};`, `}`);\n return lines;\n }\n\n /**\n * Generates the parsing statements for an `array` schema, recursing into each\n * item (supporting both list and tuple `items`/`prefixItems` forms).\n */\n function generateArrayStatements(\n schema: JsonSchemaLike,\n valueVar: string,\n pathVar: string,\n targetVar: string,\n errorsVar: string\n ): string[] {\n const lines: string[] = [\n `if (!Array.isArray(${valueVar})) {`,\n ` ${errorsVar}.push({ path: ${pathVar}, message: \"Expected an array value\" });`,\n ` ${targetVar} = ${valueVar};`,\n `} else {`\n ];\n\n const resultVar = nextTemp(\n schema.name ? `${camelCase(schema.name)}Array` : \"array\"\n );\n lines.push(`const ${resultVar}: unknown[] = [];`);\n\n const tupleItems =\n schema.prefixItems ??\n (Array.isArray(schema.items) ? schema.items : undefined);\n\n if (tupleItems) {\n const listItems = !Array.isArray(schema.items) ? schema.items : undefined;\n lines.push(\n ` for (let index = 0; index < ${valueVar}.length; index += 1) {`,\n ` const item = ${valueVar}[index];`,\n ` let itemResult;`\n );\n\n tupleItems.forEach((item, index) => {\n lines.push(` ${index === 0 ? \"if\" : \"else if\"} (index === ${index}) {`);\n lines.push(\n ...generateStatements(\n item,\n \"item\",\n childPath(pathVar, `[${index}]`),\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\"}\");\n });\n\n if (listItems) {\n lines.push(\"else {\");\n lines.push(\n ...generateStatements(\n listItems as JsonSchemaLike,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\"}\");\n } else {\n lines.push(\"else { itemResult = item; }\");\n }\n\n lines.push(\n ` ${resultVar}.push(itemResult);`,\n ` }`,\n ` ${targetVar} = ${resultVar};`,\n `}`\n );\n\n return lines;\n }\n\n const itemSchema = (schema.items ?? true) as JsonSchema;\n lines.push(\n ` for (let index = 0; index < ${valueVar}.length; index += 1) {`,\n ` const item = ${valueVar}[index];`,\n ` let itemResult;`\n );\n lines.push(\n ...generateStatements(\n itemSchema,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n )\n );\n lines.push(\n ` ${resultVar}.push(itemResult);`,\n ` }`,\n ` ${targetVar} = ${resultVar};`,\n `}`\n );\n\n return lines;\n }\n\n const parserFunctions = Object.entries(definitions).map(\n ([name, definition]) =>\n `function ${toParserIdentifier(name)}(value, path, errors) {\\nlet result;\\n${generateStatements(\n definition,\n \"value\",\n \"path\",\n \"result\",\n \"errors\"\n ).join(\"\\n\")}\\n\\n return result${\n definition.name ? ` as ${stringifyType(definition)}` : \"\"\n };\\n}`\n );\n\n return `/**\n * Error thrown when an input value cannot be parsed into the type described by the JSON Schema.\n */\nexport class ParserError extends Error {\n public override name = \"ParserError\";\n\n public errors: { path: string; message: string }[];\n\n public constructor(errors: { path: string; message: string }[]) {\n super(\n \"Failed to parse the provided value against the JSON Schema:\\\\n\" +\n errors.map(error => \" - \" + error.path + \": \" + error.message).join(\"\\\\n\")\n );\n\n this.errors = errors;\n }\n}\n\n${parserFunctions.join(\"\\n\\n\")}\n\n/**\n * Parses an input value into the type described by the JSON Schema.\n *\n * @remarks\n * The parser applies default values for missing properties, coerces primitive values to the declared type, and throws a {@link ParserError} (containing a detailed list of validation errors) when the value cannot be converted into a valid result.\n *\n * @param value - The input value to parse.\n * @returns The parsed value conforming to the schema.\n */\nexport function parse(value: Record<string, unknown>)${\n schema.name ? `: ${stringifyType(schema)}` : \"\"\n } {\n const errors: { path: string; message: string }[] = [];\n\n let result;\n${generateStatements(schema, \"value\", '\"$\"', \"result\", \"errors\").join(\"\\n\")}\n\n if (errors.length > 0) {\n throw new ParserError(errors);\n }\n\n return result${schema.name ? ` as ${stringifyType(schema)}` : \"\"};\n}`;\n}\n\n/**\n * Generates standalone JSON Schema validation code using Ajv.\n *\n * @remarks\n * The generated code includes a validation function that can be used to validate data against the provided JSON Schema at runtime. The validation function will throw an error if the data does not conform to the schema, providing detailed information about the validation errors.\n *\n * @param schema - The JSON Schema to generate validation code for.\n * @param refsOrFuncts - Optional additional references or functions for Ajv's standalone code generation.\n * @returns The generated standalone validation code as a string.\n */\nexport function generateValidationCode(\n schema: JsonSchema,\n refsOrFuncts?: Parameters<typeof standaloneCode>[1]\n) {\n return standaloneCode(getValidator(schema), refsOrFuncts);\n}\n\n/**\n * Generates standalone JavaScript code for validating and parsing data according to a JSON Schema.\n *\n * @remarks\n * The generated code includes:\n * - Validation code generated by Ajv for the provided JSON Schema, which can be used to validate data against the schema at runtime. The validation function will throw an error if the data does not conform to the schema, providing detailed information about the validation errors.\n * - Parsing code generated for the provided JSON Schema, which can be used to parse and validate data against the schema at runtime. The parsing function will apply default values specified in the schema if they are not present in the input data, throw an error if the input data does not conform to the schema (providing detailed information about the validation errors), and return the parsed data if it is valid according to the schema.\n *\n * @param schema - The JSON Schema to generate code for.\n * @param refsOrFuncts - Optional additional references or functions for Ajv's standalone code generation.\n * @returns The generated standalone validation and parsing code as a string.\n */\nexport function generateCode(\n schema: JsonSchema,\n refsOrFuncts?: Parameters<typeof standaloneCode>[1]\n) {\n return `${generateValidationCode(\n schema,\n refsOrFuncts\n )}\\n\\n${generateParserCode(schema)}`;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerlines/schema",
3
- "version": "0.11.88",
3
+ "version": "0.11.90",
4
4
  "private": false,
5
5
  "description": "A package containing a Powerlines plugin to assist in developing other Powerlines plugins.",
6
6
  "keywords": [
@@ -96,5 +96,5 @@
96
96
  "zod": { "optional": true }
97
97
  },
98
98
  "publishConfig": { "access": "public" },
99
- "gitHead": "87e51702e7912e7e0f335da1c4cff9712ec4bdba"
99
+ "gitHead": "7321f3b8d2d6423e946b7ea0ec0b09a98e51e339"
100
100
  }