@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 +40 -44
- package/dist/codegen.d.cts.map +1 -1
- package/dist/codegen.d.mts.map +1 -1
- package/dist/codegen.mjs +40 -44
- package/dist/codegen.mjs.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
118
|
+
const tempCounter = {};
|
|
118
119
|
function nextTemp(prefix) {
|
|
119
|
-
const id = tempCounter;
|
|
120
|
-
tempCounter
|
|
121
|
-
return
|
|
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
|
-
|
|
133
|
-
|
|
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 (
|
|
142
|
-
lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(
|
|
143
|
-
if (require_helpers.isSchemaNullable(
|
|
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(...
|
|
141
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
146
142
|
lines.push(` }`);
|
|
147
|
-
} else lines.push(...
|
|
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(
|
|
148
|
+
if (require_helpers.isSchemaNullable(fragment)) {
|
|
153
149
|
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
154
|
-
lines.push(...
|
|
150
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
155
151
|
lines.push(` }`);
|
|
156
|
-
} else lines.push(...
|
|
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(...
|
|
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("
|
|
239
|
-
lines.push(` const ${resultVar} = {}
|
|
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(...
|
|
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(...
|
|
260
|
-
lines.push(
|
|
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(
|
|
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(...
|
|
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(
|
|
289
|
-
lines.push(...
|
|
290
|
-
lines.push(
|
|
291
|
-
} else lines.push(
|
|
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(...
|
|
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${
|
|
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
|
-
${
|
|
330
|
+
${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
|
|
335
331
|
|
|
336
332
|
if (errors.length > 0) {
|
|
337
333
|
throw new ParserError(errors);
|
package/dist/codegen.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.cts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;
|
|
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"}
|
package/dist/codegen.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.mts","names":[],"sources":["../src/codegen.ts"],"mappings":";;;;;;
|
|
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
|
-
|
|
116
|
+
const tempCounter = {};
|
|
116
117
|
function nextTemp(prefix) {
|
|
117
|
-
const id = tempCounter;
|
|
118
|
-
tempCounter
|
|
119
|
-
return
|
|
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
|
-
|
|
131
|
-
|
|
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 (
|
|
140
|
-
lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(
|
|
141
|
-
if (isSchemaNullable(
|
|
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(...
|
|
139
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
144
140
|
lines.push(` }`);
|
|
145
|
-
} else lines.push(...
|
|
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(
|
|
146
|
+
if (isSchemaNullable(fragment)) {
|
|
151
147
|
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
152
|
-
lines.push(...
|
|
148
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
153
149
|
lines.push(` }`);
|
|
154
|
-
} else lines.push(...
|
|
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(...
|
|
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("
|
|
237
|
-
lines.push(` const ${resultVar} = {}
|
|
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(...
|
|
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(...
|
|
258
|
-
lines.push(
|
|
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(
|
|
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(...
|
|
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(
|
|
287
|
-
lines.push(...
|
|
288
|
-
lines.push(
|
|
289
|
-
} else lines.push(
|
|
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(...
|
|
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${
|
|
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
|
-
${
|
|
328
|
+
${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
|
|
333
329
|
|
|
334
330
|
if (errors.length > 0) {
|
|
335
331
|
throw new ParserError(errors);
|
package/dist/codegen.mjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;AAqDA,SAAgB,eACd,OACA,MACQ;CACR,OAAOA,cAAY,KAAK,IACpB,cACAC,SAAO,KAAK,IACV,SACA,SAAS,aAAaC,YAAU,KAAK,IACnC,OAAO,OAAO,KAAK,CAAC,IACpB,SAAS,YAAYC,WAAS,KAAK,IACjC,OAAO,WAAW,OAAO,KAAK,CAAC,EAAE,eAAe,QAAW,EACzD,uBAAuB,GACzB,CAAC,IACD,SAAS,YACP,OAAO,SAAS,OAAO,KAAK,CAAC,EAAE,eAAe,IAC9C,SAAS,YAAY,SAAS,YAAY,SAAS,UACjD,KAAK,UAAU,KAAK,IACpB,OAAO,KAAK;AAC5B;;;;AAKA,SAAgB,cAAc,QAA6B;CACzD,IAAI,CAAC,QACH,OAAO;CAGT,IAAI,OAAO,WAAW,WACpB,OAAO,SAAS,YAAY;CAG9B,IAAI,mBAAmB,MAAM,KAAKC,cAAY,OAAO,IAAI,GACvD,OAAO,OAAO;CAGhB,MAAM,eAAe;CAErB,IAAIA,cAAY,aAAa,IAAI,GAG/B,OAFc,oCAAoC,KAAK,aAAa,IAEzD,IAAI,MAAM,aAAa;CAGpC,MAAM,cAAc,qBAAqB,MAAM;CAC/C,IAAI,aAAa;EACf,IAAI,gBAAgB,aAAa,gBAAgB,UAC/C,OAAO;EAGT,OAAO;CACT;CAEA,IAAI,aAAa,SAAS,WAAW,MAAM,QAAQ,aAAa,IAAI,GAGlE,OAFmB,aAAa,KAG7B,KAAK,UAAmB,KAAK,UAAU,KAAK,CAAC,EAC7C,KAAK,KAAK;CAGf,IAAI,aAAa,UAAU,QACzB,OAAO,KAAK,UAAU,aAAa,KAAK;CAG1C,IAAI,aAAa,SAAS,WAAW,aAAa,OAKhD,OAAO,GAAG,cAJI,MAAM,QAAQ,aAAa,KAAK,IAC1C,aAAa,MAAM,KACnB,aAAa,KAEY,EAAE;CAGjC,IACE,aAAa,SAAS,YACtB,aAAa,cACb,aAAa,sBACb;EACA,IAAI,aAAa,aAAa,oBAAoB,GAChD,OAAO,oBAAoB,cAAc,aAAa,oBAAoB,EAAE;EAG9E,IAAI,mBAAmB,YAAY,GAAG;GACpC,MAAM,WAAW,aAAa,YAAY,CAAC;GAE3C,OAAO,KAAK,kBAAkB,YAAY,EACvC,KAAI,aAAY;IACf,MAAM,SACJ,CAAC,SAAS,SAAS,SAAS,IAAI,KAAK,iBAAiB,QAAQ,IAC1D,GAAG,CAAC,SAAS,SAAS,SAAS,IAAI,IAAI,MAAM,KAAK,iBAAiB,QAAQ,IAAI,YAAY,OAC3F;IAEN,OAAO,GAAG,SAAS,OAAO,OAAO,IAAI,cAAc,QAAQ;GAC7D,CAAC,EACA,KAAK,KAAK,EAAE;EACjB;CACF;CAEA,IAAI,aAAa,SAAS,aAAa,OACrC,QAAQ,aAAa,SAAS,aAAa,SAAS,CAAC,GAClD,KAAI,WAAU,cAAc,MAAM,CAAC,EACnC,KAAK,KAAK;CAGf,IAAI,aAAa,OACf,OAAO;CAGT,OAAO;AACT;;;;;;;AAQA,SAAgB,kBAAkB,OAA6C;CAC7E,OAAOH,SAAO,KAAK,IACf,SACAC,YAAU,KAAK,IACb,YACA,UAAU,KAAK,IACb,YACAC,WAAS,KAAK,IACZ,WACA,SAAS,KAAK,IACZ,WACA,SAAS,KAAK,IACZ,WACA,MAAM,QAAQ,KAAK,IACjB,UACA;AAClB;;;;AAKA,SAAS,oBAAoB,KAAiC;CAC5D,OAAO,oCAAoC,KAAK,GAAG,IAAI;AACzD;;;;AAKA,SAAS,mBAAmB,MAAsB;CAChD,MAAM,UAAU,KAAK,QAAQ,YAAY,GAAG;CAE5C,OAAO,SAAS,OAAO,KAAK,OAAO,IAAI,IAAI,YAAY;AACzD;;;;;AAMA,SAAS,kBAAkB,QAAgD;CACzE,MAAM,OAAO,OAAO;CACpB,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO,CAAC,GAAG,IAAI;CAGjB,OAAO,OAAO,CAAC,IAAsB,IAAI,CAAC;AAC5C;;;;AAKA,SAAS,UAAU,UAAkB,SAAyB;CAC5D,OAAO,GAAG,SAAS,KAAK,KAAK,UAAU,OAAO;AAChD;;;;;;;;;;;;;;;;;;;;;AAsBA,SAAgB,mBAAmB,QAA4B;CAC7D,MAAM,aACJ,OAAO,WAAW,YAAY,SAAU;CAE1C,MAAM,cACJ,OAAO,eAAe,YAClB,CAAC,IACD;EAAE,GAAG,WAAW;EAAa,GAAG,WAAW;CAAM;CAEvD,IAAI,cAAc;CAElB,SAAS,SAAS,QAAwB;EACxC,MAAM,KAAK;EACX,eAAe;EAEf,OAAO,KAAK,OAAO,GAAG;CACxB;CAEA,SAAS,OAAO,OAAiB,OAAO,GAAa;EACnD,MAAM,UAAU,IAAI,OAAO,IAAI;EAE/B,OAAO,MAAM,KAAI,SAAQ,GAAG,UAAU,MAAM;CAC9C;;;;CAKA,SAAS,mBACP,UACA,WACA,UACA,WACA,YAAY,UACF;EACV,IAAI,OAAO,aAAa,WACtB,OAAO,WACH,CAAC,GAAG,UAAU,KAAK,UAAU,EAAE,IAC/B,CACE,GAAG,UAAU,gBAAgB,SAAS,wDACtC,GAAG,UAAU,KAAK,UAAU,EAC9B;EAGN,MAAM,OAAO;EAEb,IAAIC,cAAY,KAAK,IAAI,GAAG;GAC1B,MAAM,UAAU,oBAAoB,KAAK,IAAI;GAC7C,IAAI,WAAW,WAAW,aACxB,OAAO,CACL,GAAG,UAAU,KAAK,mBAAmB,OAAO,EAAE,GAAG,UAAU,IAAI,SAAS,IAAI,UAAU,GACxF;GAIF,OAAO,CAAC,GAAG,UAAU,KAAK,UAAU,EAAE;EACxC;EAEA,MAAM,WAAW,SAAS,OAAO;EACjC,MAAM,UAAU,SAAS,MAAM;EAC/B,MAAM,QAAkB,CACtB,SAAS,SAAS,KAAK,UAAU,IACjC,SAAS,QAAQ,KAAK,SAAS,EACjC;EAEA,IAAI,KAAK,YAAY,QAAW;GAC9B,MAAM,KACJ,OAAO,SAAS,oBAChB,KAAK,UAAU,KAAK,KAAK,UAAU,KAAK,OAAO,EAAE,IACjD,UACF;GAEA,IAAI,iBAAiB,IAAI,GAAG;IAC1B,MAAM,KACJ,SAAS,SAAS,eAClB,OAAO,UAAU,WACjB,YACF;IACA,MAAM,KACJ,GAAG,OACD,uBACE,MACA,UACA,SACA,WACA,SACF,GACA,CACF,CACF;IACA,MAAM,KAAK,KAAK;GAClB,OACE,MAAM,KACJ,GAAG,OACD,uBACE,MACA,UACA,SACA,WACA,SACF,GACA,CACF,CACF;GAGF,MAAM,KAAK,GAAG;GAEd,OAAO;EACT;EAEA,MAAM,KACJ,OAAO,SAAS,oBAChB,KAAK,UAAU,gBAAgB,QAAQ,uCACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,UACF;EAEA,IAAI,iBAAiB,IAAI,GAAG;GAC1B,MAAM,KACJ,SAAS,SAAS,eAClB,OAAO,UAAU,WACjB,YACF;GACA,MAAM,KACJ,GAAG,OACD,uBAAuB,MAAM,UAAU,SAAS,WAAW,SAAS,GACpE,CACF,CACF;GACA,MAAM,KAAK,KAAK;EAClB,OACE,MAAM,KACJ,GAAG,OACD,uBAAuB,MAAM,UAAU,SAAS,WAAW,SAAS,GACpE,CACF,CACF;EAGF,MAAM,KAAK,GAAG;EAEd,OAAO;CACT;;;;CAKA,SAAS,uBACP,MACA,UACA,SACA,WACA,WACU;EACV,MAAM,QAAkB,CAAC;EAEzB,IAAI,KAAK,UAAU,QAAW;GAC5B,MAAM,aAAa,KAAK,UAAU,KAAK,KAAK;GAC5C,MAAM,KACJ,sBAAsB,SAAS,QAAQ,WAAW,MAChD,UACD,gBAAgB,QAAQ,8CACvB,WACD,SACD,GAAG,UAAU,KAAK,WAAW,EAC/B;GAEA,OAAO;EACT;EAEA,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG;GAC5B,MAAM,aAAa,KAAK,UAAU,KAAK,IAAI;GAC3C,MAAM,KACJ,QAAQ,WAAW,8DACjB,SACD,QAAQ,UAAU,gBACjB,QACD,kCAAkC,WAAW,SAC9C,GAAG,UAAU,KAAK,SAAS,EAC7B;GAEA,OAAO;EACT;EAEA,IAAI,MAAM,QAAQ,KAAK,KAAK,KAAK,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC1D,MAAM,WAAW,KAAK,SAAS,KAAK,SAAS,CAAC;GAC9C,MAAM,aAAa,SAAS,SAAS;GAErC,MAAM,KAAK,OAAO,WAAW,UAAU;GAEvC,KAAK,MAAM,UAAU,UAAU;IAC7B,MAAM,kBAAkB,SAAS,cAAc;IAC/C,MAAM,kBAAkB,SAAS,cAAc;IAE/C,MAAM,KAAK,QAAQ,WAAW,IAAI;IAClC,MAAM,KACJ,WAAW,gBAAgB,8CAC3B,SAAS,gBAAgB,EAC3B;IACA,MAAM,KACJ,GAAG,OACD,mBACE,QACA,UACA,SACA,iBACA,eACF,GACA,CACF,CACF;IACA,MAAM,KACJ,SAAS,gBAAgB,mBACzB,OAAO,UAAU,KAAK,gBAAgB,IACtC,OAAO,WAAW,WAClB,OACA,GACF;GACF;GAEA,MAAM,KACJ,QAAQ,WAAW,MACnB,KAAK,UAAU,gBAAgB,QAAQ,mEACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;GAEA,OAAO;EACT;EAEA,IAAI,MAAM,QAAQ,KAAK,KAAK,GAAG;GAC7B,MAAM,EAAE,OAAO,GAAG,SAAS;GAC3B,MAAM,SAAS,MAAM,MAAM,GAAG,KAAK;GACnC,MAAM,KACJ,GAAG,mBAAmB,QAAQ,UAAU,SAAS,WAAW,SAAS,CACvE;GAEA,OAAO;EACT;EAEA,MAAM,gBAAgB,kBAAkB,IAAI;EAM5C,QAJE,qBAAqB,IAAI,KACzB,cAAc,MAAK,SAAQ,SAAS,MAAM,MACzC,KAAK,aAAa,WAAW,KAAK,QAAQ,UAAU,SAEvD;GACE,KAAK;IACH,MAAM,KACJ,GAAG,yBACD,MACA,UACA,SACA,WACA,SACF,CACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,GAAG,wBACD,MACA,UACA,SACA,WACA,SACF,CACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,cAAc,SAAS,mBACvB,KAAK,UAAU,KAAK,SAAS,IAC7B,qBAAqB,SAAS,0BAA0B,SAAS,oBACjE,KAAK,UAAU,YAAY,SAAS,KACpC,YACA,KAAK,UAAU,gBAAgB,QAAQ,2CACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,cAAc,SAAS,oCAAoC,SAAS,OACpE,KAAK,UAAU,KAAK,SAAS,IAC7B,qBAAqB,SAAS,mBAAmB,SAAS,4CAA4C,SAAS,QAC/G,KAAK,UAAU,YAAY,SAAS,KACpC,qBAAqB,SAAS,oBAC9B,KAAK,UAAU,KAAK,SAAS,YAC7B,YACA,KAAK,UAAU,gBAAgB,QAAQ,6CACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,cAAc,SAAS,mBACvB,KAAK,UAAU,KAAK,SAAS,IAC7B,qBAAqB,SAAS,mBAAmB,SAAS,yCAAyC,SAAS,QAC5G,KAAK,UAAU,YAAY,SAAS,KACpC,qBAAqB,SAAS,oBAC9B,KAAK,UAAU,KAAK,SAAS,YAC7B,YACA,KAAK,UAAU,gBAAgB,QAAQ,2CACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,cAAc,SAAS,oBACvB,KAAK,UAAU,KAAK,SAAS,IAC7B,cAAc,SAAS,iBAAiB,SAAS,YACjD,KAAK,UAAU,WACf,cAAc,SAAS,kBAAkB,SAAS,YAClD,KAAK,UAAU,YACf,YACA,KAAK,UAAU,gBAAgB,QAAQ,4CACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;IACA;GACF,KAAK;IACH,MAAM,KACJ,OAAO,SAAS,eAChB,KAAK,UAAU,WACf,YACA,KAAK,UAAU,gBAAgB,QAAQ,yCACvC,KAAK,UAAU,KAAK,SAAS,IAC7B,GACF;IACA;GACF,KAAK;GACL;IACE,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS,EAAE;IACxC;EACJ;EAEA,OAAO;CACT;;;;;CAMA,SAAS,yBACP,MACA,UACA,SACA,WACA,WACU;EACV,MAAM,OAAO,cAAc,IAAI;EAE/B,MAAM,QAAkB;GACtB,cAAc,SAAS,mBAAmB,SAAS,6BAA6B,SAAS;GACzF,KAAK,UAAU,gBAAgB,QAAQ;GACvC,KAAK,UAAU,KAAK,SAAS;GAC7B;EACF;EAEA,MAAM,YAAY,SAAS,QAAQ;EACnC,MAAM,KAAK,WAAW,UAAU,OAAO,OAAO,OAAO,SAAS,GAAG,EAAE;EAEnE,MAAM,aAAa,mBAAmB,IAAI,IAAI,kBAAkB,IAAI,IAAI,CAAC;EACzE,MAAM,gCAAgB,IAAI,IAAY;EAEtC,KAAK,MAAM,YAAY,YAAY;GACjC,MAAM,OAAO,SAAS;GACtB,cAAc,IAAI,IAAI;GAEtB,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,UAAU,IAAI,EAAE;GACrD,MAAM,eAAe,UAAU,SAAS,IAAI,MAAM;GAClD,MAAM,cAAc,SAAS,UAAU;GAEvC,MAAM,gBACJ,SAAS,YAAY,SACjB,GAAG,UAAU,GAAG,KAAK,UAAU,IAAI,EAAE,MAAM,KAAK,UAAU,SAAS,OAAO,EAAE,KAC5E,SAAS,WACP,uBAAuB,aAAa,iDACpC;GAER,MAAM,KACJ,SAAS,SAAS,oBAClB,WAAW,YAAY,EACzB;GACA,MAAM,KACJ,GAAG,OACD,mBACE,UACA,UACA,cACA,aACA,SACF,GACA,CACF,CACF;GACA,MAAM,KAAK,OAAO,UAAU,GAAG,KAAK,UAAU,IAAI,EAAE,MAAM,YAAY,EAAE;GACxE,IAAI,eACF,MAAM,KAAK,cAAc,cAAc,GAAG;QAE1C,MAAM,KAAK,KAAK;EAEpB;EAEA,MAAM,aAAa,KAAK;EACxB,IAAI,aAAa,UAAU,GAAG;GAC5B,MAAM,gBAAgB,SAAS,YAAY;GAE3C,MAAM,KACJ,mCAAmC,SAAS,OAC5C,WAAW,KAAK,UAAU,CAAC,GAAG,aAAa,CAAC,EAAE,gCAC9C,WAAW,cAAc,EAC3B;GACA,MAAM,KACJ,GAAG,OACD,mBACE,YACA,GAAG,SAAS,QACZ,GAAG,QAAQ,eACX,eACA,SACF,GACA,CACF,CACF;GACA,MAAM,KAAK,OAAO,UAAU,UAAU,cAAc,IAAI,GAAG;EAC7D,OAAO,IAAI,eAAe,OACxB,MAAM,KACJ,mCAAmC,SAAS,OAC5C,WAAW,KAAK,UAAU,CAAC,GAAG,aAAa,CAAC,EAAE,gCAC9C,OAAO,UAAU,UAAU,SAAS,SACpC,GACF;EAGF,MAAM,KAAK,KAAK,UAAU,KAAK,UAAU,IAAI,GAAG;EAEhD,OAAO;CACT;;;;;CAMA,SAAS,wBACP,MACA,UACA,SACA,WACA,WACU;EACV,MAAM,QAAkB;GACtB,sBAAsB,SAAS;GAC/B,KAAK,UAAU,gBAAgB,QAAQ;GACvC,KAAK,UAAU,KAAK,SAAS;GAC7B;EACF;EAEA,MAAM,YAAY,SAAS,OAAO;EAClC,MAAM,KAAK,WAAW,UAAU,kBAAkB;EAElD,MAAM,aACJ,KAAK,gBAAgB,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ;EAEhE,IAAI,YAAY;GACd,MAAM,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ;GAC5D,MAAM,KACJ,iCAAiC,SAAS,yBAC1C,oBAAoB,SAAS,WAC7B,qBACF;GAEA,WAAW,SAAS,MAAM,UAAU;IAClC,MAAM,KACJ,GAAG,UAAU,IAAI,WAAW,cAAc,cAAc,MAAM,IAChE;IACA,MAAM,KACJ,GAAG,OACD,mBACE,MACA,QACA,UAAU,SAAS,IAAI,MAAM,EAAE,GAC/B,cACA,SACF,GACA,CACF,CACF;IACA,MAAM,KAAK,OAAO;GACpB,CAAC;GAED,IAAI,WAAW;IACb,MAAM,KAAK,YAAY;IACvB,MAAM,KACJ,GAAG,OACD,mBACE,WACA,QACA,GAAG,QAAQ,uBACX,cACA,SACF,GACA,CACF,CACF;IACA,MAAM,KAAK,OAAO;GACpB,OACE,MAAM,KAAK,iCAAiC;GAG9C,MAAM,KACJ,OAAO,UAAU,qBACjB,OACA,KAAK,UAAU,KAAK,UAAU,IAC9B,GACF;GAEA,OAAO;EACT;EAEA,MAAM,aAAc,KAAK,SAAS;EAClC,MAAM,KACJ,iCAAiC,SAAS,yBAC1C,oBAAoB,SAAS,WAC7B,qBACF;EACA,MAAM,KACJ,GAAG,OACD,mBACE,YACA,QACA,GAAG,QAAQ,uBACX,cACA,SACF,GACA,CACF,CACF;EACA,MAAM,KACJ,OAAO,UAAU,qBACjB,OACA,KAAK,UAAU,KAAK,UAAU,IAC9B,GACF;EAEA,OAAO;CACT;CASA,OAAO;;;;;;;;;;;;;;;;;;EAPiB,OAAO,QAAQ,WAAW,EAAE,KACjD,CAAC,MAAM,gBACN,YAAY,mBAAmB,IAAI,EAAE,0CAA0C,OAC7E,mBAAmB,YAAY,SAAS,QAAQ,UAAU,QAAQ,CACpE,EAAE,KAAK,IAAI,EAAE,wBAqBH,EAAE,KAAK,MAAM,EAAE;;;;;;;;;;;uCAY3B,OAAO,OAAO,KAAK,cAAc,MAAM,MAAM,GAC9C;;;;EAID,OAAO,mBAAmB,QAAQ,SAAS,SAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,IAAI,EAAE;;;;;;;;AAQpF;;;;;;;;;;;AAYA,SAAgB,uBACd,QACA,cACA;CACA,OAAO,eAAe,aAAa,MAAM,GAAG,YAAY;AAC1D;;;;;;;;;;;;;AAcA,SAAgB,aACd,QACA,cACA;CACA,OAAO,GAAG,uBACR,QACA,YACF,EAAE,MAAM,mBAAmB,MAAM;AACnC"}
|
|
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.
|
|
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": "
|
|
99
|
+
"gitHead": "1babfdc217eff1881035a335d23d26327fad6904"
|
|
100
100
|
}
|