@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 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
@@ -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 (isNativeAvailable() && !hasCustomRules && !validationTranslator) {
121
- return validateWithRust(fields, data);
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
- validate: (v) => {
248
- if (typeof v !== "string")
249
- return false;
250
- if (/[\r\n]/.test(v))
251
- return false;
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
- 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,
@@ -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: extractParam(chain, "min") }
464
+ ? { min: r.param }
405
465
  : r.name === "max"
406
- ? { max: extractParam(chain, "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
@@ -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"}
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
@@ -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
@@ -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"}
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.4",
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
@@ -5,7 +5,11 @@
5
5
  */
6
6
 
7
7
  import { RuneError } from "./errors.js";
8
- import { isNativeAvailable, validateNative } from "./native.js";
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 (isNativeAvailable() && !hasCustomRules && !validationTranslator) {
165
- return validateWithRust<T>(fields, data);
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
- validate: (v) => {
326
- if (typeof v !== "string") return false;
327
- if (/[\r\n]/.test(v)) return false;
328
- const at = v.indexOf("@");
329
- if (at <= 0 || at !== v.lastIndexOf("@")) return false;
330
- const domain = v.slice(at + 1);
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
- this.#nestedSchema &&
402
- typeof transformed === "object" &&
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
- nestedValue,
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
- (transformed as Record<string, unknown>)[nestedField] =
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
- transformed = [...transformed];
426
- 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++) {
427
553
  const itemResult = this.#arrayItemChain._validateWithTransform(
428
554
  `${field}.${i}`,
429
- (transformed as unknown[])[i],
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
- (transformed as unknown[])[i] = itemResult.transformed;
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: extractParam(chain, "min") }
683
+ ? { min: r.param }
529
684
  : r.name === "max"
530
- ? { max: extractParam(chain, "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
+ }