@metaobjectsdev/runtime-ts 1.0.12 → 1.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.
Files changed (83) hide show
  1. package/dist/decimal-wire.d.ts +54 -0
  2. package/dist/decimal-wire.d.ts.map +1 -0
  3. package/dist/decimal-wire.js +158 -0
  4. package/dist/decimal-wire.js.map +1 -0
  5. package/dist/drizzle-fastify/filter-allowlist.d.ts +4 -2
  6. package/dist/drizzle-fastify/filter-allowlist.d.ts.map +1 -1
  7. package/dist/drizzle-fastify/filter-allowlist.js +2 -1
  8. package/dist/drizzle-fastify/filter-allowlist.js.map +1 -1
  9. package/dist/drizzle-fastify/filter-parser.d.ts.map +1 -1
  10. package/dist/drizzle-fastify/filter-parser.js +23 -9
  11. package/dist/drizzle-fastify/filter-parser.js.map +1 -1
  12. package/dist/drizzle-fastify/filter-value-format.d.ts.map +1 -1
  13. package/dist/drizzle-fastify/filter-value-format.js +4 -1
  14. package/dist/drizzle-fastify/filter-value-format.js.map +1 -1
  15. package/dist/drizzle-fastify/index.d.ts +8 -0
  16. package/dist/drizzle-fastify/index.d.ts.map +1 -1
  17. package/dist/drizzle-fastify/index.js +4 -2
  18. package/dist/drizzle-fastify/index.js.map +1 -1
  19. package/dist/drizzle-fastify/mount-m2m.d.ts +2 -0
  20. package/dist/drizzle-fastify/mount-m2m.d.ts.map +1 -1
  21. package/dist/drizzle-fastify/mount-m2m.js +2 -1
  22. package/dist/drizzle-fastify/mount-m2m.js.map +1 -1
  23. package/dist/drizzle-fastify/mount-read-only.d.ts +25 -1
  24. package/dist/drizzle-fastify/mount-read-only.d.ts.map +1 -1
  25. package/dist/drizzle-fastify/mount-read-only.js +43 -28
  26. package/dist/drizzle-fastify/mount-read-only.js.map +1 -1
  27. package/dist/extract-object.js +5 -7
  28. package/dist/extract-object.js.map +1 -1
  29. package/dist/hono/index.d.ts +8 -0
  30. package/dist/hono/index.d.ts.map +1 -1
  31. package/dist/hono/index.js +4 -2
  32. package/dist/hono/index.js.map +1 -1
  33. package/dist/hono/mount-read-only.d.ts +25 -1
  34. package/dist/hono/mount-read-only.d.ts.map +1 -1
  35. package/dist/hono/mount-read-only.js +51 -36
  36. package/dist/hono/mount-read-only.js.map +1 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/n2m-resolver.d.ts.map +1 -1
  42. package/dist/n2m-resolver.js +4 -3
  43. package/dist/n2m-resolver.js.map +1 -1
  44. package/dist/net-format.d.ts +8 -0
  45. package/dist/net-format.d.ts.map +1 -0
  46. package/dist/net-format.js +34 -0
  47. package/dist/net-format.js.map +1 -0
  48. package/dist/object-manager.d.ts +20 -7
  49. package/dist/object-manager.d.ts.map +1 -1
  50. package/dist/object-manager.js +68 -13
  51. package/dist/object-manager.js.map +1 -1
  52. package/dist/query-builder.d.ts.map +1 -1
  53. package/dist/query-builder.js +11 -2
  54. package/dist/query-builder.js.map +1 -1
  55. package/dist/relation-resolver.d.ts.map +1 -1
  56. package/dist/relation-resolver.js +11 -11
  57. package/dist/relation-resolver.js.map +1 -1
  58. package/dist/type-coercer.d.ts +1 -1
  59. package/dist/type-coercer.d.ts.map +1 -1
  60. package/dist/type-coercer.js +114 -5
  61. package/dist/type-coercer.js.map +1 -1
  62. package/dist/validator-runner.d.ts.map +1 -1
  63. package/dist/validator-runner.js +192 -35
  64. package/dist/validator-runner.js.map +1 -1
  65. package/package.json +3 -3
  66. package/src/decimal-wire.ts +154 -0
  67. package/src/drizzle-fastify/filter-allowlist.ts +5 -1
  68. package/src/drizzle-fastify/filter-parser.ts +22 -9
  69. package/src/drizzle-fastify/filter-value-format.ts +4 -0
  70. package/src/drizzle-fastify/index.ts +11 -2
  71. package/src/drizzle-fastify/mount-m2m.ts +4 -1
  72. package/src/drizzle-fastify/mount-read-only.ts +68 -31
  73. package/src/extract-object.ts +5 -7
  74. package/src/hono/index.ts +11 -2
  75. package/src/hono/mount-read-only.ts +76 -37
  76. package/src/index.ts +2 -1
  77. package/src/n2m-resolver.ts +4 -2
  78. package/src/net-format.ts +37 -0
  79. package/src/object-manager.ts +80 -18
  80. package/src/query-builder.ts +14 -1
  81. package/src/relation-resolver.ts +15 -14
  82. package/src/type-coercer.ts +116 -5
  83. package/src/validator-runner.ts +195 -32
@@ -1,7 +1,9 @@
1
1
  // Pure function: NEVER throws. ObjectManager wraps a non-ok result in a ValidationError on writes;
2
2
  // om.validate() returns the result directly.
3
- import { isMetaRoot } from "@metaobjectsdev/metadata";
4
- import { TYPE_FIELD, TYPE_VALIDATOR, VALIDATOR_SUBTYPE_REQUIRED, VALIDATOR_SUBTYPE_LENGTH, VALIDATOR_SUBTYPE_REGEX, FIELD_SUBTYPE_STRING, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_UUID, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_REQUIRED, FIELD_ATTR_MAX_LENGTH, FIELD_ATTR_DEFAULT, FIELD_ATTR_DB_COLUMN_TYPE, DB_COLUMN_TYPE_JSONB, FIELD_ATTR_OBJECT_REF, PACKAGE_SEPARATOR, OBJECT_SUBTYPE_VALUE, VALIDATOR_ATTR_MIN, VALIDATOR_ATTR_MAX, VALIDATOR_ATTR_PATTERN, } from "@metaobjectsdev/metadata";
3
+ import { isMetaObject, isMetaRoot, refTarget } from "@metaobjectsdev/metadata";
4
+ import { TYPE_FIELD, TYPE_VALIDATOR, VALIDATOR_SUBTYPE_REQUIRED, VALIDATOR_SUBTYPE_LENGTH, VALIDATOR_SUBTYPE_REGEX, FIELD_SUBTYPE_STRING, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_UUID, FIELD_SUBTYPE_OBJECT, FIELD_SUBTYPE_MAP, FIELD_SUBTYPE_DECIMAL, FIELD_ATTR_PRECISION, FIELD_ATTR_SCALE, FIELD_ATTR_REQUIRED, FIELD_ATTR_MAX_LENGTH, FIELD_ATTR_DEFAULT, FIELD_ATTR_DB_COLUMN_TYPE, DB_COLUMN_TYPE_JSONB, FIELD_ATTR_OBJECT_REF, OBJECT_SUBTYPE_VALUE, VALIDATOR_ATTR_MIN, VALIDATOR_ATTR_MAX, VALIDATOR_ATTR_PATTERN, VALIDATOR_SUBTYPE_NUMERIC, VALIDATOR_SUBTYPE_ARRAY, FIELD_SUBTYPE_URI, FIELD_SUBTYPE_INET, FIELD_ATTR_LENIENT, IDENTITY_ATTR_FIELDS, IDENTITY_ATTR_GENERATION, GENERATION_INCREMENT, GENERATION_UUID, } from "@metaobjectsdev/metadata";
5
+ import { decimalFits, parseDecimalInput } from "./decimal-wire.js";
6
+ import { isAbsoluteUri, isInetLiteral } from "./net-format.js";
5
7
  // JS-safe numeric fields: must arrive as a JS `number` (they fit in 2^53).
6
8
  const NUMERIC_FIELD_SUBTYPES = new Set([
7
9
  FIELD_SUBTYPE_INT,
@@ -20,6 +22,7 @@ const INT64_FIELD_SUBTYPES = new Set([
20
22
  const INT64_STRING_RE = /^-?\d+$/;
21
23
  export function runValidators(entity, data, opts = {}) {
22
24
  const errors = [];
25
+ const assignedPk = assignedPkFieldNames(entity);
23
26
  // Effective children so a TPH subtype validates inherited base fields too.
24
27
  for (const field of entity.children()) {
25
28
  if (field.type !== TYPE_FIELD)
@@ -33,7 +36,11 @@ export function runValidators(entity, data, opts = {}) {
33
36
  const required = isRequired(field);
34
37
  // ADR-0039: effective attr — @default may be inherited via extends.
35
38
  const hasDefault = field.attr(FIELD_ATTR_DEFAULT) !== undefined;
36
- if (required && (value === undefined || value === null)) {
39
+ // An ASSIGNED primary key must be supplied whatever @required says: nothing else can
40
+ // produce the value. That is presence only — the non-empty-string floor below stays
41
+ // tied to a DECLARED required, as in the generated InsertSchema.
42
+ const mustBePresent = required || assignedPk.has(field.name);
43
+ if (mustBePresent && (value === undefined || value === null)) {
37
44
  if (opts.partial && !present)
38
45
  continue;
39
46
  // A @default exempts a required field only when it is ABSENT (the DB fills
@@ -81,6 +88,8 @@ export function runValidators(entity, data, opts = {}) {
81
88
  continue;
82
89
  }
83
90
  const elements = field.resolvedIsArray() ? value : [value];
91
+ if (field.resolvedIsArray())
92
+ errors.push(...arraySizeErrors(field, elements.length));
84
93
  elements.forEach((el, i) => {
85
94
  if (typeof el !== "object" || el === null || Array.isArray(el)) {
86
95
  errors.push({
@@ -103,6 +112,38 @@ export function runValidators(entity, data, opts = {}) {
103
112
  }
104
113
  continue;
105
114
  }
115
+ // A map of value objects (`field.map @objectRef`): every map value is a VO validated in full,
116
+ // as an array element is. The keys are arbitrary text and are never compared with the VO's
117
+ // member names. A map whose value is a scalar (@valueType) is unchanged.
118
+ if (field.subType === FIELD_SUBTYPE_MAP) {
119
+ const vo = resolveVoRef(field);
120
+ if (vo !== undefined) {
121
+ if (typeof value !== "object" || Array.isArray(value)) {
122
+ errors.push({
123
+ field: field.name, rule: "type",
124
+ message: `'${field.name}' must be a map of ${vo.name}`,
125
+ expected: "object", received: Array.isArray(value) ? "array" : typeof value,
126
+ });
127
+ continue;
128
+ }
129
+ for (const [key, el] of Object.entries(value)) {
130
+ if (typeof el !== "object" || el === null || Array.isArray(el)) {
131
+ errors.push({
132
+ field: `${field.name}.${key}`, rule: "type",
133
+ message: `'${field.name}.${key}' must be a ${vo.name} object`,
134
+ expected: vo.name, received: el === null ? "null" : Array.isArray(el) ? "array" : typeof el,
135
+ });
136
+ continue;
137
+ }
138
+ const sub = runValidators(vo, el);
139
+ if (!sub.ok) {
140
+ for (const e of sub.errors)
141
+ errors.push({ ...e, field: `${field.name}.${key}.${e.field}` });
142
+ }
143
+ }
144
+ continue;
145
+ }
146
+ }
106
147
  // A scalar array (`field.string isArray`, …) — stored as a native array or a JSON array.
107
148
  // Each element is checked against the element rules; an element error names its index,
108
149
  // as the value-object branch above does. ADR-0039: resolving `isArray`.
@@ -115,6 +156,7 @@ export function runValidators(entity, data, opts = {}) {
115
156
  });
116
157
  continue;
117
158
  }
159
+ errors.push(...arraySizeErrors(field, value.length));
118
160
  value.forEach((el, i) => {
119
161
  if (el === null || el === undefined)
120
162
  return;
@@ -127,8 +169,7 @@ export function runValidators(entity, data, opts = {}) {
127
169
  return errors.length === 0 ? { ok: true } : { ok: false, errors };
128
170
  }
129
171
  /** Resolve a `field.object`'s `@objectRef` to its value-object MetaData by walking
130
- * to the tree root. The ref may be a bare name or a `pkg::Name` FQN. Mirrors the
131
- * extract-object resolver. Returns undefined when unresolvable OR when the target
172
+ * to the tree root. The ref may be a bare name or a `pkg::Name` FQN. Returns undefined when unresolvable OR when the target
132
173
  * is not an `object.value` (→ no VO recursion). Cross-port parity: C#/Java/Kotlin
133
174
  * gate the recursion on the ref being a value object, so a `field.object @objectRef`
134
175
  * pointing at a non-value object validates identically (skipped) on every port.
@@ -143,12 +184,9 @@ function resolveVoRef(field) {
143
184
  // resolving, skipping nested value-object validation with no error.
144
185
  if (!isMetaRoot(root))
145
186
  return undefined;
146
- let target = root.findObject(ref);
147
- if (target === undefined) {
148
- const sep = ref.lastIndexOf(PACKAGE_SEPARATOR);
149
- if (sep >= 0)
150
- target = root.findObject(ref.slice(sep + PACKAGE_SEPARATOR.length));
151
- }
187
+ // ADR-0059 R7 — the object the loader bound `@objectRef` to, resolved in the package
188
+ // of the node that declared it — never a same-named object in some other package.
189
+ const target = refTarget(field, FIELD_ATTR_OBJECT_REF);
152
190
  return target?.subType === OBJECT_SUBTYPE_VALUE ? target : undefined;
153
191
  }
154
192
  function isRequired(field) {
@@ -161,37 +199,92 @@ function isRequired(field) {
161
199
  }
162
200
  return false;
163
201
  }
164
- function resolveMaxLength(field) {
165
- // ADR-0039: effective — @maxLength and a length-validator may be inherited via extends.
166
- const attr = field.attr(FIELD_ATTR_MAX_LENGTH);
167
- if (typeof attr === "number")
168
- return attr;
202
+ /** Primary-identity field names the CALLER must supply: the identity carries no
203
+ * store-side `@generation` (increment / uuid). A `@default` on the field still lets the
204
+ * caller omit it — the `hasDefault` exemption at the call site covers that. */
205
+ function assignedPkFieldNames(entity) {
206
+ // isMetaObject, not `instanceof` — see resolveVoRef.
207
+ const primary = isMetaObject(entity) ? entity.primaryIdentity() : undefined;
208
+ if (primary === undefined)
209
+ return new Set();
210
+ // ADR-0039: effective — an identity may be inherited via extends.
211
+ const generation = primary.attr(IDENTITY_ATTR_GENERATION);
212
+ if (generation === GENERATION_INCREMENT || generation === GENERATION_UUID)
213
+ return new Set();
214
+ const fields = primary.attr(IDENTITY_ATTR_FIELDS);
215
+ if (Array.isArray(fields))
216
+ return new Set(fields.map(String));
217
+ return typeof fields === "string" ? new Set([fields]) : new Set();
218
+ }
219
+ /** The `@min` / `@max` of the field's validators of one subtype (last authored wins). */
220
+ function validatorBounds(field, validatorSubType) {
221
+ const bounds = {};
222
+ // ADR-0039: effective — a validator and its bounds may be inherited via extends.
169
223
  for (const child of field.children()) {
170
- if (child.type !== TYPE_VALIDATOR)
171
- continue;
172
- if (child.subType !== VALIDATOR_SUBTYPE_LENGTH)
224
+ if (child.type !== TYPE_VALIDATOR || child.subType !== validatorSubType)
173
225
  continue;
226
+ const min = child.attr(VALIDATOR_ATTR_MIN);
174
227
  const max = child.attr(VALIDATOR_ATTR_MAX);
228
+ if (typeof min === "number")
229
+ bounds.min = min;
175
230
  if (typeof max === "number")
176
- return max;
231
+ bounds.max = max;
177
232
  }
178
- return undefined;
233
+ return bounds;
179
234
  }
180
- function resolveMinLength(field) {
181
- // ADR-0039: effective — a length-validator may be inherited via extends.
235
+ /** String length bounds. Max is strictest-wins across `@maxLength` and every
236
+ * `validator.length @max` (FR-036 A3). Min is the authored `validator.length @min`,
237
+ * undefined when none was authored. */
238
+ function lengthBounds(field) {
239
+ const bounds = {};
240
+ // ADR-0039: effective — @maxLength and a length-validator may be inherited via extends.
241
+ const attr = field.attr(FIELD_ATTR_MAX_LENGTH);
242
+ if (typeof attr === "number")
243
+ bounds.max = attr;
182
244
  for (const child of field.children()) {
183
- if (child.type !== TYPE_VALIDATOR)
184
- continue;
185
- if (child.subType !== VALIDATOR_SUBTYPE_LENGTH)
245
+ if (child.type !== TYPE_VALIDATOR || child.subType !== VALIDATOR_SUBTYPE_LENGTH)
186
246
  continue;
187
247
  const min = child.attr(VALIDATOR_ATTR_MIN);
248
+ const max = child.attr(VALIDATOR_ATTR_MAX);
188
249
  if (typeof min === "number")
189
- return min;
250
+ bounds.min = min;
251
+ if (typeof max === "number")
252
+ bounds.max = bounds.max === undefined ? max : Math.min(bounds.max, max);
253
+ }
254
+ return bounds;
255
+ }
256
+ /** `validator.array @min/@max` — element-count bounds on an array field of any element type. */
257
+ function arraySizeErrors(field, size) {
258
+ const { min, max } = validatorBounds(field, VALIDATOR_SUBTYPE_ARRAY);
259
+ const errors = [];
260
+ if (min !== undefined && size < min) {
261
+ errors.push({
262
+ field: field.name, rule: "array",
263
+ message: `'${field.name}' must have at least ${min} items (got ${size})`,
264
+ expected: { min }, received: size,
265
+ });
190
266
  }
267
+ if (max !== undefined && size > max) {
268
+ errors.push({
269
+ field: field.name, rule: "array",
270
+ message: `'${field.name}' must have at most ${max} items (got ${size})`,
271
+ expected: { max }, received: size,
272
+ });
273
+ }
274
+ return errors;
275
+ }
276
+ /** The comparable numeric value of a type-checked numeric field value. An int64 arrives
277
+ * as a number, a bigint or a base-10 integer string; the string compares as an integer. */
278
+ function comparable(value) {
279
+ if (typeof value === "number" || typeof value === "bigint")
280
+ return value;
281
+ if (typeof value === "string" && INT64_STRING_RE.test(value))
282
+ return BigInt(value);
191
283
  return undefined;
192
284
  }
193
285
  function checkType(subType, value) {
194
- if (subType === FIELD_SUBTYPE_STRING || subType === FIELD_SUBTYPE_UUID) {
286
+ if (subType === FIELD_SUBTYPE_STRING || subType === FIELD_SUBTYPE_UUID
287
+ || subType === FIELD_SUBTYPE_URI || subType === FIELD_SUBTYPE_INET) {
195
288
  if (typeof value !== "string")
196
289
  return `expected string`;
197
290
  }
@@ -213,6 +306,32 @@ function checkType(subType, value) {
213
306
  }
214
307
  return null;
215
308
  }
309
+ /**
310
+ * ADR-0019 Amendment 1 (W2, W3) on a write: a decimal is a string in the JSON-number grammar or a
311
+ * JSON number a double holds exactly, and must fit the declared `@precision` / `@scale`. Refused
312
+ * here, as a validation failure, so the write answers 400 rather than failing later in the coercer.
313
+ */
314
+ function decimalErrors(field, value, label) {
315
+ const canonical = parseDecimalInput(value);
316
+ if (canonical === undefined) {
317
+ return [{
318
+ field: label, rule: "type",
319
+ message: `'${label}' must be a decimal number (a string in the JSON-number grammar, or a number a double holds exactly: send a string for more than 15 significant digits)`,
320
+ expected: FIELD_SUBTYPE_DECIMAL, received: typeof value,
321
+ }];
322
+ }
323
+ // ADR-0039: effective attrs — @precision / @scale may be inherited via extends.
324
+ const precision = field.attr(FIELD_ATTR_PRECISION);
325
+ const scale = field.attr(FIELD_ATTR_SCALE);
326
+ if (!decimalFits(canonical, typeof precision === "number" ? precision : undefined, typeof scale === "number" ? scale : undefined)) {
327
+ return [{
328
+ field: label, rule: "range",
329
+ message: `'${label}' (${canonical}) does not fit @precision ${String(precision)} / @scale ${String(scale ?? 0)}`,
330
+ expected: { precision, scale }, received: canonical,
331
+ }];
332
+ }
333
+ return [];
334
+ }
216
335
  /**
217
336
  * The type, length and regex errors for one scalar value of `field` — the whole field
218
337
  * value, or one element of a scalar array (then `required` is false: element presence is not
@@ -220,6 +339,8 @@ function checkType(subType, value) {
220
339
  */
221
340
  function scalarErrors(field, value, required, label) {
222
341
  const errors = [];
342
+ if (field.subType === FIELD_SUBTYPE_DECIMAL)
343
+ return decimalErrors(field, value, label);
223
344
  const typeError = checkType(field.subType, value);
224
345
  if (typeError !== null) {
225
346
  errors.push({
@@ -231,8 +352,7 @@ function scalarErrors(field, value, required, label) {
231
352
  });
232
353
  return errors;
233
354
  }
234
- const maxLen = resolveMaxLength(field);
235
- const minLen = resolveMinLength(field);
355
+ const { min: minLen, max: maxLen } = lengthBounds(field);
236
356
  if (typeof value === "string") {
237
357
  if (maxLen !== undefined && value.length > maxLen) {
238
358
  errors.push({
@@ -243,11 +363,11 @@ function scalarErrors(field, value, required, label) {
243
363
  received: value.length,
244
364
  });
245
365
  }
246
- // FR-036 Pin 1: a @required string is non-empty. The effective floor is
247
- // max(@min, 1) so the runtime OM rejects "" for a required string exactly as
248
- // the generated Zod InsertSchema (.min(1)) does — the two enforcement surfaces
249
- // stay in lockstep. A non-required field keeps its authored @min.
250
- const effectiveMin = Math.max(minLen ?? 0, required ? 1 : 0);
366
+ // FR-036 Pin 1: a @required string is non-empty by default (an implicit floor of 1),
367
+ // but an explicitly authored `validator.length @min` is ALWAYS authoritative over that
368
+ // floor (#224 / ADR-0044): `@min: 0` opts back to presence-only. Same rule as the
369
+ // generated Zod InsertSchema, so the two enforcement surfaces stay in lockstep.
370
+ const effectiveMin = minLen !== undefined ? minLen : required ? 1 : 0;
251
371
  if (effectiveMin > 0 && value.length < effectiveMin) {
252
372
  errors.push({
253
373
  field: label,
@@ -295,6 +415,43 @@ function scalarErrors(field, value, required, label) {
295
415
  });
296
416
  }
297
417
  }
418
+ // validator.numeric @min/@max — inclusive value bounds on a numeric field.
419
+ if (NUMERIC_FIELD_SUBTYPES.has(field.subType) || INT64_FIELD_SUBTYPES.has(field.subType)) {
420
+ const num = comparable(value);
421
+ const { min, max } = validatorBounds(field, VALIDATOR_SUBTYPE_NUMERIC);
422
+ if (num !== undefined && min !== undefined && num < min) {
423
+ errors.push({
424
+ field: label, rule: "numeric",
425
+ message: `'${label}' must be at least ${min} (got ${value})`,
426
+ expected: { min }, received: value,
427
+ });
428
+ }
429
+ if (num !== undefined && max !== undefined && num > max) {
430
+ errors.push({
431
+ field: label, rule: "numeric",
432
+ message: `'${label}' must be at most ${max} (got ${value})`,
433
+ expected: { max }, received: value,
434
+ });
435
+ }
436
+ }
437
+ // field.uri / field.inet — the strict format contract, unless @lenient opts out.
438
+ // ADR-0039: effective — @lenient may be inherited via extends.
439
+ if (typeof value === "string" && field.attr(FIELD_ATTR_LENIENT) !== true) {
440
+ if (field.subType === FIELD_SUBTYPE_URI && !isAbsoluteUri(value)) {
441
+ errors.push({
442
+ field: label, rule: "format",
443
+ message: `'${label}' must be an absolute URI`,
444
+ expected: "uri", received: value,
445
+ });
446
+ }
447
+ if (field.subType === FIELD_SUBTYPE_INET && !isInetLiteral(value)) {
448
+ errors.push({
449
+ field: label, rule: "format",
450
+ message: `'${label}' must be an IPv4 or IPv6 address`,
451
+ expected: "inet", received: value,
452
+ });
453
+ }
454
+ }
298
455
  return errors;
299
456
  }
300
457
  //# sourceMappingURL=validator-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,6CAA6C;AAE7C,OAAO,EAAE,UAAU,EAAiB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACL,UAAU,EAAE,cAAc,EAC1B,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAC7E,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAC3D,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EACjE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAC/D,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAC9D,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EACtE,iBAAiB,EAAE,oBAAoB,EACvC,kBAAkB,EAAE,kBAAkB,EAAE,sBAAsB,GAC/D,MAAM,0BAA0B,CAAC;AAOlC,2EAA2E;AAC3E,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS;IAC7C,iBAAiB;IACjB,oBAAoB,EAAE,mBAAmB;CAC1C,CAAC,CAAC;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,oEAAoE;AACpE,kFAAkF;AAClF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAC3C,kBAAkB,EAAE,sBAAsB;CAC3C,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,eAAe,GAAG,SAAS,CAAC;AAclC,MAAM,UAAU,aAAa,CAC3B,MAAgB,EAChB,IAA6B,EAC7B,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,kGAAkG;QAClG,wEAAwE;QACxE,4EAA4E;QAC5E,oCAAoC;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,oEAAoE;QACpE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;QAChE,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvC,2EAA2E;YAC3E,2EAA2E;YAC3E,6EAA6E;YAC7E,4EAA4E;YAC5E,IAAI,UAAU,IAAI,CAAC,OAAO;gBAAE,SAAS;YACrC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,eAAe;aACvC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAEpD,6EAA6E;QAC7E,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,8DAA8D;QAC9D,6FAA6F;QAC7F,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,oBAAoB,EAAE,CAAC;YAChH,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,4EAA4E;QAC5E,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,IAAI,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC;wBACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;wBAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,yBAAyB,EAAE,CAAC,IAAI,EAAE;wBACzD,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK;qBAC1C,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAc,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAE,KAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACrF,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;oBACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC/D,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;4BAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC,IAAI,SAAS;4BACtD,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;yBAC9D,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBACD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,EAA6B,CAAC,CAAC;oBAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;4BAC3B,MAAM,CAAC,IAAI,CAAC;gCACV,GAAG,CAAC;gCACJ,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;6BAC/F,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,yFAAyF;QACzF,uFAAuF;QACvF,wEAAwE;QACxE,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;oBAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,oBAAoB;oBAC3C,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK;iBAC1C,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACtB,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS;oBAAE,OAAO;gBAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED;;;;;;qEAMqE;AACrE,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,gFAAgF;IAChF,0EAA0E;IAC1E,oEAAoE;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,GAAG,IAAI,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAM,EAAE,OAAO,KAAK,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,yFAAyF;IACzF,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,KAAK,0BAA0B;YAAE,OAAO,IAAI,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,wFAAwF;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAAE,SAAS;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,yEAAyE;IACzE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAAE,SAAS;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,KAAc;IAChD,IAAI,OAAO,KAAK,oBAAoB,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,4EAA4E;QAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,+DAA+D,CAAC;IACzE,CAAC;SAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,kBAAkB,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAe,EAAE,KAAc,EAAE,QAAiB,EAAE,KAAa;IACrF,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,QAAQ,EAAE,OAAO,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,KAAK,qBAAqB,MAAM,eAAe,KAAK,CAAC,MAAM,GAAG;gBAC3E,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;gBACzB,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QACD,wEAAwE;QACxE,6EAA6E;QAC7E,+EAA+E;QAC/E,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,KAAK,sBAAsB,YAAY,eAAe,KAAK,CAAC,MAAM,GAAG;gBAClF,QAAQ,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;gBAC/B,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,uBAAuB;YAAE,SAAS;QACxD,wDAAwD;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnD,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,2EAA2E;YAC3E,4EAA4E;YAC5E,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,KAAK,uCAAuC,OAAO,EAAE;gBAClE,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,KAAK,mCAAmC;gBACrD,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,6CAA6C;AAE7C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EACL,UAAU,EAAE,cAAc,EAC1B,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAC7E,oBAAoB,EAAE,iBAAiB,EAAE,kBAAkB,EAC3D,oBAAoB,EAAE,mBAAmB,EAAE,sBAAsB,EACjE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,qBAAqB,EACzG,oBAAoB,EAAE,gBAAgB,EACtC,mBAAmB,EAAE,qBAAqB,EAAE,kBAAkB,EAC9D,yBAAyB,EAAE,oBAAoB,EAAE,qBAAqB,EACtE,oBAAoB,EACpB,kBAAkB,EAAE,kBAAkB,EAAE,sBAAsB,EAC9D,yBAAyB,EAAE,uBAAuB,EAClD,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EACzD,oBAAoB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,eAAe,GACtF,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM/D,2EAA2E;AAC3E,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAS;IAC7C,iBAAiB;IACjB,oBAAoB,EAAE,mBAAmB;CAC1C,CAAC,CAAC;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,oEAAoE;AACpE,kFAAkF;AAClF,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAS;IAC3C,kBAAkB,EAAE,sBAAsB;CAC3C,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2EAA2E;AAC3E,MAAM,eAAe,GAAG,SAAS,CAAC;AAclC,MAAM,UAAU,aAAa,CAC3B,MAAgB,EAChB,IAA6B,EAC7B,OAA0B,EAAE;IAE5B,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEhD,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,kGAAkG;QAClG,wEAAwE;QACxE,4EAA4E;QAC5E,oCAAoC;QACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,oEAAoE;QACpE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,SAAS,CAAC;QAChE,qFAAqF;QACrF,oFAAoF;QACpF,iEAAiE;QACjE,MAAM,aAAa,GAAG,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,aAAa,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvC,2EAA2E;YAC3E,2EAA2E;YAC3E,6EAA6E;YAC7E,4EAA4E;YAC5E,IAAI,UAAU,IAAI,CAAC,OAAO;gBAAE,SAAS;YACrC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,eAAe;aACvC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAEpD,6EAA6E;QAC7E,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,8DAA8D;QAC9D,6FAA6F;QAC7F,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,oBAAoB,EAAE,CAAC;YAChH,SAAS;QACX,CAAC;QAED,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,4EAA4E;QAC5E,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,KAAK,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,IAAI,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC;wBACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;wBAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,yBAAyB,EAAE,CAAC,IAAI,EAAE;wBACzD,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK;qBAC1C,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAc,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAE,KAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACrF,IAAI,KAAK,CAAC,eAAe,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBACrF,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;oBACzB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC/D,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;4BAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC,IAAI,SAAS;4BACtD,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;yBAC9D,CAAC,CAAC;wBACH,OAAO;oBACT,CAAC;oBACD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,EAA6B,CAAC,CAAC;oBAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;4BAC3B,MAAM,CAAC,IAAI,CAAC;gCACV,GAAG,CAAC;gCACJ,KAAK,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;6BAC/F,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,8FAA8F;QAC9F,2FAA2F;QAC3F,yEAAyE;QACzE,IAAI,KAAK,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;YACxC,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtD,MAAM,CAAC,IAAI,CAAC;wBACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;wBAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,sBAAsB,EAAE,CAAC,IAAI,EAAE;wBACtD,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK;qBAC5E,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;oBACzE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC/D,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM;4BAC3C,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC,IAAI,SAAS;4BAC7D,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE;yBAC5F,CAAC,CAAC;wBACH,SAAS;oBACX,CAAC;oBACD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,EAAE,EAA6B,CAAC,CAAC;oBAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;wBACZ,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM;4BAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC9F,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;QACH,CAAC;QAED,yFAAyF;QACzF,uFAAuF;QACvF,wEAAwE;QACxE,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM;oBAC/B,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,oBAAoB;oBAC3C,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK;iBAC1C,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACrD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBACtB,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS;oBAAE,OAAO;gBAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpE,CAAC;AAED;;;;;qEAKqE;AACrE,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,gFAAgF;IAChF,0EAA0E;IAC1E,oEAAoE;IACpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,qFAAqF;IACrF,kFAAkF;IAClF,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACvD,OAAO,MAAM,EAAE,OAAO,KAAK,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,KAAe;IACjC,yFAAyF;IACzF,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,KAAK,0BAA0B;YAAE,OAAO,IAAI,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;gFAEgF;AAChF,SAAS,oBAAoB,CAAC,MAAgB;IAC5C,qDAAqD;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC5C,kEAAkE;IAClE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,UAAU,KAAK,oBAAoB,IAAI,UAAU,KAAK,eAAe;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC5F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;AACpE,CAAC;AAID,yFAAyF;AACzF,SAAS,eAAe,CAAC,KAAe,EAAE,gBAAwB;IAChE,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,iFAAiF;IACjF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,KAAK,gBAAgB;YAAE,SAAS;QAClF,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;wCAEwC;AACxC,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,wFAAwF;IACxF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,OAAO,KAAK,wBAAwB;YAAE,SAAS;QAC1F,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gGAAgG;AAChG,SAAS,eAAe,CAAC,KAAe,EAAE,IAAY;IACpD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IACrE,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO;YAChC,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,wBAAwB,GAAG,eAAe,IAAI,GAAG;YACxE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI;SAClC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO;YAChC,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,uBAAuB,GAAG,eAAe,IAAI,GAAG;YACvE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;4FAC4F;AAC5F,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,OAAe,EAAE,KAAc;IAChD,IAAI,OAAO,KAAK,oBAAoB,IAAI,OAAO,KAAK,kBAAkB;WAC/D,OAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,iBAAiB,CAAC;IAC1D,CAAC;SAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,4EAA4E;QAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1E,OAAO,+DAA+D,CAAC;IACzE,CAAC;SAAM,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,kBAAkB,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAe,EAAE,KAAc,EAAE,KAAa;IACnE,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC;gBACN,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM;gBAC1B,OAAO,EAAE,IAAI,KAAK,yJAAyJ;gBAC3K,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,OAAO,KAAK;aACxD,CAAC,CAAC;IACL,CAAC;IACD,gFAAgF;IAChF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QAClI,OAAO,CAAC;gBACN,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO;gBAC3B,OAAO,EAAE,IAAI,KAAK,MAAM,SAAS,6BAA6B,MAAM,CAAC,SAAS,CAAC,aAAa,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE;gBAChH,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS;aACpD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,KAAe,EAAE,KAAc,EAAE,QAAiB,EAAE,KAAa;IACrF,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,KAAK,CAAC,OAAO,KAAK,qBAAqB;QAAE,OAAO,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,KAAK,CAAC,OAAO;YACvB,QAAQ,EAAE,OAAO,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,KAAK,qBAAqB,MAAM,eAAe,KAAK,CAAC,MAAM,GAAG;gBAC3E,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;gBACzB,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QACD,qFAAqF;QACrF,uFAAuF;QACvF,kFAAkF;QAClF,gFAAgF;QAChF,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,IAAI,YAAY,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,KAAK,sBAAsB,YAAY,eAAe,KAAK,CAAC,MAAM,GAAG;gBAClF,QAAQ,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE;gBAC/B,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,uBAAuB;YAAE,SAAS;QACxD,wDAAwD;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnD,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,2EAA2E;YAC3E,4EAA4E;YAC5E,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,KAAK,uCAAuC,OAAO,EAAE;gBAClE,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,IAAI,KAAK,mCAAmC;gBACrD,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzF,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACvE,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS;gBAC7B,OAAO,EAAE,IAAI,KAAK,sBAAsB,GAAG,SAAS,KAAK,GAAG;gBAC5D,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK;aACnC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS;gBAC7B,OAAO,EAAE,IAAI,KAAK,qBAAqB,GAAG,SAAS,KAAK,GAAG;gBAC3D,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,+DAA+D;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC;QACzE,IAAI,KAAK,CAAC,OAAO,KAAK,iBAAiB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ;gBAC5B,OAAO,EAAE,IAAI,KAAK,2BAA2B;gBAC7C,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK;aACjC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,kBAAkB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ;gBAC5B,OAAO,EAAE,IAAI,KAAK,mCAAmC;gBACrD,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/runtime-ts",
3
- "version": "1.0.12",
3
+ "version": "1.1.0",
4
4
  "description": "Node-side runtime helpers for MetaObjects: Fastify route builders, Drizzle filter/sort integration, Kysely drivers.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -64,8 +64,8 @@
64
64
  "access": "public"
65
65
  },
66
66
  "dependencies": {
67
- "@metaobjectsdev/metadata": "1.0.12",
68
- "@metaobjectsdev/render": "1.0.12",
67
+ "@metaobjectsdev/metadata": "1.1.0",
68
+ "@metaobjectsdev/render": "1.1.0",
69
69
  "qs": "^6.13.0"
70
70
  },
71
71
  "peerDependencies": {
@@ -0,0 +1,154 @@
1
+ // The wire form of a field.decimal — ADR-0019 Amendment 1 (W1-W4). The ONE decimal boundary of
2
+ // the TypeScript runtime: every decimal column of an entity, a projection or a report, on every
3
+ // dialect, crosses to a client through here, and every decimal a client sends comes in through
4
+ // here (filter operands) or through the same grammar (the generated Zod write schemas, which
5
+ // carry a local copy of `canonicalDecimal` because generated model code imports nothing from
6
+ // MetaObjects; test/decimal-wire.test.ts holds both to fixtures/decimal-wire/vectors.json).
7
+ //
8
+ // W1 A decimal is a JSON string in canonical form, `^-?(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$`:
9
+ // plain notation, no exponent, no trailing fractional zeros, zero as "0". The server never
10
+ // formats a scale; a client that wants `12.50` formats with the field's `@scale`.
11
+ // W2 Input is a string in the JSON-number grammar (an exponent is allowed on input only) or a
12
+ // JSON number. Anything else is refused: `parseDecimalInput` answers `undefined`.
13
+ // W3 A value the declared column cannot hold is an error, never a silent rounding
14
+ // (`decimalFits`, applied by the generated write schemas).
15
+ // W4 SQLite and D1 have no decimal type: a decimal on them is a double, exact to 15 significant
16
+ // digits. The read path renders the double with 15 significant digits, then canonicalizes
17
+ // it, so `0.1 + 0.2` reads `"0.3"` (`decimalFromDouble15`).
18
+ //
19
+ // A string is never turned into a number on the way (no `Number()` on a decimal anywhere): an
20
+ // operand or a body value stays text, and is bound to SQL as text.
21
+
22
+ /** W2: the JSON-number grammar, exponent allowed. No whitespace, no leading `+`, no bare point. */
23
+ export const DECIMAL_INPUT_RE = /^(-?)(0|[1-9][0-9]*)(?:\.([0-9]+))?(?:[eE]([+-]?[0-9]+))?$/;
24
+
25
+ /** W1: the canonical spelling a decimal takes on the wire. */
26
+ export const DECIMAL_CANONICAL_RE = /^-?(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$/;
27
+
28
+ /** An expanded value longer than this many digits is out of range (W3): `1e999999999` must not allocate. */
29
+ const MAX_EXPANDED_DIGITS = 1000;
30
+
31
+ /**
32
+ * W1 + W2: parse `text` (the JSON-number grammar) and answer its canonical string, or `undefined`
33
+ * when it is not a number in that grammar or is too large to expand. Exact: it works on the digits
34
+ * and the exponent, never on a double.
35
+ */
36
+ export function canonicalDecimal(text: string): string | undefined {
37
+ const m = DECIMAL_INPUT_RE.exec(text);
38
+ if (m === null) return undefined;
39
+ const negative = m[1] === "-";
40
+ const intPart = m[2] ?? "";
41
+ const fracPart = m[3] ?? "";
42
+ const exponent = m[4] === undefined ? 0 : Number(m[4]);
43
+ if (!Number.isSafeInteger(exponent) || Math.abs(exponent) > MAX_EXPANDED_DIGITS) return undefined;
44
+ let digits = intPart + fracPart;
45
+ let point = intPart.length + exponent; // the decimal point sits after `point` digits
46
+ const lead = digits.length - digits.replace(/^0+/, "").length;
47
+ digits = digits.slice(lead);
48
+ point -= lead;
49
+ digits = digits.replace(/0+$/, "");
50
+ if (digits.length === 0) return "0";
51
+ let plain: string;
52
+ if (point <= 0) plain = `0.${"0".repeat(-point)}${digits}`;
53
+ else if (point >= digits.length) plain = digits + "0".repeat(point - digits.length);
54
+ else plain = `${digits.slice(0, point)}.${digits.slice(point)}`;
55
+ if (plain.length > MAX_EXPANDED_DIGITS) return undefined;
56
+ return negative ? `-${plain}` : plain;
57
+ }
58
+
59
+ /**
60
+ * W4: the canonical string of an IEEE double at 15 significant digits (SQLite's own text
61
+ * precision). `undefined` for NaN and the infinities.
62
+ */
63
+ export function decimalFromDouble15(value: number): string | undefined {
64
+ if (!Number.isFinite(value)) return undefined;
65
+ return canonicalDecimal(value.toPrecision(15));
66
+ }
67
+
68
+ /**
69
+ * W2 for a value read off a parsed JSON request body: a string in the JSON-number grammar, or a
70
+ * JSON number (exact to 15 significant digits, W4). `undefined` for anything else.
71
+ */
72
+ export function parseDecimalInput(value: unknown): string | undefined {
73
+ if (typeof value === "string") return canonicalDecimal(value);
74
+ if (typeof value === "number") return decimalFromJsonNumber(value);
75
+ return undefined;
76
+ }
77
+
78
+ /**
79
+ * W2 for a JSON number on input. `JSON.parse` has already rounded the client's digits to a double,
80
+ * so only a number that IS its own 15-digit form (or a safe integer, taken as `String(n)`) can be
81
+ * read exactly: anything else would be silently rounded, so it is refused (`undefined`) and the
82
+ * client is told to send a string. The test is `Number(n.toPrecision(15)) === n`: a number whose
83
+ * shortest round-trip form carries more than 15 significant digits fails it.
84
+ */
85
+ export function decimalFromJsonNumber(value: number): string | undefined {
86
+ if (!Number.isFinite(value)) return undefined;
87
+ if (!Number.isSafeInteger(value) && Number(value.toPrecision(15)) !== value) return undefined;
88
+ return canonicalDecimal(String(value));
89
+ }
90
+
91
+ /** W2 for a query-string filter operand: the same grammar as a body string, compared exactly. */
92
+ export function parseDecimalOperand(text: string): string | undefined {
93
+ return canonicalDecimal(text);
94
+ }
95
+
96
+ /**
97
+ * W3: whether the canonical decimal `canonical` fits a column declared `@precision` / `@scale`
98
+ * (at most `precision - scale` integer digits and `scale` fraction digits). A column rounds an
99
+ * excess fraction silently and refuses an excess integer part, so neither may reach it.
100
+ */
101
+ export function decimalFits(canonical: string, precision: number | undefined, scale: number | undefined): boolean {
102
+ if (precision === undefined) return true;
103
+ const s = scale ?? 0;
104
+ const unsigned = canonical.startsWith("-") ? canonical.slice(1) : canonical;
105
+ const dot = unsigned.indexOf(".");
106
+ const intDigits = dot === -1 ? unsigned : unsigned.slice(0, dot);
107
+ const fracDigits = dot === -1 ? 0 : unsigned.length - dot - 1;
108
+ const intLen = intDigits === "0" ? 0 : intDigits.length;
109
+ return fracDigits <= s && intLen <= precision - s;
110
+ }
111
+
112
+ /**
113
+ * W1/W4 on a value a driver hands back for a decimal column: a string (Postgres `numeric`, MySQL
114
+ * `DECIMAL`, a SQLite text value) is canonicalized, a number (a SQLite or D1 REAL or INTEGER) is
115
+ * rendered at 15 significant digits and canonicalized, a bigint is its digits, and an array (a
116
+ * `field.decimal` declared `isArray`) is rewritten element by element. Null passes through. A
117
+ * value in none of those shapes is left for the caller to see.
118
+ */
119
+ export function decimalToWire(value: unknown): unknown {
120
+ if (Array.isArray(value)) return value.map(decimalToWire);
121
+ if (typeof value === "string") return canonicalDecimal(value) ?? value;
122
+ if (typeof value === "number") return decimalFromDouble15(value) ?? value;
123
+ if (typeof value === "bigint") return value.toString();
124
+ return value;
125
+ }
126
+
127
+ /**
128
+ * Rewrite the values under `columns` to their canonical string. Returns `undefined` when there is
129
+ * nothing to do. Which keys are decimals comes from the caller (the generated route passes the
130
+ * names of the entity's `field.decimal` fields), never from the shape of a value: an integer
131
+ * column is not a decimal because it is a number.
132
+ */
133
+ export function decimalWire(
134
+ columns: readonly string[] | undefined,
135
+ ): ((row: unknown) => unknown) | undefined {
136
+ if (columns === undefined || columns.length === 0) return undefined;
137
+ return (row) => {
138
+ if (row === null || typeof row !== "object") return row;
139
+ const out = { ...(row as Record<string, unknown>) };
140
+ for (const c of columns) {
141
+ if (c in out) out[c] = decimalToWire(out[c]);
142
+ }
143
+ return out;
144
+ };
145
+ }
146
+
147
+ /** A wire mapper with the decimal rewrite of `columns` applied after `base` (which may be a timestamp mapper). */
148
+ export function withDecimals(
149
+ base: (row: unknown) => unknown,
150
+ columns: readonly string[] | undefined,
151
+ ): (row: unknown) => unknown {
152
+ const decimals = decimalWire(columns);
153
+ return decimals === undefined ? base : (row) => decimals(base(row));
154
+ }
@@ -11,6 +11,7 @@ import {
11
11
  OPS_BY_SUBTYPE,
12
12
  opsForSubType,
13
13
  FIELD_SUBTYPE_DATE,
14
+ FIELD_SUBTYPE_DECIMAL,
14
15
  FIELD_SUBTYPE_TIME,
15
16
  FIELD_SUBTYPE_TIMESTAMP,
16
17
  FIELD_SUBTYPE_UUID,
@@ -28,6 +29,7 @@ export type FilterSubType = "string" | "number" | "boolean" | "datetime";
28
29
  */
29
30
  export const FILTER_VALUE_FORMATS = [
30
31
  FIELD_SUBTYPE_DATE,
32
+ FIELD_SUBTYPE_DECIMAL,
31
33
  FIELD_SUBTYPE_TIME,
32
34
  FIELD_SUBTYPE_TIMESTAMP,
33
35
  FIELD_SUBTYPE_UUID,
@@ -52,7 +54,9 @@ export interface FilterFieldRule {
52
54
  readonly dateValues?: boolean;
53
55
  /**
54
56
  * The field's exact wire format, set by codegen for `field.date` / `field.time` /
55
- * `field.timestamp` / `field.uuid`. The filter parser rejects a value that does not
57
+ * `field.timestamp` / `field.uuid` / `field.decimal`. A `decimal` operand is parsed with the
58
+ * JSON-number grammar and bound as an exact string, never through a double (ADR-0019
59
+ * Amendment 1, W2). The filter parser rejects a value that does not
56
60
  * match it with `invalid_filter_value` instead of binding it — on SQLite a malformed
57
61
  * date compared as text and silently matched nothing; on Postgres it was a driver
58
62
  * error. Absent (an allowlist generated before this existed), a `datetime` value is