@revisium/schema-toolkit 0.16.5 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-JHMO5NLL.js → chunk-6EAIJMZV.js} +212 -18
- package/dist/chunk-6EAIJMZV.js.map +1 -0
- package/dist/chunk-G6ZKEVVU.cjs +4 -0
- package/dist/chunk-G6ZKEVVU.cjs.map +1 -0
- package/dist/chunk-NY3H6C7K.js +3 -0
- package/dist/chunk-NY3H6C7K.js.map +1 -0
- package/dist/{chunk-YGTMLR3D.js → chunk-R4CFU33U.js} +2 -2
- package/dist/{chunk-YGTMLR3D.js.map → chunk-R4CFU33U.js.map} +1 -1
- package/dist/{chunk-7XIWS4W6.js → chunk-RTBMPBPC.js} +35 -2
- package/dist/chunk-RTBMPBPC.js.map +1 -0
- package/dist/{chunk-JJ2KGTZX.cjs → chunk-VGADCIBG.cjs} +2 -2
- package/dist/{chunk-JJ2KGTZX.cjs.map → chunk-VGADCIBG.cjs.map} +1 -1
- package/dist/{chunk-I6ZH7HZ7.cjs → chunk-YRKXZTRZ.cjs} +265 -64
- package/dist/chunk-YRKXZTRZ.cjs.map +1 -0
- package/dist/{chunk-HLGT7PCU.cjs → chunk-ZG7QX4I3.cjs} +35 -2
- package/dist/chunk-ZG7QX4I3.cjs.map +1 -0
- package/dist/core/index.cjs +57 -57
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +1 -1
- package/dist/index.cjs +189 -160
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -3
- package/dist/mocks/index.cjs +18 -17
- package/dist/mocks/index.js +2 -1
- package/dist/model/index.cjs +68 -39
- package/dist/model/index.d.cts +78 -4
- package/dist/model/index.d.ts +78 -4
- package/dist/model/index.js +3 -2
- package/dist/{types-bBnnfNxC.d.ts → types-6S07rMdY.d.ts} +1 -0
- package/dist/{types-BUiNI0oL.d.cts → types-DHlnrQKG.d.cts} +1 -0
- package/package.json +1 -1
- package/dist/chunk-7XIWS4W6.js.map +0 -1
- package/dist/chunk-HLGT7PCU.cjs.map +0 -1
- package/dist/chunk-I6ZH7HZ7.cjs.map +0 -1
- package/dist/chunk-JHMO5NLL.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { AbstractBasePath, ParsedFormula, createRefNode, createObjectNode, createArrayNode, createStringNode, createNumberNode, createBooleanNode, makeAutoObservable, observable, makeObservable, runInAction, PatchBuilder, SchemaSerializer, FormulaDependencyIndex, createSchemaTree, FormulaSerializer, validateSchema, validateFormulas } from './chunk-
|
|
1
|
+
import { AbstractBasePath, ParsedFormula, createRefNode, createObjectNode, createArrayNode, createStringNode, createNumberNode, createBooleanNode, makeAutoObservable, observable, makeObservable, runInAction, PatchBuilder, SchemaSerializer, FormulaDependencyIndex, createSchemaTree, FormulaSerializer, validateSchema, validateFormulas } from './chunk-RTBMPBPC.js';
|
|
2
|
+
import { obj, ref } from './chunk-R4CFU33U.js';
|
|
2
3
|
import { nanoid } from 'nanoid';
|
|
3
4
|
|
|
4
5
|
var SchemaParser = class {
|
|
@@ -57,7 +58,7 @@ var SchemaParser = class {
|
|
|
57
58
|
throw new Error(`Unknown schema type: ${schemaWithType.type}`);
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
|
-
parseObject(schema, name,
|
|
61
|
+
parseObject(schema, name, ref2) {
|
|
61
62
|
const children = [];
|
|
62
63
|
for (const propName of Object.keys(schema.properties).sort((a, b) => a.localeCompare(b))) {
|
|
63
64
|
const propSchema = schema.properties[propName];
|
|
@@ -67,42 +68,42 @@ var SchemaParser = class {
|
|
|
67
68
|
}
|
|
68
69
|
return createObjectNode(nanoid(), name, children, {
|
|
69
70
|
metadata: this.extractMetadata(schema),
|
|
70
|
-
ref
|
|
71
|
+
ref: ref2
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
|
-
parseArray(schema, name,
|
|
74
|
+
parseArray(schema, name, ref2) {
|
|
74
75
|
const items = this.parseNode(schema.items, "items");
|
|
75
76
|
return createArrayNode(nanoid(), name, items, {
|
|
76
77
|
metadata: this.extractMetadata(schema),
|
|
77
|
-
ref
|
|
78
|
+
ref: ref2
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
|
-
parseString(schema, name,
|
|
81
|
+
parseString(schema, name, ref2) {
|
|
81
82
|
const nodeId = nanoid();
|
|
82
83
|
this.collectFormula(nodeId, schema["x-formula"]);
|
|
83
84
|
return createStringNode(nodeId, name, {
|
|
84
85
|
defaultValue: schema.default,
|
|
85
86
|
foreignKey: schema.foreignKey,
|
|
86
87
|
metadata: this.extractMetadata(schema),
|
|
87
|
-
ref
|
|
88
|
+
ref: ref2
|
|
88
89
|
});
|
|
89
90
|
}
|
|
90
|
-
parseNumber(schema, name,
|
|
91
|
+
parseNumber(schema, name, ref2) {
|
|
91
92
|
const nodeId = nanoid();
|
|
92
93
|
this.collectFormula(nodeId, schema["x-formula"]);
|
|
93
94
|
return createNumberNode(nodeId, name, {
|
|
94
95
|
defaultValue: schema.default,
|
|
95
96
|
metadata: this.extractMetadata(schema),
|
|
96
|
-
ref
|
|
97
|
+
ref: ref2
|
|
97
98
|
});
|
|
98
99
|
}
|
|
99
|
-
parseBoolean(schema, name,
|
|
100
|
+
parseBoolean(schema, name, ref2) {
|
|
100
101
|
const nodeId = nanoid();
|
|
101
102
|
this.collectFormula(nodeId, schema["x-formula"]);
|
|
102
103
|
return createBooleanNode(nodeId, name, {
|
|
103
104
|
defaultValue: schema.default,
|
|
104
105
|
metadata: this.extractMetadata(schema),
|
|
105
|
-
ref
|
|
106
|
+
ref: ref2
|
|
106
107
|
});
|
|
107
108
|
}
|
|
108
109
|
extractMetadata(schema) {
|
|
@@ -240,6 +241,193 @@ function generateDefaultValue(schema, options = {}) {
|
|
|
240
241
|
}
|
|
241
242
|
return generateDefaultValueInternal(schema, options);
|
|
242
243
|
}
|
|
244
|
+
var PrimitiveToArrayTransformer = class {
|
|
245
|
+
canTransform(ctx) {
|
|
246
|
+
const { sourceNode, targetSpec } = ctx;
|
|
247
|
+
return sourceNode.isPrimitive() && targetSpec.type === "array";
|
|
248
|
+
}
|
|
249
|
+
transform(ctx) {
|
|
250
|
+
const { sourceNode } = ctx;
|
|
251
|
+
const itemsNode = sourceNode.cloneWithId(nanoid());
|
|
252
|
+
itemsNode.setName("items");
|
|
253
|
+
const arrayNode = createArrayNode(nanoid(), sourceNode.name(), itemsNode);
|
|
254
|
+
return { node: arrayNode };
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
var ObjectToArrayTransformer = class {
|
|
258
|
+
canTransform(ctx) {
|
|
259
|
+
const { sourceNode, targetSpec } = ctx;
|
|
260
|
+
return sourceNode.isObject() && targetSpec.type === "array";
|
|
261
|
+
}
|
|
262
|
+
transform(ctx) {
|
|
263
|
+
const { sourceNode } = ctx;
|
|
264
|
+
const itemsNode = sourceNode.cloneWithId(nanoid());
|
|
265
|
+
itemsNode.setName("items");
|
|
266
|
+
const arrayNode = createArrayNode(nanoid(), sourceNode.name(), itemsNode);
|
|
267
|
+
return { node: arrayNode };
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
var ArrayToItemsTypeTransformer = class {
|
|
271
|
+
canTransform(ctx) {
|
|
272
|
+
const { sourceNode, targetSpec } = ctx;
|
|
273
|
+
if (!sourceNode.isArray()) {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
const targetType = targetSpec.type;
|
|
277
|
+
if (!targetType || !this.isPrimitiveType(targetType)) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
const items = sourceNode.items();
|
|
281
|
+
return items.nodeType() === targetType;
|
|
282
|
+
}
|
|
283
|
+
transform(ctx) {
|
|
284
|
+
const { sourceNode } = ctx;
|
|
285
|
+
const items = sourceNode.items();
|
|
286
|
+
const newNode = items.cloneWithId(nanoid());
|
|
287
|
+
newNode.setName(sourceNode.name());
|
|
288
|
+
return { node: newNode };
|
|
289
|
+
}
|
|
290
|
+
isPrimitiveType(type) {
|
|
291
|
+
return type === "string" || type === "number" || type === "boolean";
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
var RefTransformer = class {
|
|
295
|
+
canTransform(ctx) {
|
|
296
|
+
return ctx.targetSpec.$ref !== void 0;
|
|
297
|
+
}
|
|
298
|
+
transform(ctx) {
|
|
299
|
+
const { sourceNode, targetSpec, refSchemas } = ctx;
|
|
300
|
+
const refUri = targetSpec.$ref;
|
|
301
|
+
const resolvedSchema = refSchemas?.[refUri];
|
|
302
|
+
if (resolvedSchema) {
|
|
303
|
+
const parser = new SchemaParser();
|
|
304
|
+
const wrapperSchema = obj({ temp: ref(refUri) });
|
|
305
|
+
const resolvedNode = parser.parse(wrapperSchema, refSchemas);
|
|
306
|
+
const tempNode = resolvedNode.property("temp");
|
|
307
|
+
const newNode = tempNode.cloneWithId(nanoid());
|
|
308
|
+
newNode.setName(sourceNode.name());
|
|
309
|
+
return { node: newNode };
|
|
310
|
+
}
|
|
311
|
+
const metadata = this.extractMetadata(targetSpec);
|
|
312
|
+
const node = createRefNode(nanoid(), sourceNode.name(), refUri, metadata);
|
|
313
|
+
return { node };
|
|
314
|
+
}
|
|
315
|
+
extractMetadata(spec) {
|
|
316
|
+
const meta = {};
|
|
317
|
+
let hasValue = false;
|
|
318
|
+
if (spec.title) {
|
|
319
|
+
meta.title = spec.title;
|
|
320
|
+
hasValue = true;
|
|
321
|
+
}
|
|
322
|
+
if (spec.description) {
|
|
323
|
+
meta.description = spec.description;
|
|
324
|
+
hasValue = true;
|
|
325
|
+
}
|
|
326
|
+
if (spec.deprecated) {
|
|
327
|
+
meta.deprecated = spec.deprecated;
|
|
328
|
+
hasValue = true;
|
|
329
|
+
}
|
|
330
|
+
return hasValue ? meta : void 0;
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
var DefaultTransformer = class {
|
|
334
|
+
canTransform(ctx) {
|
|
335
|
+
return ctx.targetSpec.type !== void 0;
|
|
336
|
+
}
|
|
337
|
+
transform(ctx) {
|
|
338
|
+
const { sourceNode, targetSpec } = ctx;
|
|
339
|
+
const type = targetSpec.type;
|
|
340
|
+
const metadata = this.extractMetadata(targetSpec);
|
|
341
|
+
const node = this.createNode(sourceNode.name(), type, targetSpec, metadata);
|
|
342
|
+
return { node };
|
|
343
|
+
}
|
|
344
|
+
createNode(name, type, spec, metadata) {
|
|
345
|
+
switch (type) {
|
|
346
|
+
case "string":
|
|
347
|
+
return createStringNode(nanoid(), name, {
|
|
348
|
+
defaultValue: spec.default ?? "",
|
|
349
|
+
foreignKey: spec.foreignKey,
|
|
350
|
+
metadata
|
|
351
|
+
});
|
|
352
|
+
case "number":
|
|
353
|
+
return createNumberNode(nanoid(), name, {
|
|
354
|
+
defaultValue: spec.default ?? 0,
|
|
355
|
+
metadata
|
|
356
|
+
});
|
|
357
|
+
case "boolean":
|
|
358
|
+
return createBooleanNode(nanoid(), name, {
|
|
359
|
+
defaultValue: spec.default ?? false,
|
|
360
|
+
metadata
|
|
361
|
+
});
|
|
362
|
+
case "object":
|
|
363
|
+
return createObjectNode(nanoid(), name, [], { metadata });
|
|
364
|
+
case "array":
|
|
365
|
+
return this.createArrayNode(name, metadata);
|
|
366
|
+
default:
|
|
367
|
+
throw new Error(`Unknown field type: ${type}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
createArrayNode(name, metadata) {
|
|
371
|
+
const items = createStringNode(nanoid(), "items", { defaultValue: "" });
|
|
372
|
+
return createArrayNode(nanoid(), name, items, { metadata });
|
|
373
|
+
}
|
|
374
|
+
extractMetadata(spec) {
|
|
375
|
+
const meta = {};
|
|
376
|
+
let hasValue = false;
|
|
377
|
+
if (spec.title) {
|
|
378
|
+
meta.title = spec.title;
|
|
379
|
+
hasValue = true;
|
|
380
|
+
}
|
|
381
|
+
if (spec.description) {
|
|
382
|
+
meta.description = spec.description;
|
|
383
|
+
hasValue = true;
|
|
384
|
+
}
|
|
385
|
+
if (spec.deprecated) {
|
|
386
|
+
meta.deprecated = spec.deprecated;
|
|
387
|
+
hasValue = true;
|
|
388
|
+
}
|
|
389
|
+
return hasValue ? meta : void 0;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
// src/model/type-transformer/TypeTransformChain.ts
|
|
394
|
+
var TypeTransformChain = class {
|
|
395
|
+
_transformers;
|
|
396
|
+
_refSchemas;
|
|
397
|
+
constructor(options = {}) {
|
|
398
|
+
this._refSchemas = options.refSchemas;
|
|
399
|
+
this._transformers = [
|
|
400
|
+
...options.customTransformers ?? [],
|
|
401
|
+
new PrimitiveToArrayTransformer(),
|
|
402
|
+
new ObjectToArrayTransformer(),
|
|
403
|
+
new ArrayToItemsTypeTransformer(),
|
|
404
|
+
new RefTransformer(),
|
|
405
|
+
new DefaultTransformer()
|
|
406
|
+
];
|
|
407
|
+
}
|
|
408
|
+
transform(sourceNode, spec) {
|
|
409
|
+
const normalizedSpec = this.normalizeSpec(spec);
|
|
410
|
+
const ctx = {
|
|
411
|
+
sourceNode,
|
|
412
|
+
targetSpec: normalizedSpec,
|
|
413
|
+
refSchemas: this._refSchemas
|
|
414
|
+
};
|
|
415
|
+
const transformer = this._transformers.find((t) => t.canTransform(ctx));
|
|
416
|
+
if (!transformer) {
|
|
417
|
+
throw new Error(`No transformer found for spec: ${JSON.stringify(spec)}`);
|
|
418
|
+
}
|
|
419
|
+
return transformer.transform(ctx);
|
|
420
|
+
}
|
|
421
|
+
normalizeSpec(spec) {
|
|
422
|
+
if (typeof spec === "string") {
|
|
423
|
+
return { type: spec };
|
|
424
|
+
}
|
|
425
|
+
return spec;
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
function createTypeTransformChain(options) {
|
|
429
|
+
return new TypeTransformChain(options);
|
|
430
|
+
}
|
|
243
431
|
|
|
244
432
|
// src/model/schema-model/SchemaModelImpl.ts
|
|
245
433
|
var SchemaModelImpl = class {
|
|
@@ -249,10 +437,15 @@ var SchemaModelImpl = class {
|
|
|
249
437
|
_serializer = new SchemaSerializer();
|
|
250
438
|
_nodeFactory = new NodeFactory();
|
|
251
439
|
_formulaIndex = new FormulaDependencyIndex();
|
|
440
|
+
_transformChain;
|
|
252
441
|
_formulaParseErrors = [];
|
|
253
442
|
_refSchemas;
|
|
254
443
|
constructor(schema, options) {
|
|
255
444
|
this._refSchemas = options?.refSchemas;
|
|
445
|
+
this._transformChain = new TypeTransformChain({
|
|
446
|
+
refSchemas: this._refSchemas,
|
|
447
|
+
customTransformers: options?.customTransformers
|
|
448
|
+
});
|
|
256
449
|
const parser = new SchemaParser();
|
|
257
450
|
const rootNode = parser.parse(schema, this._refSchemas);
|
|
258
451
|
this._currentTree = createSchemaTree(rootNode);
|
|
@@ -265,6 +458,7 @@ var SchemaModelImpl = class {
|
|
|
265
458
|
_serializer: false,
|
|
266
459
|
_nodeFactory: false,
|
|
267
460
|
_formulaIndex: false,
|
|
461
|
+
_transformChain: false,
|
|
268
462
|
_refSchemas: false,
|
|
269
463
|
_currentTree: "observable.ref",
|
|
270
464
|
_baseTree: "observable.ref",
|
|
@@ -308,10 +502,10 @@ var SchemaModelImpl = class {
|
|
|
308
502
|
if (path.isEmpty()) {
|
|
309
503
|
return node;
|
|
310
504
|
}
|
|
311
|
-
const
|
|
312
|
-
this._currentTree.setNodeAt(path,
|
|
313
|
-
this._currentTree.trackReplacement(nodeId,
|
|
314
|
-
return
|
|
505
|
+
const result = this._transformChain.transform(node, newType);
|
|
506
|
+
this._currentTree.setNodeAt(path, result.node);
|
|
507
|
+
this._currentTree.trackReplacement(nodeId, result.node.id());
|
|
508
|
+
return result.node;
|
|
315
509
|
}
|
|
316
510
|
updateMetadata(nodeId, meta) {
|
|
317
511
|
const node = this._currentTree.nodeById(nodeId);
|
|
@@ -2260,6 +2454,6 @@ function createDataModel(options) {
|
|
|
2260
2454
|
return new DataModelImpl(options);
|
|
2261
2455
|
}
|
|
2262
2456
|
|
|
2263
|
-
export { ArrayValueNode, BasePrimitiveValueNode, BaseValueNode, BooleanValueNode, DataModelImpl, ForeignKeyNotFoundError, ForeignKeyResolverImpl, ForeignKeyResolverNotConfiguredError, ForeignKeyValueNodeImpl, NodeFactory, NodeFactory2, NodeFactoryRegistry, NumberValueNode, ObjectValueNode, RowModelImpl, SchemaParser, StringValueNode, TableModelImpl, ValueType, createDataModel, createDefaultRegistry, createForeignKeyResolver, createNodeFactory, createSchemaModel, createTableModel, extractFormulaDefinition, generateDefaultValue, generateNodeId, isForeignKeyValueNode, resetNodeIdCounter };
|
|
2264
|
-
//# sourceMappingURL=chunk-
|
|
2265
|
-
//# sourceMappingURL=chunk-
|
|
2457
|
+
export { ArrayToItemsTypeTransformer, ArrayValueNode, BasePrimitiveValueNode, BaseValueNode, BooleanValueNode, DataModelImpl, DefaultTransformer, ForeignKeyNotFoundError, ForeignKeyResolverImpl, ForeignKeyResolverNotConfiguredError, ForeignKeyValueNodeImpl, NodeFactory, NodeFactory2, NodeFactoryRegistry, NumberValueNode, ObjectToArrayTransformer, ObjectValueNode, PrimitiveToArrayTransformer, RefTransformer, RowModelImpl, SchemaParser, StringValueNode, TableModelImpl, TypeTransformChain, ValueType, createDataModel, createDefaultRegistry, createForeignKeyResolver, createNodeFactory, createSchemaModel, createTableModel, createTypeTransformChain, extractFormulaDefinition, generateDefaultValue, generateNodeId, isForeignKeyValueNode, resetNodeIdCounter };
|
|
2458
|
+
//# sourceMappingURL=chunk-6EAIJMZV.js.map
|
|
2459
|
+
//# sourceMappingURL=chunk-6EAIJMZV.js.map
|