@powerlines/schema 0.11.45 → 0.11.46

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 (69) hide show
  1. package/dist/bundle.cjs +1 -1
  2. package/dist/bundle.d.cts +1 -1
  3. package/dist/bundle.d.mts +1 -1
  4. package/dist/bundle.mjs +1 -1
  5. package/dist/bundle.mjs.map +1 -1
  6. package/dist/codegen.cjs +28 -22
  7. package/dist/codegen.d.cts +11 -11
  8. package/dist/codegen.d.cts.map +1 -1
  9. package/dist/codegen.d.mts +11 -11
  10. package/dist/codegen.d.mts.map +1 -1
  11. package/dist/codegen.mjs +36 -30
  12. package/dist/codegen.mjs.map +1 -1
  13. package/dist/constants.cjs +15 -11
  14. package/dist/constants.d.cts +4 -3
  15. package/dist/constants.d.cts.map +1 -1
  16. package/dist/constants.d.mts +4 -3
  17. package/dist/constants.d.mts.map +1 -1
  18. package/dist/constants.mjs +13 -10
  19. package/dist/constants.mjs.map +1 -1
  20. package/dist/extract.cjs +158 -20
  21. package/dist/extract.d.cts +55 -16
  22. package/dist/extract.d.cts.map +1 -1
  23. package/dist/extract.d.mts +55 -16
  24. package/dist/extract.d.mts.map +1 -1
  25. package/dist/extract.mjs +158 -22
  26. package/dist/extract.mjs.map +1 -1
  27. package/dist/helpers.cjs +43 -8
  28. package/dist/helpers.d.cts +40 -6
  29. package/dist/helpers.d.cts.map +1 -1
  30. package/dist/helpers.d.mts +40 -6
  31. package/dist/helpers.d.mts.map +1 -1
  32. package/dist/helpers.mjs +43 -10
  33. package/dist/helpers.mjs.map +1 -1
  34. package/dist/index.cjs +39 -7
  35. package/dist/index.d.cts +8 -8
  36. package/dist/index.d.mts +8 -8
  37. package/dist/index.mjs +7 -7
  38. package/dist/metadata.cjs +9 -35
  39. package/dist/metadata.d.cts +5 -26
  40. package/dist/metadata.d.cts.map +1 -1
  41. package/dist/metadata.d.mts +5 -26
  42. package/dist/metadata.d.mts.map +1 -1
  43. package/dist/metadata.mjs +9 -33
  44. package/dist/metadata.mjs.map +1 -1
  45. package/dist/persistence.d.cts +4 -4
  46. package/dist/persistence.d.cts.map +1 -1
  47. package/dist/persistence.d.mts +4 -4
  48. package/dist/persistence.d.mts.map +1 -1
  49. package/dist/persistence.mjs.map +1 -1
  50. package/dist/reflection.cjs +72 -50
  51. package/dist/reflection.d.cts +1 -1
  52. package/dist/reflection.d.cts.map +1 -1
  53. package/dist/reflection.d.mts +1 -1
  54. package/dist/reflection.d.mts.map +1 -1
  55. package/dist/reflection.mjs +74 -52
  56. package/dist/reflection.mjs.map +1 -1
  57. package/dist/type-checks.cjs +363 -83
  58. package/dist/type-checks.d.cts +138 -16
  59. package/dist/type-checks.d.cts.map +1 -1
  60. package/dist/type-checks.d.mts +138 -16
  61. package/dist/type-checks.d.mts.map +1 -1
  62. package/dist/type-checks.mjs +336 -85
  63. package/dist/type-checks.mjs.map +1 -1
  64. package/dist/types.d.cts +901 -176
  65. package/dist/types.d.cts.map +1 -1
  66. package/dist/types.d.mts +901 -176
  67. package/dist/types.d.mts.map +1 -1
  68. package/dist/validate.mjs.map +1 -1
  69. package/package.json +5 -5
@@ -1,6 +1,7 @@
1
- import { isJsonSchema, isJsonSchemaObject, isNullOnlyJsonSchema } from "./type-checks.mjs";
1
+ import { isJsonSchemaObject, isJsonSchemaPrimitiveType, isNullOnlyJsonSchema } from "./type-checks.mjs";
2
+ import { getJsonSchemaType } from "./codegen.mjs";
2
3
  import defu from "defu";
3
- import { isSetArray, isSetObject, isSetString, isUndefined } from "@stryke/type-checks";
4
+ import { isBigInt, isBoolean, isInteger, isNull, isNumber, isRegExp, isSetArray, isSetObject, isSetString, isString, isUndefined } from "@stryke/type-checks";
4
5
  import { ReflectionClass, ReflectionKind, TypeNumberBrand } from "@powerlines/deepkit/vendor/type";
5
6
 
6
7
  //#region src/reflection.ts
@@ -64,20 +65,25 @@ function numberBrandToJsonSchema(brand) {
64
65
  }
65
66
  }
66
67
  function withReflectionTags(reflection, schema) {
67
- if (!isSetObject(reflection?.tags)) return schema;
68
+ if (!isSetObject(schema) || !isSetObject(reflection?.tags)) return schema;
69
+ const updatedSchema = { ...schema };
68
70
  const tags = reflection.tags;
69
- if (isSetString(tags.title)) schema.title = tags.title;
70
- if (isSetArray(tags.alias)) schema.alias = tags.alias;
71
- if (!isUndefined(tags.hidden)) schema.hidden = tags.hidden;
72
- if (!isUndefined(tags.ignore)) schema.ignore = tags.ignore;
73
- if (!isUndefined(tags.internal)) schema.internal = tags.internal;
74
- if (!isUndefined(tags.runtime)) schema.runtime = tags.runtime;
75
- if (!isUndefined(tags.readonly)) schema.readOnly = tags.readonly;
76
- return schema;
71
+ if (isSetString(tags.title)) updatedSchema.title = tags.title;
72
+ if (isSetArray(tags.alias)) updatedSchema.alias = tags.alias;
73
+ if (!isUndefined(tags.hidden)) updatedSchema.hidden = tags.hidden;
74
+ if (!isUndefined(tags.ignore)) updatedSchema.ignore = tags.ignore;
75
+ if (!isUndefined(tags.internal)) updatedSchema.internal = tags.internal;
76
+ if (!isUndefined(tags.runtime)) updatedSchema.runtime = tags.runtime;
77
+ if (!isUndefined(tags.readonly)) updatedSchema.readOnly = tags.readonly;
78
+ return updatedSchema;
77
79
  }
78
- function withNullable(schema, nullable) {
79
- if (!nullable) return schema;
80
- const types = Array.isArray(schema.type) ? [...schema.type] : schema.type ? [schema.type] : [];
80
+ function withNullable(schema) {
81
+ if (!isSetObject(schema)) return { anyOf: [schema, {
82
+ type: "null",
83
+ default: null
84
+ }] };
85
+ const rawType = schema.type;
86
+ const types = Array.isArray(rawType) ? [...rawType] : rawType ? [rawType] : [];
81
87
  if (!types.includes("null")) types.push("null");
82
88
  return {
83
89
  ...schema,
@@ -101,7 +107,7 @@ function reflectionToJsonSchemaInner(reflection) {
101
107
  case ReflectionKind.null: return withReflectionTags(reflection, {
102
108
  type: "null",
103
109
  name: reflection.typeName,
104
- nullable: true
110
+ default: null
105
111
  });
106
112
  case ReflectionKind.string: return withReflectionTags(reflection, {
107
113
  type: "string",
@@ -115,8 +121,7 @@ function reflectionToJsonSchemaInner(reflection) {
115
121
  case ReflectionKind.bigint: return withReflectionTags(reflection, {
116
122
  type: "integer",
117
123
  name: reflection.typeName,
118
- format: "int64",
119
- multipleOf: 1
124
+ format: "int64"
120
125
  });
121
126
  case ReflectionKind.regexp: return withReflectionTags(reflection, {
122
127
  type: "string",
@@ -126,37 +131,42 @@ function reflectionToJsonSchemaInner(reflection) {
126
131
  });
127
132
  case ReflectionKind.literal: {
128
133
  const { literal } = reflection;
129
- if (typeof literal === "string" || typeof literal === "number" || typeof literal === "boolean") return withReflectionTags(reflection, {
130
- type: typeof literal,
131
- name: reflection.typeName,
132
- const: literal
133
- });
134
- if (typeof literal === "bigint") return withReflectionTags(reflection, {
134
+ if (isBigInt(literal)) return withReflectionTags(reflection, {
135
135
  type: "integer",
136
136
  name: reflection.typeName,
137
137
  format: "int64",
138
- multipleOf: 1,
139
- const: String(literal)
138
+ const: literal
140
139
  });
141
- if (literal instanceof RegExp) return withReflectionTags(reflection, {
140
+ if (isRegExp(literal)) return withReflectionTags(reflection, {
142
141
  type: "string",
143
142
  name: reflection.typeName,
144
143
  format: "regex",
145
144
  const: literal.source
146
145
  });
147
- return withReflectionTags(reflection, { name: reflection.typeName });
146
+ return withReflectionTags(reflection, {
147
+ type: getJsonSchemaType(literal),
148
+ name: reflection.typeName,
149
+ const: literal
150
+ });
148
151
  }
149
152
  case ReflectionKind.templateLiteral: return withReflectionTags(reflection, { type: "string" });
150
153
  case ReflectionKind.enum: {
151
- const values = reflection.values.filter((value) => typeof value === "string" || typeof value === "number" || typeof value === "boolean");
154
+ const values = reflection.values.filter((value) => isString(value) || isInteger(value) || isBigInt(value) || isNumber(value) || isBoolean(value) || isNull(value));
152
155
  if (values.length === 0) return withReflectionTags(reflection, {
153
156
  name: reflection.typeName,
154
- description: reflection.description
157
+ description: reflection.description,
158
+ enum: []
155
159
  });
156
160
  return withReflectionTags(reflection, {
161
+ type: values.every((value) => isString(value)) ? "string" : values.every((value) => isInteger(value) || isBigInt(value)) ? "integer" : values.every((value) => isNumber(value)) ? "number" : values.every((value) => isBoolean(value)) ? "boolean" : values.every((value) => isNull(value)) ? "null" : values.reduce((ret, value) => {
162
+ const type = getJsonSchemaType(value);
163
+ if (isJsonSchemaPrimitiveType(type) && !ret.includes(type)) ret.push(type);
164
+ return ret;
165
+ }, []),
157
166
  name: reflection.typeName,
158
167
  description: reflection.description,
159
- enum: values
168
+ enum: values,
169
+ default: values.length === 1 ? values[0] : void 0
160
170
  });
161
171
  }
162
172
  case ReflectionKind.array: {
@@ -172,50 +182,63 @@ function reflectionToJsonSchemaInner(reflection) {
172
182
  if (items.length <= 1) return withReflectionTags(reflection, {
173
183
  type: "array",
174
184
  name: reflection.typeName,
175
- items: items[0] ?? {}
185
+ items: items.length === 1 ? items[0] : {}
176
186
  });
177
187
  return withReflectionTags(reflection, {
178
188
  type: "array",
179
189
  name: reflection.typeName,
180
- items,
190
+ prefixItems: items,
181
191
  minItems: items.length,
182
192
  maxItems: items.length
183
193
  });
184
194
  }
185
195
  case ReflectionKind.union: {
186
- const branches = reflection.types.map((inner) => reflectionToJsonSchemaInner(inner)).filter(isJsonSchema);
187
- const nullable = reflection.types.some((inner) => inner.kind === ReflectionKind.null || inner.kind === ReflectionKind.undefined);
188
- const nonNull = branches.filter((branch) => branch.type !== "null" && !isNullOnlyJsonSchema(branch));
196
+ const branches = reflection.types.map((inner) => reflectionToJsonSchemaInner(inner)).filter((branch) => branch !== void 0);
197
+ if (!reflection.types.some((inner) => inner.kind === ReflectionKind.null || inner.kind === ReflectionKind.undefined)) return withReflectionTags(reflection, {
198
+ name: reflection.typeName,
199
+ anyOf: branches
200
+ });
201
+ const nonNull = branches.filter((branch) => !isNullOnlyJsonSchema(branch));
189
202
  if (nonNull.length === 0) return withReflectionTags(reflection, {
190
203
  type: "null",
191
- nullable: true
204
+ default: null
192
205
  });
193
- if (nonNull.length === 1) return withNullable(withReflectionTags(reflection, {
194
- name: reflection.typeName,
195
- ...nonNull[0]
196
- }), nullable);
197
- const enumValues = nonNull.map((branch) => branch.const).filter((value) => value !== void 0);
206
+ if (nonNull.length === 1) {
207
+ const first = nonNull[0];
208
+ if (!isSetObject(first)) return withNullable(withReflectionTags(reflection, {
209
+ name: reflection.typeName,
210
+ anyOf: [first]
211
+ }));
212
+ return withNullable(withReflectionTags(reflection, {
213
+ name: reflection.typeName,
214
+ ...first
215
+ }));
216
+ }
217
+ const enumValues = nonNull.map((branch) => isSetObject(branch) ? branch.const : void 0).filter((value) => value === null || typeof value === "string" || typeof value === "number" || typeof value === "bigint" || typeof value === "boolean");
198
218
  if (enumValues.length === nonNull.length) return withNullable(withReflectionTags(reflection, {
199
219
  name: reflection.typeName,
200
220
  enum: enumValues
201
- }), nullable);
221
+ }));
202
222
  const discriminator = tryReflectionDiscriminator(reflection.types);
203
- if (discriminator) return withNullable(withReflectionTags(reflection, {
223
+ if (discriminator && isSetObject(discriminator)) return withNullable(withReflectionTags(reflection, {
204
224
  name: reflection.typeName,
205
225
  ...discriminator
206
- }), nullable);
226
+ }));
207
227
  return withNullable(withReflectionTags(reflection, {
208
228
  name: reflection.typeName,
209
229
  anyOf: nonNull
210
- }), nullable);
230
+ }));
211
231
  }
212
232
  case ReflectionKind.intersection: {
213
233
  const members = reflection.types.map((inner) => reflectionToJsonSchemaInner(inner)).filter((item) => item !== void 0);
214
234
  if (members.length === 0) return;
215
- if (members.length === 1) return withReflectionTags(reflection, {
216
- name: reflection.typeName,
217
- ...members[0]
218
- });
235
+ if (members.length === 1) {
236
+ if (!isSetObject(members[0])) return members[0];
237
+ return withReflectionTags(reflection, {
238
+ name: reflection.typeName,
239
+ ...members[0]
240
+ });
241
+ }
219
242
  if (members.every(isJsonSchemaObject)) return withReflectionTags(reflection, {
220
243
  name: reflection.typeName,
221
244
  ...mergeObjectSchemas(members)
@@ -373,7 +396,7 @@ function objectReflectionToJsonSchema(type) {
373
396
  let property = reflectionToJsonSchemaInner(propertyReflection.type);
374
397
  if (!property) continue;
375
398
  property = {
376
- ...property,
399
+ ...isSetObject(property) ? property : {},
377
400
  name: propertyReflection.getNameAsString(),
378
401
  description: propertyReflection.getDescription(),
379
402
  readOnly: propertyReflection.isReadonly(),
@@ -381,13 +404,12 @@ function objectReflectionToJsonSchema(type) {
381
404
  internal: propertyReflection.isInternal(),
382
405
  runtime: propertyReflection.isRuntime(),
383
406
  hidden: propertyReflection.isHidden(),
384
- visibility: propertyReflection.isPublic() ? "public" : propertyReflection.isProtected() ? "protected" : propertyReflection.isPrivate() ? "private" : void 0,
385
407
  ...propertyReflection.hasDefault() ? { default: propertyReflection.getDefaultValue() } : {},
386
408
  ...isSetArray(propertyReflection.getGroups()) ? { tags: propertyReflection.getGroups() } : {},
387
409
  ...isSetArray(propertyReflection.getAlias()) ? { alias: propertyReflection.getAlias() } : {},
388
410
  ...isSetString(propertyReflection.getTitle()) ? { title: propertyReflection.getTitle() } : {}
389
411
  };
390
- if (propertyReflection.isNullable()) property = withNullable(property, true);
412
+ if (propertyReflection.isNullable()) property = withNullable(property);
391
413
  schema.properties ??= {};
392
414
  schema.properties[propertyReflection.name] = property;
393
415
  if (!propertyReflection.isOptional()) {
@@ -1 +1 @@
1
- {"version":3,"file":"reflection.mjs","names":[],"sources":["../src/reflection.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 type {\n TagsReflection,\n Type,\n TypeClass\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n ReflectionClass,\n ReflectionKind,\n TypeNumberBrand,\n TypeObjectLiteral\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n isSetArray,\n isSetObject,\n isSetString,\n isUndefined\n} from \"@stryke/type-checks\";\nimport defu from \"defu\";\nimport {\n isJsonSchema,\n isJsonSchemaObject,\n isNullOnlyJsonSchema\n} from \"./type-checks\";\nimport {\n JsonSchema,\n JsonSchemaLike,\n JsonSchemaObject,\n JsonSchemaProperty\n} from \"./types\";\n\n/**\n * Maps a Deepkit numeric `brand` to JSON Schema `type` and `format`.\n *\n * @remarks\n * This function takes a `TypeNumberBrand` (which represents specific numeric types in Deepkit, such as `integer`, `float`, `int8`, etc.) and returns a corresponding JSON Schema fragment that includes the appropriate `type`, `format`, and any relevant keywords (like `multipleOf` for integers). If the brand is not recognized, it defaults to a generic JSON Schema for numbers.\n *\n * @param brand - The Deepkit numeric brand to convert.\n * @return A JSON Schema fragment representing the numeric type corresponding to the provided brand.\n */\nfunction numberBrandToJsonSchema(\n brand: TypeNumberBrand | undefined\n): JsonSchema<number> {\n switch (brand) {\n case TypeNumberBrand.integer:\n return {\n type: \"integer\",\n format: \"int32\",\n multipleOf: 1\n };\n case TypeNumberBrand.int8:\n return { type: \"integer\", format: \"int8\", multipleOf: 1 };\n case TypeNumberBrand.uint8:\n return { type: \"integer\", format: \"uint8\", multipleOf: 1 };\n case TypeNumberBrand.int16:\n return { type: \"integer\", format: \"int16\", multipleOf: 1 };\n case TypeNumberBrand.uint16:\n return { type: \"integer\", format: \"uint16\", multipleOf: 1 };\n case TypeNumberBrand.int32:\n return { type: \"integer\", format: \"int32\", multipleOf: 1 };\n case TypeNumberBrand.uint32:\n return { type: \"integer\", format: \"uint32\", multipleOf: 1 };\n case TypeNumberBrand.float:\n case TypeNumberBrand.float32:\n return { type: \"number\", format: \"float\" };\n case TypeNumberBrand.float64:\n return { type: \"number\", format: \"double\" };\n case undefined:\n default:\n return { type: \"number\" };\n }\n}\n\nfunction withReflectionTags<T = unknown>(\n reflection: Type,\n schema: Partial<JsonSchema<T>>\n): JsonSchema<T> {\n if (!isSetObject((reflection as { tags?: TagsReflection })?.tags)) {\n return schema as JsonSchema<T>;\n }\n\n const tags = (reflection as { tags: TagsReflection }).tags;\n if (isSetString(tags.title)) {\n schema.title = tags.title;\n }\n if (isSetArray(tags.alias)) {\n schema.alias = tags.alias;\n }\n if (!isUndefined(tags.hidden)) {\n schema.hidden = tags.hidden;\n }\n if (!isUndefined(tags.ignore)) {\n schema.ignore = tags.ignore;\n }\n if (!isUndefined(tags.internal)) {\n schema.internal = tags.internal;\n }\n if (!isUndefined(tags.runtime)) {\n schema.runtime = tags.runtime;\n }\n if (!isUndefined(tags.readonly)) {\n schema.readOnly = tags.readonly;\n }\n\n return schema as JsonSchema<T>;\n}\n\nfunction withNullable<T = unknown>(\n schema: JsonSchema<T>,\n nullable: boolean\n): JsonSchema<T> {\n if (!nullable) {\n return schema;\n }\n\n const types = Array.isArray(schema.type)\n ? [...schema.type]\n : schema.type\n ? [schema.type]\n : [];\n if (!types.includes(\"null\")) {\n types.push(\"null\");\n }\n\n return {\n ...schema,\n type: types.length === 1 ? types[0] : types\n } as JsonSchema<T>;\n}\n\n/**\n * Converts a Deepkit type reflection into a JSON Schema (draft-07) fragment.\n */\nexport function reflectionToJsonSchema<T = unknown>(\n reflection: Type\n): JsonSchema<T> | undefined {\n return reflectionToJsonSchemaInner<T>(reflection);\n}\n\nfunction reflectionToJsonSchemaInner<T = unknown>(\n reflection: Type\n): JsonSchema<T> | undefined {\n switch (reflection.kind) {\n case ReflectionKind.any:\n case ReflectionKind.unknown:\n case ReflectionKind.void:\n case ReflectionKind.object:\n return withReflectionTags<T>(reflection, { name: reflection.typeName });\n case ReflectionKind.never:\n return undefined;\n case ReflectionKind.undefined:\n case ReflectionKind.null:\n return withReflectionTags<T>(reflection, {\n type: \"null\",\n name: reflection.typeName,\n nullable: true\n });\n case ReflectionKind.string:\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n name: reflection.typeName\n });\n case ReflectionKind.boolean:\n return withReflectionTags<T>(reflection, {\n type: \"boolean\",\n name: reflection.typeName\n });\n case ReflectionKind.number: {\n const numeric = numberBrandToJsonSchema(reflection.brand);\n\n return withReflectionTags<T>(reflection, numeric as JsonSchema<T>);\n }\n case ReflectionKind.bigint:\n return withReflectionTags<T>(reflection, {\n type: \"integer\",\n name: reflection.typeName,\n format: \"int64\",\n multipleOf: 1\n });\n case ReflectionKind.regexp:\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n name: reflection.typeName,\n format: \"regex\",\n contentMediaType: \"text/regex\"\n });\n case ReflectionKind.literal: {\n const { literal } = reflection;\n if (\n typeof literal === \"string\" ||\n typeof literal === \"number\" ||\n typeof literal === \"boolean\"\n ) {\n return withReflectionTags<T>(reflection, {\n type: typeof literal,\n name: reflection.typeName,\n const: literal\n });\n }\n if (typeof literal === \"bigint\") {\n return withReflectionTags<T>(reflection, {\n type: \"integer\",\n name: reflection.typeName,\n format: \"int64\",\n multipleOf: 1,\n const: String(literal)\n });\n }\n if (literal instanceof RegExp) {\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n name: reflection.typeName,\n format: \"regex\",\n const: literal.source\n });\n }\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName\n });\n }\n case ReflectionKind.templateLiteral:\n return withReflectionTags<T>(reflection, { type: \"string\" });\n case ReflectionKind.enum: {\n const values = reflection.values.filter(\n value =>\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n if (values.length === 0) {\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n description: reflection.description\n });\n }\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n description: reflection.description,\n enum: values\n });\n }\n case ReflectionKind.array: {\n const items = reflectionToJsonSchemaInner<T>(reflection.type);\n\n return withReflectionTags<T>(reflection, {\n type: \"array\",\n name: reflection.typeName,\n items: items ?? {}\n });\n }\n case ReflectionKind.tuple: {\n const items = reflection.types\n .map(member => reflectionToJsonSchemaInner<T>(member.type))\n .filter((item): item is JsonSchema => item !== undefined);\n if (items.length <= 1) {\n return withReflectionTags<T>(reflection, {\n type: \"array\",\n name: reflection.typeName,\n items: items[0] ?? {}\n });\n }\n return withReflectionTags<T>(reflection, {\n type: \"array\",\n name: reflection.typeName,\n items,\n minItems: items.length,\n maxItems: items.length\n });\n }\n case ReflectionKind.union: {\n const branches = reflection.types\n .map(inner => reflectionToJsonSchemaInner<T>(inner))\n .filter(isJsonSchema) as JsonSchema<T>[];\n const nullable = reflection.types.some(\n inner =>\n inner.kind === ReflectionKind.null ||\n inner.kind === ReflectionKind.undefined\n );\n const nonNull = branches.filter(\n branch => branch.type !== \"null\" && !isNullOnlyJsonSchema(branch)\n );\n\n if (nonNull.length === 0) {\n return withReflectionTags<T>(reflection, {\n type: \"null\",\n nullable: true\n });\n }\n\n if (nonNull.length === 1) {\n return withNullable(\n withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n ...nonNull[0]\n }),\n nullable\n );\n }\n\n const enumValues = nonNull\n .map(branch => branch.const)\n .filter(value => value !== undefined);\n if (enumValues.length === nonNull.length) {\n return withNullable(\n withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n enum: enumValues\n }),\n nullable\n );\n }\n\n const discriminator = tryReflectionDiscriminator<T>(reflection.types);\n if (discriminator) {\n return withNullable(\n withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n ...discriminator\n }),\n nullable\n );\n }\n\n return withNullable(\n withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n anyOf: nonNull\n }),\n nullable\n );\n }\n case ReflectionKind.intersection: {\n const members = reflection.types\n .map(inner => reflectionToJsonSchemaInner<T>(inner))\n .filter((item): item is JsonSchema => item !== undefined);\n if (members.length === 0) {\n return undefined;\n }\n if (members.length === 1) {\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n ...members[0]\n });\n }\n if (members.every(isJsonSchemaObject)) {\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n ...mergeObjectSchemas(members)\n });\n }\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n allOf: members\n });\n }\n case ReflectionKind.promise:\n return reflectionToJsonSchemaInner<T>(reflection.type);\n case ReflectionKind.objectLiteral:\n return objectReflectionToJsonSchema(reflection);\n case ReflectionKind.class: {\n const classType = reflection.classType as { name?: string } | undefined;\n const className = classType?.name;\n switch (className) {\n case \"Date\":\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n format: \"date-time\"\n });\n case \"RegExp\":\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n format: \"regex\"\n });\n case \"URL\":\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n format: \"uri\"\n });\n case \"Set\": {\n const itemType = reflection.arguments?.[0];\n const items = itemType\n ? reflectionToJsonSchemaInner<T>(itemType)\n : undefined;\n\n return withReflectionTags<T>(reflection, {\n type: \"array\",\n items: items ?? {},\n uniqueItems: true\n });\n }\n case \"Map\": {\n const valueType = reflection.arguments?.[1];\n const values = valueType\n ? reflectionToJsonSchemaInner<T>(valueType)\n : undefined;\n\n return withReflectionTags<T>(reflection, {\n type: \"object\",\n additionalProperties: values ?? true\n });\n }\n case \"Uint8Array\":\n case \"Uint8ClampedArray\":\n case \"Uint16Array\":\n case \"Uint32Array\":\n case \"Int8Array\":\n case \"Int16Array\":\n case \"Int32Array\":\n case \"Float32Array\":\n case \"Float64Array\":\n case \"BigInt64Array\":\n case \"BigUint64Array\":\n return withReflectionTags<T>(reflection, {\n type: \"string\",\n format: \"byte\",\n contentEncoding: \"base64\"\n });\n case undefined:\n default:\n return withReflectionTags<T>(reflection, {\n name: reflection.typeName,\n description: reflection.description,\n ...objectReflectionToJsonSchema(reflection)\n });\n }\n }\n case ReflectionKind.symbol:\n case ReflectionKind.property:\n case ReflectionKind.method:\n case ReflectionKind.function:\n case ReflectionKind.parameter:\n case ReflectionKind.typeParameter:\n case ReflectionKind.tupleMember:\n case ReflectionKind.enumMember:\n case ReflectionKind.rest:\n case ReflectionKind.indexSignature:\n case ReflectionKind.propertySignature:\n case ReflectionKind.methodSignature:\n case ReflectionKind.infer:\n case ReflectionKind.callSignature:\n default:\n return undefined;\n }\n}\n\nfunction mergeObjectSchemas<T = unknown>(\n schemas: JsonSchema<T>[]\n): JsonSchema<T> {\n const merged: JsonSchema<T> = {\n type: \"object\",\n properties: {},\n required: []\n };\n\n for (const schema of schemas) {\n if (schema.properties) {\n merged.properties = defu(merged.properties, schema.properties);\n }\n if (schema.required) {\n merged.required = Array.from(\n new Set([...(merged.required ?? []), ...schema.required])\n );\n }\n if (schema.additionalProperties !== undefined) {\n merged.additionalProperties = schema.additionalProperties;\n }\n }\n\n if ((merged.required?.length ?? 0) === 0) {\n delete merged.required;\n }\n\n return merged;\n}\n\nfunction tryReflectionDiscriminator<T = unknown>(\n types: readonly Type[]\n): JsonSchema<T> | undefined {\n const nonNullTypes = types.filter(\n t => t.kind !== ReflectionKind.null && t.kind !== ReflectionKind.undefined\n );\n const objectBranches: Array<TypeObjectLiteral | TypeClass> =\n nonNullTypes.filter(\n t =>\n t.kind === ReflectionKind.objectLiteral ||\n t.kind === ReflectionKind.class\n );\n\n if (\n objectBranches.length < 2 ||\n objectBranches.length !== nonNullTypes.length\n ) {\n return undefined;\n }\n\n let tagKey: string | undefined;\n const branches: JsonSchemaLike[] = [];\n\n for (const branch of objectBranches) {\n const literalProps: Array<{ name: string; literal: string }> = [];\n for (const member of branch.types) {\n if (\n (member.kind === ReflectionKind.property ||\n member.kind === ReflectionKind.propertySignature) &&\n typeof member.name === \"string\" &&\n member.type.kind === ReflectionKind.literal &&\n typeof (member.type as { literal?: unknown }).literal === \"string\"\n ) {\n literalProps.push({\n name: member.name,\n literal: (member.type as { literal: string }).literal\n });\n }\n }\n\n if (literalProps.length === 0) {\n return undefined;\n }\n\n const first = literalProps[0]!;\n if (!tagKey) {\n tagKey = first.name;\n } else if (tagKey !== first.name) {\n return undefined;\n }\n\n const filteredBranch = {\n ...branch,\n types: branch.types.filter(\n member =>\n !(\n (member.kind === ReflectionKind.property ||\n member.kind === ReflectionKind.propertySignature) &&\n member.name === tagKey\n )\n )\n } as TypeObjectLiteral | TypeClass;\n\n const body = objectReflectionToJsonSchema(filteredBranch);\n if (!body || !isJsonSchemaObject(body)) {\n return undefined;\n }\n\n branches.push({\n type: \"object\",\n properties: {\n [tagKey]: { const: first.literal },\n ...(body.properties ?? {})\n },\n required: [tagKey, ...(body.required ?? [])],\n additionalProperties: body.additionalProperties ?? false\n } as JsonSchemaLike);\n }\n\n if (!tagKey) {\n return undefined;\n }\n\n return {\n oneOf: branches,\n discriminator: { propertyName: tagKey }\n } as JsonSchema<T>;\n}\n\nfunction objectReflectionToJsonSchema<\n T extends Record<string, any> = Record<string, any>\n>(type: TypeObjectLiteral | TypeClass): JsonSchema<T> {\n const reflection = ReflectionClass.from(type);\n\n const schema: JsonSchemaObject<T> = {\n type: \"object\",\n name: reflection.getName(),\n description: reflection.getDescription(),\n properties: {},\n required: [],\n readOnly: reflection.isReadonly(),\n ignore: reflection.isIgnored(),\n internal: reflection.isInternal(),\n runtime: reflection.isRuntime(),\n hidden: reflection.isHidden(),\n primaryKey: reflection\n .getPrimaries()\n .map(primary => primary.getNameAsString()),\n ...(isSetString(reflection.databaseSchemaName)\n ? { databaseSchemaName: reflection.databaseSchemaName }\n : {}),\n ...(isSetString(reflection.getName())\n ? { name: reflection.getName() }\n : {}),\n ...(isSetString(reflection.getDescription())\n ? { description: reflection.getDescription() }\n : {}),\n ...(isSetArray(reflection.getAlias())\n ? { alias: reflection.getAlias() }\n : {}),\n ...(isSetString(reflection.getTitle())\n ? { title: reflection.getTitle() }\n : {})\n };\n\n for (const propertyReflection of reflection.getProperties()) {\n if (propertyReflection.getKind() === ReflectionKind.indexSignature) {\n schema.additionalProperties =\n reflectionToJsonSchemaInner(propertyReflection.type) ?? true;\n continue;\n }\n\n let property = reflectionToJsonSchemaInner<any>(propertyReflection.type);\n if (!property) {\n continue;\n }\n\n property = {\n ...property,\n name: propertyReflection.getNameAsString(),\n description: propertyReflection.getDescription(),\n readOnly: propertyReflection.isReadonly(),\n ignore: propertyReflection.isIgnored(),\n internal: propertyReflection.isInternal(),\n runtime: propertyReflection.isRuntime(),\n hidden: propertyReflection.isHidden(),\n visibility: propertyReflection.isPublic()\n ? \"public\"\n : propertyReflection.isProtected()\n ? \"protected\"\n : propertyReflection.isPrivate()\n ? \"private\"\n : undefined,\n ...(propertyReflection.hasDefault()\n ? { default: propertyReflection.getDefaultValue() }\n : {}),\n ...(isSetArray(propertyReflection.getGroups())\n ? { tags: propertyReflection.getGroups() }\n : {}),\n ...(isSetArray(propertyReflection.getAlias())\n ? { alias: propertyReflection.getAlias() }\n : {}),\n ...(isSetString(propertyReflection.getTitle())\n ? { title: propertyReflection.getTitle() }\n : {})\n };\n\n if (propertyReflection.isNullable()) {\n property = withNullable(property, true);\n }\n\n schema.properties ??= {};\n schema.properties[propertyReflection.name] =\n property as JsonSchemaProperty<T>;\n if (!propertyReflection.isOptional()) {\n schema.required ??= [];\n schema.required.push(propertyReflection.name);\n }\n }\n\n return schema;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reflection.mjs","names":[],"sources":["../src/reflection.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 type {\n TagsReflection,\n Type,\n TypeClass\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n ReflectionClass,\n ReflectionKind,\n TypeNumberBrand,\n TypeObjectLiteral\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n isBigInt,\n isBoolean,\n isInteger,\n isNull,\n isNumber,\n isRegExp,\n isSetArray,\n isSetObject,\n isSetString,\n isString,\n isUndefined\n} from \"@stryke/type-checks\";\nimport defu from \"defu\";\nimport { getJsonSchemaType } from \"./codegen\";\nimport {\n isJsonSchemaObject,\n isJsonSchemaPrimitiveType,\n isNullOnlyJsonSchema\n} from \"./type-checks\";\nimport {\n JsonSchema,\n JsonSchemaNullable,\n JsonSchemaObject,\n JsonSchemaPrimitiveType\n} from \"./types\";\n\n/**\n * Maps a Deepkit numeric `brand` to JSON Schema `type` and `format`.\n *\n * @remarks\n * This function takes a `TypeNumberBrand` (which represents specific numeric types in Deepkit, such as `integer`, `float`, `int8`, etc.) and returns a corresponding JSON Schema fragment that includes the appropriate `type`, `format`, and any relevant keywords (like `multipleOf` for integers). If the brand is not recognized, it defaults to a generic JSON Schema for numbers.\n *\n * @param brand - The Deepkit numeric brand to convert.\n * @return A JSON Schema fragment representing the numeric type corresponding to the provided brand.\n */\nfunction numberBrandToJsonSchema(\n brand: TypeNumberBrand | undefined\n): JsonSchema {\n switch (brand) {\n case TypeNumberBrand.integer:\n return {\n type: \"integer\",\n format: \"int32\",\n multipleOf: 1\n };\n case TypeNumberBrand.int8:\n return { type: \"integer\", format: \"int8\", multipleOf: 1 };\n case TypeNumberBrand.uint8:\n return { type: \"integer\", format: \"uint8\", multipleOf: 1 };\n case TypeNumberBrand.int16:\n return { type: \"integer\", format: \"int16\", multipleOf: 1 };\n case TypeNumberBrand.uint16:\n return { type: \"integer\", format: \"uint16\", multipleOf: 1 };\n case TypeNumberBrand.int32:\n return { type: \"integer\", format: \"int32\", multipleOf: 1 };\n case TypeNumberBrand.uint32:\n return { type: \"integer\", format: \"uint32\", multipleOf: 1 };\n case TypeNumberBrand.float:\n case TypeNumberBrand.float32:\n return { type: \"number\", format: \"float\" };\n case TypeNumberBrand.float64:\n return { type: \"number\", format: \"double\" };\n case undefined:\n default:\n return { type: \"number\" };\n }\n}\n\nfunction withReflectionTags(reflection: Type, schema: JsonSchema): JsonSchema {\n if (\n !isSetObject(schema) ||\n !isSetObject((reflection as { tags?: TagsReflection })?.tags)\n ) {\n return schema;\n }\n\n const updatedSchema = { ...schema };\n const tags = (reflection as { tags: TagsReflection }).tags;\n if (isSetString(tags.title)) {\n updatedSchema.title = tags.title;\n }\n if (isSetArray(tags.alias)) {\n updatedSchema.alias = tags.alias;\n }\n if (!isUndefined(tags.hidden)) {\n updatedSchema.hidden = tags.hidden;\n }\n if (!isUndefined(tags.ignore)) {\n updatedSchema.ignore = tags.ignore;\n }\n if (!isUndefined(tags.internal)) {\n updatedSchema.internal = tags.internal;\n }\n if (!isUndefined(tags.runtime)) {\n updatedSchema.runtime = tags.runtime;\n }\n if (!isUndefined(tags.readonly)) {\n updatedSchema.readOnly = tags.readonly;\n }\n\n return updatedSchema;\n}\n\nfunction withNullable(schema: JsonSchema): JsonSchemaNullable {\n if (!isSetObject(schema)) {\n return {\n anyOf: [schema, { type: \"null\", default: null }]\n };\n }\n\n const rawType = (schema as { type?: string | readonly string[] }).type;\n\n const types = Array.isArray(rawType)\n ? [...rawType]\n : rawType\n ? [rawType]\n : [];\n if (!types.includes(\"null\")) {\n types.push(\"null\");\n }\n\n return {\n ...schema,\n type: types.length === 1 ? types[0] : types\n };\n}\n\n/**\n * Converts a Deepkit type reflection into a JSON Schema (draft-07) fragment.\n */\nexport function reflectionToJsonSchema(\n reflection: Type\n): JsonSchema | undefined {\n return reflectionToJsonSchemaInner(reflection);\n}\n\nfunction reflectionToJsonSchemaInner(reflection: Type): JsonSchema | undefined {\n switch (reflection.kind) {\n case ReflectionKind.any:\n case ReflectionKind.unknown:\n case ReflectionKind.void:\n case ReflectionKind.object:\n return withReflectionTags(reflection, { name: reflection.typeName });\n case ReflectionKind.never:\n return undefined;\n case ReflectionKind.undefined:\n case ReflectionKind.null:\n return withReflectionTags(reflection, {\n type: \"null\",\n name: reflection.typeName,\n default: null\n });\n case ReflectionKind.string:\n return withReflectionTags(reflection, {\n type: \"string\",\n name: reflection.typeName\n });\n case ReflectionKind.boolean:\n return withReflectionTags(reflection, {\n type: \"boolean\",\n name: reflection.typeName\n });\n case ReflectionKind.number: {\n const numeric = numberBrandToJsonSchema(reflection.brand);\n\n return withReflectionTags(reflection, numeric);\n }\n case ReflectionKind.bigint:\n return withReflectionTags(reflection, {\n type: \"integer\",\n name: reflection.typeName,\n format: \"int64\"\n });\n case ReflectionKind.regexp:\n return withReflectionTags(reflection, {\n type: \"string\",\n name: reflection.typeName,\n format: \"regex\",\n contentMediaType: \"text/regex\"\n });\n case ReflectionKind.literal: {\n const { literal } = reflection;\n if (isBigInt(literal)) {\n return withReflectionTags(reflection, {\n type: \"integer\",\n name: reflection.typeName,\n format: \"int64\",\n const: literal\n });\n }\n\n if (isRegExp(literal)) {\n return withReflectionTags(reflection, {\n type: \"string\",\n name: reflection.typeName,\n format: \"regex\",\n const: literal.source\n });\n }\n\n return withReflectionTags(reflection, {\n type: getJsonSchemaType(literal),\n name: reflection.typeName,\n const: literal\n });\n }\n case ReflectionKind.templateLiteral:\n return withReflectionTags(reflection, { type: \"string\" });\n case ReflectionKind.enum: {\n const values = reflection.values.filter(\n value =>\n isString(value) ||\n isInteger(value) ||\n isBigInt(value) ||\n isNumber(value) ||\n isBoolean(value) ||\n isNull(value)\n ) as (string | number | bigint | boolean | null)[];\n if (values.length === 0) {\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n description: reflection.description,\n enum: []\n });\n }\n\n return withReflectionTags(reflection, {\n type: values.every(value => isString(value))\n ? \"string\"\n : values.every(value => isInteger(value) || isBigInt(value))\n ? \"integer\"\n : values.every(value => isNumber(value))\n ? \"number\"\n : values.every(value => isBoolean(value))\n ? \"boolean\"\n : values.every(value => isNull(value))\n ? \"null\"\n : values.reduce((ret, value) => {\n const type = getJsonSchemaType(value);\n if (\n isJsonSchemaPrimitiveType(type) &&\n !ret.includes(type)\n ) {\n ret.push(type);\n }\n\n return ret;\n }, [] as JsonSchemaPrimitiveType[]),\n name: reflection.typeName,\n description: reflection.description,\n enum: values,\n default: values.length === 1 ? values[0] : undefined\n });\n }\n case ReflectionKind.array: {\n const items = reflectionToJsonSchemaInner(reflection.type);\n\n return withReflectionTags(reflection, {\n type: \"array\",\n name: reflection.typeName,\n items: items ?? {}\n });\n }\n case ReflectionKind.tuple: {\n const items = reflection.types\n .map(member => reflectionToJsonSchemaInner(member.type))\n .filter((item): item is JsonSchema => item !== undefined);\n if (items.length <= 1) {\n return withReflectionTags(reflection, {\n type: \"array\",\n name: reflection.typeName,\n items: items.length === 1 ? items[0] : {}\n });\n }\n\n return withReflectionTags(reflection, {\n type: \"array\",\n name: reflection.typeName,\n prefixItems: items,\n minItems: items.length,\n maxItems: items.length\n });\n }\n case ReflectionKind.union: {\n const branches = reflection.types\n .map(inner => reflectionToJsonSchemaInner(inner))\n .filter((branch): branch is JsonSchema => branch !== undefined);\n if (\n !reflection.types.some(\n inner =>\n inner.kind === ReflectionKind.null ||\n inner.kind === ReflectionKind.undefined\n )\n ) {\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n anyOf: branches\n });\n }\n\n const nonNull = branches.filter(branch => !isNullOnlyJsonSchema(branch));\n if (nonNull.length === 0) {\n return withReflectionTags(reflection, {\n type: \"null\",\n default: null\n });\n }\n\n if (nonNull.length === 1) {\n const first = nonNull[0]!;\n\n if (!isSetObject(first)) {\n return withNullable(\n withReflectionTags(reflection, {\n name: reflection.typeName,\n anyOf: [first]\n })\n );\n }\n\n return withNullable(\n withReflectionTags(reflection, {\n name: reflection.typeName,\n ...(first as Record<string, unknown>)\n })\n );\n }\n\n const enumValues = nonNull\n .map(branch =>\n isSetObject(branch)\n ? (branch as { const?: unknown }).const\n : undefined\n )\n .filter(\n (value): value is string | number | bigint | boolean | null =>\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"bigint\" ||\n typeof value === \"boolean\"\n );\n if (enumValues.length === nonNull.length) {\n return withNullable(\n withReflectionTags(reflection, {\n name: reflection.typeName,\n enum: enumValues\n })\n );\n }\n\n const discriminator = tryReflectionDiscriminator(reflection.types);\n if (discriminator && isSetObject(discriminator)) {\n return withNullable(\n withReflectionTags(reflection, {\n name: reflection.typeName,\n ...(discriminator as Record<string, unknown>)\n })\n );\n }\n\n return withNullable(\n withReflectionTags(reflection, {\n name: reflection.typeName,\n anyOf: nonNull\n })\n );\n }\n case ReflectionKind.intersection: {\n const members = reflection.types\n .map(inner => reflectionToJsonSchemaInner(inner))\n .filter((item): item is JsonSchema => item !== undefined);\n if (members.length === 0) {\n return undefined;\n }\n if (members.length === 1) {\n if (!isSetObject(members[0])) {\n return members[0];\n }\n\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n ...members[0]\n });\n }\n if (members.every(isJsonSchemaObject)) {\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n ...mergeObjectSchemas(members)\n });\n }\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n allOf: members\n });\n }\n case ReflectionKind.promise:\n return reflectionToJsonSchemaInner(reflection.type);\n case ReflectionKind.objectLiteral:\n return objectReflectionToJsonSchema(reflection);\n case ReflectionKind.class: {\n const classType = reflection.classType as { name?: string } | undefined;\n const className = classType?.name;\n switch (className) {\n case \"Date\":\n return withReflectionTags(reflection, {\n type: \"string\",\n format: \"date-time\"\n });\n case \"RegExp\":\n return withReflectionTags(reflection, {\n type: \"string\",\n format: \"regex\"\n });\n case \"URL\":\n return withReflectionTags(reflection, {\n type: \"string\",\n format: \"uri\"\n });\n case \"Set\": {\n const itemType = reflection.arguments?.[0];\n const items = itemType\n ? reflectionToJsonSchemaInner(itemType)\n : undefined;\n\n return withReflectionTags(reflection, {\n type: \"array\",\n items: items ?? {},\n uniqueItems: true\n });\n }\n case \"Map\": {\n const valueType = reflection.arguments?.[1];\n const values = valueType\n ? reflectionToJsonSchemaInner(valueType)\n : undefined;\n\n return withReflectionTags(reflection, {\n type: \"object\",\n additionalProperties: values ?? true\n });\n }\n case \"Uint8Array\":\n case \"Uint8ClampedArray\":\n case \"Uint16Array\":\n case \"Uint32Array\":\n case \"Int8Array\":\n case \"Int16Array\":\n case \"Int32Array\":\n case \"Float32Array\":\n case \"Float64Array\":\n case \"BigInt64Array\":\n case \"BigUint64Array\":\n return withReflectionTags(reflection, {\n type: \"string\",\n format: \"byte\",\n contentEncoding: \"base64\"\n });\n case undefined:\n default:\n return withReflectionTags(reflection, {\n name: reflection.typeName,\n description: reflection.description,\n ...objectReflectionToJsonSchema(reflection)\n });\n }\n }\n case ReflectionKind.symbol:\n case ReflectionKind.property:\n case ReflectionKind.method:\n case ReflectionKind.function:\n case ReflectionKind.parameter:\n case ReflectionKind.typeParameter:\n case ReflectionKind.tupleMember:\n case ReflectionKind.enumMember:\n case ReflectionKind.rest:\n case ReflectionKind.indexSignature:\n case ReflectionKind.propertySignature:\n case ReflectionKind.methodSignature:\n case ReflectionKind.infer:\n case ReflectionKind.callSignature:\n default:\n return undefined;\n }\n}\n\nfunction mergeObjectSchemas(schemas: JsonSchemaObject[]): JsonSchemaObject {\n const merged: JsonSchemaObject = {\n type: \"object\",\n properties: {},\n required: []\n };\n\n for (const schema of schemas) {\n if (schema.properties) {\n merged.properties = defu(merged.properties, schema.properties);\n }\n if (schema.required) {\n merged.required = Array.from(\n new Set([...(merged.required ?? []), ...schema.required])\n );\n }\n if (schema.additionalProperties !== undefined) {\n merged.additionalProperties = schema.additionalProperties;\n }\n }\n\n if ((merged.required?.length ?? 0) === 0) {\n delete merged.required;\n }\n\n return merged;\n}\n\nfunction tryReflectionDiscriminator(\n types: readonly Type[]\n): JsonSchema | undefined {\n const nonNullTypes = types.filter(\n t => t.kind !== ReflectionKind.null && t.kind !== ReflectionKind.undefined\n );\n const objectBranches: Array<TypeObjectLiteral | TypeClass> =\n nonNullTypes.filter(\n t =>\n t.kind === ReflectionKind.objectLiteral ||\n t.kind === ReflectionKind.class\n );\n\n if (\n objectBranches.length < 2 ||\n objectBranches.length !== nonNullTypes.length\n ) {\n return undefined;\n }\n\n let tagKey: string | undefined;\n const branches: JsonSchemaObject[] = [];\n\n for (const branch of objectBranches) {\n const literalProps: Array<{ name: string; literal: string }> = [];\n for (const member of branch.types) {\n if (\n (member.kind === ReflectionKind.property ||\n member.kind === ReflectionKind.propertySignature) &&\n typeof member.name === \"string\" &&\n member.type.kind === ReflectionKind.literal &&\n typeof (member.type as { literal?: unknown }).literal === \"string\"\n ) {\n literalProps.push({\n name: member.name,\n literal: (member.type as { literal: string }).literal\n });\n }\n }\n\n if (literalProps.length === 0) {\n return undefined;\n }\n\n const first = literalProps[0]!;\n if (!tagKey) {\n tagKey = first.name;\n } else if (tagKey !== first.name) {\n return undefined;\n }\n\n const filteredBranch = {\n ...branch,\n types: branch.types.filter(\n member =>\n !(\n (member.kind === ReflectionKind.property ||\n member.kind === ReflectionKind.propertySignature) &&\n member.name === tagKey\n )\n )\n } as TypeObjectLiteral | TypeClass;\n\n const body = objectReflectionToJsonSchema(filteredBranch);\n if (!body || !isJsonSchemaObject(body)) {\n return undefined;\n }\n\n branches.push({\n type: \"object\",\n properties: {\n [tagKey]: { const: first.literal },\n ...(body.properties ?? {})\n },\n required: [tagKey, ...(body.required ?? [])],\n additionalProperties: body.additionalProperties ?? false\n });\n }\n\n if (!tagKey) {\n return undefined;\n }\n\n return {\n oneOf: branches,\n discriminator: { propertyName: tagKey }\n } as JsonSchema;\n}\n\nfunction objectReflectionToJsonSchema(\n type: TypeObjectLiteral | TypeClass\n): JsonSchemaObject {\n const reflection = ReflectionClass.from(type);\n\n const schema: JsonSchemaObject = {\n type: \"object\",\n name: reflection.getName(),\n description: reflection.getDescription(),\n properties: {},\n required: [],\n readOnly: reflection.isReadonly(),\n ignore: reflection.isIgnored(),\n internal: reflection.isInternal(),\n runtime: reflection.isRuntime(),\n hidden: reflection.isHidden(),\n primaryKey: reflection\n .getPrimaries()\n .map(primary => primary.getNameAsString()),\n ...(isSetString(reflection.databaseSchemaName)\n ? { databaseSchemaName: reflection.databaseSchemaName }\n : {}),\n ...(isSetString(reflection.getName())\n ? { name: reflection.getName() }\n : {}),\n ...(isSetString(reflection.getDescription())\n ? { description: reflection.getDescription() }\n : {}),\n ...(isSetArray(reflection.getAlias())\n ? { alias: reflection.getAlias() }\n : {}),\n ...(isSetString(reflection.getTitle())\n ? { title: reflection.getTitle() }\n : {})\n };\n\n for (const propertyReflection of reflection.getProperties()) {\n if (propertyReflection.getKind() === ReflectionKind.indexSignature) {\n schema.additionalProperties =\n reflectionToJsonSchemaInner(propertyReflection.type) ?? true;\n continue;\n }\n\n let property = reflectionToJsonSchemaInner(\n propertyReflection.type\n ) as JsonSchema;\n if (!property) {\n continue;\n }\n\n const propertySchema = isSetObject(property) ? property : {};\n\n property = {\n ...propertySchema,\n name: propertyReflection.getNameAsString(),\n description: propertyReflection.getDescription(),\n readOnly: propertyReflection.isReadonly(),\n ignore: propertyReflection.isIgnored(),\n internal: propertyReflection.isInternal(),\n runtime: propertyReflection.isRuntime(),\n hidden: propertyReflection.isHidden(),\n ...(propertyReflection.hasDefault()\n ? { default: propertyReflection.getDefaultValue() }\n : {}),\n ...(isSetArray(propertyReflection.getGroups())\n ? { tags: propertyReflection.getGroups() }\n : {}),\n ...(isSetArray(propertyReflection.getAlias())\n ? { alias: propertyReflection.getAlias() }\n : {}),\n ...(isSetString(propertyReflection.getTitle())\n ? { title: propertyReflection.getTitle() }\n : {})\n };\n\n if (propertyReflection.isNullable()) {\n property = withNullable(property);\n }\n\n schema.properties ??= {};\n schema.properties[propertyReflection.name] = property;\n if (!propertyReflection.isOptional()) {\n schema.required ??= [];\n schema.required.push(propertyReflection.name);\n }\n }\n\n return schema;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiEA,SAAS,wBACP,OACY;CACZ,QAAQ,OAAR;EACE,KAAK,gBAAgB,SACnB,OAAO;GACL,MAAM;GACN,QAAQ;GACR,YAAY;EACd;EACF,KAAK,gBAAgB,MACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAQ,YAAY;EAAE;EAC1D,KAAK,gBAAgB,OACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAS,YAAY;EAAE;EAC3D,KAAK,gBAAgB,OACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAS,YAAY;EAAE;EAC3D,KAAK,gBAAgB,QACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAU,YAAY;EAAE;EAC5D,KAAK,gBAAgB,OACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAS,YAAY;EAAE;EAC3D,KAAK,gBAAgB,QACnB,OAAO;GAAE,MAAM;GAAW,QAAQ;GAAU,YAAY;EAAE;EAC5D,KAAK,gBAAgB;EACrB,KAAK,gBAAgB,SACnB,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAQ;EAC3C,KAAK,gBAAgB,SACnB,OAAO;GAAE,MAAM;GAAU,QAAQ;EAAS;EAC5C,KAAK;EACL,SACE,OAAO,EAAE,MAAM,SAAS;CAC5B;AACF;AAEA,SAAS,mBAAmB,YAAkB,QAAgC;CAC5E,IACE,CAAC,YAAY,MAAM,KACnB,CAAC,YAAa,YAA0C,IAAI,GAE5D,OAAO;CAGT,MAAM,gBAAgB,EAAE,GAAG,OAAO;CAClC,MAAM,OAAQ,WAAwC;CACtD,IAAI,YAAY,KAAK,KAAK,GACxB,cAAc,QAAQ,KAAK;CAE7B,IAAI,WAAW,KAAK,KAAK,GACvB,cAAc,QAAQ,KAAK;CAE7B,IAAI,CAAC,YAAY,KAAK,MAAM,GAC1B,cAAc,SAAS,KAAK;CAE9B,IAAI,CAAC,YAAY,KAAK,MAAM,GAC1B,cAAc,SAAS,KAAK;CAE9B,IAAI,CAAC,YAAY,KAAK,QAAQ,GAC5B,cAAc,WAAW,KAAK;CAEhC,IAAI,CAAC,YAAY,KAAK,OAAO,GAC3B,cAAc,UAAU,KAAK;CAE/B,IAAI,CAAC,YAAY,KAAK,QAAQ,GAC5B,cAAc,WAAW,KAAK;CAGhC,OAAO;AACT;AAEA,SAAS,aAAa,QAAwC;CAC5D,IAAI,CAAC,YAAY,MAAM,GACrB,OAAO,EACL,OAAO,CAAC,QAAQ;EAAE,MAAM;EAAQ,SAAS;CAAK,CAAC,EACjD;CAGF,MAAM,UAAW,OAAiD;CAElE,MAAM,QAAQ,MAAM,QAAQ,OAAO,IAC/B,CAAC,GAAG,OAAO,IACX,UACE,CAAC,OAAO,IACR,CAAC;CACP,IAAI,CAAC,MAAM,SAAS,MAAM,GACxB,MAAM,KAAK,MAAM;CAGnB,OAAO;EACL,GAAG;EACH,MAAM,MAAM,WAAW,IAAI,MAAM,KAAK;CACxC;AACF;;;;AAKA,SAAgB,uBACd,YACwB;CACxB,OAAO,4BAA4B,UAAU;AAC/C;AAEA,SAAS,4BAA4B,YAA0C;CAC7E,QAAQ,WAAW,MAAnB;EACE,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe,QAClB,OAAO,mBAAmB,YAAY,EAAE,MAAM,WAAW,SAAS,CAAC;EACrE,KAAK,eAAe,OAClB;EACF,KAAK,eAAe;EACpB,KAAK,eAAe,MAClB,OAAO,mBAAmB,YAAY;GACpC,MAAM;GACN,MAAM,WAAW;GACjB,SAAS;EACX,CAAC;EACH,KAAK,eAAe,QAClB,OAAO,mBAAmB,YAAY;GACpC,MAAM;GACN,MAAM,WAAW;EACnB,CAAC;EACH,KAAK,eAAe,SAClB,OAAO,mBAAmB,YAAY;GACpC,MAAM;GACN,MAAM,WAAW;EACnB,CAAC;EACH,KAAK,eAAe,QAGlB,OAAO,mBAAmB,YAFV,wBAAwB,WAAW,KAEP,CAAC;EAE/C,KAAK,eAAe,QAClB,OAAO,mBAAmB,YAAY;GACpC,MAAM;GACN,MAAM,WAAW;GACjB,QAAQ;EACV,CAAC;EACH,KAAK,eAAe,QAClB,OAAO,mBAAmB,YAAY;GACpC,MAAM;GACN,MAAM,WAAW;GACjB,QAAQ;GACR,kBAAkB;EACpB,CAAC;EACH,KAAK,eAAe,SAAS;GAC3B,MAAM,EAAE,YAAY;GACpB,IAAI,SAAS,OAAO,GAClB,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,MAAM,WAAW;IACjB,QAAQ;IACR,OAAO;GACT,CAAC;GAGH,IAAI,SAAS,OAAO,GAClB,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,MAAM,WAAW;IACjB,QAAQ;IACR,OAAO,QAAQ;GACjB,CAAC;GAGH,OAAO,mBAAmB,YAAY;IACpC,MAAM,kBAAkB,OAAO;IAC/B,MAAM,WAAW;IACjB,OAAO;GACT,CAAC;EACH;EACA,KAAK,eAAe,iBAClB,OAAO,mBAAmB,YAAY,EAAE,MAAM,SAAS,CAAC;EAC1D,KAAK,eAAe,MAAM;GACxB,MAAM,SAAS,WAAW,OAAO,QAC/B,UACE,SAAS,KAAK,KACd,UAAU,KAAK,KACf,SAAS,KAAK,KACd,SAAS,KAAK,KACd,UAAU,KAAK,KACf,OAAO,KAAK,CAChB;GACA,IAAI,OAAO,WAAW,GACpB,OAAO,mBAAmB,YAAY;IACpC,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB,MAAM,CAAC;GACT,CAAC;GAGH,OAAO,mBAAmB,YAAY;IACpC,MAAM,OAAO,OAAM,UAAS,SAAS,KAAK,CAAC,IACvC,WACA,OAAO,OAAM,UAAS,UAAU,KAAK,KAAK,SAAS,KAAK,CAAC,IACvD,YACA,OAAO,OAAM,UAAS,SAAS,KAAK,CAAC,IACnC,WACA,OAAO,OAAM,UAAS,UAAU,KAAK,CAAC,IACpC,YACA,OAAO,OAAM,UAAS,OAAO,KAAK,CAAC,IACjC,SACA,OAAO,QAAQ,KAAK,UAAU;KAC5B,MAAM,OAAO,kBAAkB,KAAK;KACpC,IACE,0BAA0B,IAAI,KAC9B,CAAC,IAAI,SAAS,IAAI,GAElB,IAAI,KAAK,IAAI;KAGf,OAAO;IACT,GAAG,CAAC,CAA8B;IAC9C,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB,MAAM;IACN,SAAS,OAAO,WAAW,IAAI,OAAO,KAAK;GAC7C,CAAC;EACH;EACA,KAAK,eAAe,OAAO;GACzB,MAAM,QAAQ,4BAA4B,WAAW,IAAI;GAEzD,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,MAAM,WAAW;IACjB,OAAO,SAAS,CAAC;GACnB,CAAC;EACH;EACA,KAAK,eAAe,OAAO;GACzB,MAAM,QAAQ,WAAW,MACtB,KAAI,WAAU,4BAA4B,OAAO,IAAI,CAAC,EACtD,QAAQ,SAA6B,SAAS,MAAS;GAC1D,IAAI,MAAM,UAAU,GAClB,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,MAAM,WAAW;IACjB,OAAO,MAAM,WAAW,IAAI,MAAM,KAAK,CAAC;GAC1C,CAAC;GAGH,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,MAAM,WAAW;IACjB,aAAa;IACb,UAAU,MAAM;IAChB,UAAU,MAAM;GAClB,CAAC;EACH;EACA,KAAK,eAAe,OAAO;GACzB,MAAM,WAAW,WAAW,MACzB,KAAI,UAAS,4BAA4B,KAAK,CAAC,EAC/C,QAAQ,WAAiC,WAAW,MAAS;GAChE,IACE,CAAC,WAAW,MAAM,MAChB,UACE,MAAM,SAAS,eAAe,QAC9B,MAAM,SAAS,eAAe,SAClC,GAEA,OAAO,mBAAmB,YAAY;IACpC,MAAM,WAAW;IACjB,OAAO;GACT,CAAC;GAGH,MAAM,UAAU,SAAS,QAAO,WAAU,CAAC,qBAAqB,MAAM,CAAC;GACvE,IAAI,QAAQ,WAAW,GACrB,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,SAAS;GACX,CAAC;GAGH,IAAI,QAAQ,WAAW,GAAG;IACxB,MAAM,QAAQ,QAAQ;IAEtB,IAAI,CAAC,YAAY,KAAK,GACpB,OAAO,aACL,mBAAmB,YAAY;KAC7B,MAAM,WAAW;KACjB,OAAO,CAAC,KAAK;IACf,CAAC,CACH;IAGF,OAAO,aACL,mBAAmB,YAAY;KAC7B,MAAM,WAAW;KACjB,GAAI;IACN,CAAC,CACH;GACF;GAEA,MAAM,aAAa,QAChB,KAAI,WACH,YAAY,MAAM,IACb,OAA+B,QAChC,MACN,EACC,QACE,UACC,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,SACrB;GACF,IAAI,WAAW,WAAW,QAAQ,QAChC,OAAO,aACL,mBAAmB,YAAY;IAC7B,MAAM,WAAW;IACjB,MAAM;GACR,CAAC,CACH;GAGF,MAAM,gBAAgB,2BAA2B,WAAW,KAAK;GACjE,IAAI,iBAAiB,YAAY,aAAa,GAC5C,OAAO,aACL,mBAAmB,YAAY;IAC7B,MAAM,WAAW;IACjB,GAAI;GACN,CAAC,CACH;GAGF,OAAO,aACL,mBAAmB,YAAY;IAC7B,MAAM,WAAW;IACjB,OAAO;GACT,CAAC,CACH;EACF;EACA,KAAK,eAAe,cAAc;GAChC,MAAM,UAAU,WAAW,MACxB,KAAI,UAAS,4BAA4B,KAAK,CAAC,EAC/C,QAAQ,SAA6B,SAAS,MAAS;GAC1D,IAAI,QAAQ,WAAW,GACrB;GAEF,IAAI,QAAQ,WAAW,GAAG;IACxB,IAAI,CAAC,YAAY,QAAQ,EAAE,GACzB,OAAO,QAAQ;IAGjB,OAAO,mBAAmB,YAAY;KACpC,MAAM,WAAW;KACjB,GAAG,QAAQ;IACb,CAAC;GACH;GACA,IAAI,QAAQ,MAAM,kBAAkB,GAClC,OAAO,mBAAmB,YAAY;IACpC,MAAM,WAAW;IACjB,GAAG,mBAAmB,OAAO;GAC/B,CAAC;GAEH,OAAO,mBAAmB,YAAY;IACpC,MAAM,WAAW;IACjB,OAAO;GACT,CAAC;EACH;EACA,KAAK,eAAe,SAClB,OAAO,4BAA4B,WAAW,IAAI;EACpD,KAAK,eAAe,eAClB,OAAO,6BAA6B,UAAU;EAChD,KAAK,eAAe,OAGlB,QAFkB,WAAW,WACA,MAC7B;GACE,KAAK,QACH,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,QAAQ;GACV,CAAC;GACH,KAAK,UACH,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,QAAQ;GACV,CAAC;GACH,KAAK,OACH,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,QAAQ;GACV,CAAC;GACH,KAAK,OAAO;IACV,MAAM,WAAW,WAAW,YAAY;IAKxC,OAAO,mBAAmB,YAAY;KACpC,MAAM;KACN,QANY,WACV,4BAA4B,QAAQ,IACpC,WAIc,CAAC;KACjB,aAAa;IACf,CAAC;GACH;GACA,KAAK,OAAO;IACV,MAAM,YAAY,WAAW,YAAY;IAKzC,OAAO,mBAAmB,YAAY;KACpC,MAAM;KACN,uBANa,YACX,4BAA4B,SAAS,IACrC,WAI8B;IAClC,CAAC;GACH;GACA,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,kBACH,OAAO,mBAAmB,YAAY;IACpC,MAAM;IACN,QAAQ;IACR,iBAAiB;GACnB,CAAC;GACH,KAAK;GACL,SACE,OAAO,mBAAmB,YAAY;IACpC,MAAM,WAAW;IACjB,aAAa,WAAW;IACxB,GAAG,6BAA6B,UAAU;GAC5C,CAAC;EACL;EAEF,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,KAAK,eAAe;EACpB,SACE;CACJ;AACF;AAEA,SAAS,mBAAmB,SAA+C;CACzE,MAAM,SAA2B;EAC/B,MAAM;EACN,YAAY,CAAC;EACb,UAAU,CAAC;CACb;CAEA,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,YACT,OAAO,aAAa,KAAK,OAAO,YAAY,OAAO,UAAU;EAE/D,IAAI,OAAO,UACT,OAAO,WAAW,MAAM,KACtB,IAAI,IAAI,CAAC,GAAI,OAAO,YAAY,CAAC,GAAI,GAAG,OAAO,QAAQ,CAAC,CAC1D;EAEF,IAAI,OAAO,yBAAyB,QAClC,OAAO,uBAAuB,OAAO;CAEzC;CAEA,KAAK,OAAO,UAAU,UAAU,OAAO,GACrC,OAAO,OAAO;CAGhB,OAAO;AACT;AAEA,SAAS,2BACP,OACwB;CACxB,MAAM,eAAe,MAAM,QACzB,MAAK,EAAE,SAAS,eAAe,QAAQ,EAAE,SAAS,eAAe,SACnE;CACA,MAAM,iBACJ,aAAa,QACX,MACE,EAAE,SAAS,eAAe,iBAC1B,EAAE,SAAS,eAAe,KAC9B;CAEF,IACE,eAAe,SAAS,KACxB,eAAe,WAAW,aAAa,QAEvC;CAGF,IAAI;CACJ,MAAM,WAA+B,CAAC;CAEtC,KAAK,MAAM,UAAU,gBAAgB;EACnC,MAAM,eAAyD,CAAC;EAChE,KAAK,MAAM,UAAU,OAAO,OAC1B,KACG,OAAO,SAAS,eAAe,YAC9B,OAAO,SAAS,eAAe,sBACjC,OAAO,OAAO,SAAS,YACvB,OAAO,KAAK,SAAS,eAAe,WACpC,OAAQ,OAAO,KAA+B,YAAY,UAE1D,aAAa,KAAK;GAChB,MAAM,OAAO;GACb,SAAU,OAAO,KAA6B;EAChD,CAAC;EAIL,IAAI,aAAa,WAAW,GAC1B;EAGF,MAAM,QAAQ,aAAa;EAC3B,IAAI,CAAC,QACH,SAAS,MAAM;OACV,IAAI,WAAW,MAAM,MAC1B;EAeF,MAAM,OAAO,6BAA6B;GAXxC,GAAG;GACH,OAAO,OAAO,MAAM,QAClB,WACE,GACG,OAAO,SAAS,eAAe,YAC9B,OAAO,SAAS,eAAe,sBACjC,OAAO,SAAS,OAEtB;EAGqD,CAAC;EACxD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,IAAI,GACnC;EAGF,SAAS,KAAK;GACZ,MAAM;GACN,YAAY;KACT,SAAS,EAAE,OAAO,MAAM,QAAQ;IACjC,GAAI,KAAK,cAAc,CAAC;GAC1B;GACA,UAAU,CAAC,QAAQ,GAAI,KAAK,YAAY,CAAC,CAAE;GAC3C,sBAAsB,KAAK,wBAAwB;EACrD,CAAC;CACH;CAEA,IAAI,CAAC,QACH;CAGF,OAAO;EACL,OAAO;EACP,eAAe,EAAE,cAAc,OAAO;CACxC;AACF;AAEA,SAAS,6BACP,MACkB;CAClB,MAAM,aAAa,gBAAgB,KAAK,IAAI;CAE5C,MAAM,SAA2B;EAC/B,MAAM;EACN,MAAM,WAAW,QAAQ;EACzB,aAAa,WAAW,eAAe;EACvC,YAAY,CAAC;EACb,UAAU,CAAC;EACX,UAAU,WAAW,WAAW;EAChC,QAAQ,WAAW,UAAU;EAC7B,UAAU,WAAW,WAAW;EAChC,SAAS,WAAW,UAAU;EAC9B,QAAQ,WAAW,SAAS;EAC5B,YAAY,WACT,aAAa,EACb,KAAI,YAAW,QAAQ,gBAAgB,CAAC;EAC3C,GAAI,YAAY,WAAW,kBAAkB,IACzC,EAAE,oBAAoB,WAAW,mBAAmB,IACpD,CAAC;EACL,GAAI,YAAY,WAAW,QAAQ,CAAC,IAChC,EAAE,MAAM,WAAW,QAAQ,EAAE,IAC7B,CAAC;EACL,GAAI,YAAY,WAAW,eAAe,CAAC,IACvC,EAAE,aAAa,WAAW,eAAe,EAAE,IAC3C,CAAC;EACL,GAAI,WAAW,WAAW,SAAS,CAAC,IAChC,EAAE,OAAO,WAAW,SAAS,EAAE,IAC/B,CAAC;EACL,GAAI,YAAY,WAAW,SAAS,CAAC,IACjC,EAAE,OAAO,WAAW,SAAS,EAAE,IAC/B,CAAC;CACP;CAEA,KAAK,MAAM,sBAAsB,WAAW,cAAc,GAAG;EAC3D,IAAI,mBAAmB,QAAQ,MAAM,eAAe,gBAAgB;GAClE,OAAO,uBACL,4BAA4B,mBAAmB,IAAI,KAAK;GAC1D;EACF;EAEA,IAAI,WAAW,4BACb,mBAAmB,IACrB;EACA,IAAI,CAAC,UACH;EAKF,WAAW;GACT,GAHqB,YAAY,QAAQ,IAAI,WAAW,CAAC;GAIzD,MAAM,mBAAmB,gBAAgB;GACzC,aAAa,mBAAmB,eAAe;GAC/C,UAAU,mBAAmB,WAAW;GACxC,QAAQ,mBAAmB,UAAU;GACrC,UAAU,mBAAmB,WAAW;GACxC,SAAS,mBAAmB,UAAU;GACtC,QAAQ,mBAAmB,SAAS;GACpC,GAAI,mBAAmB,WAAW,IAC9B,EAAE,SAAS,mBAAmB,gBAAgB,EAAE,IAChD,CAAC;GACL,GAAI,WAAW,mBAAmB,UAAU,CAAC,IACzC,EAAE,MAAM,mBAAmB,UAAU,EAAE,IACvC,CAAC;GACL,GAAI,WAAW,mBAAmB,SAAS,CAAC,IACxC,EAAE,OAAO,mBAAmB,SAAS,EAAE,IACvC,CAAC;GACL,GAAI,YAAY,mBAAmB,SAAS,CAAC,IACzC,EAAE,OAAO,mBAAmB,SAAS,EAAE,IACvC,CAAC;EACP;EAEA,IAAI,mBAAmB,WAAW,GAChC,WAAW,aAAa,QAAQ;EAGlC,OAAO,eAAe,CAAC;EACvB,OAAO,WAAW,mBAAmB,QAAQ;EAC7C,IAAI,CAAC,mBAAmB,WAAW,GAAG;GACpC,OAAO,aAAa,CAAC;GACrB,OAAO,SAAS,KAAK,mBAAmB,IAAI;EAC9C;CACF;CAEA,OAAO;AACT"}