@powerlines/schema 0.11.82 → 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 +121 -59
- package/dist/codegen.d.cts.map +1 -1
- package/dist/codegen.d.mts.map +1 -1
- package/dist/codegen.mjs +121 -59
- package/dist/codegen.mjs.map +1 -1
- package/package.json +5 -5
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,124 +115,184 @@ function generateParserCode(schema) {
|
|
|
114
115
|
...rootSchema.definitions,
|
|
115
116
|
...rootSchema.$defs
|
|
116
117
|
};
|
|
118
|
+
const tempCounter = {};
|
|
119
|
+
function nextTemp(prefix) {
|
|
120
|
+
const id = tempCounter[prefix] ?? 0;
|
|
121
|
+
tempCounter[prefix] = id + 1;
|
|
122
|
+
return `${prefix}${id > 0 ? `${id}` : ""}`;
|
|
123
|
+
}
|
|
117
124
|
/**
|
|
118
|
-
* Generates
|
|
119
|
-
* The expression has access to an in-scope mutable `errors` array.
|
|
125
|
+
* Generates inline parsing statements for a schema fragment.
|
|
120
126
|
*/
|
|
121
|
-
function
|
|
122
|
-
if (typeof fragment === "boolean") return fragment ? valueExpr :
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
function generateStatements(fragment, valueExpr, pathExpr, targetVar, errorsVar = "errors") {
|
|
128
|
+
if (typeof fragment === "boolean") return fragment ? [`${targetVar} = ${valueExpr};`] : [`${errorsVar}.push({ path: ${pathExpr}, message: "No value is allowed at this location" });`, `${targetVar} = ${valueExpr};`];
|
|
129
|
+
if ((0, _stryke_type_checks_is_set_string.isSetString)(fragment.$ref)) {
|
|
130
|
+
const refName = resolveLocalRefName(fragment.$ref);
|
|
131
|
+
if (refName && refName in definitions) return [`${targetVar} = ${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, ${errorsVar});`];
|
|
132
|
+
return [`${targetVar} = ${valueExpr};`];
|
|
133
|
+
}
|
|
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");
|
|
136
|
+
const lines = [`const ${valueVar} = ${valueExpr};`, `const ${pathVar} = ${pathExpr};`];
|
|
137
|
+
if (fragment.default !== void 0) {
|
|
138
|
+
lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(fragment.default)};`, `} else {`);
|
|
139
|
+
if (require_helpers.isSchemaNullable(fragment)) {
|
|
140
|
+
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
141
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
142
|
+
lines.push(` }`);
|
|
143
|
+
} else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
144
|
+
lines.push(`}`);
|
|
145
|
+
return lines;
|
|
128
146
|
}
|
|
129
|
-
|
|
147
|
+
lines.push(`if (${valueVar} === undefined) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "A value is required" });`, ` ${targetVar} = ${valueVar};`, `} else {`);
|
|
148
|
+
if (require_helpers.isSchemaNullable(fragment)) {
|
|
149
|
+
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
150
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
151
|
+
lines.push(` }`);
|
|
152
|
+
} else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
153
|
+
lines.push(`}`);
|
|
154
|
+
return lines;
|
|
130
155
|
}
|
|
131
156
|
/**
|
|
132
|
-
* Generates
|
|
133
|
-
* arrow function produced by {@link generateExpression}.
|
|
157
|
+
* Generates inline parsing statements assuming `value` is already defined.
|
|
134
158
|
*/
|
|
135
|
-
function
|
|
159
|
+
function generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
136
160
|
const lines = [];
|
|
137
|
-
const nullable = require_helpers.isSchemaNullable(view);
|
|
138
|
-
if (view.default !== void 0) lines.push(`if (value === undefined) { return ${JSON.stringify(view.default)}; }`);
|
|
139
|
-
else lines.push(`if (value === undefined) { errors.push({ path, message: "A value is required" }); return value; }`);
|
|
140
|
-
if (nullable) lines.push(`if (value === null) { return null; }`);
|
|
141
161
|
if (view.const !== void 0) {
|
|
142
162
|
const constValue = JSON.stringify(view.const);
|
|
143
|
-
lines.push(`if (JSON.stringify(
|
|
144
|
-
return lines
|
|
163
|
+
lines.push(`if (JSON.stringify(${valueVar}) !== ${constValue}) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected the constant value " + ${constValue} }); }`, `${targetVar} = ${constValue};`);
|
|
164
|
+
return lines;
|
|
145
165
|
}
|
|
146
166
|
if (Array.isArray(view.enum)) {
|
|
147
167
|
const enumValues = JSON.stringify(view.enum);
|
|
148
|
-
lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(
|
|
149
|
-
return lines
|
|
168
|
+
lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${valueVar}))) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected one of " + ${enumValues} }); }`, `${targetVar} = ${valueVar};`);
|
|
169
|
+
return lines;
|
|
150
170
|
}
|
|
151
171
|
if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
172
|
+
const branches = view.oneOf ?? view.anyOf ?? [];
|
|
173
|
+
const matchedVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Matched` : "matched");
|
|
174
|
+
lines.push(`let ${matchedVar} = false;`);
|
|
175
|
+
for (const branch of branches) {
|
|
176
|
+
const branchErrorsVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}BranchErrors` : "branchErrors");
|
|
177
|
+
const branchResultVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}BranchResult` : "branchResult");
|
|
178
|
+
lines.push(`if (!${matchedVar}) {`);
|
|
179
|
+
lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
|
|
180
|
+
lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
|
|
181
|
+
lines.push(` if (${branchErrorsVar}.length === 0) {`, ` ${targetVar} = ${branchResultVar};`, ` ${matchedVar} = true;`, ` }`, `}`);
|
|
182
|
+
}
|
|
183
|
+
lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
184
|
+
return lines;
|
|
155
185
|
}
|
|
156
186
|
if (Array.isArray(view.allOf)) {
|
|
157
187
|
const { allOf, ...rest } = view;
|
|
158
188
|
const merged = require_helpers.merge(rest, ...allOf);
|
|
159
|
-
lines.push(
|
|
160
|
-
return lines
|
|
189
|
+
lines.push(...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar));
|
|
190
|
+
return lines;
|
|
161
191
|
}
|
|
162
192
|
const declaredTypes = readDeclaredTypes(view);
|
|
163
193
|
switch (require_metadata.getPrimarySchemaType(view) ?? declaredTypes.find((type) => type !== "null") ?? (view.properties ? "object" : view.items ? "array" : void 0)) {
|
|
164
194
|
case "object":
|
|
165
|
-
lines.push(
|
|
195
|
+
lines.push(...generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar));
|
|
166
196
|
break;
|
|
167
197
|
case "array":
|
|
168
|
-
lines.push(
|
|
198
|
+
lines.push(...generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar));
|
|
169
199
|
break;
|
|
170
200
|
case "string":
|
|
171
|
-
lines.push(`if (typeof
|
|
201
|
+
lines.push(`if (typeof ${valueVar} === "string") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "number" || typeof ${valueVar} === "boolean") {`, ` ${targetVar} = String(${valueVar});`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a string value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
172
202
|
break;
|
|
173
203
|
case "integer":
|
|
174
|
-
lines.push(`if (typeof
|
|
204
|
+
lines.push(`if (typeof ${valueVar} === "number" && Number.isInteger(${valueVar})) {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "string" && ${valueVar}.trim() !== "" && Number.isInteger(Number(${valueVar}))) {`, ` ${targetVar} = Number(${valueVar});`, `} else if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar} ? 1 : 0;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an integer value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
175
205
|
break;
|
|
176
206
|
case "number":
|
|
177
|
-
lines.push(`if (typeof
|
|
207
|
+
lines.push(`if (typeof ${valueVar} === "number") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "string" && ${valueVar}.trim() !== "" && !Number.isNaN(Number(${valueVar}))) {`, ` ${targetVar} = Number(${valueVar});`, `} else if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar} ? 1 : 0;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a number value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
178
208
|
break;
|
|
179
209
|
case "boolean":
|
|
180
|
-
lines.push(`if (typeof
|
|
210
|
+
lines.push(`if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar};`, `} else if (${valueVar} === "true" || ${valueVar} === 1) {`, ` ${targetVar} = true;`, `} else if (${valueVar} === "false" || ${valueVar} === 0) {`, ` ${targetVar} = false;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a boolean value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
181
211
|
break;
|
|
182
212
|
case "null":
|
|
183
|
-
lines.push(`if (
|
|
213
|
+
lines.push(`if (${valueVar} === null) {`, ` ${targetVar} = null;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a null value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
184
214
|
break;
|
|
185
215
|
case void 0:
|
|
186
216
|
default:
|
|
187
|
-
lines.push(
|
|
217
|
+
lines.push(`${targetVar} = ${valueVar};`);
|
|
188
218
|
break;
|
|
189
219
|
}
|
|
190
|
-
return lines
|
|
220
|
+
return lines;
|
|
191
221
|
}
|
|
192
222
|
/**
|
|
193
223
|
* Generates the parsing statements for an `object` schema, applying property
|
|
194
224
|
* defaults and recursing into each declared property.
|
|
195
225
|
*/
|
|
196
|
-
function
|
|
226
|
+
function generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
197
227
|
const type = stringifyType(view);
|
|
198
|
-
const lines = [
|
|
228
|
+
const lines = [
|
|
229
|
+
`if (typeof ${valueVar} !== "object" || ${valueVar} === null || Array.isArray(${valueVar})) {`,
|
|
230
|
+
` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an object value" });`,
|
|
231
|
+
` ${targetVar} = ${valueVar};`,
|
|
232
|
+
`} else {`
|
|
233
|
+
];
|
|
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>`);
|
|
199
236
|
const properties = require_type_checks.isJsonSchemaObject(view) ? require_helpers.getPropertiesList(view) : [];
|
|
200
237
|
const propertyNames = /* @__PURE__ */ new Set();
|
|
201
238
|
for (const property of properties) {
|
|
202
239
|
const name = property.name;
|
|
203
240
|
propertyNames.add(name);
|
|
204
|
-
const accessor =
|
|
205
|
-
const propertyPath = childPath(
|
|
206
|
-
const
|
|
207
|
-
const missingBranch = property.default !== void 0 ?
|
|
208
|
-
lines.push(`if (${accessor} !== undefined) {`, `
|
|
241
|
+
const accessor = `${valueVar}[${JSON.stringify(name)}]`;
|
|
242
|
+
const propertyPath = childPath(pathVar, `.${name}`);
|
|
243
|
+
const propertyVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Property` : "property");
|
|
244
|
+
const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : ``;
|
|
245
|
+
lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
|
|
246
|
+
lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
|
|
247
|
+
lines.push(` ${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
|
|
248
|
+
if (missingBranch) lines.push(` } else { ${missingBranch} }`);
|
|
249
|
+
else lines.push(` }`);
|
|
209
250
|
}
|
|
210
251
|
const additional = view.additionalProperties;
|
|
211
252
|
if (require_type_checks.isJsonSchema(additional)) {
|
|
212
|
-
const
|
|
213
|
-
lines.push(`for (const key of Object.keys(
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
253
|
+
const additionalVar = nextTemp(type || view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(type || view.name)}Additional` : "additional");
|
|
254
|
+
lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
|
|
255
|
+
lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
|
|
256
|
+
lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
|
|
257
|
+
} else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
|
|
258
|
+
lines.push(`${targetVar} = ${resultVar};`, `}`);
|
|
259
|
+
return lines;
|
|
217
260
|
}
|
|
218
261
|
/**
|
|
219
262
|
* Generates the parsing statements for an `array` schema, recursing into each
|
|
220
263
|
* item (supporting both list and tuple `items`/`prefixItems` forms).
|
|
221
264
|
*/
|
|
222
|
-
function
|
|
223
|
-
const lines = [
|
|
265
|
+
function generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
266
|
+
const lines = [
|
|
267
|
+
`if (!Array.isArray(${valueVar})) {`,
|
|
268
|
+
` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an array value" });`,
|
|
269
|
+
` ${targetVar} = ${valueVar};`,
|
|
270
|
+
`} else {`
|
|
271
|
+
];
|
|
272
|
+
const resultVar = nextTemp(view.name ? `${(0, _stryke_string_format_camel_case.camelCase)(view.name)}Array` : "array");
|
|
273
|
+
lines.push(` const ${resultVar}: unknown[] = [];`);
|
|
224
274
|
const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
|
|
225
275
|
if (tupleItems) {
|
|
226
276
|
const listItems = !Array.isArray(view.items) ? view.items : void 0;
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
277
|
+
lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
|
|
278
|
+
tupleItems.forEach((item, index) => {
|
|
279
|
+
lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
|
|
280
|
+
lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
|
|
281
|
+
lines.push("}");
|
|
282
|
+
});
|
|
283
|
+
if (listItems) {
|
|
284
|
+
lines.push("else {");
|
|
285
|
+
lines.push(...generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
|
|
286
|
+
lines.push("}");
|
|
287
|
+
} else lines.push("else { itemResult = item; }");
|
|
288
|
+
lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
|
|
289
|
+
return lines;
|
|
231
290
|
}
|
|
232
|
-
const
|
|
233
|
-
lines.push(`
|
|
234
|
-
|
|
291
|
+
const itemSchema = view.items ?? true;
|
|
292
|
+
lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
|
|
293
|
+
lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
|
|
294
|
+
lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
|
|
295
|
+
return lines;
|
|
235
296
|
}
|
|
236
297
|
return `/**
|
|
237
298
|
* Error thrown when an input value cannot be parsed into the type described by the JSON Schema.
|
|
@@ -251,7 +312,7 @@ export class ParserError extends Error {
|
|
|
251
312
|
}
|
|
252
313
|
}
|
|
253
314
|
|
|
254
|
-
${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\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")}
|
|
255
316
|
|
|
256
317
|
/**
|
|
257
318
|
* Parses an input value into the type described by the JSON Schema.
|
|
@@ -262,10 +323,11 @@ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserId
|
|
|
262
323
|
* @param value - The input value to parse.
|
|
263
324
|
* @returns The parsed value conforming to the schema.
|
|
264
325
|
*/
|
|
265
|
-
export function parse(value: unknown)${schema.name ? `: ${stringifyType(schema)}` : ""} {
|
|
326
|
+
export function parse(value: Record<string, unknown>)${schema.name ? `: ${stringifyType(schema)}` : ""} {
|
|
266
327
|
const errors: { path: string; message: string }[] = [];
|
|
267
328
|
|
|
268
|
-
|
|
329
|
+
let result;
|
|
330
|
+
${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
|
|
269
331
|
|
|
270
332
|
if (errors.length > 0) {
|
|
271
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,124 +113,184 @@ function generateParserCode(schema) {
|
|
|
112
113
|
...rootSchema.definitions,
|
|
113
114
|
...rootSchema.$defs
|
|
114
115
|
};
|
|
116
|
+
const tempCounter = {};
|
|
117
|
+
function nextTemp(prefix) {
|
|
118
|
+
const id = tempCounter[prefix] ?? 0;
|
|
119
|
+
tempCounter[prefix] = id + 1;
|
|
120
|
+
return `${prefix}${id > 0 ? `${id}` : ""}`;
|
|
121
|
+
}
|
|
115
122
|
/**
|
|
116
|
-
* Generates
|
|
117
|
-
* The expression has access to an in-scope mutable `errors` array.
|
|
123
|
+
* Generates inline parsing statements for a schema fragment.
|
|
118
124
|
*/
|
|
119
|
-
function
|
|
120
|
-
if (typeof fragment === "boolean") return fragment ? valueExpr :
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
function generateStatements(fragment, valueExpr, pathExpr, targetVar, errorsVar = "errors") {
|
|
126
|
+
if (typeof fragment === "boolean") return fragment ? [`${targetVar} = ${valueExpr};`] : [`${errorsVar}.push({ path: ${pathExpr}, message: "No value is allowed at this location" });`, `${targetVar} = ${valueExpr};`];
|
|
127
|
+
if (isSetString$1(fragment.$ref)) {
|
|
128
|
+
const refName = resolveLocalRefName(fragment.$ref);
|
|
129
|
+
if (refName && refName in definitions) return [`${targetVar} = ${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, ${errorsVar});`];
|
|
130
|
+
return [`${targetVar} = ${valueExpr};`];
|
|
131
|
+
}
|
|
132
|
+
const valueVar = nextTemp(fragment.name ? `${camelCase(fragment.name)}Value` : "value");
|
|
133
|
+
const pathVar = nextTemp(fragment.name ? `${camelCase(fragment.name)}Path` : "path");
|
|
134
|
+
const lines = [`const ${valueVar} = ${valueExpr};`, `const ${pathVar} = ${pathExpr};`];
|
|
135
|
+
if (fragment.default !== void 0) {
|
|
136
|
+
lines.push(`if (${valueVar} === undefined) {`, ` ${targetVar} = ${JSON.stringify(fragment.default)};`, `} else {`);
|
|
137
|
+
if (isSchemaNullable(fragment)) {
|
|
138
|
+
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
139
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
140
|
+
lines.push(` }`);
|
|
141
|
+
} else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
142
|
+
lines.push(`}`);
|
|
143
|
+
return lines;
|
|
126
144
|
}
|
|
127
|
-
|
|
145
|
+
lines.push(`if (${valueVar} === undefined) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "A value is required" });`, ` ${targetVar} = ${valueVar};`, `} else {`);
|
|
146
|
+
if (isSchemaNullable(fragment)) {
|
|
147
|
+
lines.push(` if (${valueVar} === null) {`, ` ${targetVar} = null;`, ` } else {`);
|
|
148
|
+
lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
149
|
+
lines.push(` }`);
|
|
150
|
+
} else lines.push(...generateCoreStatements(fragment, valueVar, pathVar, targetVar, errorsVar));
|
|
151
|
+
lines.push(`}`);
|
|
152
|
+
return lines;
|
|
128
153
|
}
|
|
129
154
|
/**
|
|
130
|
-
* Generates
|
|
131
|
-
* arrow function produced by {@link generateExpression}.
|
|
155
|
+
* Generates inline parsing statements assuming `value` is already defined.
|
|
132
156
|
*/
|
|
133
|
-
function
|
|
157
|
+
function generateCoreStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
134
158
|
const lines = [];
|
|
135
|
-
const nullable = isSchemaNullable(view);
|
|
136
|
-
if (view.default !== void 0) lines.push(`if (value === undefined) { return ${JSON.stringify(view.default)}; }`);
|
|
137
|
-
else lines.push(`if (value === undefined) { errors.push({ path, message: "A value is required" }); return value; }`);
|
|
138
|
-
if (nullable) lines.push(`if (value === null) { return null; }`);
|
|
139
159
|
if (view.const !== void 0) {
|
|
140
160
|
const constValue = JSON.stringify(view.const);
|
|
141
|
-
lines.push(`if (JSON.stringify(
|
|
142
|
-
return lines
|
|
161
|
+
lines.push(`if (JSON.stringify(${valueVar}) !== ${constValue}) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected the constant value " + ${constValue} }); }`, `${targetVar} = ${constValue};`);
|
|
162
|
+
return lines;
|
|
143
163
|
}
|
|
144
164
|
if (Array.isArray(view.enum)) {
|
|
145
165
|
const enumValues = JSON.stringify(view.enum);
|
|
146
|
-
lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(
|
|
147
|
-
return lines
|
|
166
|
+
lines.push(`if (!${enumValues}.some(allowed => JSON.stringify(allowed) === JSON.stringify(${valueVar}))) { ${errorsVar}.push({ path: ${pathVar}, message: "Expected one of " + ${enumValues} }); }`, `${targetVar} = ${valueVar};`);
|
|
167
|
+
return lines;
|
|
148
168
|
}
|
|
149
169
|
if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
170
|
+
const branches = view.oneOf ?? view.anyOf ?? [];
|
|
171
|
+
const matchedVar = nextTemp(view.name ? `${camelCase(view.name)}Matched` : "matched");
|
|
172
|
+
lines.push(`let ${matchedVar} = false;`);
|
|
173
|
+
for (const branch of branches) {
|
|
174
|
+
const branchErrorsVar = nextTemp(view.name ? `${camelCase(view.name)}BranchErrors` : "branchErrors");
|
|
175
|
+
const branchResultVar = nextTemp(view.name ? `${camelCase(view.name)}BranchResult` : "branchResult");
|
|
176
|
+
lines.push(`if (!${matchedVar}) {`);
|
|
177
|
+
lines.push(` const ${branchErrorsVar}: { path: string; message: string }[] = [];`, ` let ${branchResultVar};`);
|
|
178
|
+
lines.push(...generateStatements(branch, valueVar, pathVar, branchResultVar, branchErrorsVar));
|
|
179
|
+
lines.push(` if (${branchErrorsVar}.length === 0) {`, ` ${targetVar} = ${branchResultVar};`, ` ${matchedVar} = true;`, ` }`, `}`);
|
|
180
|
+
}
|
|
181
|
+
lines.push(`if (!${matchedVar}) {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Value does not match any of the allowed schemas" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
182
|
+
return lines;
|
|
153
183
|
}
|
|
154
184
|
if (Array.isArray(view.allOf)) {
|
|
155
185
|
const { allOf, ...rest } = view;
|
|
156
186
|
const merged = merge(rest, ...allOf);
|
|
157
|
-
lines.push(
|
|
158
|
-
return lines
|
|
187
|
+
lines.push(...generateStatements(merged, valueVar, pathVar, targetVar, errorsVar));
|
|
188
|
+
return lines;
|
|
159
189
|
}
|
|
160
190
|
const declaredTypes = readDeclaredTypes(view);
|
|
161
191
|
switch (getPrimarySchemaType(view) ?? declaredTypes.find((type) => type !== "null") ?? (view.properties ? "object" : view.items ? "array" : void 0)) {
|
|
162
192
|
case "object":
|
|
163
|
-
lines.push(
|
|
193
|
+
lines.push(...generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar));
|
|
164
194
|
break;
|
|
165
195
|
case "array":
|
|
166
|
-
lines.push(
|
|
196
|
+
lines.push(...generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar));
|
|
167
197
|
break;
|
|
168
198
|
case "string":
|
|
169
|
-
lines.push(`if (typeof
|
|
199
|
+
lines.push(`if (typeof ${valueVar} === "string") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "number" || typeof ${valueVar} === "boolean") {`, ` ${targetVar} = String(${valueVar});`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a string value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
170
200
|
break;
|
|
171
201
|
case "integer":
|
|
172
|
-
lines.push(`if (typeof
|
|
202
|
+
lines.push(`if (typeof ${valueVar} === "number" && Number.isInteger(${valueVar})) {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "string" && ${valueVar}.trim() !== "" && Number.isInteger(Number(${valueVar}))) {`, ` ${targetVar} = Number(${valueVar});`, `} else if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar} ? 1 : 0;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an integer value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
173
203
|
break;
|
|
174
204
|
case "number":
|
|
175
|
-
lines.push(`if (typeof
|
|
205
|
+
lines.push(`if (typeof ${valueVar} === "number") {`, ` ${targetVar} = ${valueVar};`, `} else if (typeof ${valueVar} === "string" && ${valueVar}.trim() !== "" && !Number.isNaN(Number(${valueVar}))) {`, ` ${targetVar} = Number(${valueVar});`, `} else if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar} ? 1 : 0;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a number value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
176
206
|
break;
|
|
177
207
|
case "boolean":
|
|
178
|
-
lines.push(`if (typeof
|
|
208
|
+
lines.push(`if (typeof ${valueVar} === "boolean") {`, ` ${targetVar} = ${valueVar};`, `} else if (${valueVar} === "true" || ${valueVar} === 1) {`, ` ${targetVar} = true;`, `} else if (${valueVar} === "false" || ${valueVar} === 0) {`, ` ${targetVar} = false;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a boolean value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
179
209
|
break;
|
|
180
210
|
case "null":
|
|
181
|
-
lines.push(`if (
|
|
211
|
+
lines.push(`if (${valueVar} === null) {`, ` ${targetVar} = null;`, `} else {`, ` ${errorsVar}.push({ path: ${pathVar}, message: "Expected a null value" });`, ` ${targetVar} = ${valueVar};`, `}`);
|
|
182
212
|
break;
|
|
183
213
|
case void 0:
|
|
184
214
|
default:
|
|
185
|
-
lines.push(
|
|
215
|
+
lines.push(`${targetVar} = ${valueVar};`);
|
|
186
216
|
break;
|
|
187
217
|
}
|
|
188
|
-
return lines
|
|
218
|
+
return lines;
|
|
189
219
|
}
|
|
190
220
|
/**
|
|
191
221
|
* Generates the parsing statements for an `object` schema, applying property
|
|
192
222
|
* defaults and recursing into each declared property.
|
|
193
223
|
*/
|
|
194
|
-
function
|
|
224
|
+
function generateObjectStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
195
225
|
const type = stringifyType(view);
|
|
196
|
-
const lines = [
|
|
226
|
+
const lines = [
|
|
227
|
+
`if (typeof ${valueVar} !== "object" || ${valueVar} === null || Array.isArray(${valueVar})) {`,
|
|
228
|
+
` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an object value" });`,
|
|
229
|
+
` ${targetVar} = ${valueVar};`,
|
|
230
|
+
`} else {`
|
|
231
|
+
];
|
|
232
|
+
const resultVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Schema` : "schema");
|
|
233
|
+
lines.push(` const ${resultVar} = {} as Record<string, any>`);
|
|
197
234
|
const properties = isJsonSchemaObject(view) ? getPropertiesList(view) : [];
|
|
198
235
|
const propertyNames = /* @__PURE__ */ new Set();
|
|
199
236
|
for (const property of properties) {
|
|
200
237
|
const name = property.name;
|
|
201
238
|
propertyNames.add(name);
|
|
202
|
-
const accessor =
|
|
203
|
-
const propertyPath = childPath(
|
|
204
|
-
const
|
|
205
|
-
const missingBranch = property.default !== void 0 ?
|
|
206
|
-
lines.push(`if (${accessor} !== undefined) {`, `
|
|
239
|
+
const accessor = `${valueVar}[${JSON.stringify(name)}]`;
|
|
240
|
+
const propertyPath = childPath(pathVar, `.${name}`);
|
|
241
|
+
const propertyVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Property` : "property");
|
|
242
|
+
const missingBranch = property.default !== void 0 ? `${resultVar}[${JSON.stringify(name)}] = ${JSON.stringify(property.default)};` : property.required ? `errors.push({ path: ${propertyPath}, message: "Required property is missing" });` : ``;
|
|
243
|
+
lines.push(` if (${accessor} !== undefined) {`, ` let ${propertyVar};`);
|
|
244
|
+
lines.push(...generateStatements(property, accessor, propertyPath, propertyVar, errorsVar));
|
|
245
|
+
lines.push(` ${resultVar}[${JSON.stringify(name)}] = ${propertyVar};`);
|
|
246
|
+
if (missingBranch) lines.push(` } else { ${missingBranch} }`);
|
|
247
|
+
else lines.push(` }`);
|
|
207
248
|
}
|
|
208
249
|
const additional = view.additionalProperties;
|
|
209
250
|
if (isJsonSchema(additional)) {
|
|
210
|
-
const
|
|
211
|
-
lines.push(`for (const key of Object.keys(
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
251
|
+
const additionalVar = nextTemp(type || view.name ? `${camelCase(type || view.name)}Additional` : "additional");
|
|
252
|
+
lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` let ${additionalVar};`);
|
|
253
|
+
lines.push(...generateStatements(additional, `${valueVar}[key]`, `${pathVar} + "." + key`, additionalVar, errorsVar));
|
|
254
|
+
lines.push(`${resultVar}[key] = ${additionalVar};`, `}`);
|
|
255
|
+
} else if (additional !== false) lines.push(` for (const key of Object.keys(${valueVar})) {`, ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`, ` ${resultVar}[key] = ${valueVar}[key];`, `}`);
|
|
256
|
+
lines.push(`${targetVar} = ${resultVar};`, `}`);
|
|
257
|
+
return lines;
|
|
215
258
|
}
|
|
216
259
|
/**
|
|
217
260
|
* Generates the parsing statements for an `array` schema, recursing into each
|
|
218
261
|
* item (supporting both list and tuple `items`/`prefixItems` forms).
|
|
219
262
|
*/
|
|
220
|
-
function
|
|
221
|
-
const lines = [
|
|
263
|
+
function generateArrayStatements(view, valueVar, pathVar, targetVar, errorsVar) {
|
|
264
|
+
const lines = [
|
|
265
|
+
`if (!Array.isArray(${valueVar})) {`,
|
|
266
|
+
` ${errorsVar}.push({ path: ${pathVar}, message: "Expected an array value" });`,
|
|
267
|
+
` ${targetVar} = ${valueVar};`,
|
|
268
|
+
`} else {`
|
|
269
|
+
];
|
|
270
|
+
const resultVar = nextTemp(view.name ? `${camelCase(view.name)}Array` : "array");
|
|
271
|
+
lines.push(` const ${resultVar}: unknown[] = [];`);
|
|
222
272
|
const tupleItems = view.prefixItems ?? (Array.isArray(view.items) ? view.items : void 0);
|
|
223
273
|
if (tupleItems) {
|
|
224
274
|
const listItems = !Array.isArray(view.items) ? view.items : void 0;
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
275
|
+
lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
|
|
276
|
+
tupleItems.forEach((item, index) => {
|
|
277
|
+
lines.push(`${index === 0 ? " if" : " else if"} (index === ${index}) {`);
|
|
278
|
+
lines.push(...generateStatements(item, "item", childPath(pathVar, `[${index}]`), "itemResult", errorsVar));
|
|
279
|
+
lines.push("}");
|
|
280
|
+
});
|
|
281
|
+
if (listItems) {
|
|
282
|
+
lines.push("else {");
|
|
283
|
+
lines.push(...generateStatements(listItems, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
|
|
284
|
+
lines.push("}");
|
|
285
|
+
} else lines.push("else { itemResult = item; }");
|
|
286
|
+
lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
|
|
287
|
+
return lines;
|
|
229
288
|
}
|
|
230
|
-
const
|
|
231
|
-
lines.push(`
|
|
232
|
-
|
|
289
|
+
const itemSchema = view.items ?? true;
|
|
290
|
+
lines.push(` for (let index = 0; index < ${valueVar}.length; index += 1) {`, ` const item = ${valueVar}[index];`, ` let itemResult;`);
|
|
291
|
+
lines.push(...generateStatements(itemSchema, "item", `${pathVar} + "[" + index + "]"`, "itemResult", errorsVar));
|
|
292
|
+
lines.push(` ${resultVar}.push(itemResult);`, ` }`, ` ${targetVar} = ${resultVar};`, `}`);
|
|
293
|
+
return lines;
|
|
233
294
|
}
|
|
234
295
|
return `/**
|
|
235
296
|
* Error thrown when an input value cannot be parsed into the type described by the JSON Schema.
|
|
@@ -249,7 +310,7 @@ export class ParserError extends Error {
|
|
|
249
310
|
}
|
|
250
311
|
}
|
|
251
312
|
|
|
252
|
-
${Object.entries(definitions).map(([name, definition]) => `function ${toParserIdentifier(name)}(value, path, errors) {\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")}
|
|
253
314
|
|
|
254
315
|
/**
|
|
255
316
|
* Parses an input value into the type described by the JSON Schema.
|
|
@@ -260,10 +321,11 @@ ${Object.entries(definitions).map(([name, definition]) => `function ${toParserId
|
|
|
260
321
|
* @param value - The input value to parse.
|
|
261
322
|
* @returns The parsed value conforming to the schema.
|
|
262
323
|
*/
|
|
263
|
-
export function parse(value: unknown)${schema.name ? `: ${stringifyType(schema)}` : ""} {
|
|
324
|
+
export function parse(value: Record<string, unknown>)${schema.name ? `: ${stringifyType(schema)}` : ""} {
|
|
264
325
|
const errors: { path: string; message: string }[] = [];
|
|
265
326
|
|
|
266
|
-
|
|
327
|
+
let result;
|
|
328
|
+
${generateStatements(schema, "value", "\"$\"", "result", "errors").join("\n")}
|
|
267
329
|
|
|
268
330
|
if (errors.length > 0) {
|
|
269
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 /**\n * Generates a JavaScript expression that parses `valueExpr` against `fragment`.\n * The expression has access to an in-scope mutable `errors` array.\n */\n function generateExpression(\n fragment: JsonSchema,\n valueExpr: string,\n pathExpr: string\n ): string {\n if (typeof fragment === \"boolean\") {\n return fragment\n ? valueExpr\n : `((value, path) => { errors.push({ path, message: \"No value is allowed at this location\" }); return value; })(${valueExpr}, ${pathExpr})`;\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 `${toParserIdentifier(refName)}(${valueExpr}, ${pathExpr}, errors)`;\n }\n\n // Unknown / external reference — pass the value through unchanged.\n return valueExpr;\n }\n\n return `((value, path) => {\\n${generateBody(view)}\\n})(${valueExpr}, ${pathExpr})`;\n }\n\n /**\n * Generates the body statements (including a terminating `return`) for the\n * arrow function produced by {@link generateExpression}.\n */\n function generateBody(view: JsonSchemaObjectView): string {\n const lines: string[] = [];\n const nullable = isSchemaNullable(view);\n\n if (view.default !== undefined) {\n lines.push(\n `if (value === undefined) { return ${JSON.stringify(view.default)}; }`\n );\n } else {\n lines.push(\n `if (value === undefined) { errors.push({ path, message: \"A value is required\" }); return value; }`\n );\n }\n\n if (nullable) {\n lines.push(`if (value === null) { return null; }`);\n }\n\n if (view.const !== undefined) {\n const constValue = JSON.stringify(view.const);\n lines.push(\n `if (JSON.stringify(value) !== ${JSON.stringify(constValue)}) { errors.push({ path, message: \"Expected the constant value \" + ${JSON.stringify(constValue)} }); }`,\n `return ${constValue};`\n );\n\n return lines.join(\"\\n\");\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(value))) { errors.push({ path, message: \"Expected one of \" + ${JSON.stringify(enumValues)} }); }`,\n `return value;`\n );\n\n return lines.join(\"\\n\");\n }\n\n if (Array.isArray(view.oneOf) || Array.isArray(view.anyOf)) {\n const branches = view.oneOf ?? view.anyOf ?? [];\n const branchFns = branches\n .map(\n branch =>\n `(value, path, errors) => (${generateExpression(branch, \"value\", \"path\")})`\n )\n .join(\",\\n\");\n\n lines.push(\n `const branches = [\\n${branchFns}\\n];`,\n `for (const branch of branches) {`,\n ` const branchErrors = [];`,\n ` const branchResult = branch(value, path, branchErrors);`,\n ` if (branchErrors.length === 0) { return branchResult; }`,\n `}`,\n `errors.push({ path, message: \"Value does not match any of the allowed schemas\" });`,\n `return value;`\n );\n\n return lines.join(\"\\n\");\n }\n\n if (Array.isArray(view.allOf)) {\n const { allOf, ...rest } = view;\n const merged = merge(rest, ...allOf);\n lines.push(`return ${generateExpression(merged, \"value\", \"path\")};`);\n\n return lines.join(\"\\n\");\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(generateObjectBody(view));\n break;\n case \"array\":\n lines.push(generateArrayBody(view));\n break;\n case \"string\":\n lines.push(\n `if (typeof value === \"string\") { return value; }`,\n `if (typeof value === \"number\" || typeof value === \"boolean\") { return String(value); }`,\n `errors.push({ path, message: \"Expected a string value\" });`,\n `return value;`\n );\n break;\n case \"integer\":\n lines.push(\n `if (typeof value === \"number\" && Number.isInteger(value)) { return value; }`,\n `if (typeof value === \"string\" && value.trim() !== \"\" && Number.isInteger(Number(value))) { return Number(value); }`,\n `if (typeof value === \"boolean\") { return value ? 1 : 0; }`,\n `errors.push({ path, message: \"Expected an integer value\" });`,\n `return value;`\n );\n break;\n case \"number\":\n lines.push(\n `if (typeof value === \"number\") { return value; }`,\n `if (typeof value === \"string\" && value.trim() !== \"\" && !Number.isNaN(Number(value))) { return Number(value); }`,\n `if (typeof value === \"boolean\") { return value ? 1 : 0; }`,\n `errors.push({ path, message: \"Expected a number value\" });`,\n `return value;`\n );\n break;\n case \"boolean\":\n lines.push(\n `if (typeof value === \"boolean\") { return value; }`,\n `if (value === \"true\" || value === 1) { return true; }`,\n `if (value === \"false\" || value === 0) { return false; }`,\n `errors.push({ path, message: \"Expected a boolean value\" });`,\n `return value;`\n );\n break;\n case \"null\":\n lines.push(\n `if (value === null) { return null; }`,\n `errors.push({ path, message: \"Expected a null value\" });`,\n `return value;`\n );\n break;\n case undefined:\n default:\n lines.push(`return value;`);\n break;\n }\n\n return lines.join(\"\\n\");\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 generateObjectBody(view: JsonSchemaObjectView): string {\n const type = stringifyType(view);\n\n const lines: string[] = [\n `if (typeof value !== \"object\" || value === null || Array.isArray(value)) { errors.push({ path, message: \"Expected an object value\" }); return value; }`,\n `const result = {}${type ? ` as ${type}` : \"\"};`\n ];\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 = `value[${JSON.stringify(name)}]`;\n const propertyPath = childPath(\"path\", `.${name}`);\n const propertyExpression = generateExpression(\n property,\n accessor,\n propertyPath\n );\n\n const missingBranch =\n property.default !== undefined\n ? `result[${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 ` result[${JSON.stringify(name)}] = ${propertyExpression};`,\n `}${missingBranch ? ` else { ${missingBranch} }` : ``}`\n );\n }\n\n const additional = view.additionalProperties;\n if (isJsonSchema(additional)) {\n const additionalExpression = generateExpression(\n additional,\n `value[key]`,\n `path + \".\" + key`\n );\n\n lines.push(\n `for (const key of Object.keys(value)) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` result[key] = ${additionalExpression};`,\n `}`\n );\n } else if (additional !== false) {\n lines.push(\n `for (const key of Object.keys(value)) {`,\n ` if (${JSON.stringify([...propertyNames])}.includes(key)) { continue; }`,\n ` result[key] = value[key];`,\n `}`\n );\n }\n\n lines.push(`return result;`);\n\n return lines.join(\"\\n\");\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 generateArrayBody(view: JsonSchemaObjectView): string {\n const lines: string[] = [\n `if (!Array.isArray(value)) { errors.push({ path, message: \"Expected an array value\" }); return value; }`\n ];\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 const itemExpressions = tupleItems.map(\n (item, index) =>\n `index === ${index} ? (${generateExpression(item, \"item\", childPath(\"path\", `[${index}]`))})`\n );\n const fallbackExpression = listItems\n ? generateExpression(listItems, \"item\", `path + \"[\" + index + \"]\"`)\n : \"item\";\n\n lines.push(\n `return value.map((item, index) => ${itemExpressions.join(\" : \")}${\n itemExpressions.length > 0 ? \" : \" : \"\"\n }${fallbackExpression});`\n );\n\n return lines.join(\"\\n\");\n }\n\n const itemSchema = (view.items ?? true) as JsonSchema;\n const itemExpression = generateExpression(\n itemSchema,\n \"item\",\n `path + \"[\" + index + \"]\"`\n );\n\n lines.push(`return value.map((item, index) => ${itemExpression});`);\n\n return lines.join(\"\\n\");\n }\n\n const parserFunctions = Object.entries(definitions).map(\n ([name, definition]) =>\n `function ${toParserIdentifier(name)}(value, path, errors) {\\n return ${generateExpression(\n definition,\n \"value\",\n \"path\"\n )};\\n}`\n );\n\n return `/**\n * Error thrown when an input value cannot be parsed into the type described by the JSON Schema.\n */\nexport class ParserError extends Error {\n public override name = \"ParserError\";\n\n public errors: { path: string; message: string }[];\n\n public constructor(errors: { path: string; message: string }[]) {\n super(\n \"Failed to parse the provided value against the JSON Schema:\\\\n\" +\n errors.map(error => \" - \" + error.path + \": \" + error.message).join(\"\\\\n\")\n );\n\n this.errors = errors;\n }\n}\n\n${parserFunctions.join(\"\\n\\n\")}\n\n/**\n * Parses an input value into the type described by the JSON Schema.\n *\n * @remarks\n * The parser applies default values for missing properties, coerces primitive values to the declared type, and throws a {@link ParserError} (containing a detailed list of validation errors) when the value cannot be converted into a valid result.\n *\n * @param value - The input value to parse.\n * @returns The parsed value conforming to the schema.\n */\nexport function parse(value: unknown)${\n schema.name ? `: ${stringifyType(schema)}` : \"\"\n } {\n const errors: { path: string; message: string }[] = [];\n\n const result = ${generateExpression(schema, \"value\", '\"$\"')};\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.
|
|
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": [
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"typings": "dist/index.d.mts",
|
|
60
60
|
"files": ["dist"],
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@powerlines/core": "^0.48.
|
|
63
|
-
"@powerlines/deepkit": "^0.9.
|
|
64
|
-
"@powerlines/unplugin": "^0.0.
|
|
62
|
+
"@powerlines/core": "^0.48.34",
|
|
63
|
+
"@powerlines/deepkit": "^0.9.66",
|
|
64
|
+
"@powerlines/unplugin": "^0.0.82",
|
|
65
65
|
"@standard-schema/spec": "^1.1.0",
|
|
66
66
|
"@stryke/convert": "^0.7.13",
|
|
67
67
|
"@stryke/hash": "^0.13.36",
|
|
@@ -96,5 +96,5 @@
|
|
|
96
96
|
"zod": { "optional": true }
|
|
97
97
|
},
|
|
98
98
|
"publishConfig": { "access": "public" },
|
|
99
|
-
"gitHead": "
|
|
99
|
+
"gitHead": "1babfdc217eff1881035a335d23d26327fad6904"
|
|
100
100
|
}
|