@nhtio/validation 1.20250911.0 → 1.20251028.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nhtio/validation",
3
- "version": "1.20250911.0",
3
+ "version": "1.20251028.0",
4
4
  "description": "A powerful schema description language and data validator",
5
5
  "keywords": [],
6
6
  "author": "Jak Giveon <jak@nht.io>",
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Modern ES6 + TypeScript reimplementation of Joi's root factory.
3
+ *
4
+ * Based on: https://github.com/hapijs/joi/blob/master/lib/index.js
5
+ *
6
+ * This module recreates Joi's internal root factory to enable deeper
7
+ * customization through schema type modifiers and shortcuts modifiers.
8
+ */
9
+ import type { Root } from 'joi';
10
+ import type { Schema } from '../index';
11
+ export type SchemaTypeDefinition = Schema;
12
+ export type SchemaTypeDefinititionMiddlewareFn = (ctx: SchemaTypeDefinition, root: Root, args: any[]) => SchemaTypeDefinition;
13
+ export type ShortcutsMiddlewareFn = (ctx: string[]) => string[];
14
+ export interface RootFactoryOptions {
15
+ schemaTypeModifiers?: SchemaTypeDefinititionMiddlewareFn[];
16
+ shortcutsModifiers?: ShortcutsMiddlewareFn[];
17
+ }
18
+ export declare class RootFactory {
19
+ static readonly types: {
20
+ alternatives: any;
21
+ any: any;
22
+ array: any;
23
+ boolean: any;
24
+ date: any;
25
+ function: any;
26
+ link: any;
27
+ number: any;
28
+ object: any;
29
+ string: any;
30
+ symbol: any;
31
+ binary: any;
32
+ };
33
+ static readonly aliases: {
34
+ alt: string;
35
+ bool: string;
36
+ func: string;
37
+ };
38
+ static assertValue(value: any, schema: any, annotate: boolean, args: any[]): any;
39
+ static generate(root: any, schema: any, args: any[]): any;
40
+ static expandExtension(extension: any, joi: any): any[];
41
+ static getMethods(): {
42
+ ValidationError: any;
43
+ version: any;
44
+ cache: any;
45
+ assert(value: any, schema: any, ...args: any[]): void;
46
+ attempt(value: any, schema: any, ...args: any[]): any;
47
+ build(this: Root, desc: any): any;
48
+ checkPreferences(prefs: any): void;
49
+ compile(this: Root, schema: any, options: any): any;
50
+ defaults(this: Root, modifier: any): Root;
51
+ expression(...args: any[]): any;
52
+ extend(this: Root, ...extensions: any[]): Root;
53
+ isError: any;
54
+ isExpression: any;
55
+ isRef: any;
56
+ isSchema: any;
57
+ in(...args: any[]): any;
58
+ override: any;
59
+ ref(...args: any[]): any;
60
+ types(this: any): any;
61
+ };
62
+ static create(options?: RootFactoryOptions): Root;
63
+ }
@@ -1,12 +1,14 @@
1
- import { default as Joi } from 'joi';
2
1
  import type { DateTime } from 'luxon';
3
2
  import type { PhoneSchema } from './schemas/phone';
4
3
  import type { BigIntSchema } from './schemas/bigint';
5
4
  import type { DatetimeSchema } from './schemas/datetime';
6
5
  import type { CountryOrUnknown } from '@nhtio/phone-object';
7
- import type { Root, Reference, SchemaMap, SchemaLike } from 'joi';
8
6
  import type { I18nCallback, SetI18nCallback } from './patches/i18n';
7
+ import type { ValidationOptions, Root, Reference as JoiReference, SchemaMap, SchemaLike, WhenSchemaOptions, WhenOptions, State, ReferenceOptions } from 'joi';
9
8
  import type { AnySchema, StringSchema, BinarySchema, NumberSchema, BooleanSchema, ObjectSchema, ArraySchema, DateSchema, AlternativesSchema, FunctionSchema, LinkSchema, SymbolSchema, Schema } from './schemas';
9
+ export type Reference = JoiReference & {
10
+ resolve: (value: any, state: State, prefs: ValidationOptions, local?: any, options?: ReferenceOptions) => any;
11
+ };
10
12
  /**
11
13
  * Extended Joi root interface that includes custom schema types for
12
14
  * additional validation scenarios.
@@ -26,7 +28,7 @@ import type { AnySchema, StringSchema, BinarySchema, NumberSchema, BooleanSchema
26
28
  *
27
29
  * @public
28
30
  */
29
- export interface ValidationRoot extends Omit<Root, 'allow' | 'alt' | 'alternatives' | 'any' | 'array' | 'binary' | 'bool' | 'boolean' | 'date' | 'disallow' | 'equal' | 'exist' | 'forbidden' | 'func' | 'function' | 'invalid' | 'link' | 'not' | 'number' | 'object' | 'optional' | 'preferences' | 'prefs' | 'required' | 'string' | 'symbol' | 'types' | 'valid' | 'when'> {
31
+ export interface ValidationRoot extends Omit<Root, 'allow' | 'alt' | 'alternatives' | 'any' | 'array' | 'binary' | 'bool' | 'boolean' | 'date' | 'disallow' | 'equal' | 'exist' | 'forbidden' | 'func' | 'function' | 'invalid' | 'link' | 'not' | 'number' | 'object' | 'optional' | 'preferences' | 'prefs' | 'required' | 'string' | 'symbol' | 'types' | 'valid' | 'when' | 'ref'> {
30
32
  /**
31
33
  * Generates a schema object that matches any data type.
32
34
  */
@@ -165,16 +167,20 @@ export interface ValidationRoot extends Omit<Root, 'allow' | 'alt' | 'alternativ
165
167
  /**
166
168
  * Overrides the global validate() options for the current key and any sub-key.
167
169
  */
168
- preferences(options: Joi.ValidationOptions): Schema;
170
+ preferences(options: ValidationOptions): Schema;
169
171
  /**
170
172
  * Overrides the global validate() options for the current key and any sub-key.
171
173
  */
172
- prefs(options: Joi.ValidationOptions): Schema;
174
+ prefs(options: ValidationOptions): Schema;
173
175
  /**
174
176
  * Converts the type into an alternatives type where the conditions are merged into the type definition where:
175
177
  */
176
- when(ref: string | Reference, options: Joi.WhenOptions | Joi.WhenOptions[]): AlternativesSchema;
177
- when(ref: Schema, options: Joi.WhenSchemaOptions): AlternativesSchema;
178
+ when(ref: string | Reference, options: WhenOptions | WhenOptions[]): AlternativesSchema;
179
+ when(ref: Schema, options: WhenSchemaOptions): AlternativesSchema;
180
+ /**
181
+ * Creates a reference to another schema key.
182
+ */
183
+ ref(key: string, options?: ReferenceOptions): Reference;
178
184
  /**
179
185
  * Sets a global internationalization callback that applies to all validator instances.
180
186
  *
@@ -232,27 +238,8 @@ export interface ValidationRoot extends Omit<Root, 'allow' | 'alt' | 'alternativ
232
238
  $clearI18n: () => ValidationRoot;
233
239
  $i18n: I18nCallback;
234
240
  }
235
- /**
236
- * Extended Joi instance with custom schema types.
237
- *
238
- * This instance includes all standard Joi functionality plus additional
239
- * schema types for additional validation scenarios.
240
- *
241
- * @example
242
- * ```typescript
243
- * import { validator } from '@nhtio/validation'
244
- *
245
- * // Standard Joi usage
246
- * const userSchema = validator.object({
247
- * name: validator.string().required(),
248
- * age: validator.number().min(0),
249
- * balance: validator.bigint().positive() // Custom BigInt type
250
- * })
251
- * ```
252
- *
253
- * @public
254
- */
255
241
  export declare const validator: ValidationRoot;
256
242
  export type { BigIntSchema, DatetimeSchema, PhoneSchema, SetI18nCallback, I18nCallback };
257
243
  export type * from './schemas';
258
244
  export { encode, decode } from './utils';
245
+ export type { Knex } from 'knex';
@@ -0,0 +1,10 @@
1
+ import type { SchemaTypeDefinititionMiddlewareFn } from '../core/root';
2
+ export declare const knexMessages: {
3
+ 'knex.unique': string;
4
+ 'knex.exists': string;
5
+ 'knex.missingConnection': string;
6
+ 'knex.invalidTable': string;
7
+ 'knex.invalidColumn': string;
8
+ 'knex.internal': string;
9
+ };
10
+ export declare const knex: SchemaTypeDefinititionMiddlewareFn;
@@ -1,9 +1,10 @@
1
1
  import { DateTime } from 'luxon';
2
- import { Dayjs } from 'dayjs';
2
+ import type { Dayjs } from 'dayjs';
3
3
  import type { Tokens } from '../types';
4
4
  import type { AnySchema } from '../schemas';
5
- import type { ExtensionFactory, Reference } from 'joi';
5
+ import type { ExtensionFactory, CustomHelpers, Reference } from 'joi';
6
6
  import type { Zone, LocaleOptions, DateObjectUnits, ZoneOptions, ToISOTimeOptions, ToISODateOptions, ToSQLOptions, ToRelativeOptions } from 'luxon';
7
+ type CallbackOrValue<T> = T | ((dt: DateTime, helpers: CustomHelpers) => T);
7
8
  export declare const messages: {
8
9
  'datetime.base': string;
9
10
  'datetime.exactly': string;
@@ -251,59 +252,90 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
251
252
  /**
252
253
  * Formats the datetime using a custom format string during validation.
253
254
  *
254
- * @param format - The format string (Luxon format tokens)
255
+ * @param format - The format string (Luxon format tokens) or callback function
255
256
  * @returns The schema instance for method chaining
256
257
  *
257
- * @example
258
+ * @example Static format
258
259
  * ```typescript
259
260
  * const schema = joi.datetime().toFormat('yyyy-MM-dd HH:mm:ss')
260
261
  * const result = schema.validate('2023-07-15T15:30:00Z')
261
262
  * // Returns: "2023-07-15 15:30:00"
262
263
  * ```
264
+ *
265
+ * @example Callback function (serializable)
266
+ * ```typescript
267
+ * const schema = joi.datetime().toFormat((dt, helpers) =>
268
+ * dt.year > 2000 ? 'yyyy-MM-dd' : 'MM/dd/yy'
269
+ * )
270
+ * ```
263
271
  */
264
- toFormat(format: Tokens): this;
272
+ toFormat(format: CallbackOrValue<Tokens>): this;
265
273
  /**
266
274
  * Formats the datetime using locale-specific formatting during validation.
267
275
  *
268
- * @param formatOpts - Locale formatting options
276
+ * @param formatOpts - Locale formatting options or callback function
269
277
  * @returns The schema instance for method chaining
270
278
  *
271
- * @example
279
+ * @example Static options
272
280
  * ```typescript
273
- * const schema = joi.datetime().toLocaleString({ month: 'long', day: 'numeric' })
281
+ * const schema = joi.datetime().toLocalizedString({ month: 'long', day: 'numeric' })
274
282
  * const result = schema.validate('2023-07-15T15:30:00Z')
275
283
  * // Returns: "July 15" (or localized equivalent)
276
284
  * ```
285
+ *
286
+ * @example Callback function (serializable)
287
+ * ```typescript
288
+ * const schema = joi.datetime().toLocalizedString((dt, helpers) => ({
289
+ * month: dt.month > 6 ? 'long' : 'short',
290
+ * day: 'numeric'
291
+ * }))
292
+ * ```
277
293
  */
278
- toLocalizedString(formatOpts: LocaleOptions): this;
294
+ toLocalizedString(formatOpts: CallbackOrValue<LocaleOptions>): this;
279
295
  /**
280
296
  * Converts the datetime to ISO 8601 string format during validation.
281
297
  *
282
- * @param opts - Options for ISO string formatting
298
+ * @param opts - Options for ISO string formatting or callback function
283
299
  * @returns The schema instance for method chaining
284
300
  *
285
- * @example
301
+ * @example Static options
286
302
  * ```typescript
287
- * const schema = joi.datetime().toISO()
303
+ * const schema = joi.datetime().toISO({ suppressMilliseconds: true })
288
304
  * const result = schema.validate('July 15, 2023 3:30 PM')
289
- * // Returns: "2023-07-15T15:30:00.000Z"
305
+ * // Returns: "2023-07-15T15:30:00Z"
306
+ * ```
307
+ *
308
+ * @example Callback function (serializable)
309
+ * ```typescript
310
+ * const schema = joi.datetime().toISO((dt, helpers) => ({
311
+ * suppressMilliseconds: true,
312
+ * extendedZone: dt.year > 1970,
313
+ * precision: 'seconds'
314
+ * }))
290
315
  * ```
291
316
  */
292
- toISO(opts?: ToISOTimeOptions): this;
317
+ toISO(opts?: CallbackOrValue<ToISOTimeOptions>): this;
293
318
  /**
294
319
  * Converts the datetime to ISO date format (YYYY-MM-DD) during validation.
295
320
  *
296
- * @param opts - Options for ISO date formatting
321
+ * @param opts - Options for ISO date formatting or callback function
297
322
  * @returns The schema instance for method chaining
298
323
  *
299
- * @example
324
+ * @example Static options
300
325
  * ```typescript
301
326
  * const schema = joi.datetime().toISODate()
302
327
  * const result = schema.validate('July 15, 2023 3:30 PM')
303
328
  * // Returns: "2023-07-15"
304
329
  * ```
330
+ *
331
+ * @example Callback function (serializable)
332
+ * ```typescript
333
+ * const schema = joi.datetime().toISODate((dt, helpers) => ({
334
+ * format: dt.year > 2000 ? 'extended' : 'basic'
335
+ * }))
336
+ * ```
305
337
  */
306
- toISODate(opts?: ToISODateOptions): this;
338
+ toISODate(opts?: CallbackOrValue<ToISODateOptions>): this;
307
339
  /**
308
340
  * Converts the datetime to ISO week date format during validation.
309
341
  *
@@ -320,17 +352,24 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
320
352
  /**
321
353
  * Converts the datetime to ISO time format during validation.
322
354
  *
323
- * @param opts - Options for ISO time formatting
355
+ * @param opts - Options for ISO time formatting or callback function
324
356
  * @returns The schema instance for method chaining
325
357
  *
326
- * @example
358
+ * @example Static options
327
359
  * ```typescript
328
- * const schema = joi.datetime().toISOTime()
360
+ * const schema = joi.datetime().toISOTime({ suppressMilliseconds: true })
329
361
  * const result = schema.validate('2023-07-15T15:30:00Z')
330
- * // Returns: "15:30:00.000Z"
362
+ * // Returns: "15:30:00Z"
363
+ * ```
364
+ *
365
+ * @example Callback function (serializable)
366
+ * ```typescript
367
+ * const schema = joi.datetime().toISOTime((dt, helpers) => ({
368
+ * suppressMilliseconds: dt.millisecond === 0
369
+ * }))
331
370
  * ```
332
371
  */
333
- toISOTime(opts?: ToISOTimeOptions): this;
372
+ toISOTime(opts?: CallbackOrValue<ToISOTimeOptions>): this;
334
373
  /**
335
374
  * Converts the datetime to RFC 2822 format during validation.
336
375
  *
@@ -373,31 +412,45 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
373
412
  /**
374
413
  * Converts the datetime to SQL time format (HH:mm:ss.SSS) during validation.
375
414
  *
376
- * @param opts - Options for SQL time formatting
415
+ * @param opts - Options for SQL time formatting or callback function
377
416
  * @returns The schema instance for method chaining
378
417
  *
379
- * @example
418
+ * @example Static options
380
419
  * ```typescript
381
- * const schema = joi.datetime().toSQLTime()
420
+ * const schema = joi.datetime().toSQLTime({ includeZone: true })
382
421
  * const result = schema.validate('2023-07-15T15:30:45.123Z')
383
- * // Returns: "15:30:45.123"
422
+ * // Returns: "15:30:45.123 Z"
423
+ * ```
424
+ *
425
+ * @example Callback function (serializable)
426
+ * ```typescript
427
+ * const schema = joi.datetime().toSQLTime((dt, helpers) => ({
428
+ * includeZone: dt.zone.name !== 'UTC'
429
+ * }))
384
430
  * ```
385
431
  */
386
- toSQLTime(opts?: ToSQLOptions): this;
432
+ toSQLTime(opts?: CallbackOrValue<ToSQLOptions>): this;
387
433
  /**
388
434
  * Converts the datetime to SQL datetime format during validation.
389
435
  *
390
- * @param opts - Options for SQL formatting
436
+ * @param opts - Options for SQL formatting or callback function
391
437
  * @returns The schema instance for method chaining
392
438
  *
393
- * @example
439
+ * @example Static options
394
440
  * ```typescript
395
- * const schema = joi.datetime().toSQL()
441
+ * const schema = joi.datetime().toSQL({ includeZone: false })
396
442
  * const result = schema.validate('2023-07-15T15:30:45.123Z')
397
- * // Returns: "2023-07-15 15:30:45.123 Z"
443
+ * // Returns: "2023-07-15 15:30:45.123"
444
+ * ```
445
+ *
446
+ * @example Callback function (serializable)
447
+ * ```typescript
448
+ * const schema = joi.datetime().toSQL((dt, helpers) => ({
449
+ * includeZone: dt.zone.name !== 'UTC'
450
+ * }))
398
451
  * ```
399
452
  */
400
- toSQL(opts?: ToSQLOptions): this;
453
+ toSQL(opts?: CallbackOrValue<ToSQLOptions>): this;
401
454
  /**
402
455
  * Converts the datetime to milliseconds since Unix epoch during validation.
403
456
  *
@@ -466,19 +519,26 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
466
519
  /**
467
520
  * Converts the datetime to a plain object representation during validation.
468
521
  *
469
- * @param opts - Options for object conversion
522
+ * @param opts - Options for object conversion or callback function
470
523
  * @returns The schema instance for method chaining
471
524
  *
472
- * @example
525
+ * @example Static options
473
526
  * ```typescript
474
- * const schema = joi.datetime().toObject()
527
+ * const schema = joi.datetime().toObject({ includeConfig: true })
475
528
  * const result = schema.validate('2023-07-15T15:30:00Z')
476
529
  * // Returns: { year: 2023, month: 7, day: 15, hour: 15, minute: 30, second: 0, millisecond: 0 }
477
530
  * ```
531
+ *
532
+ * @example Callback function (serializable)
533
+ * ```typescript
534
+ * const schema = joi.datetime().toObject((dt, helpers) => ({
535
+ * includeConfig: dt.year > 2000
536
+ * }))
537
+ * ```
478
538
  */
479
- toObject(opts?: {
539
+ toObject(opts?: CallbackOrValue<{
480
540
  includeConfig?: boolean;
481
- }): this;
541
+ }>): this;
482
542
  /**
483
543
  * Converts the datetime to a JavaScript Date object during validation.
484
544
  *
@@ -495,17 +555,24 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
495
555
  /**
496
556
  * Converts the datetime to a relative time string during validation.
497
557
  *
498
- * @param opts - Options for relative time formatting
558
+ * @param opts - Options for relative time formatting or callback function
499
559
  * @returns The schema instance for method chaining
500
560
  *
501
- * @example
561
+ * @example Static options
502
562
  * ```typescript
503
- * const schema = joi.datetime().toRelative()
563
+ * const schema = joi.datetime().toRelative({ base: DateTime.now() })
504
564
  * const result = schema.validate('2023-07-15T15:30:00Z')
505
565
  * // Returns: "2 hours ago" (relative to current time)
506
566
  * ```
567
+ *
568
+ * @example Callback function (serializable)
569
+ * ```typescript
570
+ * const schema = joi.datetime().toRelative((dt, helpers) => ({
571
+ * base: dt.year > 2020 ? DateTime.now() : DateTime.fromISO('2020-01-01')
572
+ * }))
573
+ * ```
507
574
  */
508
- toRelative(opts?: ToRelativeOptions): this;
575
+ toRelative(opts?: CallbackOrValue<ToRelativeOptions>): this;
509
576
  /**
510
577
  * Sets the locale for the datetime during validation.
511
578
  *
@@ -584,3 +651,4 @@ export interface DatetimeSchema<TSchema = DateTime> extends AnySchema<TSchema> {
584
651
  * ```
585
652
  */
586
653
  export declare const datetime: ExtensionFactory;
654
+ export {};
@@ -1,9 +1,40 @@
1
+ import type { Knex } from 'knex';
2
+ import type { Reference } from '..';
1
3
  import type { DateTime } from 'luxon';
2
4
  import type { PhoneSchema } from './schemas/phone';
3
5
  import type { BigIntSchema } from './schemas/bigint';
4
6
  import type { DatetimeSchema } from './schemas/datetime';
5
- import type { default as Joi, AnySchema as JoiAnySchema, Reference, BasicType, CustomHelpers } from 'joi';
7
+ import type { QueryClientContract } from '@adonisjs/lucid/types/database';
8
+ import type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder';
9
+ import type { default as Joi, AnySchema as JoiAnySchema, BasicType, CustomHelpers, ExternalHelpers } from 'joi';
10
+ export type { Knex, QueryClientContract, DatabaseQueryBuilderContract };
11
+ export type KnexTransaction = Knex.Transaction;
12
+ export type KnexQueryBuilder = Knex.QueryBuilder;
13
+ export type QueryClient = Knex | KnexTransaction | QueryClientContract;
14
+ export type QueryBuilder = KnexQueryBuilder | DatabaseQueryBuilderContract;
15
+ export interface KnexConnectionConfigurations {
16
+ client: NonNullable<Knex.Config['client']>;
17
+ connection: NonNullable<Knex.Config['connection']>;
18
+ [key: string | number | symbol]: any;
19
+ }
20
+ export type KnexSchemaConnection = QueryClient | KnexConnectionConfigurations;
6
21
  export type DefaultableValue = Reference | BasicType | DateTime | bigint | ((parent: any, helpers: CustomHelpers) => Reference | BasicType | DateTime | bigint);
22
+ /**
23
+ * Options for database-backed validation helpers such as `uniqueInDb` and `existsInDb`.
24
+ */
25
+ export interface DbValidationOptions {
26
+ /**
27
+ * Perform case-insensitive comparisons when querying the database.
28
+ * Defaults to `false`.
29
+ */
30
+ caseInsensitive?: boolean;
31
+ /**
32
+ * Optional function that receives the Knex query builder (or equivalent) so
33
+ * the caller can append additional WHERE clauses (or joins). Can be async.
34
+ * Example: `async (query, value, column, helpers) => query.where('tenant_id', tenantId)`
35
+ */
36
+ filter?: (queryBuilder: QueryBuilder, value: any, column: string, helpers: Omit<ExternalHelpers, 'warn' | 'error' | 'message'>) => void | Promise<void>;
37
+ }
7
38
  /**
8
39
  * Base schema type for all validation schemas.
9
40
  *
@@ -100,6 +131,70 @@ export interface AnySchema<TSchema = any> extends Omit<JoiAnySchema<TSchema>, '$
100
131
  warning(code: string, context: Joi.Context): this;
101
132
  when(ref: string | Reference, options: Joi.WhenOptions | Joi.WhenOptions[]): this;
102
133
  when(ref: Schema, options: Joi.WhenSchemaOptions): this;
134
+ $_knex: KnexSchemaConnection | undefined;
135
+ /**
136
+ * Sets the database connection for database validation rules.
137
+ * This must be called before using `.uniqueInDb()` or `.existsInDb()`.
138
+ *
139
+ * @param connection - A Knex instance, transaction, or connection configuration
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * import knex from 'knex'
144
+ * const db = knex({ client: 'pg', connection: {...} })
145
+ * const schema = joi.string().knex(db).uniqueInDb('users', 'email')
146
+ * ```
147
+ */
148
+ knex(connection: KnexSchemaConnection): this;
149
+ /**
150
+ * Alias for `.knex()`. Sets the database connection for database validation rules.
151
+ *
152
+ * @param connection - A Knex instance, transaction, or connection configuration
153
+ */
154
+ db(connection: KnexSchemaConnection): this;
155
+ /**
156
+ * Validates that the value is unique in the specified database table and column.
157
+ * Requires `.knex()` or `.db()` to be called first to set the database connection.
158
+ *
159
+ * @param table - The database table name (can be a Joi reference)
160
+ * @param column - The column name to check (can be a Joi reference)
161
+ * @param options - Optional configuration:
162
+ * - `caseInsensitive`: Perform case-insensitive comparison (default: false)
163
+ * - `filter`: Async function to add additional WHERE clauses to the query
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * const schema = joi.object({
168
+ * email: joi.string().email().knex(db).uniqueInDb('users', 'email'),
169
+ * username: joi.string().knex(db).uniqueInDb('users', 'username', {
170
+ * caseInsensitive: true,
171
+ * filter: async (query) => query.where('tenant_id', tenantId)
172
+ * })
173
+ * })
174
+ * ```
175
+ */
176
+ uniqueInDb(table: string | Reference, column: string | Reference, options?: DbValidationOptions): this;
177
+ /**
178
+ * Validates that the value exists in the specified database table and column.
179
+ * Requires `.knex()` or `.db()` to be called first to set the database connection.
180
+ *
181
+ * @param table - The database table name (can be a Joi reference)
182
+ * @param column - The column name to check (can be a Joi reference)
183
+ * @param options - Optional configuration:
184
+ * - `caseInsensitive`: Perform case-insensitive comparison (default: false)
185
+ * - `filter`: Async function to add additional WHERE clauses to the query
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * const schema = joi.object({
190
+ * country_id: joi.number().knex(db).existsInDb('countries', 'id'),
191
+ * category: joi.string().knex(db).existsInDb('categories', 'name', {
192
+ * caseInsensitive: true
193
+ * })
194
+ * })
195
+ * ```
196
+ */
197
+ existsInDb(table: string | Reference, column: string | Reference, options?: DbValidationOptions): this;
103
198
  /**
104
199
  * Sets a default value if the original value is `undefined`.
105
200
  *