@powerlines/schema 0.11.83 → 0.11.84

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/codegen.cjs CHANGED
@@ -4,6 +4,7 @@ const require_type_checks = require('./type-checks.cjs');
4
4
  const require_helpers = require('./helpers.cjs');
5
5
  const require_validate = require('./validate.cjs');
6
6
  let _stryke_convert_to_bool = require("@stryke/convert/to-bool");
7
+ let _stryke_string_format_camel_case = require("@stryke/string-format/camel-case");
7
8
  let _stryke_type_checks = require("@stryke/type-checks");
8
9
  let _stryke_type_checks_is_boolean = require("@stryke/type-checks/is-boolean");
9
10
  let _stryke_type_checks_is_null = require("@stryke/type-checks/is-null");
@@ -114,46 +115,41 @@ function generateParserCode(schema) {
114
115
  ...rootSchema.definitions,
115
116
  ...rootSchema.$defs
116
117
  };
117
- let tempCounter = 0;
118
+ const tempCounter = {};
118
119
  function nextTemp(prefix) {
119
- const id = tempCounter;
120
- tempCounter += 1;
121
- return `__${prefix}_${id}`;
122
- }
123
- function indent(lines, size = 2) {
124
- const padding = " ".repeat(size);
125
- return lines.map((line) => `${padding}${line}`);
120
+ const id = tempCounter[prefix] ?? 0;
121
+ tempCounter[prefix] = id + 1;
122
+ return `${prefix}${id > 0 ? `${id}` : ""}`;
126
123
  }
127
124
  /**
128
125
  * Generates inline parsing statements for a schema fragment.
129
126
  */
130
127
  function generateStatements(fragment, valueExpr, pathExpr, targetVar, errorsVar = "errors") {
131
128
  if (typeof fragment === "boolean") return fragment ? [`${targetVar} = ${valueExpr};`] : [`${errorsVar}.push({ path: ${pathExpr}, message: "No value is allowed at this location" });`, `${targetVar} = ${valueExpr};`];
132
- const view = fragment;
133
- if ((0, _stryke_type_checks_is_set_string.isSetString)(view.$ref)) {
134
- const refName = resolveLocalRefName(view.$ref);
129
+ if ((0, _stryke_type_checks_is_set_string.isSetString)(fragment.$ref)) {
130
+ const refName = resolveLocalRefName(fragment.$ref);
135
131
  if (refName && refName in definitions) return [`${targetVar} = ${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, ${errorsVar});`];
136
132
  return [`${targetVar} = ${valueExpr};`];
137
133
  }
138
- const valueVar = nextTemp("value");
139
- const pathVar = nextTemp("path");
134
+ const valueVar = nextTemp(fragment.name ? `${(0, _stryke_string_format_camel_case.camelCase)(fragment.name)}Value` : "value");
135
+ const pathVar = nextTemp(fragment.name ? `${(0, _stryke_string_format_camel_case.camelCase)(fragment.name)}Path` : "path");
140
136
  const lines = [`const ${valueVar} = ${valueExpr};`, `const ${pathVar} = ${pathExpr};`];
141
- if (view.default !== void 0) {
142
- lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(view.default)};`, `} else {`);
143
- if (require_helpers.isSchemaNullable(view)) {
137
+ if (fragment.default !== void 0) {
138
+ lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(fragment.default)};`, `} else {`);
139
+ if (require_helpers.isSchemaNullable(fragment)) {
144
140
  lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
145
- lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 4));
141
+ lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
146
142
  lines.push(` }`);
147
- } else lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 2));
143
+ } else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
148
144
  lines.push(`}`);
149
145
  return lines;
150
146
  }
151
147
  lines.push(`if (${valueVar} === undefined) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "A value is required" });`, ` ${targetVar} = ${valueVar};`, `} else {`);
152
- if (require_helpers.isSchemaNullable(view)) {
148
+ if (require_helpers.isSchemaNullable(fragment)) {
153
149
  lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
154
- lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 4));
150
+ lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
155
151
  lines.push(` }`);
156
- } else lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 2));
152
+ } else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
157
153
  lines.push(`}`);
158
154
  return lines;
159
155
  }
@@ -174,14 +170,14 @@ function generateParserCode(schema) {
174
170
  }
175
171
  if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
176
172
  const branches = view.oneOf ?? view.anyOf ?? [];
177
- const matchedVar = nextTemp("matched");
173
+ const matchedVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Matched` : "matched");
178
174
  lines.push(`let ${matchedVar} = false;`);
179
175
  for (const branch of branches) {
180
- const branchErrorsVar = nextTemp("branchErrors");
181
- const branchResultVar = nextTemp("branchResult");
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");
182
178
  lines.push(`if (!${matchedVar}) {`);
183
179
  lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
184
- lines.push(...indent(generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar), 2));
180
+ lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
185
181
  lines.push(` if (${branchErrorsVar}.length === 0) {`, ` ${targetVar} = ${branchResultVar};`, ` ${matchedVar} = true;`, ` }`, `}`);
186
182
  }
187
183
  lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
@@ -235,8 +231,8 @@ function generateParserCode(schema) {
235
231
  ` ${targetVar} = ${valueVar};`,
236
232
  `} else {`
237
233
  ];
238
- const resultVar = nextTemp("object");
239
- lines.push(` const ${resultVar} = {}${type ? ` as ${type}` : ""};`);
234
+ const resultVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Schema` : "schema");
235
+ lines.push(` const ${resultVar} = {} as Record<string, any>`);
240
236
  const properties = require_type_checks.isJsonSchemaObject(view) ? require_helpers.getPropertiesList(view) : [];
241
237
  const propertyNames = /* @__PURE__ */ new Set();
242
238
  for (const property of properties) {
@@ -244,22 +240,22 @@ function generateParserCode(schema) {
244
240
  propertyNames.add(name);
245
241
  const accessor = `${valueVar}[${JSON.stringify(name)}]`;
246
242
  const propertyPath = childPath(pathVar, `.${name}`);
247
- const propertyVar = nextTemp("property");
243
+ const propertyVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Property` : "property");
248
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" });` : ``;
249
245
  lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
250
- lines.push(...indent(generateStatements(property, accessor, propertyPath, propertyVar, errorsVar), 4));
246
+ lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
251
247
  lines.push(` ${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
252
248
  if (missingBranch) lines.push(` } else { ${missingBranch} }`);
253
249
  else lines.push(` }`);
254
250
  }
255
251
  const additional = view.additionalProperties;
256
252
  if (require_type_checks.isJsonSchema(additional)) {
257
- const additionalVar = nextTemp("additional");
253
+ const additionalVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Additional` : "additional");
258
254
  lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
259
- lines.push(...indent(generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar), 4));
260
- lines.push(` ${resultVar}[key] = ${additionalVar};`, `}`);
255
+ lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
256
+ lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
261
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];`, `}`);
262
- lines.push(` ${targetVar} = ${resultVar};`, `}`);
258
+ lines.push(`${targetVar} = ${resultVar};`, `}`);
263
259
  return lines;
264
260
  }
265
261
  /**
@@ -273,7 +269,7 @@ function generateParserCode(schema) {
273
269
  ` ${targetVar} = ${valueVar};`,
274
270
  `} else {`
275
271
  ];
276
- const resultVar = nextTemp("array");
272
+ const resultVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Array` : "array");
277
273
  lines.push(` const ${resultVar}: unknown[] = [];`);
278
274
  const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
279
275
  if (tupleItems) {
@@ -281,20 +277,20 @@ function generateParserCode(schema) {
281
277
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
282
278
  tupleItems.forEach((item, index) => {
283
279
  lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
284
- lines.push(...indent(generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar), 6));
285
- lines.push(` }`);
280
+ lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
281
+ lines.push("}");
286
282
  });
287
283
  if (listItems) {
288
- lines.push(` else {`);
289
- lines.push(...indent(generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar), 6));
290
- lines.push(` }`);
291
- } else lines.push(` else { itemResult = item; }`);
284
+ lines.push("else {");
285
+ lines.push(...generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
286
+ lines.push("}");
287
+ } else lines.push("else { itemResult = item; }");
292
288
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
293
289
  return lines;
294
290
  }
295
291
  const itemSchema = view.items ?? true;
296
292
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
297
- lines.push(...indent(generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar), 4));
293
+ lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
298
294
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
299
295
  return lines;
300
296
  }
@@ -316,7 +312,7 @@ export class ParserError extends Error {
316
312
  }
317
313
  }
318
314
 
319
- ${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\n let result;\n${indent(generateStatements(definition, "value", "path", "result", "errors")).join("\n")}\n\n return result;\n}`).join("\n\n")}
315
+ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\n let result;\n${generateStatements(definition, "value", "path", "result", "errors").join("\n")}\n\n return result;\n}`).join("\n\n")}
320
316
 
321
317
  /**
322
318
  * Parses an input value into the type described by the JSON Schema.
@@ -327,11 +323,11 @@ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserId
327
323
  * @param value - The input value to parse.
328
324
  * @returns The parsed value conforming to the schema.
329
325
  */
330
- export function parse(value: unknown)${schema.name ? `: ${stringifyType(schema)}` : ""} {
326
+ export function parse(value: Record<string, unknown>)${schema.name ? `: ${stringifyType(schema)}` : ""} {
331
327
  const errors: { path: string; message: string }[] = [];
332
328
 
333
329
  let result;
334
- ${indent(generateStatements(schema, "value", "\"$\"", "result", "errors")).join("\n")}
330
+ ${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
335
331
 
336
332
  if (errors.length > 0) {
337
333
  throw new ParserError(errors);
@@ -1 +1 @@
1
- {"version":3,"file":"codegen.d.cts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;AAqDA;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;AAqmBrD;;;;;;;;;AA7wBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAumBA;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":";;;;;;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;AA2mBrD;;;;;;;;;AAnxBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AA6mBA;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":";;;;;;AAqDA;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;AAqmBrD;;;;;;;;;AA7wBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AAumBA;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":";;;;;;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;AA2mBrD;;;;;;;;;AAnxBiD,iBAwKjC,kBAAA,CAAmB,MAAkB,EAAV,UAAU;;;;;AA6mBA;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
@@ -3,6 +3,7 @@ import { isJsonSchema, isJsonSchemaObject } 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
+ import { camelCase } from "@stryke/string-format/camel-case";
6
7
  import { isInteger, isObject, isString } from "@stryke/type-checks";
7
8
  import { isBoolean as isBoolean$1 } from "@stryke/type-checks/is-boolean";
8
9
  import { isNull as isNull$1 } from "@stryke/type-checks/is-null";
@@ -112,46 +113,41 @@ function generateParserCode(schema) {
112
113
  ...rootSchema.definitions,
113
114
  ...rootSchema.$defs
114
115
  };
115
- let tempCounter = 0;
116
+ const tempCounter = {};
116
117
  function nextTemp(prefix) {
117
- const id = tempCounter;
118
- tempCounter += 1;
119
- return `__${prefix}_${id}`;
120
- }
121
- function indent(lines, size = 2) {
122
- const padding = " ".repeat(size);
123
- return lines.map((line) => `${padding}${line}`);
118
+ const id = tempCounter[prefix] ?? 0;
119
+ tempCounter[prefix] = id + 1;
120
+ return `${prefix}${id > 0 ? `${id}` : ""}`;
124
121
  }
125
122
  /**
126
123
  * Generates inline parsing statements for a schema fragment.
127
124
  */
128
125
  function generateStatements(fragment, valueExpr, pathExpr, targetVar, errorsVar = "errors") {
129
126
  if (typeof fragment === "boolean") return fragment ? [`${targetVar} = ${valueExpr};`] : [`${errorsVar}.push({ path: ${pathExpr}, message: "No value is allowed at this location" });`, `${targetVar} = ${valueExpr};`];
130
- const view = fragment;
131
- if (isSetString$1(view.$ref)) {
132
- const refName = resolveLocalRefName(view.$ref);
127
+ if (isSetString$1(fragment.$ref)) {
128
+ const refName = resolveLocalRefName(fragment.$ref);
133
129
  if (refName && refName in definitions) return [`${targetVar} = ${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, ${errorsVar});`];
134
130
  return [`${targetVar} = ${valueExpr};`];
135
131
  }
136
- const valueVar = nextTemp("value");
137
- const pathVar = nextTemp("path");
132
+ const valueVar = nextTemp(fragment.name ? `${camelCase(fragment.name)}Value` : "value");
133
+ const pathVar = nextTemp(fragment.name ? `${camelCase(fragment.name)}Path` : "path");
138
134
  const lines = [`const ${valueVar} = ${valueExpr};`, `const ${pathVar} = ${pathExpr};`];
139
- if (view.default !== void 0) {
140
- lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(view.default)};`, `} else {`);
141
- if (isSchemaNullable(view)) {
135
+ if (fragment.default !== void 0) {
136
+ lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(fragment.default)};`, `} else {`);
137
+ if (isSchemaNullable(fragment)) {
142
138
  lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
143
- lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 4));
139
+ lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
144
140
  lines.push(` }`);
145
- } else lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 2));
141
+ } else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
146
142
  lines.push(`}`);
147
143
  return lines;
148
144
  }
149
145
  lines.push(`if (${valueVar} === undefined) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "A value is required" });`, ` ${targetVar} = ${valueVar};`, `} else {`);
150
- if (isSchemaNullable(view)) {
146
+ if (isSchemaNullable(fragment)) {
151
147
  lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
152
- lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 4));
148
+ lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
153
149
  lines.push(` }`);
154
- } else lines.push(...indent(generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar), 2));
150
+ } else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
155
151
  lines.push(`}`);
156
152
  return lines;
157
153
  }
@@ -172,14 +168,14 @@ function generateParserCode(schema) {
172
168
  }
173
169
  if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
174
170
  const branches = view.oneOf ?? view.anyOf ?? [];
175
- const matchedVar = nextTemp("matched");
171
+ const matchedVar = nextTemp(view.name ? `${camelCase(view.name)}Matched` : "matched");
176
172
  lines.push(`let ${matchedVar} = false;`);
177
173
  for (const branch of branches) {
178
- const branchErrorsVar = nextTemp("branchErrors");
179
- const branchResultVar = nextTemp("branchResult");
174
+ const branchErrorsVar = nextTemp(view.name ? `${camelCase(view.name)}BranchErrors` : "branchErrors");
175
+ const branchResultVar = nextTemp(view.name ? `${camelCase(view.name)}BranchResult` : "branchResult");
180
176
  lines.push(`if (!${matchedVar}) {`);
181
177
  lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
182
- lines.push(...indent(generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar), 2));
178
+ lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
183
179
  lines.push(` if (${branchErrorsVar}.length === 0) {`, ` ${targetVar} = ${branchResultVar};`, ` ${matchedVar} = true;`, ` }`, `}`);
184
180
  }
185
181
  lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
@@ -233,8 +229,8 @@ function generateParserCode(schema) {
233
229
  ` ${targetVar} = ${valueVar};`,
234
230
  `} else {`
235
231
  ];
236
- const resultVar = nextTemp("object");
237
- lines.push(` const ${resultVar} = {}${type ? ` as ${type}` : ""};`);
232
+ const resultVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Schema` : "schema");
233
+ lines.push(` const ${resultVar} = {} as Record<string, any>`);
238
234
  const properties = isJsonSchemaObject(view) ? getPropertiesList(view) : [];
239
235
  const propertyNames = /* @__PURE__ */ new Set();
240
236
  for (const property of properties) {
@@ -242,22 +238,22 @@ function generateParserCode(schema) {
242
238
  propertyNames.add(name);
243
239
  const accessor = `${valueVar}[${JSON.stringify(name)}]`;
244
240
  const propertyPath = childPath(pathVar, `.${name}`);
245
- const propertyVar = nextTemp("property");
241
+ const propertyVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Property` : "property");
246
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" });` : ``;
247
243
  lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
248
- lines.push(...indent(generateStatements(property, accessor, propertyPath, propertyVar, errorsVar), 4));
244
+ lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
249
245
  lines.push(` ${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
250
246
  if (missingBranch) lines.push(` } else { ${missingBranch} }`);
251
247
  else lines.push(` }`);
252
248
  }
253
249
  const additional = view.additionalProperties;
254
250
  if (isJsonSchema(additional)) {
255
- const additionalVar = nextTemp("additional");
251
+ const additionalVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Additional` : "additional");
256
252
  lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
257
- lines.push(...indent(generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar), 4));
258
- lines.push(` ${resultVar}[key] = ${additionalVar};`, `}`);
253
+ lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
254
+ lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
259
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];`, `}`);
260
- lines.push(` ${targetVar} = ${resultVar};`, `}`);
256
+ lines.push(`${targetVar} = ${resultVar};`, `}`);
261
257
  return lines;
262
258
  }
263
259
  /**
@@ -271,7 +267,7 @@ function generateParserCode(schema) {
271
267
  ` ${targetVar} = ${valueVar};`,
272
268
  `} else {`
273
269
  ];
274
- const resultVar = nextTemp("array");
270
+ const resultVar = nextTemp(view.name ? `${camelCase(view.name)}Array` : "array");
275
271
  lines.push(` const ${resultVar}: unknown[] = [];`);
276
272
  const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
277
273
  if (tupleItems) {
@@ -279,20 +275,20 @@ function generateParserCode(schema) {
279
275
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
280
276
  tupleItems.forEach((item, index) => {
281
277
  lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
282
- lines.push(...indent(generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar), 6));
283
- lines.push(` }`);
278
+ lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
279
+ lines.push("}");
284
280
  });
285
281
  if (listItems) {
286
- lines.push(` else {`);
287
- lines.push(...indent(generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar), 6));
288
- lines.push(` }`);
289
- } else lines.push(` else { itemResult = item; }`);
282
+ lines.push("else {");
283
+ lines.push(...generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
284
+ lines.push("}");
285
+ } else lines.push("else { itemResult = item; }");
290
286
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
291
287
  return lines;
292
288
  }
293
289
  const itemSchema = view.items ?? true;
294
290
  lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
295
- lines.push(...indent(generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar), 4));
291
+ lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
296
292
  lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
297
293
  return lines;
298
294
  }
@@ -314,7 +310,7 @@ export class ParserError extends Error {
314
310
  }
315
311
  }
316
312
 
317
- ${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\n let result;\n${indent(generateStatements(definition, "value", "path", "result", "errors")).join("\n")}\n\n return result;\n}`).join("\n\n")}
313
+ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\n let result;\n${generateStatements(definition, "value", "path", "result", "errors").join("\n")}\n\n return result;\n}`).join("\n\n")}
318
314
 
319
315
  /**
320
316
  * Parses an input value into the type described by the JSON Schema.
@@ -325,11 +321,11 @@ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserId
325
321
  * @param value - The input value to parse.
326
322
  * @returns The parsed value conforming to the schema.
327
323
  */
328
- export function parse(value: unknown)${schema.name ? `: ${stringifyType(schema)}` : ""} {
324
+ export function parse(value: Record<string, unknown>)${schema.name ? `: ${stringifyType(schema)}` : ""} {
329
325
  const errors: { path: string; message: string }[] = [];
330
326
 
331
327
  let result;
332
- ${indent(generateStatements(schema, "value", "\"$\"", "result", "errors")).join("\n")}
328
+ ${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
333
329
 
334
330
  if (errors.length > 0) {
335
331
  throw new ParserError(errors);
@@ -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 { 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, JsonSchemaType } from \"./types\";\nimport { getValidator } from \"./validate\";\n\ninterface JsonSchemaObjectView {\n $ref?: string;\n type?: JsonSchemaType | readonly JsonSchemaType[];\n enum?: readonly unknown[];\n const?: unknown;\n default?: unknown;\n items?: JsonSchema | JsonSchema[];\n prefixItems?: JsonSchema[];\n properties?: Record<string, JsonSchema>;\n additionalProperties?: boolean | JsonSchema;\n required?: string[];\n oneOf?: JsonSchema[];\n anyOf?: JsonSchema[];\n allOf?: JsonSchema[];\n $defs?: Record<string, JsonSchema>;\n definitions?: Record<string, JsonSchema>;\n}\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 JsonSchemaObjectView;\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: JsonSchemaObjectView): JsonSchemaType[] {\n const type = schema.type;\n if (Array.isArray(type)) {\n return [...type];\n }\n\n return type ? [type as JsonSchemaType] : [];\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 JsonSchemaObjectView);\n\n const definitions: Record<string, JsonSchema> =\n typeof rootSchema === \"boolean\"\n ? {}\n : { ...rootSchema.definitions, ...rootSchema.$defs };\n\n let tempCounter = 0;\n\n function nextTemp(prefix: string): string {\n const id = tempCounter;\n tempCounter += 1;\n\n return `__${prefix}_${id}`;\n }\n\n function indent(lines: string[], size = 2): string[] {\n const padding = \" \".repeat(size);\n\n return lines.map(line => `${padding}${line}`);\n }\n\n /**\n * Generates inline parsing statements for a schema fragment.\n */\n function generateStatements(\n fragment: JsonSchema,\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 const view = fragment as JsonSchemaObjectView;\n\n if (isSetString(view.$ref)) {\n const refName = resolveLocalRefName(view.$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(\"value\");\n const pathVar = nextTemp(\"path\");\n const lines: string[] = [\n `const ${valueVar} = ${valueExpr};`,\n `const ${pathVar} = ${pathExpr};`\n ];\n\n if (view.default !== undefined) {\n lines.push(\n `if (${valueVar} === undefined) {`,\n ` ${targetVar} = ${JSON.stringify(view.default)};`,\n `} else {`\n );\n\n if (isSchemaNullable(view)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...indent(\n generateCoreStatements(\n view,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n ),\n 4\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...indent(\n generateCoreStatements(\n view,\n valueVar,\n pathVar,\n targetVar,\n errorsVar\n ),\n 2\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(view)) {\n lines.push(\n ` if (${valueVar} === null) {`,\n ` ${targetVar} = null;`,\n ` } else {`\n );\n lines.push(\n ...indent(\n generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar),\n 4\n )\n );\n lines.push(` }`);\n } else {\n lines.push(\n ...indent(\n generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar),\n 2\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: JsonSchemaObjectView,\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(\"matched\");\n\n lines.push(`let ${matchedVar} = false;`);\n\n for (const branch of branches) {\n const branchErrorsVar = nextTemp(\"branchErrors\");\n const branchResultVar = nextTemp(\"branchResult\");\n\n lines.push(`if (!${matchedVar}) {`);\n lines.push(\n ` const ${branchErrorsVar}: { path: string; message: string }[] = [];`,\n ` let ${branchResultVar};`\n );\n lines.push(\n ...indent(\n generateStatements(\n branch,\n valueVar,\n pathVar,\n branchResultVar,\n branchErrorsVar\n ),\n 2\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: JsonSchemaObjectView,\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(\"object\");\n lines.push(` const ${resultVar} = {}${type ? ` as ${type}` : \"\"};`);\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 = `${valueVar}[${JSON.stringify(name)}]`;\n const propertyPath = childPath(pathVar, `.${name}`);\n const propertyVar = nextTemp(\"property\");\n\n const missingBranch =\n property.default !== undefined\n ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};`\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 ...indent(\n generateStatements(\n property,\n accessor,\n propertyPath,\n propertyVar,\n errorsVar\n ),\n 4\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(\"additional\");\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 ...indent(\n generateStatements(\n additional,\n `${valueVar}[key]`,\n `${pathVar} + \".\" + key`,\n additionalVar,\n errorsVar\n ),\n 4\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: JsonSchemaObjectView,\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(\"array\");\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 ...indent(\n generateStatements(\n item,\n \"item\",\n childPath(pathVar, `[${index}]`),\n \"itemResult\",\n errorsVar\n ),\n 6\n )\n );\n lines.push(` }`);\n });\n\n if (listItems) {\n lines.push(` else {`);\n lines.push(\n ...indent(\n generateStatements(\n listItems,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n ),\n 6\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 ...indent(\n generateStatements(\n itemSchema,\n \"item\",\n `${pathVar} + \"[\" + index + \"]\"`,\n \"itemResult\",\n errorsVar\n ),\n 4\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) {\\n let result;\\n${indent(\n generateStatements(definition, \"value\", \"path\", \"result\", \"errors\")\n ).join(\"\\n\")}\\n\\n return result;\\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: unknown)${\n schema.name ? `: ${stringifyType(schema)}` : \"\"\n } {\n const errors: { path: string; message: string }[] = [];\n\n let result;\n${indent(generateStatements(schema, \"value\", '\"$\"', \"result\", \"errors\")).join(\"\\n\")}\n\n if (errors.length > 0) {\n throw new ParserError(errors);\n }\n\n return result;\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, 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 = `${valueVar}[${JSON.stringify(name)}]`;\n const propertyPath = childPath(pathVar, `.${name}`);\n const propertyVar = nextTemp(\n type || view.name\n ? `${camelCase(type || view.name)}Property`\n : \"property\"\n );\n\n const missingBranch =\n property.default !== undefined\n ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};`\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)}Additional`\n : \"additional\"\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) {\\n let result;\\n${generateStatements(\n definition,\n \"value\",\n \"path\",\n \"result\",\n \"errors\"\n ).join(\"\\n\")}\\n\\n return result;\\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;\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.83",
3
+ "version": "0.11.84",
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": "64a604fd5da7312baeeb58dfcef0fd3ace15174e"
99
+ "gitHead": "1babfdc217eff1881035a335d23d26327fad6904"
100
100
  }