@c9up/rune 0.1.4 → 0.1.6
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/Schema.d.ts +71 -2
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +93 -40
- package/dist/Schema.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native.d.ts +8 -0
- package/dist/native.d.ts.map +1 -1
- package/dist/native.js +22 -0
- package/dist/native.js.map +1 -1
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -1
- package/src/Schema.ts +189 -41
- package/src/index.ts +5 -0
- package/src/native.ts +26 -0
package/dist/Schema.d.ts
CHANGED
|
@@ -10,6 +10,55 @@ export interface ValidationError {
|
|
|
10
10
|
rule: string;
|
|
11
11
|
message: string;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Field context handed to `.use()` rules — mirrors VineJS's field context. It
|
|
15
|
+
* exposes the value plus the surrounding data so a rule can validate across
|
|
16
|
+
* fields (e.g. `password === passwordConfirmation`), and a `report()` sink to
|
|
17
|
+
* raise errors (VineJS reports instead of returning a boolean).
|
|
18
|
+
*/
|
|
19
|
+
export interface FieldContext {
|
|
20
|
+
/** The current field value (post-transform). */
|
|
21
|
+
value: unknown;
|
|
22
|
+
/** The root object being validated. Shared across fields — do NOT mutate. */
|
|
23
|
+
data: Record<string, unknown>;
|
|
24
|
+
/** The immediate parent container of this field (object or array). */
|
|
25
|
+
parent: Record<string, unknown> | unknown[];
|
|
26
|
+
/** Dotted path to the field, e.g. `address.city` or `tags.0`. */
|
|
27
|
+
field: string;
|
|
28
|
+
/** Runtime metadata passed to `validate(data, { meta })`. */
|
|
29
|
+
meta: Record<string, unknown>;
|
|
30
|
+
/** `true` while no error has been reported for this field yet. */
|
|
31
|
+
isValid: boolean;
|
|
32
|
+
/** Report a validation failure for this field. */
|
|
33
|
+
report(message: string, rule: string): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A `.use()` rule validator — VineJS shape `(value, options, field)`. Report
|
|
37
|
+
* failures via `field.report(...)`; the return value is ignored.
|
|
38
|
+
*/
|
|
39
|
+
export type RuleValidator<Options = undefined> = (value: unknown, options: Options, field: FieldContext) => void;
|
|
40
|
+
/** A compiled `.use()` rule produced by {@link createRule}. */
|
|
41
|
+
export interface CompiledRule {
|
|
42
|
+
readonly __rune: "rule";
|
|
43
|
+
run(value: unknown, field: FieldContext): void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Turn a validator function into a reusable `.use()` rule — VineJS's
|
|
47
|
+
* `createRule`. Returns a factory: call it with the rule's options to get a
|
|
48
|
+
* `CompiledRule`, then attach it with `chain.use(rule(options))`.
|
|
49
|
+
*
|
|
50
|
+
* const sameAs = createRule<string>((value, other, field) => {
|
|
51
|
+
* if (value !== field.data[other]) {
|
|
52
|
+
* field.report(`Must match ${other}`, 'sameAs')
|
|
53
|
+
* }
|
|
54
|
+
* })
|
|
55
|
+
* schema({
|
|
56
|
+
* password: rules.string().min(8),
|
|
57
|
+
* passwordConfirmation: rules.string().use(sameAs('password')),
|
|
58
|
+
* })
|
|
59
|
+
*/
|
|
60
|
+
export declare function createRule(validator: RuleValidator<undefined>): () => CompiledRule;
|
|
61
|
+
export declare function createRule<Options>(validator: RuleValidator<Options>): (options: Options) => CompiledRule;
|
|
13
62
|
/**
|
|
14
63
|
* Validation result — discriminated union that narrows `data` to the schema's
|
|
15
64
|
* `T` when `valid` is `true`, removing the need for callers to cast or guard
|
|
@@ -24,9 +73,20 @@ export type ValidationResult<T = Record<string, unknown>> = {
|
|
|
24
73
|
errors: ValidationError[];
|
|
25
74
|
data?: undefined;
|
|
26
75
|
};
|
|
76
|
+
/** Options for {@link ValidationSchema.validate}. */
|
|
77
|
+
export interface ValidateOptions {
|
|
78
|
+
/** Runtime metadata exposed to `.use()` rules via `field.meta` (VineJS parity). */
|
|
79
|
+
meta?: Record<string, unknown>;
|
|
80
|
+
}
|
|
27
81
|
export interface ValidationSchema<T = Record<string, unknown>> {
|
|
28
82
|
fields: Record<string, RuleChain>;
|
|
29
|
-
validate(data: unknown): ValidationResult<T>;
|
|
83
|
+
validate(data: unknown, options?: ValidateOptions): ValidationResult<T>;
|
|
84
|
+
}
|
|
85
|
+
/** Context threaded through validation so field rules can reach root/parent/meta. */
|
|
86
|
+
interface RunContext {
|
|
87
|
+
data: Record<string, unknown>;
|
|
88
|
+
parent: Record<string, unknown> | unknown[];
|
|
89
|
+
meta: Record<string, unknown>;
|
|
30
90
|
}
|
|
31
91
|
/**
|
|
32
92
|
* Create a validation schema.
|
|
@@ -66,6 +126,8 @@ export declare class RuleChain {
|
|
|
66
126
|
name: string;
|
|
67
127
|
fn: (value: unknown) => unknown;
|
|
68
128
|
}>;
|
|
129
|
+
/** Public read access to `.use()` rules (used to keep such schemas off the native path). */
|
|
130
|
+
get useRules(): readonly CompiledRule[];
|
|
69
131
|
/** Mark field as optional. */
|
|
70
132
|
optional(): this;
|
|
71
133
|
/** Must be an object matching a nested schema. */
|
|
@@ -90,10 +152,16 @@ export declare class RuleChain {
|
|
|
90
152
|
trim(): this;
|
|
91
153
|
/** Custom validation rule. */
|
|
92
154
|
custom(name: string, validate: (value: unknown) => boolean, message?: string): this;
|
|
155
|
+
/**
|
|
156
|
+
* Attach a `.use()` rule (from {@link createRule}). Unlike `custom`, the rule
|
|
157
|
+
* receives a {@link FieldContext} with the root `data` and `parent`, so it can
|
|
158
|
+
* validate across fields. Runs after this field's type/value rules.
|
|
159
|
+
*/
|
|
160
|
+
use(rule: CompiledRule): this;
|
|
93
161
|
/** Set custom error message for the last rule. */
|
|
94
162
|
message(msg: string): this;
|
|
95
163
|
/** Internal: validate a field value and return errors + transformed value. */
|
|
96
|
-
_validateWithTransform(field: string, value: unknown): {
|
|
164
|
+
_validateWithTransform(field: string, value: unknown, ctx?: RunContext): {
|
|
97
165
|
errors: ValidationError[];
|
|
98
166
|
transformed: unknown;
|
|
99
167
|
};
|
|
@@ -109,4 +177,5 @@ export declare const rules: {
|
|
|
109
177
|
boolean: () => RuleChain;
|
|
110
178
|
any: () => RuleChain;
|
|
111
179
|
};
|
|
180
|
+
export {};
|
|
112
181
|
//# sourceMappingURL=Schema.d.ts.map
|
package/dist/Schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAChF,MAAM,MAAM,oBAAoB,GAAG,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,uBAAuB,KAC5B,MAAM,GAAG,SAAS,CAAC;AAExB,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,gDAAgD;IAChD,KAAK,EAAE,OAAO,CAAC;IACf,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;IAC5C,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,OAAO,GAAG,SAAS,IAAI,CAChD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,YAAY,KACf,IAAI,CAAC;AAEV,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CACzB,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC,GACjC,MAAM,YAAY,CAAC;AACtB,wBAAgB,UAAU,CAAC,OAAO,EACjC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,GAC/B,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,CAAC;AAYtC;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACrD;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GACnD;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAEjE,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC/B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACxE;AAED,qFAAqF;AACrF,UAAU,UAAU;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAgGD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAC/B,gBAAgB,CAAC,CAAC,CAAC,CAwDrB;AAED,wBAAgB,uBAAuB,CACtC,UAAU,CAAC,EAAE,oBAAoB,GAC/B,IAAI,CAEN;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACpC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAAC;CACzD,GAAG,IAAI,CAEP;AAED,yCAAyC;AACzC,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,8CAA8C;AAC9C,qBAAa,SAAS;;IAQrB,yEAAyE;IACzE,IAAI,KAAK,IAAI,SAAS,OAAO,EAAE,CAE9B;IACD,IAAI,eAAe,IAAI,OAAO,CAE7B;IACD,IAAI,UAAU,IAAI,aAAa,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;KAChC,CAAC,CAED;IACD,4FAA4F;IAC5F,IAAI,QAAQ,IAAI,SAAS,YAAY,EAAE,CAEtC;IAED,8BAA8B;IAC9B,QAAQ,IAAI,IAAI;IAKhB,kDAAkD;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAI;IAU9C,+DAA+D;IAC/D,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAUlC,wBAAwB;IACxB,MAAM,IAAI,IAAI;IASd,wBAAwB;IACxB,MAAM,IAAI,IAAI;IAUd,yBAAyB;IACzB,OAAO,IAAI,IAAI;IASf,yDAAyD;IACzD,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAepB,yDAAyD;IACzD,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAepB,6BAA6B;IAC7B,KAAK,IAAI,IAAI;IAcb,yCAAyC;IACzC,QAAQ,IAAI,IAAI;IAShB,mCAAmC;IACnC,IAAI,IAAI,IAAI;IAQZ,8BAA8B;IAC9B,MAAM,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACrC,OAAO,CAAC,EAAE,MAAM,GACd,IAAI;IASP;;;;OAIG;IACH,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAY7B,kDAAkD;IAClD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ1B,8EAA8E;IAC9E,sBAAsB,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,GAAG,GAAE,UAA8B,GACjC;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;IA2HtD,0DAA0D;IAC1D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,eAAe,EAAE;IAI3D,kCAAkC;IAClC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAWnC;AAED,sCAAsC;AACtC,eAAO,MAAM,KAAK;;;;;CAKjB,CAAC"}
|
package/dist/Schema.js
CHANGED
|
@@ -4,7 +4,17 @@
|
|
|
4
4
|
* @implements FR38, FR39, FR40, FR41
|
|
5
5
|
*/
|
|
6
6
|
import { RuneError } from "./errors.js";
|
|
7
|
-
import { isNativeAvailable, validateNative } from "./native.js";
|
|
7
|
+
import { isNativeAvailable, validateNative, warnNativeUnavailableOnce, } from "./native.js";
|
|
8
|
+
export function createRule(validator) {
|
|
9
|
+
return (options) => ({
|
|
10
|
+
__rune: "rule",
|
|
11
|
+
run(value, field) {
|
|
12
|
+
validator(value, options, field);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/** Default context for internal callers that don't supply one (no root available). */
|
|
17
|
+
const EMPTY_RUN_CONTEXT = { data: {}, parent: {}, meta: {} };
|
|
8
18
|
/** Type guard: narrows `unknown` to a plain object (non-null, non-array, typeof 'object'). */
|
|
9
19
|
function isPlainObject(value) {
|
|
10
20
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -74,6 +84,8 @@ function resolveRuleMessage(field, rule) {
|
|
|
74
84
|
/** Compute once: does any field rule prevent dispatching to Rust? */
|
|
75
85
|
function detectHasCustomRules(fields) {
|
|
76
86
|
return Object.values(fields).some((chain) => {
|
|
87
|
+
if (chain.useRules.length > 0)
|
|
88
|
+
return true; // .use() rule — TS-only (Rust can't run JS)
|
|
77
89
|
return chain.rules.some((r) => {
|
|
78
90
|
if (!STANDARD_RULES.has(r.name))
|
|
79
91
|
return true; // custom rule
|
|
@@ -104,7 +116,7 @@ export function schema(fields) {
|
|
|
104
116
|
const hasCustomRules = detectHasCustomRules(fields);
|
|
105
117
|
return {
|
|
106
118
|
fields,
|
|
107
|
-
validate(data) {
|
|
119
|
+
validate(data, options) {
|
|
108
120
|
if (!isPlainObject(data)) {
|
|
109
121
|
return {
|
|
110
122
|
valid: false,
|
|
@@ -117,14 +129,28 @@ export function schema(fields) {
|
|
|
117
129
|
],
|
|
118
130
|
};
|
|
119
131
|
}
|
|
120
|
-
if (
|
|
121
|
-
|
|
132
|
+
if (!hasCustomRules && !validationTranslator) {
|
|
133
|
+
if (isNativeAvailable()) {
|
|
134
|
+
return validateWithRust(fields, data);
|
|
135
|
+
}
|
|
136
|
+
// This schema would have used the native engine, but it isn't
|
|
137
|
+
// loaded — surface the platform-dependent TS fallback once instead
|
|
138
|
+
// of diverging silently. (Schemas with custom rules / a translator
|
|
139
|
+
// always run on TS by design and don't warn.)
|
|
140
|
+
warnNativeUnavailableOnce();
|
|
122
141
|
}
|
|
123
142
|
const errors = [];
|
|
124
143
|
const validated = {};
|
|
144
|
+
// Root context: `data` is the root, `parent` of a top-level field is the
|
|
145
|
+
// root too; nested/array recursion narrows `parent` as it descends.
|
|
146
|
+
const rootCtx = {
|
|
147
|
+
data,
|
|
148
|
+
parent: data,
|
|
149
|
+
meta: options?.meta ?? {},
|
|
150
|
+
};
|
|
125
151
|
for (const [field, chain] of Object.entries(fields)) {
|
|
126
152
|
const value = data[field];
|
|
127
|
-
const result = chain._validateWithTransform(field, value);
|
|
153
|
+
const result = chain._validateWithTransform(field, value, rootCtx);
|
|
128
154
|
errors.push(...result.errors);
|
|
129
155
|
if (result.errors.length === 0 && value !== undefined) {
|
|
130
156
|
validated[field] = result.transformed;
|
|
@@ -150,6 +176,7 @@ export class RuleChain {
|
|
|
150
176
|
#transforms = [];
|
|
151
177
|
#nestedSchema = null;
|
|
152
178
|
#arrayItemChain = null;
|
|
179
|
+
#useRules = [];
|
|
153
180
|
/** Public read access to rules (for OpenAPI generation, Rust bridge). */
|
|
154
181
|
get rules() {
|
|
155
182
|
return this.#rules;
|
|
@@ -160,6 +187,10 @@ export class RuleChain {
|
|
|
160
187
|
get transforms() {
|
|
161
188
|
return this.#transforms;
|
|
162
189
|
}
|
|
190
|
+
/** Public read access to `.use()` rules (used to keep such schemas off the native path). */
|
|
191
|
+
get useRules() {
|
|
192
|
+
return this.#useRules;
|
|
193
|
+
}
|
|
163
194
|
/** Mark field as optional. */
|
|
164
195
|
optional() {
|
|
165
196
|
this.#isOptional = true;
|
|
@@ -244,18 +275,11 @@ export class RuleChain {
|
|
|
244
275
|
email() {
|
|
245
276
|
this.#rules.push({
|
|
246
277
|
name: "email",
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
const at = v.indexOf("@");
|
|
253
|
-
if (at <= 0 || at !== v.lastIndexOf("@"))
|
|
254
|
-
return false;
|
|
255
|
-
const domain = v.slice(at + 1);
|
|
256
|
-
const dot = domain.lastIndexOf(".");
|
|
257
|
-
return dot > 0 && dot < domain.length - 1;
|
|
258
|
-
},
|
|
278
|
+
// Mirror the Rust engine's regex exactly (crates/rune-engine/src/engine.rs)
|
|
279
|
+
// so the SAME schema validates identically whether or not the native
|
|
280
|
+
// binary loaded: no whitespace anywhere (the old TS rule rejected only
|
|
281
|
+
// \r\n, silently accepting interior spaces), a single @, dotted domain.
|
|
282
|
+
validate: (v) => typeof v === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),
|
|
259
283
|
message: "Must be a valid email",
|
|
260
284
|
});
|
|
261
285
|
return this;
|
|
@@ -286,6 +310,18 @@ export class RuleChain {
|
|
|
286
310
|
});
|
|
287
311
|
return this;
|
|
288
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Attach a `.use()` rule (from {@link createRule}). Unlike `custom`, the rule
|
|
315
|
+
* receives a {@link FieldContext} with the root `data` and `parent`, so it can
|
|
316
|
+
* validate across fields. Runs after this field's type/value rules.
|
|
317
|
+
*/
|
|
318
|
+
use(rule) {
|
|
319
|
+
if (rule?.__rune !== "rule" || typeof rule.run !== "function") {
|
|
320
|
+
throw new RuneError("INVALID_RULE", "use() expects a compiled rule — call the factory first", { hint: "use(myRule()) or use(myRule(options)), not use(myRule)" });
|
|
321
|
+
}
|
|
322
|
+
this.#useRules.push(rule);
|
|
323
|
+
return this;
|
|
324
|
+
}
|
|
289
325
|
/** Set custom error message for the last rule. */
|
|
290
326
|
message(msg) {
|
|
291
327
|
if (this.#rules.length === 0) {
|
|
@@ -295,7 +331,7 @@ export class RuleChain {
|
|
|
295
331
|
return this;
|
|
296
332
|
}
|
|
297
333
|
/** Internal: validate a field value and return errors + transformed value. */
|
|
298
|
-
_validateWithTransform(field, value) {
|
|
334
|
+
_validateWithTransform(field, value, ctx = EMPTY_RUN_CONTEXT) {
|
|
299
335
|
if (value === undefined || value === null) {
|
|
300
336
|
if (this.#isOptional)
|
|
301
337
|
return { errors: [], transformed: value };
|
|
@@ -308,35 +344,56 @@ export class RuleChain {
|
|
|
308
344
|
// 2. Apply transforms (trim, etc.), then run value rules on the result.
|
|
309
345
|
let transformed = this.#applyTransformsTo(value);
|
|
310
346
|
const errors = this.#runValueRules(field, transformed);
|
|
347
|
+
// 3. Vine-style .use() rules — run with a FieldContext exposing the root
|
|
348
|
+
// `data` and `parent`, so a rule can validate across fields.
|
|
349
|
+
if (this.#useRules.length > 0) {
|
|
350
|
+
this.#runUseRules(field, transformed, ctx, errors);
|
|
351
|
+
}
|
|
311
352
|
// 4. Nested object validation (only if type check passed — not arrays)
|
|
312
|
-
if (this.#nestedSchema &&
|
|
313
|
-
|
|
314
|
-
transformed
|
|
315
|
-
!Array.isArray(transformed)) {
|
|
316
|
-
transformed = { ...transformed };
|
|
353
|
+
if (this.#nestedSchema && isPlainObject(transformed)) {
|
|
354
|
+
const obj = { ...transformed };
|
|
355
|
+
transformed = obj;
|
|
317
356
|
for (const [nestedField, chain] of Object.entries(this.#nestedSchema)) {
|
|
318
|
-
const
|
|
319
|
-
const nestedResult = chain._validateWithTransform(`${field}.${nestedField}`, nestedValue);
|
|
357
|
+
const nestedResult = chain._validateWithTransform(`${field}.${nestedField}`, obj[nestedField], { data: ctx.data, parent: obj, meta: ctx.meta });
|
|
320
358
|
errors.push(...nestedResult.errors);
|
|
321
359
|
if (nestedResult.transformed !== undefined) {
|
|
322
|
-
|
|
323
|
-
nestedResult.transformed;
|
|
360
|
+
obj[nestedField] = nestedResult.transformed;
|
|
324
361
|
}
|
|
325
362
|
}
|
|
326
363
|
}
|
|
327
364
|
// 5. Array item validation
|
|
328
365
|
if (this.#arrayItemChain && Array.isArray(transformed)) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
366
|
+
const arr = [...transformed];
|
|
367
|
+
transformed = arr;
|
|
368
|
+
for (let i = 0; i < arr.length; i++) {
|
|
369
|
+
const itemResult = this.#arrayItemChain._validateWithTransform(`${field}.${i}`, arr[i], { data: ctx.data, parent: arr, meta: ctx.meta });
|
|
332
370
|
errors.push(...itemResult.errors);
|
|
333
371
|
if (itemResult.transformed !== undefined) {
|
|
334
|
-
|
|
372
|
+
arr[i] = itemResult.transformed;
|
|
335
373
|
}
|
|
336
374
|
}
|
|
337
375
|
}
|
|
338
376
|
return { errors, transformed };
|
|
339
377
|
}
|
|
378
|
+
/** Run `.use()` rules on the transformed value with a fresh FieldContext. */
|
|
379
|
+
#runUseRules(field, transformed, ctx, errors) {
|
|
380
|
+
const fieldCtx = {
|
|
381
|
+
value: transformed,
|
|
382
|
+
data: ctx.data,
|
|
383
|
+
parent: ctx.parent,
|
|
384
|
+
field,
|
|
385
|
+
meta: ctx.meta,
|
|
386
|
+
isValid: errors.length === 0,
|
|
387
|
+
report(message, rule) {
|
|
388
|
+
errors.push({ field, rule, message });
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
for (const rule of this.#useRules) {
|
|
392
|
+
// Refresh isValid so a rule can early-return once the field has failed.
|
|
393
|
+
fieldCtx.isValid = errors.length === 0;
|
|
394
|
+
rule.run(transformed, fieldCtx);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
340
397
|
#requiredError(field) {
|
|
341
398
|
return {
|
|
342
399
|
field,
|
|
@@ -400,10 +457,13 @@ function validateWithRust(fields, data) {
|
|
|
400
457
|
for (const [field, chain] of Object.entries(fields)) {
|
|
401
458
|
const rules = chain.rules.map((r) => ({
|
|
402
459
|
name: r.name,
|
|
460
|
+
// Serialize THIS rule's own param. Previously a find-first lookup by
|
|
461
|
+
// rule name returned the first matching rule's param, so min(3).min(5)
|
|
462
|
+
// sent both Rust entries as min=3, dropping the 5 bound (audit 2026-06-13).
|
|
403
463
|
params: r.name === "min"
|
|
404
|
-
? { min:
|
|
464
|
+
? { min: r.param }
|
|
405
465
|
: r.name === "max"
|
|
406
|
-
? { max:
|
|
466
|
+
? { max: r.param }
|
|
407
467
|
: null,
|
|
408
468
|
}));
|
|
409
469
|
schemaDesc[field] = {
|
|
@@ -419,11 +479,4 @@ function validateWithRust(fields, data) {
|
|
|
419
479
|
}
|
|
420
480
|
return { valid: false, errors: native.errors };
|
|
421
481
|
}
|
|
422
|
-
function extractParam(chain, ruleName) {
|
|
423
|
-
const rule = chain.rules.find((r) => r.name === ruleName);
|
|
424
|
-
if (!rule)
|
|
425
|
-
return undefined;
|
|
426
|
-
// Use stored param directly (no longer parsed from message text)
|
|
427
|
-
return rule.param;
|
|
428
|
-
}
|
|
429
482
|
//# sourceMappingURL=Schema.js.map
|
package/dist/Schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Schema.js","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* @implements FR38, FR39, FR40, FR41, FR42
|
|
5
5
|
*/
|
|
6
6
|
export { RuneError } from "./errors.js";
|
|
7
|
-
export type { RuleChain, ValidationError, ValidationMessageParams, ValidationResult, ValidationSchema, ValidationTranslator, } from "./Schema.js";
|
|
8
|
-
export { bindRosetta, rules, schema, setValidationTranslator, } from "./Schema.js";
|
|
7
|
+
export type { CompiledRule, FieldContext, RuleChain, RuleValidator, ValidateOptions, ValidationError, ValidationMessageParams, ValidationResult, ValidationSchema, ValidationTranslator, } from "./Schema.js";
|
|
8
|
+
export { bindRosetta, createRule, rules, schema, setValidationTranslator, } from "./Schema.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACX,SAAS,EACT,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,WAAW,EACX,KAAK,EACL,MAAM,EACN,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,aAAa,EACb,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
* @implements FR38, FR39, FR40, FR41, FR42
|
|
5
5
|
*/
|
|
6
6
|
export { RuneError } from "./errors.js";
|
|
7
|
-
export { bindRosetta, rules, schema, setValidationTranslator, } from "./Schema.js";
|
|
7
|
+
export { bindRosetta, createRule, rules, schema, setValidationTranslator, } from "./Schema.js";
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAaxC,OAAO,EACN,WAAW,EACX,UAAU,EACV,KAAK,EACL,MAAM,EACN,uBAAuB,GACvB,MAAM,aAAa,CAAC"}
|
package/dist/native.d.ts
CHANGED
|
@@ -16,4 +16,12 @@ export declare function validateNative(requestJson: string): {
|
|
|
16
16
|
data?: Record<string, unknown>;
|
|
17
17
|
};
|
|
18
18
|
export declare function isNativeAvailable(): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Surface — exactly once per process — that the native engine is unavailable so
|
|
21
|
+
* the schema is falling back to the TypeScript validator. The two paths can
|
|
22
|
+
* differ subtly, so a silent fallback makes validation results depend on whether
|
|
23
|
+
* the prebuilt binary loaded (platform-dependent). Callers invoke this only when
|
|
24
|
+
* they WOULD have used the native engine (no custom rules / translator).
|
|
25
|
+
*/
|
|
26
|
+
export declare function warnNativeUnavailableOnce(): void;
|
|
19
27
|
//# sourceMappingURL=native.d.ts.map
|
package/dist/native.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAaA;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAaA;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAID;;;;;;GAMG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAehD"}
|
package/dist/native.js
CHANGED
|
@@ -43,4 +43,26 @@ export function validateNative(requestJson) {
|
|
|
43
43
|
export function isNativeAvailable() {
|
|
44
44
|
return native !== undefined;
|
|
45
45
|
}
|
|
46
|
+
let warnedFallback = false;
|
|
47
|
+
/**
|
|
48
|
+
* Surface — exactly once per process — that the native engine is unavailable so
|
|
49
|
+
* the schema is falling back to the TypeScript validator. The two paths can
|
|
50
|
+
* differ subtly, so a silent fallback makes validation results depend on whether
|
|
51
|
+
* the prebuilt binary loaded (platform-dependent). Callers invoke this only when
|
|
52
|
+
* they WOULD have used the native engine (no custom rules / translator).
|
|
53
|
+
*/
|
|
54
|
+
export function warnNativeUnavailableOnce() {
|
|
55
|
+
if (warnedFallback)
|
|
56
|
+
return;
|
|
57
|
+
warnedFallback = true;
|
|
58
|
+
const target = `${platform}-${arch}`;
|
|
59
|
+
const reason = loadError !== undefined
|
|
60
|
+
? `failed to load (${loadError instanceof Error ? loadError.message : String(loadError)})`
|
|
61
|
+
: platformMap[target] !== undefined
|
|
62
|
+
? "binary not found"
|
|
63
|
+
: `no prebuilt binary for ${target}`;
|
|
64
|
+
console.warn(`[rune] native validation engine unavailable — ${reason}. Falling back to the ` +
|
|
65
|
+
"TypeScript validator, whose results can differ subtly from the Rust engine — " +
|
|
66
|
+
"validation is platform-dependent for this process.");
|
|
67
|
+
}
|
|
46
68
|
//# sourceMappingURL=native.js.map
|
package/dist/native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,GAA2B;IAC3C,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,gBAAgB;CAC7B,CAAC;AAEF,IAAI,MAA0D,CAAC;AAC/D,IAAI,SAAkB,CAAC;AAEvB,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACZ,SAAS,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAKjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,+DAA+D,SAAS,IAAI,kBAAkB,EAAE,CAChG,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACd,uEAAuE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAC/F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB;IAChC,OAAO,MAAM,KAAK,SAAS,CAAC;AAC7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE3D,MAAM,WAAW,GAA2B;IAC3C,WAAW,EAAE,eAAe;IAC5B,aAAa,EAAE,iBAAiB;IAChC,YAAY,EAAE,YAAY;IAC1B,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,gBAAgB;CAC7B,CAAC;AAEF,IAAI,MAA0D,CAAC;AAC/D,IAAI,SAAkB,CAAC;AAEvB,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;AACF,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACZ,SAAS,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAKjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,+DAA+D,SAAS,IAAI,kBAAkB,EAAE,CAChG,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACd,uEAAuE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAC/F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB;IAChC,OAAO,MAAM,KAAK,SAAS,CAAC;AAC7B,CAAC;AAED,IAAI,cAAc,GAAG,KAAK,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB;IACxC,IAAI,cAAc;QAAE,OAAO;IAC3B,cAAc,GAAG,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IACrC,MAAM,MAAM,GACX,SAAS,KAAK,SAAS;QACtB,CAAC,CAAC,mBAAmB,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;QAC1F,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,SAAS;YAClC,CAAC,CAAC,kBAAkB;YACpB,CAAC,CAAC,0BAA0B,MAAM,EAAE,CAAC;IACxC,OAAO,CAAC,IAAI,CACX,iDAAiD,MAAM,wBAAwB;QAC9E,+EAA+E;QAC/E,oDAAoD,CACrD,CAAC;AACH,CAAC"}
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/src/Schema.ts
CHANGED
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { RuneError } from "./errors.js";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
isNativeAvailable,
|
|
10
|
+
validateNative,
|
|
11
|
+
warnNativeUnavailableOnce,
|
|
12
|
+
} from "./native.js";
|
|
9
13
|
|
|
10
14
|
export type ValidationMessageParams = Record<string, string | number | boolean>;
|
|
11
15
|
export type ValidationTranslator = (
|
|
@@ -19,6 +23,77 @@ export interface ValidationError {
|
|
|
19
23
|
message: string;
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Field context handed to `.use()` rules — mirrors VineJS's field context. It
|
|
28
|
+
* exposes the value plus the surrounding data so a rule can validate across
|
|
29
|
+
* fields (e.g. `password === passwordConfirmation`), and a `report()` sink to
|
|
30
|
+
* raise errors (VineJS reports instead of returning a boolean).
|
|
31
|
+
*/
|
|
32
|
+
export interface FieldContext {
|
|
33
|
+
/** The current field value (post-transform). */
|
|
34
|
+
value: unknown;
|
|
35
|
+
/** The root object being validated. Shared across fields — do NOT mutate. */
|
|
36
|
+
data: Record<string, unknown>;
|
|
37
|
+
/** The immediate parent container of this field (object or array). */
|
|
38
|
+
parent: Record<string, unknown> | unknown[];
|
|
39
|
+
/** Dotted path to the field, e.g. `address.city` or `tags.0`. */
|
|
40
|
+
field: string;
|
|
41
|
+
/** Runtime metadata passed to `validate(data, { meta })`. */
|
|
42
|
+
meta: Record<string, unknown>;
|
|
43
|
+
/** `true` while no error has been reported for this field yet. */
|
|
44
|
+
isValid: boolean;
|
|
45
|
+
/** Report a validation failure for this field. */
|
|
46
|
+
report(message: string, rule: string): void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A `.use()` rule validator — VineJS shape `(value, options, field)`. Report
|
|
51
|
+
* failures via `field.report(...)`; the return value is ignored.
|
|
52
|
+
*/
|
|
53
|
+
export type RuleValidator<Options = undefined> = (
|
|
54
|
+
value: unknown,
|
|
55
|
+
options: Options,
|
|
56
|
+
field: FieldContext,
|
|
57
|
+
) => void;
|
|
58
|
+
|
|
59
|
+
/** A compiled `.use()` rule produced by {@link createRule}. */
|
|
60
|
+
export interface CompiledRule {
|
|
61
|
+
readonly __rune: "rule";
|
|
62
|
+
run(value: unknown, field: FieldContext): void;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Turn a validator function into a reusable `.use()` rule — VineJS's
|
|
67
|
+
* `createRule`. Returns a factory: call it with the rule's options to get a
|
|
68
|
+
* `CompiledRule`, then attach it with `chain.use(rule(options))`.
|
|
69
|
+
*
|
|
70
|
+
* const sameAs = createRule<string>((value, other, field) => {
|
|
71
|
+
* if (value !== field.data[other]) {
|
|
72
|
+
* field.report(`Must match ${other}`, 'sameAs')
|
|
73
|
+
* }
|
|
74
|
+
* })
|
|
75
|
+
* schema({
|
|
76
|
+
* password: rules.string().min(8),
|
|
77
|
+
* passwordConfirmation: rules.string().use(sameAs('password')),
|
|
78
|
+
* })
|
|
79
|
+
*/
|
|
80
|
+
export function createRule(
|
|
81
|
+
validator: RuleValidator<undefined>,
|
|
82
|
+
): () => CompiledRule;
|
|
83
|
+
export function createRule<Options>(
|
|
84
|
+
validator: RuleValidator<Options>,
|
|
85
|
+
): (options: Options) => CompiledRule;
|
|
86
|
+
export function createRule<Options>(
|
|
87
|
+
validator: RuleValidator<Options>,
|
|
88
|
+
): (options: Options) => CompiledRule {
|
|
89
|
+
return (options: Options): CompiledRule => ({
|
|
90
|
+
__rune: "rule",
|
|
91
|
+
run(value: unknown, field: FieldContext): void {
|
|
92
|
+
validator(value, options, field);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
22
97
|
/**
|
|
23
98
|
* Validation result — discriminated union that narrows `data` to the schema's
|
|
24
99
|
* `T` when `valid` is `true`, removing the need for callers to cast or guard
|
|
@@ -28,11 +103,27 @@ export type ValidationResult<T = Record<string, unknown>> =
|
|
|
28
103
|
| { valid: true; errors: ValidationError[]; data: T }
|
|
29
104
|
| { valid: false; errors: ValidationError[]; data?: undefined };
|
|
30
105
|
|
|
106
|
+
/** Options for {@link ValidationSchema.validate}. */
|
|
107
|
+
export interface ValidateOptions {
|
|
108
|
+
/** Runtime metadata exposed to `.use()` rules via `field.meta` (VineJS parity). */
|
|
109
|
+
meta?: Record<string, unknown>;
|
|
110
|
+
}
|
|
111
|
+
|
|
31
112
|
export interface ValidationSchema<T = Record<string, unknown>> {
|
|
32
113
|
fields: Record<string, RuleChain>;
|
|
33
|
-
validate(data: unknown): ValidationResult<T>;
|
|
114
|
+
validate(data: unknown, options?: ValidateOptions): ValidationResult<T>;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Context threaded through validation so field rules can reach root/parent/meta. */
|
|
118
|
+
interface RunContext {
|
|
119
|
+
data: Record<string, unknown>;
|
|
120
|
+
parent: Record<string, unknown> | unknown[];
|
|
121
|
+
meta: Record<string, unknown>;
|
|
34
122
|
}
|
|
35
123
|
|
|
124
|
+
/** Default context for internal callers that don't supply one (no root available). */
|
|
125
|
+
const EMPTY_RUN_CONTEXT: RunContext = { data: {}, parent: {}, meta: {} };
|
|
126
|
+
|
|
36
127
|
/** Type guard: narrows `unknown` to a plain object (non-null, non-array, typeof 'object'). */
|
|
37
128
|
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
38
129
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -115,6 +206,7 @@ function resolveRuleMessage(field: string, rule: RuleDef): string {
|
|
|
115
206
|
/** Compute once: does any field rule prevent dispatching to Rust? */
|
|
116
207
|
function detectHasCustomRules(fields: Record<string, RuleChain>): boolean {
|
|
117
208
|
return Object.values(fields).some((chain) => {
|
|
209
|
+
if (chain.useRules.length > 0) return true; // .use() rule — TS-only (Rust can't run JS)
|
|
118
210
|
return chain.rules.some((r) => {
|
|
119
211
|
if (!STANDARD_RULES.has(r.name)) return true; // custom rule
|
|
120
212
|
if (!hasDefaultMessage(r)) return true; // custom message
|
|
@@ -147,7 +239,7 @@ export function schema<T = Record<string, unknown>>(
|
|
|
147
239
|
|
|
148
240
|
return {
|
|
149
241
|
fields,
|
|
150
|
-
validate(data: unknown): ValidationResult<T> {
|
|
242
|
+
validate(data: unknown, options?: ValidateOptions): ValidationResult<T> {
|
|
151
243
|
if (!isPlainObject(data)) {
|
|
152
244
|
return {
|
|
153
245
|
valid: false,
|
|
@@ -161,16 +253,30 @@ export function schema<T = Record<string, unknown>>(
|
|
|
161
253
|
};
|
|
162
254
|
}
|
|
163
255
|
|
|
164
|
-
if (
|
|
165
|
-
|
|
256
|
+
if (!hasCustomRules && !validationTranslator) {
|
|
257
|
+
if (isNativeAvailable()) {
|
|
258
|
+
return validateWithRust<T>(fields, data);
|
|
259
|
+
}
|
|
260
|
+
// This schema would have used the native engine, but it isn't
|
|
261
|
+
// loaded — surface the platform-dependent TS fallback once instead
|
|
262
|
+
// of diverging silently. (Schemas with custom rules / a translator
|
|
263
|
+
// always run on TS by design and don't warn.)
|
|
264
|
+
warnNativeUnavailableOnce();
|
|
166
265
|
}
|
|
167
266
|
|
|
168
267
|
const errors: ValidationError[] = [];
|
|
169
268
|
const validated: Record<string, unknown> = {};
|
|
269
|
+
// Root context: `data` is the root, `parent` of a top-level field is the
|
|
270
|
+
// root too; nested/array recursion narrows `parent` as it descends.
|
|
271
|
+
const rootCtx: RunContext = {
|
|
272
|
+
data,
|
|
273
|
+
parent: data,
|
|
274
|
+
meta: options?.meta ?? {},
|
|
275
|
+
};
|
|
170
276
|
|
|
171
277
|
for (const [field, chain] of Object.entries(fields)) {
|
|
172
278
|
const value = data[field];
|
|
173
|
-
const result = chain._validateWithTransform(field, value);
|
|
279
|
+
const result = chain._validateWithTransform(field, value, rootCtx);
|
|
174
280
|
errors.push(...result.errors);
|
|
175
281
|
if (result.errors.length === 0 && value !== undefined) {
|
|
176
282
|
validated[field] = result.transformed;
|
|
@@ -212,6 +318,7 @@ export class RuleChain {
|
|
|
212
318
|
#transforms: Array<{ name: string; fn: (value: unknown) => unknown }> = [];
|
|
213
319
|
#nestedSchema: Record<string, RuleChain> | null = null;
|
|
214
320
|
#arrayItemChain: RuleChain | null = null;
|
|
321
|
+
#useRules: CompiledRule[] = [];
|
|
215
322
|
|
|
216
323
|
/** Public read access to rules (for OpenAPI generation, Rust bridge). */
|
|
217
324
|
get rules(): readonly RuleDef[] {
|
|
@@ -226,6 +333,10 @@ export class RuleChain {
|
|
|
226
333
|
}> {
|
|
227
334
|
return this.#transforms;
|
|
228
335
|
}
|
|
336
|
+
/** Public read access to `.use()` rules (used to keep such schemas off the native path). */
|
|
337
|
+
get useRules(): readonly CompiledRule[] {
|
|
338
|
+
return this.#useRules;
|
|
339
|
+
}
|
|
229
340
|
|
|
230
341
|
/** Mark field as optional. */
|
|
231
342
|
optional(): this {
|
|
@@ -322,15 +433,12 @@ export class RuleChain {
|
|
|
322
433
|
email(): this {
|
|
323
434
|
this.#rules.push({
|
|
324
435
|
name: "email",
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
const dot = domain.lastIndexOf(".");
|
|
332
|
-
return dot > 0 && dot < domain.length - 1;
|
|
333
|
-
},
|
|
436
|
+
// Mirror the Rust engine's regex exactly (crates/rune-engine/src/engine.rs)
|
|
437
|
+
// so the SAME schema validates identically whether or not the native
|
|
438
|
+
// binary loaded: no whitespace anywhere (the old TS rule rejected only
|
|
439
|
+
// \r\n, silently accepting interior spaces), a single @, dotted domain.
|
|
440
|
+
validate: (v) =>
|
|
441
|
+
typeof v === "string" && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v),
|
|
334
442
|
message: "Must be a valid email",
|
|
335
443
|
});
|
|
336
444
|
return this;
|
|
@@ -369,6 +477,23 @@ export class RuleChain {
|
|
|
369
477
|
return this;
|
|
370
478
|
}
|
|
371
479
|
|
|
480
|
+
/**
|
|
481
|
+
* Attach a `.use()` rule (from {@link createRule}). Unlike `custom`, the rule
|
|
482
|
+
* receives a {@link FieldContext} with the root `data` and `parent`, so it can
|
|
483
|
+
* validate across fields. Runs after this field's type/value rules.
|
|
484
|
+
*/
|
|
485
|
+
use(rule: CompiledRule): this {
|
|
486
|
+
if (rule?.__rune !== "rule" || typeof rule.run !== "function") {
|
|
487
|
+
throw new RuneError(
|
|
488
|
+
"INVALID_RULE",
|
|
489
|
+
"use() expects a compiled rule — call the factory first",
|
|
490
|
+
{ hint: "use(myRule()) or use(myRule(options)), not use(myRule)" },
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
this.#useRules.push(rule);
|
|
494
|
+
return this;
|
|
495
|
+
}
|
|
496
|
+
|
|
372
497
|
/** Set custom error message for the last rule. */
|
|
373
498
|
message(msg: string): this {
|
|
374
499
|
if (this.#rules.length === 0) {
|
|
@@ -382,6 +507,7 @@ export class RuleChain {
|
|
|
382
507
|
_validateWithTransform(
|
|
383
508
|
field: string,
|
|
384
509
|
value: unknown,
|
|
510
|
+
ctx: RunContext = EMPTY_RUN_CONTEXT,
|
|
385
511
|
): { errors: ValidationError[]; transformed: unknown } {
|
|
386
512
|
if (value === undefined || value === null) {
|
|
387
513
|
if (this.#isOptional) return { errors: [], transformed: value };
|
|
@@ -396,41 +522,42 @@ export class RuleChain {
|
|
|
396
522
|
let transformed = this.#applyTransformsTo(value);
|
|
397
523
|
const errors = this.#runValueRules(field, transformed);
|
|
398
524
|
|
|
525
|
+
// 3. Vine-style .use() rules — run with a FieldContext exposing the root
|
|
526
|
+
// `data` and `parent`, so a rule can validate across fields.
|
|
527
|
+
if (this.#useRules.length > 0) {
|
|
528
|
+
this.#runUseRules(field, transformed, ctx, errors);
|
|
529
|
+
}
|
|
530
|
+
|
|
399
531
|
// 4. Nested object validation (only if type check passed — not arrays)
|
|
400
|
-
if (
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
transformed !== null &&
|
|
404
|
-
!Array.isArray(transformed)
|
|
405
|
-
) {
|
|
406
|
-
transformed = { ...(transformed as Record<string, unknown>) };
|
|
532
|
+
if (this.#nestedSchema && isPlainObject(transformed)) {
|
|
533
|
+
const obj: Record<string, unknown> = { ...transformed };
|
|
534
|
+
transformed = obj;
|
|
407
535
|
for (const [nestedField, chain] of Object.entries(this.#nestedSchema)) {
|
|
408
|
-
const nestedValue = (transformed as Record<string, unknown>)[
|
|
409
|
-
nestedField
|
|
410
|
-
];
|
|
411
536
|
const nestedResult = chain._validateWithTransform(
|
|
412
537
|
`${field}.${nestedField}`,
|
|
413
|
-
|
|
538
|
+
obj[nestedField],
|
|
539
|
+
{ data: ctx.data, parent: obj, meta: ctx.meta },
|
|
414
540
|
);
|
|
415
541
|
errors.push(...nestedResult.errors);
|
|
416
542
|
if (nestedResult.transformed !== undefined) {
|
|
417
|
-
|
|
418
|
-
nestedResult.transformed;
|
|
543
|
+
obj[nestedField] = nestedResult.transformed;
|
|
419
544
|
}
|
|
420
545
|
}
|
|
421
546
|
}
|
|
422
547
|
|
|
423
548
|
// 5. Array item validation
|
|
424
549
|
if (this.#arrayItemChain && Array.isArray(transformed)) {
|
|
425
|
-
|
|
426
|
-
|
|
550
|
+
const arr: unknown[] = [...transformed];
|
|
551
|
+
transformed = arr;
|
|
552
|
+
for (let i = 0; i < arr.length; i++) {
|
|
427
553
|
const itemResult = this.#arrayItemChain._validateWithTransform(
|
|
428
554
|
`${field}.${i}`,
|
|
429
|
-
|
|
555
|
+
arr[i],
|
|
556
|
+
{ data: ctx.data, parent: arr, meta: ctx.meta },
|
|
430
557
|
);
|
|
431
558
|
errors.push(...itemResult.errors);
|
|
432
559
|
if (itemResult.transformed !== undefined) {
|
|
433
|
-
|
|
560
|
+
arr[i] = itemResult.transformed;
|
|
434
561
|
}
|
|
435
562
|
}
|
|
436
563
|
}
|
|
@@ -438,6 +565,31 @@ export class RuleChain {
|
|
|
438
565
|
return { errors, transformed };
|
|
439
566
|
}
|
|
440
567
|
|
|
568
|
+
/** Run `.use()` rules on the transformed value with a fresh FieldContext. */
|
|
569
|
+
#runUseRules(
|
|
570
|
+
field: string,
|
|
571
|
+
transformed: unknown,
|
|
572
|
+
ctx: RunContext,
|
|
573
|
+
errors: ValidationError[],
|
|
574
|
+
): void {
|
|
575
|
+
const fieldCtx: FieldContext = {
|
|
576
|
+
value: transformed,
|
|
577
|
+
data: ctx.data,
|
|
578
|
+
parent: ctx.parent,
|
|
579
|
+
field,
|
|
580
|
+
meta: ctx.meta,
|
|
581
|
+
isValid: errors.length === 0,
|
|
582
|
+
report(message: string, rule: string): void {
|
|
583
|
+
errors.push({ field, rule, message });
|
|
584
|
+
},
|
|
585
|
+
};
|
|
586
|
+
for (const rule of this.#useRules) {
|
|
587
|
+
// Refresh isValid so a rule can early-return once the field has failed.
|
|
588
|
+
fieldCtx.isValid = errors.length === 0;
|
|
589
|
+
rule.run(transformed, fieldCtx);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
441
593
|
#requiredError(field: string): ValidationError {
|
|
442
594
|
return {
|
|
443
595
|
field,
|
|
@@ -523,11 +675,14 @@ function validateWithRust<T>(
|
|
|
523
675
|
for (const [field, chain] of Object.entries(fields)) {
|
|
524
676
|
const rules = chain.rules.map((r) => ({
|
|
525
677
|
name: r.name,
|
|
678
|
+
// Serialize THIS rule's own param. Previously a find-first lookup by
|
|
679
|
+
// rule name returned the first matching rule's param, so min(3).min(5)
|
|
680
|
+
// sent both Rust entries as min=3, dropping the 5 bound (audit 2026-06-13).
|
|
526
681
|
params:
|
|
527
682
|
r.name === "min"
|
|
528
|
-
? { min:
|
|
683
|
+
? { min: r.param }
|
|
529
684
|
: r.name === "max"
|
|
530
|
-
? { max:
|
|
685
|
+
? { max: r.param }
|
|
531
686
|
: null,
|
|
532
687
|
}));
|
|
533
688
|
schemaDesc[field] = {
|
|
@@ -544,10 +699,3 @@ function validateWithRust<T>(
|
|
|
544
699
|
}
|
|
545
700
|
return { valid: false, errors: native.errors };
|
|
546
701
|
}
|
|
547
|
-
|
|
548
|
-
function extractParam(chain: RuleChain, ruleName: string): number | undefined {
|
|
549
|
-
const rule = chain.rules.find((r) => r.name === ruleName);
|
|
550
|
-
if (!rule) return undefined;
|
|
551
|
-
// Use stored param directly (no longer parsed from message text)
|
|
552
|
-
return rule.param;
|
|
553
|
-
}
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
export { RuneError } from "./errors.js";
|
|
8
8
|
export type {
|
|
9
|
+
CompiledRule,
|
|
10
|
+
FieldContext,
|
|
9
11
|
RuleChain,
|
|
12
|
+
RuleValidator,
|
|
13
|
+
ValidateOptions,
|
|
10
14
|
ValidationError,
|
|
11
15
|
ValidationMessageParams,
|
|
12
16
|
ValidationResult,
|
|
@@ -15,6 +19,7 @@ export type {
|
|
|
15
19
|
} from "./Schema.js";
|
|
16
20
|
export {
|
|
17
21
|
bindRosetta,
|
|
22
|
+
createRule,
|
|
18
23
|
rules,
|
|
19
24
|
schema,
|
|
20
25
|
setValidationTranslator,
|
package/src/native.ts
CHANGED
|
@@ -57,3 +57,29 @@ export function validateNative(requestJson: string): {
|
|
|
57
57
|
export function isNativeAvailable(): boolean {
|
|
58
58
|
return native !== undefined;
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
let warnedFallback = false;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Surface — exactly once per process — that the native engine is unavailable so
|
|
65
|
+
* the schema is falling back to the TypeScript validator. The two paths can
|
|
66
|
+
* differ subtly, so a silent fallback makes validation results depend on whether
|
|
67
|
+
* the prebuilt binary loaded (platform-dependent). Callers invoke this only when
|
|
68
|
+
* they WOULD have used the native engine (no custom rules / translator).
|
|
69
|
+
*/
|
|
70
|
+
export function warnNativeUnavailableOnce(): void {
|
|
71
|
+
if (warnedFallback) return;
|
|
72
|
+
warnedFallback = true;
|
|
73
|
+
const target = `${platform}-${arch}`;
|
|
74
|
+
const reason =
|
|
75
|
+
loadError !== undefined
|
|
76
|
+
? `failed to load (${loadError instanceof Error ? loadError.message : String(loadError)})`
|
|
77
|
+
: platformMap[target] !== undefined
|
|
78
|
+
? "binary not found"
|
|
79
|
+
: `no prebuilt binary for ${target}`;
|
|
80
|
+
console.warn(
|
|
81
|
+
`[rune] native validation engine unavailable — ${reason}. Falling back to the ` +
|
|
82
|
+
"TypeScript validator, whose results can differ subtly from the Rust engine — " +
|
|
83
|
+
"validation is platform-dependent for this process.",
|
|
84
|
+
);
|
|
85
|
+
}
|