@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.
Files changed (37) hide show
  1. package/dist/{chunk-JHMO5NLL.js → chunk-6EAIJMZV.js} +212 -18
  2. package/dist/chunk-6EAIJMZV.js.map +1 -0
  3. package/dist/chunk-G6ZKEVVU.cjs +4 -0
  4. package/dist/chunk-G6ZKEVVU.cjs.map +1 -0
  5. package/dist/chunk-NY3H6C7K.js +3 -0
  6. package/dist/chunk-NY3H6C7K.js.map +1 -0
  7. package/dist/{chunk-YGTMLR3D.js → chunk-R4CFU33U.js} +2 -2
  8. package/dist/{chunk-YGTMLR3D.js.map → chunk-R4CFU33U.js.map} +1 -1
  9. package/dist/{chunk-7XIWS4W6.js → chunk-RTBMPBPC.js} +35 -2
  10. package/dist/chunk-RTBMPBPC.js.map +1 -0
  11. package/dist/{chunk-JJ2KGTZX.cjs → chunk-VGADCIBG.cjs} +2 -2
  12. package/dist/{chunk-JJ2KGTZX.cjs.map → chunk-VGADCIBG.cjs.map} +1 -1
  13. package/dist/{chunk-I6ZH7HZ7.cjs → chunk-YRKXZTRZ.cjs} +265 -64
  14. package/dist/chunk-YRKXZTRZ.cjs.map +1 -0
  15. package/dist/{chunk-HLGT7PCU.cjs → chunk-ZG7QX4I3.cjs} +35 -2
  16. package/dist/chunk-ZG7QX4I3.cjs.map +1 -0
  17. package/dist/core/index.cjs +57 -57
  18. package/dist/core/index.d.cts +2 -2
  19. package/dist/core/index.d.ts +2 -2
  20. package/dist/core/index.js +1 -1
  21. package/dist/index.cjs +189 -160
  22. package/dist/index.d.cts +2 -2
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +4 -3
  25. package/dist/mocks/index.cjs +18 -17
  26. package/dist/mocks/index.js +2 -1
  27. package/dist/model/index.cjs +68 -39
  28. package/dist/model/index.d.cts +78 -4
  29. package/dist/model/index.d.ts +78 -4
  30. package/dist/model/index.js +3 -2
  31. package/dist/{types-bBnnfNxC.d.ts → types-6S07rMdY.d.ts} +1 -0
  32. package/dist/{types-BUiNI0oL.d.cts → types-DHlnrQKG.d.cts} +1 -0
  33. package/package.json +1 -1
  34. package/dist/chunk-7XIWS4W6.js.map +0 -1
  35. package/dist/chunk-HLGT7PCU.cjs.map +0 -1
  36. package/dist/chunk-I6ZH7HZ7.cjs.map +0 -1
  37. 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-7XIWS4W6.js';
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, ref) {
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, ref) {
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, ref) {
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, ref) {
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, ref) {
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 newNode = this._nodeFactory.createNode(node.name(), newType);
312
- this._currentTree.setNodeAt(path, newNode);
313
- this._currentTree.trackReplacement(nodeId, newNode.id());
314
- return newNode;
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-JHMO5NLL.js.map
2265
- //# sourceMappingURL=chunk-JHMO5NLL.js.map
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