ajsc 5.0.2 → 5.1.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.
@@ -14,42 +14,53 @@ export class TypescriptConverter extends TypescriptBaseConverter {
14
14
  * for deduplication across the schema.
15
15
  */
16
16
  this.enumDeclarations = new Map();
17
+ this.mergeCounter = 0;
17
18
  this.opts = opts;
18
19
  this.inlineTypes = opts?.inlineTypes ?? false;
19
20
  this.enumStyle = opts?.enumStyle ?? "union";
21
+ this.emitJSDoc = !this.inlineTypes && (opts?.jsdoc ?? false);
20
22
  this.schemaConverter = new JSONSchemaConverter(schema);
21
- if (!this.schemaConverter.irNode.name) {
22
- this.schemaConverter.irNode.name = "Root";
23
+ // Merge compatible anyOf unions into single object types before
24
+ // enum pre-registration and type generation, so the downstream
25
+ // pipeline sees merged enums and objects rather than separate variants.
26
+ const irNode = this.mergeCompatibleUnions(this.schemaConverter.irNode);
27
+ if (!irNode.name) {
28
+ irNode.name = "Root";
23
29
  }
24
30
  // Reserve the root type name so enums/ref types don't collide with it
25
- this.rootName = this.schemaConverter.irNode.name;
31
+ this.rootName = irNode.name;
26
32
  this.usedDeclarationNames.add(this.rootName);
27
33
  // Pre-register enum names before type generation so that enum names
28
34
  // (derived from meaningful property names) take precedence over
29
35
  // synthetic ref type names (derived from postfix fallbacks).
30
36
  if (this.enumStyle === "enum" && !this.inlineTypes) {
31
- this.preRegisterEnumNames(this.schemaConverter.irNode);
37
+ this.preRegisterEnumNames(irNode);
32
38
  }
33
- const code = this.generateType(this.schemaConverter.irNode, {
39
+ const code = this.generateType(irNode, {
34
40
  getReferencedType: this.inlineTypes
35
41
  ? () => undefined
36
42
  : this.getReferencedType.bind(this),
37
43
  });
38
- const rootName = this.schemaConverter.irNode.name;
44
+ const rootName = irNode.name;
39
45
  if (!this.inlineTypes) {
40
46
  const enumCode = [...this.enumDeclarations.values()]
41
- .map(({ name, members }) => {
47
+ .map(({ name, members, description }) => {
48
+ const jsdoc = this.emitJSDoc && description ? `${this.formatJSDoc(description)}\n` : "";
42
49
  const body = members
43
50
  .map(({ key, value }) => `${key} = ${JSON.stringify(value)}`)
44
51
  .join(", ");
45
- return `export enum ${name} { ${body} }`;
52
+ return `${jsdoc}export enum ${name} { ${body} }`;
46
53
  })
47
54
  .join("\n");
48
55
  const typeCode = this.refTypes
49
- .map(([_sig, name, { code }]) => `export type ${name} = ${code};`)
56
+ .map(([_sig, name, { code, description }]) => {
57
+ const jsdoc = this.emitJSDoc && description ? `${this.formatJSDoc(description)}\n` : "";
58
+ return `${jsdoc}export type ${name} = ${code};`;
59
+ })
50
60
  .join("\n");
51
61
  const allDecls = [enumCode, typeCode].filter(Boolean).join("\n");
52
- this.code = `${allDecls}\n\nexport type ${rootName} = ${code};\n`;
62
+ const rootJsdoc = this.emitJSDoc && irNode.description ? `${this.formatJSDoc(irNode.description)}\n` : "";
63
+ this.code = `${allDecls}\n\n${rootJsdoc}export type ${rootName} = ${code};\n`;
53
64
  }
54
65
  else {
55
66
  this.code = `${code}`;
@@ -79,11 +90,11 @@ export class TypescriptConverter extends TypescriptBaseConverter {
79
90
  preRegisterEnumNames(ir) {
80
91
  if (ir.type === "enum" &&
81
92
  ir.values?.every((v) => typeof v === "string")) {
82
- this.getOrCreateEnumDeclaration(ir.values, ir.path);
93
+ this.getOrCreateEnumDeclaration(ir.values, ir.path, ir.description, ir.title);
83
94
  }
84
95
  else if (ir.type === "literal" &&
85
96
  typeof ir.constraints?.value === "string") {
86
- this.getOrCreateEnumDeclaration([ir.constraints.value], ir.path);
97
+ this.getOrCreateEnumDeclaration([ir.constraints.value], ir.path, ir.description, ir.title);
87
98
  }
88
99
  // Recurse in the same order as generateType
89
100
  if (ir.properties) {
@@ -110,7 +121,7 @@ export class TypescriptConverter extends TypescriptBaseConverter {
110
121
  if (this.enumStyle === "enum" &&
111
122
  !this.inlineTypes &&
112
123
  ir.values?.every((v) => typeof v === "string")) {
113
- return this.getOrCreateEnumDeclaration(ir.values, ir.path);
124
+ return this.getOrCreateEnumDeclaration(ir.values, ir.path, ir.description, ir.title);
114
125
  }
115
126
  return super.generateEnumType(ir);
116
127
  }
@@ -118,7 +129,7 @@ export class TypescriptConverter extends TypescriptBaseConverter {
118
129
  if (this.enumStyle === "enum" &&
119
130
  !this.inlineTypes &&
120
131
  typeof ir.constraints?.value === "string") {
121
- return this.getOrCreateEnumDeclaration([ir.constraints.value], ir.path);
132
+ return this.getOrCreateEnumDeclaration([ir.constraints.value], ir.path, ir.description, ir.title);
122
133
  }
123
134
  return super.generateLiteralType(ir);
124
135
  }
@@ -130,10 +141,16 @@ export class TypescriptConverter extends TypescriptBaseConverter {
130
141
  * includes parent path segments for collision resolution (e.g. "Type" →
131
142
  * "ArgsType" → "DataArgsType") before falling back to a numeric suffix.
132
143
  */
133
- getOrCreateEnumDeclaration(values, path) {
144
+ getOrCreateEnumDeclaration(values, path, description, title) {
134
145
  const canonicalKey = JSON.stringify([...values].sort());
135
146
  const existing = this.enumDeclarations.get(canonicalKey);
136
147
  if (existing) {
148
+ if (!existing.description && description) {
149
+ existing.description = description;
150
+ }
151
+ if (!existing.title && title) {
152
+ existing.title = title;
153
+ }
137
154
  return existing.name;
138
155
  }
139
156
  const enumName = this.deriveEnumName(path);
@@ -151,7 +168,7 @@ export class TypescriptConverter extends TypescriptBaseConverter {
151
168
  usedMemberNames.add(memberName);
152
169
  return { key: memberName, value };
153
170
  });
154
- this.enumDeclarations.set(canonicalKey, { name: enumName, members });
171
+ this.enumDeclarations.set(canonicalKey, { name: enumName, members, title, description });
155
172
  return enumName;
156
173
  }
157
174
  /**
@@ -206,5 +223,244 @@ export class TypescriptConverter extends TypescriptBaseConverter {
206
223
  name = "Value";
207
224
  return name;
208
225
  }
226
+ /**
227
+ * Recursively walks the IR tree (bottom-up) and merges anyOf unions
228
+ * whose options are all objects with compatible property types.
229
+ * Merged enums collect values from all options; properties missing
230
+ * from some options become optional in the merged type.
231
+ */
232
+ mergeCompatibleUnions(ir) {
233
+ // Recurse into children first (bottom-up)
234
+ if (ir.properties) {
235
+ for (const key of Object.keys(ir.properties)) {
236
+ ir.properties[key] = this.mergeCompatibleUnions(ir.properties[key]);
237
+ }
238
+ }
239
+ if (ir.items) {
240
+ ir.items = this.mergeCompatibleUnions(ir.items);
241
+ }
242
+ if (ir.tupleItems) {
243
+ ir.tupleItems = ir.tupleItems.map((t) => this.mergeCompatibleUnions(t));
244
+ }
245
+ if (ir.options) {
246
+ ir.options = ir.options.map((o) => this.mergeCompatibleUnions(o));
247
+ }
248
+ if (ir.additionalProperties &&
249
+ typeof ir.additionalProperties !== "boolean") {
250
+ ir.additionalProperties = this.mergeCompatibleUnions(ir.additionalProperties);
251
+ }
252
+ // Check if this node is a mergeable anyOf union
253
+ if (ir.type === "union" &&
254
+ ir.constraints?.combinator === "anyOf" &&
255
+ ir.options &&
256
+ ir.options.length > 1) {
257
+ const merged = this.tryMergeObjectUnion(ir);
258
+ if (merged)
259
+ return merged;
260
+ }
261
+ return ir;
262
+ }
263
+ /**
264
+ * Attempts to merge all options of an anyOf union into a single object type.
265
+ * Returns the merged IRNode, or null if the options are not compatible.
266
+ */
267
+ tryMergeObjectUnion(ir) {
268
+ const options = ir.options;
269
+ // All options must be objects
270
+ if (!options.every((opt) => opt.type === "object")) {
271
+ return null;
272
+ }
273
+ // Bail if any option has patternProperties
274
+ if (options.some((opt) => opt.patternProperties)) {
275
+ return null;
276
+ }
277
+ // Bail if options have conflicting additionalProperties values.
278
+ // Identical values (all false, all true, all same schema) are fine.
279
+ const apValues = options.map((opt) => opt.additionalProperties);
280
+ const hasAp = apValues.some((v) => v !== undefined);
281
+ if (hasAp) {
282
+ const serialized = apValues.map((v) => JSON.stringify(v ?? null));
283
+ if (!serialized.every((s) => s === serialized[0])) {
284
+ return null;
285
+ }
286
+ }
287
+ // Collect all property names in first-seen order across options
288
+ const allPropNames = [];
289
+ const seenProps = new Set();
290
+ for (const opt of options) {
291
+ if (opt.properties) {
292
+ for (const key of Object.keys(opt.properties)) {
293
+ if (!seenProps.has(key)) {
294
+ seenProps.add(key);
295
+ allPropNames.push(key);
296
+ }
297
+ }
298
+ }
299
+ }
300
+ if (allPropNames.length === 0) {
301
+ return null;
302
+ }
303
+ // Only merge when options share at least one property name —
304
+ // disjoint objects should remain as a union to preserve semantics.
305
+ const sharedPropNames = allPropNames.filter((propName) => options.every((opt) => opt.properties?.[propName] !== undefined));
306
+ if (sharedPropNames.length === 0) {
307
+ return null;
308
+ }
309
+ // Detect discriminated unions: if a shared property has different
310
+ // const/single-value-enum values across options AND there are
311
+ // option-specific (non-shared) properties, this is a tagged union
312
+ // where merging would lose the correlation between discriminator
313
+ // and variant-specific fields.
314
+ if (this.isDiscriminatedUnion(options, sharedPropNames, allPropNames)) {
315
+ return null;
316
+ }
317
+ // Try to merge each property across all options
318
+ const mergedProperties = {};
319
+ for (const propName of allPropNames) {
320
+ const instances = [];
321
+ for (const opt of options) {
322
+ if (opt.properties?.[propName]) {
323
+ instances.push(opt.properties[propName]);
324
+ }
325
+ }
326
+ const merged = this.tryMergeProperty(instances);
327
+ if (!merged) {
328
+ return null; // Incompatible — bail out, keep as union
329
+ }
330
+ // Required only if property exists in ALL options AND required in all
331
+ const existsInAll = options.every((opt) => opt.properties?.[propName] !== undefined);
332
+ const requiredInAll = instances.every((inst) => inst.required === true);
333
+ merged.required = existsInAll && requiredInAll;
334
+ mergedProperties[propName] = merged;
335
+ }
336
+ // Derive a name from the union's path
337
+ const pathSegments = ir.path
338
+ .split(".")
339
+ .filter((x) => !/^\d+$/.test(x));
340
+ const name = pathSegments[pathSegments.length - 1] || "Merged";
341
+ const merged = {
342
+ type: "object",
343
+ properties: mergedProperties,
344
+ path: ir.path,
345
+ name,
346
+ signature: `merged:${++this.mergeCounter}`,
347
+ description: ir.description,
348
+ };
349
+ // Propagate additionalProperties when all options agree on the same value
350
+ if (hasAp) {
351
+ merged.additionalProperties = options[0].additionalProperties;
352
+ }
353
+ return merged;
354
+ }
355
+ /**
356
+ * Tries to merge multiple instances of the same property across union options.
357
+ * Returns the merged IRNode, or null if incompatible.
358
+ */
359
+ tryMergeProperty(instances) {
360
+ if (instances.length === 0)
361
+ return null;
362
+ if (instances.length === 1)
363
+ return { ...instances[0] };
364
+ const isStringEnum = (ir) => ir.type === "enum" &&
365
+ ir.values?.every((v) => typeof v === "string");
366
+ const isStringLiteral = (ir) => ir.type === "literal" && typeof ir.constraints?.value === "string";
367
+ // Merge string enums and/or string literals into a single enum
368
+ if (instances.every((inst) => isStringEnum(inst) || isStringLiteral(inst))) {
369
+ const seen = new Set();
370
+ const mergedValues = [];
371
+ for (const inst of instances) {
372
+ const values = isStringEnum(inst)
373
+ ? inst.values
374
+ : [inst.constraints.value];
375
+ for (const v of values) {
376
+ if (!seen.has(v)) {
377
+ seen.add(v);
378
+ mergedValues.push(v);
379
+ }
380
+ }
381
+ }
382
+ return {
383
+ type: "enum",
384
+ values: mergedValues,
385
+ path: instances[0].path,
386
+ };
387
+ }
388
+ // Same primitive type across all instances
389
+ const firstType = instances[0].type;
390
+ if (instances.every((inst) => inst.type === firstType) &&
391
+ ["string", "number", "integer", "boolean", "null"].includes(firstType)) {
392
+ return { ...instances[0] };
393
+ }
394
+ // Same object signature across all instances
395
+ if (instances.every((inst) => inst.type === "object" && inst.signature) &&
396
+ instances.every((inst) => inst.signature === instances[0].signature)) {
397
+ return { ...instances[0] };
398
+ }
399
+ // Incompatible types
400
+ return null;
401
+ }
402
+ /**
403
+ * Detects discriminated union patterns where merging would lose
404
+ * semantic precision. A discriminated union requires:
405
+ * 1. A shared property with distinct const/single-value-enum per option
406
+ * (the "discriminator")
407
+ * 2. Every option has at least one property exclusive to only that option
408
+ * (variant-specific fields tied to the discriminator value)
409
+ *
410
+ * This distinguishes true tagged unions (circle+radius vs square+side)
411
+ * from schemas where single-value enums represent different values of
412
+ * the same field that should be merged (past/current/future → Timeframe).
413
+ */
414
+ isDiscriminatedUnion(options, sharedPropNames, allPropNames) {
415
+ const hasOptionSpecificProps = allPropNames.length > sharedPropNames.length;
416
+ if (!hasOptionSpecificProps) {
417
+ return false;
418
+ }
419
+ // Check if any shared property acts as a discriminator:
420
+ // each option has a distinct const or single-value enum for that property
421
+ let hasDiscriminator = false;
422
+ for (const propName of sharedPropNames) {
423
+ const perOptionValues = options.map((opt) => {
424
+ const prop = opt.properties?.[propName];
425
+ if (!prop)
426
+ return undefined;
427
+ if (prop.type === "literal" &&
428
+ typeof prop.constraints?.value === "string") {
429
+ return prop.constraints.value;
430
+ }
431
+ if (prop.type === "enum" &&
432
+ prop.values?.length === 1 &&
433
+ typeof prop.values[0] === "string") {
434
+ return prop.values[0];
435
+ }
436
+ return undefined;
437
+ });
438
+ if (perOptionValues.every((v) => v !== undefined)) {
439
+ const uniqueValues = new Set(perOptionValues);
440
+ if (uniqueValues.size === options.length) {
441
+ hasDiscriminator = true;
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ if (!hasDiscriminator) {
447
+ return false;
448
+ }
449
+ // For a true discriminated union, every option must have at least one
450
+ // property that is exclusive to ONLY that option (no other option has it).
451
+ // This distinguishes { kind:"circle", radius } | { kind:"square", side }
452
+ // from { timeframe:"past", title } | { timeframe:"current", title } | { timeframe:"future" }
453
+ const sharedSet = new Set(sharedPropNames);
454
+ return options.every((opt) => {
455
+ const optProps = Object.keys(opt.properties ?? {});
456
+ return optProps.some((propName) => {
457
+ if (sharedSet.has(propName))
458
+ return false;
459
+ // Check if this prop appears in any other option
460
+ return !options.some((other) => other !== opt &&
461
+ other.properties?.[propName] !== undefined);
462
+ });
463
+ });
464
+ }
209
465
  }
210
466
  //# sourceMappingURL=TypescriptConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TypescriptConverter.js","sourceRoot":"","sources":["../src/TypescriptConverter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TypescriptConverter.js","sourceRoot":"","sources":["../src/TypescriptConverter.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAuClD;;GAEG;AACH,MAAM,OAAO,mBACX,SAAQ,uBAAuB;IAuB/B,YAAY,MAA6B,EAAE,IAA8B;QACvE,KAAK,EAAE,CAAC;QArBM,aAAQ,GAAG,YAAY,CAAC;QAOxC;;;WAGG;QACK,qBAAgB,GAAG,IAAI,GAAG,EAG/B,CAAC;QAII,iBAAY,GAAG,CAAC,CAAC;QAKvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,IAAI,KAAK,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC;QAE7D,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEvD,gEAAgE;QAChE,+DAA+D;QAC/D,wEAAwE;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEvE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;QACvB,CAAC;QAED,sEAAsE;QACtE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE7C,oEAAoE;QACpE,gEAAgE;QAChE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACrC,iBAAiB,EAAE,IAAI,CAAC,WAAW;gBACjC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS;gBACjB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;SACtC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;iBACjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,MAAM,IAAI,GAAG,OAAO;qBACjB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,GAAG,KAAK,eAAe,IAAI,MAAM,IAAI,IAAI,CAAC;YACnD,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;iBAC3B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,OAAO,GAAG,KAAK,eAAe,IAAI,MAAM,IAAI,GAAG,CAAC;YAClD,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,IAAI,GAAG,GAAG,QAAQ,OAAO,SAAS,eAAe,QAAQ,MAAM,IAAI,KAAK,CAAC;QAChF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAEkB,sBAAsB;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC;QAC5C,OAAO;YACL,GAAG,IAAI;YACP,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,KAAK,SAAS,IAAI;gBAC9C,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe;aAC3C,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,IAAI;gBAC1C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;aACnC,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,KAAK,SAAS,IAAI;gBAC/C,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB;aAC7C,CAAC;SACH,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,oBAAoB,CAAC,EAAU;QACrC,IACE,EAAE,CAAC,IAAI,KAAK,MAAM;YAClB,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EACvD,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5F,CAAC;aAAM,IACL,EAAE,CAAC,IAAI,KAAK,SAAS;YACrB,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,QAAQ,EACzC,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7F,CAAC;QAED,4CAA4C;QAC5C,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,KAAK;YAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU;gBAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO;gBAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/D,CAAC;QACD,IACE,EAAE,CAAC,oBAAoB;YACvB,OAAO,EAAE,CAAC,oBAAoB,KAAK,SAAS,EAC5C,CAAC;YACD,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEkB,gBAAgB,CAAC,EAAU;QAC5C,IACE,IAAI,CAAC,SAAS,KAAK,MAAM;YACzB,CAAC,IAAI,CAAC,WAAW;YACjB,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EACvD,CAAC;YACD,OAAO,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,MAAkB,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAEkB,mBAAmB,CAAC,EAAU;QAC/C,IACE,IAAI,CAAC,SAAS,KAAK,MAAM;YACzB,CAAC,IAAI,CAAC,WAAW;YACjB,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,QAAQ,EACzC,CAAC;YACD,OAAO,IAAI,CAAC,0BAA0B,CACpC,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACtB,EAAE,CAAC,IAAI,EACP,EAAE,CAAC,WAAW,EACd,EAAE,CAAC,KAAK,CACT,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;OAOG;IACK,0BAA0B,CAChC,MAAgB,EAChB,IAAY,EACZ,WAAoB,EACpB,KAAc;QAEd,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC;gBACzC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;YACrC,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC7B,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAExC,0CAA0C;QAC1C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,IAAI,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,UAAU,GAAG,UAAU,CAAC;YAC5B,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,OAAO,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;gBACxC,aAAa,EAAE,CAAC;YAClB,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAAC,IAAY;QACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAED,8CAA8C;QAC9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,QAAQ;iBACtB,KAAK,CAAC,CAAC,KAAK,CAAC;iBACb,GAAG,CAAC,YAAY,CAAC;iBACjB,IAAI,CAAC,EAAE,CAAC,CAAC;YAEZ,IACE,QAAQ;gBACR,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAChC,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EACxC,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;QAChE,OAAO,IAAI,CAAC,iBAAiB,CAC3B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CACtD,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,QAAgB;QACxC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC9D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAa;QACpC,IAAI,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,OAAO,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACK,qBAAqB,CAAC,EAAU;QACtC,0CAA0C;QAC1C,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACf,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IACE,EAAE,CAAC,oBAAoB;YACvB,OAAO,EAAE,CAAC,oBAAoB,KAAK,SAAS,EAC5C,CAAC;YACD,EAAE,CAAC,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,CAClD,EAAE,CAAC,oBAAoB,CACxB,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,IACE,EAAE,CAAC,IAAI,KAAK,OAAO;YACnB,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK,OAAO;YACtC,EAAE,CAAC,OAAO;YACV,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EACrB,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;QAC5B,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,EAAU;QACpC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAQ,CAAC;QAE5B,8BAA8B;QAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gEAAgE;QAChE,oEAAoE;QACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACnB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6DAA6D;QAC7D,mEAAmE;QACnE,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CACjE,CAAC;QACF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kEAAkE;QAClE,8DAA8D;QAC9D,kEAAkE;QAClE,iEAAiE;QACjE,+BAA+B;QAC/B,IAAI,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gDAAgD;QAChD,MAAM,gBAAgB,GAA8B,EAAE,CAAC;QAEvD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,CAAC,yCAAyC;YACxD,CAAC;YAED,sEAAsE;YACtE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,SAAS,CAClD,CAAC;YACF,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;YACxE,MAAM,CAAC,QAAQ,GAAG,WAAW,IAAI,aAAa,CAAC;YAE/C,gBAAgB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;QACtC,CAAC;QAED,sCAAsC;QACtC,MAAM,YAAY,GAAG,EAAE,CAAC,IAAI;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC;QAE/D,MAAM,MAAM,GAAW;YACrB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,gBAAgB;YAC5B,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI;YACJ,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE;YAC1C,WAAW,EAAE,EAAE,CAAC,WAAW;SAC5B,CAAC;QAEF,0EAA0E;QAC1E,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,oBAAoB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAChE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,SAAmB;QAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAEvD,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,EAAE,CAClC,EAAE,CAAC,IAAI,KAAK,MAAM;YAClB,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,EAAE,CACrC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,QAAQ,CAAC;QAErE,+DAA+D;QAC/D,IACE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,EACtE,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;oBAC/B,CAAC,CAAE,IAAI,CAAC,MAAmB;oBAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,WAAY,CAAC,KAAe,CAAC,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACZ,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;aACxB,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,IACE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;YAClD,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EACtE,CAAC;YACD,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,CAAC;QAED,6CAA6C;QAC7C,IACE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC;YACnE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EACpE,CAAC;YACD,OAAO,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,CAAC;QAED,qBAAqB;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;OAWG;IACK,oBAAoB,CAC1B,OAAiB,EACjB,eAAyB,EACzB,YAAsB;QAEtB,MAAM,sBAAsB,GAAG,YAAY,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;QAC5E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,wDAAwD;QACxD,0EAA0E;QAC1E,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,eAAe,EAAE,CAAC;YACvC,MAAM,eAAe,GAA2B,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClE,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI;oBAAE,OAAO,SAAS,CAAC;gBAC5B,IACE,IAAI,CAAC,IAAI,KAAK,SAAS;oBACvB,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,QAAQ,EAC3C,CAAC;oBACD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;gBAChC,CAAC;gBACD,IACE,IAAI,CAAC,IAAI,KAAK,MAAM;oBACpB,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC;oBACzB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAClC,CAAC;oBACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;gBAClD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC9C,IAAI,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;oBACzC,gBAAgB,GAAG,IAAI,CAAC;oBACxB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,sEAAsE;QACtE,2EAA2E;QAC3E,yEAAyE;QACzE,6FAA6F;QAC7F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAChC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC1C,iDAAiD;gBACjD,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,KAAK,GAAG;oBACb,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,SAAS,CAC7C,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,194 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { TypescriptConverter } from "./TypescriptConverter.js";
3
+ describe("TypescriptConverter - JSDoc emission", () => {
4
+ it("should not emit JSDoc by default", () => {
5
+ const result = new TypescriptConverter({
6
+ type: "object",
7
+ description: "A person",
8
+ properties: {
9
+ name: { type: "string", description: "The name" },
10
+ },
11
+ });
12
+ expect(result.code).not.toContain("/**");
13
+ });
14
+ it("should emit JSDoc on root type description", () => {
15
+ const result = new TypescriptConverter({
16
+ type: "object",
17
+ description: "A person record",
18
+ properties: {
19
+ name: { type: "string" },
20
+ },
21
+ }, { jsdoc: true });
22
+ expect(result.code).toContain("/** A person record */\nexport type Root =");
23
+ });
24
+ it("should emit JSDoc on properties with descriptions", () => {
25
+ const result = new TypescriptConverter({
26
+ type: "object",
27
+ properties: {
28
+ name: { type: "string", description: "The person's name" },
29
+ age: { type: "number" },
30
+ },
31
+ }, { jsdoc: true });
32
+ expect(result.code).toContain("/** The person's name */");
33
+ expect(result.code).toContain("name?:");
34
+ // age has no description, so no JSDoc for it
35
+ expect(result.code).not.toContain("/** age");
36
+ });
37
+ it("should use multiline format when any property has description", () => {
38
+ const result = new TypescriptConverter({
39
+ type: "object",
40
+ properties: {
41
+ name: { type: "string", description: "The name" },
42
+ age: { type: "number" },
43
+ },
44
+ }, { jsdoc: true });
45
+ // Should be multiline with indentation
46
+ expect(result.code).toContain(" /** The name */\n name?:");
47
+ expect(result.code).toContain(" age?:");
48
+ });
49
+ it("should emit JSDoc on extracted/referenced types", () => {
50
+ const result = new TypescriptConverter({
51
+ type: "object",
52
+ properties: {
53
+ address: {
54
+ type: "object",
55
+ description: "The mailing address",
56
+ properties: {
57
+ street: { type: "string" },
58
+ },
59
+ },
60
+ },
61
+ }, { jsdoc: true });
62
+ expect(result.code).toContain("/** The mailing address */\nexport type Address =");
63
+ });
64
+ it("should emit JSDoc on enum declarations", () => {
65
+ const result = new TypescriptConverter({
66
+ type: "object",
67
+ properties: {
68
+ status: {
69
+ type: "string",
70
+ enum: ["active", "inactive"],
71
+ description: "The current status",
72
+ },
73
+ },
74
+ }, { jsdoc: true, enumStyle: "enum" });
75
+ expect(result.code).toContain("/** The current status */\nexport enum Status");
76
+ });
77
+ it("should handle multiline descriptions", () => {
78
+ const result = new TypescriptConverter({
79
+ type: "object",
80
+ description: "Line one\nLine two",
81
+ properties: {
82
+ name: { type: "string" },
83
+ },
84
+ }, { jsdoc: true });
85
+ expect(result.code).toContain("/**\n * Line one\n * Line two\n */");
86
+ });
87
+ it("should not emit JSDoc in inline mode even with jsdoc option", () => {
88
+ const result = new TypescriptConverter({
89
+ type: "object",
90
+ description: "A person",
91
+ properties: {
92
+ name: { type: "string", description: "The name" },
93
+ },
94
+ }, { jsdoc: true, inlineTypes: true });
95
+ expect(result.code).not.toContain("/**");
96
+ });
97
+ it("should keep compact format when no descriptions exist", () => {
98
+ const result = new TypescriptConverter({
99
+ type: "object",
100
+ properties: {
101
+ name: { type: "string" },
102
+ age: { type: "number" },
103
+ },
104
+ }, { jsdoc: true });
105
+ // No descriptions on properties, so should remain compact
106
+ expect(result.code).toContain("{ name?: string; age?: number; }");
107
+ });
108
+ it("should emit JSDoc on properties inside extracted types", () => {
109
+ const result = new TypescriptConverter({
110
+ type: "object",
111
+ properties: {
112
+ user: {
113
+ type: "object",
114
+ properties: {
115
+ email: {
116
+ type: "string",
117
+ description: "User email address",
118
+ },
119
+ name: { type: "string" },
120
+ },
121
+ },
122
+ },
123
+ }, { jsdoc: true });
124
+ // The extracted type should have JSDoc on its property
125
+ expect(result.code).toContain("/** User email address */");
126
+ expect(result.code).toContain("email?:");
127
+ // Verify it's inside the extracted type declaration
128
+ expect(result.code).toMatch(/export type User = \{\n\s+\/\*\* User email address \*\/\n\s+email\?:/);
129
+ });
130
+ it("should emit JSDoc on multiline property descriptions", () => {
131
+ const result = new TypescriptConverter({
132
+ type: "object",
133
+ properties: {
134
+ name: {
135
+ type: "string",
136
+ description: "The full name\nFirst and last",
137
+ },
138
+ },
139
+ }, { jsdoc: true });
140
+ expect(result.code).toContain("/**\n * The full name\n * First and last\n */");
141
+ });
142
+ it("should sanitize */ in descriptions to prevent broken JSDoc", () => {
143
+ const result = new TypescriptConverter({
144
+ type: "object",
145
+ properties: {
146
+ ratio: {
147
+ type: "string",
148
+ description: "use a*/b syntax",
149
+ },
150
+ },
151
+ }, { jsdoc: true });
152
+ // Should escape */ to prevent premature comment close
153
+ expect(result.code).toContain("a*\\/b");
154
+ expect(result.code).not.toMatch(/\/\*\*.*\*\/.*\*\//s);
155
+ });
156
+ it("should emit property title as JSDoc when no description exists", () => {
157
+ const result = new TypescriptConverter({
158
+ type: "object",
159
+ properties: {
160
+ email: { type: "string", title: "Email Address" },
161
+ },
162
+ }, { jsdoc: true });
163
+ expect(result.code).toContain("/** Email Address */");
164
+ expect(result.code).toContain("email?:");
165
+ });
166
+ it("should combine title and description in property JSDoc", () => {
167
+ const result = new TypescriptConverter({
168
+ type: "object",
169
+ properties: {
170
+ email: {
171
+ type: "string",
172
+ title: "Email Address",
173
+ description: "The primary contact email",
174
+ },
175
+ },
176
+ }, { jsdoc: true });
177
+ // Title should appear as a heading, followed by description
178
+ expect(result.code).toContain("Email Address");
179
+ expect(result.code).toContain("The primary contact email");
180
+ });
181
+ it("should not emit root title as JSDoc on type declaration (redundant with type name)", () => {
182
+ const result = new TypescriptConverter({
183
+ type: "object",
184
+ title: "UserProfile",
185
+ properties: {
186
+ name: { type: "string" },
187
+ },
188
+ }, { jsdoc: true });
189
+ // Title matches type name — no JSDoc emitted for root
190
+ expect(result.code).not.toContain("/** UserProfile */");
191
+ expect(result.code).toContain("export type UserProfile =");
192
+ });
193
+ });
194
+ //# sourceMappingURL=TypescriptConverter.jsdoc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypescriptConverter.jsdoc.test.js","sourceRoot":"","sources":["../src/TypescriptConverter.jsdoc.test.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -67,6 +67,10 @@ export interface IRNode {
67
67
  * For tuple types: ordered array of IR nodes representing positional item types.
68
68
  */
69
69
  tupleItems?: IRNode[];
70
+ /**
71
+ * Short label from JSON Schema 'title' keyword.
72
+ */
73
+ title?: string;
70
74
  /**
71
75
  * Human-readable description from JSON Schema 'description' keyword.
72
76
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ajsc",
3
- "version": "5.0.2",
3
+ "version": "5.1.0",
4
4
  "description": "Another Json-Schema Converter",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",