@metaobjectsdev/runtime-ts 1.0.13 → 1.1.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decimal-wire.d.ts +54 -0
- package/dist/decimal-wire.d.ts.map +1 -0
- package/dist/decimal-wire.js +158 -0
- package/dist/decimal-wire.js.map +1 -0
- package/dist/drizzle-fastify/filter-allowlist.d.ts +4 -2
- package/dist/drizzle-fastify/filter-allowlist.d.ts.map +1 -1
- package/dist/drizzle-fastify/filter-allowlist.js +2 -1
- package/dist/drizzle-fastify/filter-allowlist.js.map +1 -1
- package/dist/drizzle-fastify/filter-parser.d.ts.map +1 -1
- package/dist/drizzle-fastify/filter-parser.js +23 -9
- package/dist/drizzle-fastify/filter-parser.js.map +1 -1
- package/dist/drizzle-fastify/filter-value-format.d.ts.map +1 -1
- package/dist/drizzle-fastify/filter-value-format.js +4 -1
- package/dist/drizzle-fastify/filter-value-format.js.map +1 -1
- package/dist/drizzle-fastify/index.d.ts +8 -0
- package/dist/drizzle-fastify/index.d.ts.map +1 -1
- package/dist/drizzle-fastify/index.js +4 -2
- package/dist/drizzle-fastify/index.js.map +1 -1
- package/dist/drizzle-fastify/mount-m2m.d.ts +2 -0
- package/dist/drizzle-fastify/mount-m2m.d.ts.map +1 -1
- package/dist/drizzle-fastify/mount-m2m.js +2 -1
- package/dist/drizzle-fastify/mount-m2m.js.map +1 -1
- package/dist/drizzle-fastify/mount-read-only.d.ts +25 -1
- package/dist/drizzle-fastify/mount-read-only.d.ts.map +1 -1
- package/dist/drizzle-fastify/mount-read-only.js +43 -28
- package/dist/drizzle-fastify/mount-read-only.js.map +1 -1
- package/dist/extract-object.js +5 -7
- package/dist/extract-object.js.map +1 -1
- package/dist/hono/index.d.ts +8 -0
- package/dist/hono/index.d.ts.map +1 -1
- package/dist/hono/index.js +4 -2
- package/dist/hono/index.js.map +1 -1
- package/dist/hono/mount-read-only.d.ts +25 -1
- package/dist/hono/mount-read-only.d.ts.map +1 -1
- package/dist/hono/mount-read-only.js +51 -36
- package/dist/hono/mount-read-only.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/n2m-resolver.d.ts.map +1 -1
- package/dist/n2m-resolver.js +4 -3
- package/dist/n2m-resolver.js.map +1 -1
- package/dist/net-format.d.ts +8 -0
- package/dist/net-format.d.ts.map +1 -0
- package/dist/net-format.js +34 -0
- package/dist/net-format.js.map +1 -0
- package/dist/object-manager.d.ts +20 -7
- package/dist/object-manager.d.ts.map +1 -1
- package/dist/object-manager.js +68 -13
- package/dist/object-manager.js.map +1 -1
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/query-builder.js +11 -2
- package/dist/query-builder.js.map +1 -1
- package/dist/relation-resolver.d.ts.map +1 -1
- package/dist/relation-resolver.js +11 -11
- package/dist/relation-resolver.js.map +1 -1
- package/dist/type-coercer.d.ts +1 -1
- package/dist/type-coercer.d.ts.map +1 -1
- package/dist/type-coercer.js +114 -5
- package/dist/type-coercer.js.map +1 -1
- package/dist/validator-runner.d.ts.map +1 -1
- package/dist/validator-runner.js +192 -35
- package/dist/validator-runner.js.map +1 -1
- package/package.json +3 -3
- package/src/decimal-wire.ts +154 -0
- package/src/drizzle-fastify/filter-allowlist.ts +5 -1
- package/src/drizzle-fastify/filter-parser.ts +22 -9
- package/src/drizzle-fastify/filter-value-format.ts +4 -0
- package/src/drizzle-fastify/index.ts +11 -2
- package/src/drizzle-fastify/mount-m2m.ts +4 -1
- package/src/drizzle-fastify/mount-read-only.ts +68 -31
- package/src/extract-object.ts +5 -7
- package/src/hono/index.ts +11 -2
- package/src/hono/mount-read-only.ts +76 -37
- package/src/index.ts +2 -1
- package/src/n2m-resolver.ts +4 -2
- package/src/net-format.ts +37 -0
- package/src/object-manager.ts +80 -18
- package/src/query-builder.ts +14 -1
- package/src/relation-resolver.ts +15 -14
- package/src/type-coercer.ts +116 -5
- package/src/validator-runner.ts +195 -32
package/dist/validator-runner.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
231
|
+
bounds.max = max;
|
|
177
232
|
}
|
|
178
|
-
return
|
|
233
|
+
return bounds;
|
|
179
234
|
}
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
//
|
|
250
|
-
const effectiveMin =
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"validator-runner.js","sourceRoot":"","sources":["../src/validator-runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaobjectsdev/runtime-ts",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1-rc.1",
|
|
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.
|
|
68
|
-
"@metaobjectsdev/render": "1.
|
|
67
|
+
"@metaobjectsdev/metadata": "1.1.1-rc.1",
|
|
68
|
+
"@metaobjectsdev/render": "1.1.1-rc.1",
|
|
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
|
|
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
|