@c9up/rune 0.1.5 → 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 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
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../src/Schema.ts"],"names":[],"mappings":"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"}
package/dist/Schema.js CHANGED
@@ -5,6 +5,16 @@
5
5
  */
6
6
  import { RuneError } from "./errors.js";
7
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,
@@ -129,9 +141,16 @@ export function schema(fields) {
129
141
  }
130
142
  const errors = [];
131
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
+ };
132
151
  for (const [field, chain] of Object.entries(fields)) {
133
152
  const value = data[field];
134
- const result = chain._validateWithTransform(field, value);
153
+ const result = chain._validateWithTransform(field, value, rootCtx);
135
154
  errors.push(...result.errors);
136
155
  if (result.errors.length === 0 && value !== undefined) {
137
156
  validated[field] = result.transformed;
@@ -157,6 +176,7 @@ export class RuleChain {
157
176
  #transforms = [];
158
177
  #nestedSchema = null;
159
178
  #arrayItemChain = null;
179
+ #useRules = [];
160
180
  /** Public read access to rules (for OpenAPI generation, Rust bridge). */
161
181
  get rules() {
162
182
  return this.#rules;
@@ -167,6 +187,10 @@ export class RuleChain {
167
187
  get transforms() {
168
188
  return this.#transforms;
169
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
+ }
170
194
  /** Mark field as optional. */
171
195
  optional() {
172
196
  this.#isOptional = true;
@@ -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
- typeof transformed === "object" &&
314
- transformed !== null &&
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 nestedValue = transformed[nestedField];
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
- transformed[nestedField] =
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
- transformed = [...transformed];
330
- for (let i = 0; i < transformed.length; i++) {
331
- const itemResult = this.#arrayItemChain._validateWithTransform(`${field}.${i}`, transformed[i]);
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
- transformed[i] = itemResult.transformed;
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,
@@ -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
@@ -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;AASxC,OAAO,EACN,WAAW,EACX,KAAK,EACL,MAAM,EACN,uBAAuB,GACvB,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"}
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c9up/rune",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Rune — Validation engine for the Ream framework",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/src/Schema.ts CHANGED
@@ -23,6 +23,77 @@ export interface ValidationError {
23
23
  message: string;
24
24
  }
25
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
+
26
97
  /**
27
98
  * Validation result — discriminated union that narrows `data` to the schema's
28
99
  * `T` when `valid` is `true`, removing the need for callers to cast or guard
@@ -32,11 +103,27 @@ export type ValidationResult<T = Record<string, unknown>> =
32
103
  | { valid: true; errors: ValidationError[]; data: T }
33
104
  | { valid: false; errors: ValidationError[]; data?: undefined };
34
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
+
35
112
  export interface ValidationSchema<T = Record<string, unknown>> {
36
113
  fields: Record<string, RuleChain>;
37
- 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>;
38
122
  }
39
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
+
40
127
  /** Type guard: narrows `unknown` to a plain object (non-null, non-array, typeof 'object'). */
41
128
  function isPlainObject(value: unknown): value is Record<string, unknown> {
42
129
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -119,6 +206,7 @@ function resolveRuleMessage(field: string, rule: RuleDef): string {
119
206
  /** Compute once: does any field rule prevent dispatching to Rust? */
120
207
  function detectHasCustomRules(fields: Record<string, RuleChain>): boolean {
121
208
  return Object.values(fields).some((chain) => {
209
+ if (chain.useRules.length > 0) return true; // .use() rule — TS-only (Rust can't run JS)
122
210
  return chain.rules.some((r) => {
123
211
  if (!STANDARD_RULES.has(r.name)) return true; // custom rule
124
212
  if (!hasDefaultMessage(r)) return true; // custom message
@@ -151,7 +239,7 @@ export function schema<T = Record<string, unknown>>(
151
239
 
152
240
  return {
153
241
  fields,
154
- validate(data: unknown): ValidationResult<T> {
242
+ validate(data: unknown, options?: ValidateOptions): ValidationResult<T> {
155
243
  if (!isPlainObject(data)) {
156
244
  return {
157
245
  valid: false,
@@ -178,10 +266,17 @@ export function schema<T = Record<string, unknown>>(
178
266
 
179
267
  const errors: ValidationError[] = [];
180
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
+ };
181
276
 
182
277
  for (const [field, chain] of Object.entries(fields)) {
183
278
  const value = data[field];
184
- const result = chain._validateWithTransform(field, value);
279
+ const result = chain._validateWithTransform(field, value, rootCtx);
185
280
  errors.push(...result.errors);
186
281
  if (result.errors.length === 0 && value !== undefined) {
187
282
  validated[field] = result.transformed;
@@ -223,6 +318,7 @@ export class RuleChain {
223
318
  #transforms: Array<{ name: string; fn: (value: unknown) => unknown }> = [];
224
319
  #nestedSchema: Record<string, RuleChain> | null = null;
225
320
  #arrayItemChain: RuleChain | null = null;
321
+ #useRules: CompiledRule[] = [];
226
322
 
227
323
  /** Public read access to rules (for OpenAPI generation, Rust bridge). */
228
324
  get rules(): readonly RuleDef[] {
@@ -237,6 +333,10 @@ export class RuleChain {
237
333
  }> {
238
334
  return this.#transforms;
239
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
+ }
240
340
 
241
341
  /** Mark field as optional. */
242
342
  optional(): this {
@@ -377,6 +477,23 @@ export class RuleChain {
377
477
  return this;
378
478
  }
379
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
+
380
497
  /** Set custom error message for the last rule. */
381
498
  message(msg: string): this {
382
499
  if (this.#rules.length === 0) {
@@ -390,6 +507,7 @@ export class RuleChain {
390
507
  _validateWithTransform(
391
508
  field: string,
392
509
  value: unknown,
510
+ ctx: RunContext = EMPTY_RUN_CONTEXT,
393
511
  ): { errors: ValidationError[]; transformed: unknown } {
394
512
  if (value === undefined || value === null) {
395
513
  if (this.#isOptional) return { errors: [], transformed: value };
@@ -404,41 +522,42 @@ export class RuleChain {
404
522
  let transformed = this.#applyTransformsTo(value);
405
523
  const errors = this.#runValueRules(field, transformed);
406
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
+
407
531
  // 4. Nested object validation (only if type check passed — not arrays)
408
- if (
409
- this.#nestedSchema &&
410
- typeof transformed === "object" &&
411
- transformed !== null &&
412
- !Array.isArray(transformed)
413
- ) {
414
- transformed = { ...(transformed as Record<string, unknown>) };
532
+ if (this.#nestedSchema && isPlainObject(transformed)) {
533
+ const obj: Record<string, unknown> = { ...transformed };
534
+ transformed = obj;
415
535
  for (const [nestedField, chain] of Object.entries(this.#nestedSchema)) {
416
- const nestedValue = (transformed as Record<string, unknown>)[
417
- nestedField
418
- ];
419
536
  const nestedResult = chain._validateWithTransform(
420
537
  `${field}.${nestedField}`,
421
- nestedValue,
538
+ obj[nestedField],
539
+ { data: ctx.data, parent: obj, meta: ctx.meta },
422
540
  );
423
541
  errors.push(...nestedResult.errors);
424
542
  if (nestedResult.transformed !== undefined) {
425
- (transformed as Record<string, unknown>)[nestedField] =
426
- nestedResult.transformed;
543
+ obj[nestedField] = nestedResult.transformed;
427
544
  }
428
545
  }
429
546
  }
430
547
 
431
548
  // 5. Array item validation
432
549
  if (this.#arrayItemChain && Array.isArray(transformed)) {
433
- transformed = [...transformed];
434
- for (let i = 0; i < (transformed as unknown[]).length; i++) {
550
+ const arr: unknown[] = [...transformed];
551
+ transformed = arr;
552
+ for (let i = 0; i < arr.length; i++) {
435
553
  const itemResult = this.#arrayItemChain._validateWithTransform(
436
554
  `${field}.${i}`,
437
- (transformed as unknown[])[i],
555
+ arr[i],
556
+ { data: ctx.data, parent: arr, meta: ctx.meta },
438
557
  );
439
558
  errors.push(...itemResult.errors);
440
559
  if (itemResult.transformed !== undefined) {
441
- (transformed as unknown[])[i] = itemResult.transformed;
560
+ arr[i] = itemResult.transformed;
442
561
  }
443
562
  }
444
563
  }
@@ -446,6 +565,31 @@ export class RuleChain {
446
565
  return { errors, transformed };
447
566
  }
448
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
+
449
593
  #requiredError(field: string): ValidationError {
450
594
  return {
451
595
  field,
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,