speexjs 0.2.3 → 0.4.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/README.md +32 -60
- package/dist/cli/index.js +300 -91
- package/dist/cli/index.js.map +1 -1
- package/dist/{index-CMkhSDh7.d.ts → index-C4xilc_E.d.ts} +4 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2989 -1864
- package/dist/index.js.map +1 -1
- package/dist/rpc/index.d.ts +1 -1
- package/dist/schema/index.d.ts +36 -30
- package/dist/schema/index.js +12 -229
- package/dist/schema/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +3 -1
- package/dist/server/auth/index.js +18 -12
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +2 -1
- package/dist/server/controller/index.d.ts +2 -1
- package/dist/server/database/index.d.ts +34 -2
- package/dist/server/database/index.js +1101 -30
- package/dist/server/database/index.js.map +1 -1
- package/dist/server/gate/index.d.ts +2 -1
- package/dist/server/http/index.js +19 -2
- package/dist/server/http/index.js.map +1 -1
- package/dist/server/index.d.ts +58 -4
- package/dist/server/index.js +2058 -716
- package/dist/server/index.js.map +1 -1
- package/dist/server/middleware/index.d.ts +2 -1
- package/dist/server/middleware/index.js +85 -34
- package/dist/server/middleware/index.js.map +1 -1
- package/dist/server/router/index.d.ts +2 -1
- package/dist/server/router/index.js +8 -6
- package/dist/server/router/index.js.map +1 -1
- package/dist/{types-CXH8hPei.d.ts → types-aW38f63o.d.ts} +1 -1
- package/package.json +142 -136
package/dist/schema/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/schema/messages.ts","../../src/schema/types.ts","../../src/schema/primitives.ts","../../src/schema/complex.ts","../../src/schema/indonesia.ts","../../src/schema/transform.ts","../../src/schema/index.ts"],"sourcesContent":["let currentLocale: 'id' | 'en' = 'id'\n\nconst ID: Record<string, string> = {\n required: 'Nilai wajib diisi',\n type_string: 'Nilai harus berupa teks',\n type_number: 'Nilai harus berupa angka',\n type_boolean: 'Nilai harus berupa boolean',\n type_bigint: 'Nilai harus berupa BigInt',\n type_symbol: 'Nilai harus berupa Symbol',\n type_undefined: 'Nilai harus berupa undefined',\n type_null: 'Nilai harus berupa null',\n type_nan: 'Nilai harus berupa NaN',\n type_object: 'Nilai harus berupa objek',\n type_array: 'Nilai harus berupa array',\n type_date: 'Nilai harus berupa tanggal yang valid',\n type_function: 'Nilai harus berupa fungsi',\n type_string_or_number: 'Nilai harus berupa teks atau angka',\n string_min: 'Panjang minimal {min} karakter',\n string_max: 'Panjang maksimal {max} karakter',\n string_length: 'Panjang harus tepat {length} karakter',\n string_email: 'Format email tidak valid',\n string_url: 'Format URL tidak valid',\n string_regex: 'Format tidak sesuai dengan pola yang diharapkan',\n string_includes: 'Teks harus mengandung \"{substring}\"',\n string_starts_with: 'Teks harus diawali dengan \"{prefix}\"',\n string_ends_with: 'Teks harus diakhiri dengan \"{suffix}\"',\n number_min: 'Nilai minimal {min}',\n number_max: 'Nilai maksimal {max}',\n number_int: 'Nilai harus bilangan bulat',\n number_positive: 'Nilai harus positif',\n number_negative: 'Nilai harus negatif',\n number_finite: 'Nilai harus terbatas (finite)',\n number_safe: 'Nilai harus dalam batas safe integer',\n array_min: 'Panjang array minimal {min}',\n array_max: 'Panjang array maksimal {max}',\n array_length: 'Panjang array harus tepat {length}',\n array_nonempty: 'Array tidak boleh kosong',\n array_unique: 'Semua elemen array harus unik',\n object_strict: 'Key \"{key}\" tidak dikenal',\n enum_invalid: 'Nilai harus salah satu dari: {values}',\n tuple_length: 'Tuple harus memiliki tepat {length} elemen',\n union_fail: 'Nilai tidak cocok dengan skema apapun',\n intersection_fail: 'Nilai tidak cocok dengan interseksi skema',\n literal_fail: 'Nilai harus tepat {expected}',\n refine_fail: '{message}',\n date_invalid: 'Tanggal tidak valid',\n date_not_date: 'Nilai harus berupa tanggal yang valid',\n indonesia_nik: 'NIK harus 16 digit dan memenuhi format yang valid',\n indonesia_npwp: 'NPWP tidak valid',\n indonesia_phone: 'Nomor telepon Indonesia tidak valid',\n indonesia_alamat: 'Alamat tidak valid (minimal 10 karakter, harus mengandung unsur jalan/RT/RW)',\n indonesia_kodepos: 'Kode pos harus 5 digit angka',\n indonesia_rekening: 'Nomor rekening harus 10-16 digit angka',\n coerce_number_fail: 'Nilai tidak dapat dikonversi menjadi angka',\n coerce_date_fail: 'Nilai tidak dapat dikonversi menjadi tanggal',\n map_not_map: 'Nilai harus berupa Map',\n set_not_set: 'Nilai harus berupa Set',\n}\n\nconst EN: Record<string, string> = {\n required: 'Value is required',\n type_string: 'Expected a string',\n type_number: 'Expected a number',\n type_boolean: 'Expected a boolean',\n type_bigint: 'Expected a BigInt',\n type_symbol: 'Expected a Symbol',\n type_undefined: 'Expected undefined',\n type_null: 'Expected null',\n type_nan: 'Expected NaN',\n type_object: 'Expected an object',\n type_array: 'Expected an array',\n type_date: 'Expected a valid date',\n type_function: 'Expected a function',\n type_string_or_number: 'Expected a string or number',\n string_min: 'Minimum {min} characters',\n string_max: 'Maximum {max} characters',\n string_length: 'Exactly {length} characters required',\n string_email: 'Invalid email format',\n string_url: 'Invalid URL format',\n string_regex: 'Format does not match expected pattern',\n string_includes: 'Must contain \"{substring}\"',\n string_starts_with: 'Must start with \"{prefix}\"',\n string_ends_with: 'Must end with \"{suffix}\"',\n number_min: 'Minimum value is {min}',\n number_max: 'Maximum value is {max}',\n number_int: 'Expected an integer',\n number_positive: 'Expected a positive number',\n number_negative: 'Expected a negative number',\n number_finite: 'Expected a finite number',\n number_safe: 'Expected a safe integer',\n array_min: 'Minimum {min} items',\n array_max: 'Maximum {max} items',\n array_length: 'Exactly {length} items required',\n array_nonempty: 'Array must not be empty',\n array_unique: 'All items must be unique',\n object_strict: 'Unexpected key: \"{key}\"',\n enum_invalid: 'Value must be one of: {values}',\n tuple_length: 'Tuple must have exactly {length} items',\n union_fail: 'Value does not match any schema',\n intersection_fail: 'Value does not match intersection schema',\n literal_fail: 'Value must be {expected}',\n refine_fail: '{message}',\n date_invalid: 'Invalid date',\n date_not_date: 'Value must be a valid date',\n indonesia_nik: 'NIK must be 16 digits with valid format',\n indonesia_npwp: 'Invalid NPWP format',\n indonesia_phone: 'Invalid Indonesian phone number',\n indonesia_alamat: 'Invalid address (min 10 characters, must contain street/RT/RW elements)',\n indonesia_kodepos: 'Postal code must be 5 digits',\n indonesia_rekening: 'Bank account number must be 10-16 digits',\n coerce_number_fail: 'Value cannot be coerced to a number',\n coerce_date_fail: 'Value cannot be coerced to a date',\n map_not_map: 'Expected a Map',\n set_not_set: 'Expected a Set',\n}\n\nconst store: Record<string, string> = { ...ID }\n\nexport function msg(key: string, params?: Record<string, string | number | undefined>): string {\n let template = store[key]\n if (!template) return key\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n template = template.replace(`{${k}}`, v !== undefined ? String(v) : '')\n }\n }\n return template\n}\n\nexport function setLocale(locale: 'id' | 'en'): void {\n currentLocale = locale\n const source = locale === 'id' ? ID : EN\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n store[key] = source[key]!\n }\n }\n}\n\nexport function getLocale(): 'id' | 'en' {\n return currentLocale\n}\n","import { msg } from './messages.js'\n\n// ─── SchemaError ────────────────────────────────────────────\n\nexport class SchemaError extends Error {\n readonly path: string\n readonly received: unknown\n\n constructor(message: string, options?: { path?: string; received?: unknown }) {\n super(message)\n this.name = 'SchemaError'\n this.path = options?.path ?? ''\n this.received = options?.received\n }\n\n toJSON(): { name: string; message: string; path: string; received: unknown } {\n return { name: this.name, message: this.message, path: this.path, received: this.received }\n }\n}\n\n// ─── Schema base class ──────────────────────────────────────\n\nexport abstract class Schema<T> {\n /**\n * Parse a value. Internal method — subclasses override this.\n * @internal\n */\n abstract _parse(value: unknown): T\n\n parse(value: unknown): T {\n return this._parse(value)\n }\n\n safeParse(value: unknown): { success: boolean; data?: T; error?: string } {\n try {\n const data = this._parse(value)\n return { success: true, data }\n } catch (e) {\n if (e instanceof SchemaError) {\n return { success: false, error: e.message }\n }\n return { success: false, error: String(e) }\n }\n }\n\n optional(): Schema<T | undefined> {\n return new OptionalSchema(this)\n }\n\n nullable(): Schema<T | null> {\n return new NullableSchema(this)\n }\n\n default(defaultValue: T): Schema<T> {\n return new DefaultSchema(this, defaultValue)\n }\n\n describe(_description: string): this {\n return this\n }\n\n refine(fn: (val: T) => boolean, message: string): Schema<T> {\n return new RefineSchema(this, fn, message)\n }\n\n transform<U>(fn: (val: T) => U): Schema<U> {\n return new TransformSchema(this, fn)\n }\n\n /** @internal used by s.enum() etc */\n get _internal(): this {\n return this\n }\n}\n\n// ─── Wrapper schemas ────────────────────────────────────────\n\nclass OptionalSchema<T> extends Schema<T | undefined> {\n constructor(private readonly inner: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): T | undefined {\n if (value === undefined) return undefined\n return this.inner._parse(value)\n }\n}\n\nclass NullableSchema<T> extends Schema<T | null> {\n constructor(private readonly inner: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): T | null {\n if (value === null) return null\n return this.inner._parse(value)\n }\n}\n\nclass DefaultSchema<T> extends Schema<T> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly defaultValue: T,\n ) {\n super()\n }\n\n _parse(value: unknown): T {\n if (value === undefined) return this.defaultValue\n return this.inner._parse(value)\n }\n}\n\nclass RefineSchema<T> extends Schema<T> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly fn: (val: T) => boolean,\n private readonly errorMsg: string,\n ) {\n super()\n }\n\n _parse(value: unknown): T {\n const result = this.inner._parse(value)\n if (!this.fn(result)) {\n throw new SchemaError(msg('refine_fail', { message: this.errorMsg }))\n }\n return result\n }\n}\n\nclass TransformSchema<T, U> extends Schema<U> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly fn: (val: T) => U,\n ) {\n super()\n }\n\n _parse(value: unknown): U {\n const result = this.inner._parse(value)\n return this.fn(result)\n }\n}\n\n// ─── Infer type helper ──────────────────────────────────────\n\nexport type Infer<S extends Schema<unknown>> = S extends Schema<infer T> ? T : never\n\n// ─── Re-export wrappers for use by other files ──────────────\n\nexport { OptionalSchema, NullableSchema, DefaultSchema, RefineSchema, TransformSchema }\n","import { Schema, SchemaError } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── StringSchema ───────────────────────────────────────────\n\nexport class StringSchema extends Schema<string> {\n private checks: Array<(val: string) => void> = []\n\n min(n: number): this {\n this.checks.push(val => {\n if (val.length < n) throw new SchemaError(msg('string_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val.length > n) throw new SchemaError(msg('string_max', { max: n }))\n })\n return this\n }\n\n length(n: number): this {\n this.checks.push(val => {\n if (val.length !== n) throw new SchemaError(msg('string_length', { length: n }))\n })\n return this\n }\n\n email(): this {\n this.checks.push(val => {\n if (!isValidEmail(val)) throw new SchemaError(msg('string_email'))\n })\n return this\n }\n\n url(): this {\n this.checks.push(val => {\n try {\n const url = new URL(val)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') throw new Error()\n } catch {\n throw new SchemaError(msg('string_url'))\n }\n })\n return this\n }\n\n regex(pattern: RegExp): this {\n this.checks.push(val => {\n if (!pattern.test(val)) throw new SchemaError(msg('string_regex'))\n })\n return this\n }\n\n includes(substring: string): this {\n this.checks.push(val => {\n if (!val.includes(substring)) throw new SchemaError(msg('string_includes', { substring }))\n })\n return this\n }\n\n startsWith(prefix: string): this {\n this.checks.push(val => {\n if (!val.startsWith(prefix)) throw new SchemaError(msg('string_starts_with', { prefix }))\n })\n return this\n }\n\n endsWith(suffix: string): this {\n this.checks.push(val => {\n if (!val.endsWith(suffix)) throw new SchemaError(msg('string_ends_with', { suffix }))\n })\n return this\n }\n\n trim(): StringTrimSchema {\n return new StringTrimSchema(this)\n }\n\n lowercase(): StringLowercaseSchema {\n return new StringLowercaseSchema(this)\n }\n\n uppercase(): StringUppercaseSchema {\n return new StringUppercaseSchema(this)\n }\n\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n for (const check of this.checks) check(value)\n return value\n }\n}\n\n// ─── String transform variants ──────────────────────────────\n\nclass StringTrimSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.trim()\n }\n}\n\nclass StringLowercaseSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.toLowerCase()\n }\n}\n\nclass StringUppercaseSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.toUpperCase()\n }\n}\n\n// ─── NumberSchema ───────────────────────────────────────────\n\nexport class NumberSchema extends Schema<number> {\n private checks: Array<(val: number) => void> = []\n\n min(n: number): this {\n this.checks.push(val => {\n if (val < n) throw new SchemaError(msg('number_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val > n) throw new SchemaError(msg('number_max', { max: n }))\n })\n return this\n }\n\n int(): this {\n this.checks.push(val => {\n if (!Number.isInteger(val)) throw new SchemaError(msg('number_int'))\n })\n return this\n }\n\n positive(): this {\n this.checks.push(val => {\n if (val <= 0) throw new SchemaError(msg('number_positive'))\n })\n return this\n }\n\n negative(): this {\n this.checks.push(val => {\n if (val >= 0) throw new SchemaError(msg('number_negative'))\n })\n return this\n }\n\n finite(): this {\n this.checks.push(val => {\n if (!Number.isFinite(val)) throw new SchemaError(msg('number_finite'))\n })\n return this\n }\n\n safe(): this {\n this.checks.push(val => {\n if (!Number.isSafeInteger(val)) throw new SchemaError(msg('number_safe'))\n })\n return this\n }\n\n _parse(value: unknown): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new SchemaError(msg('type_number'))\n }\n for (const check of this.checks) check(value)\n return value\n }\n}\n\n// ─── BooleanSchema ──────────────────────────────────────────\n\nexport class BooleanSchema extends Schema<boolean> {\n _parse(value: unknown): boolean {\n if (typeof value !== 'boolean') throw new SchemaError(msg('type_boolean'))\n return value\n }\n}\n\n// ─── BigIntSchema ───────────────────────────────────────────\n\nexport class BigIntSchema extends Schema<bigint> {\n _parse(value: unknown): bigint {\n if (typeof value !== 'bigint') throw new SchemaError(msg('type_bigint'))\n return value\n }\n}\n\n// ─── SymbolSchema ───────────────────────────────────────────\n\nexport class SymbolSchema extends Schema<symbol> {\n _parse(value: unknown): symbol {\n if (typeof value !== 'symbol') throw new SchemaError(msg('type_symbol'))\n return value\n }\n}\n\n// ─── UndefinedSchema ────────────────────────────────────────\n\nexport class UndefinedSchema extends Schema<undefined> {\n _parse(value: unknown): undefined {\n if (value !== undefined) throw new SchemaError(msg('type_undefined'))\n return undefined\n }\n}\n\n// ─── NullSchema ─────────────────────────────────────────────\n\nexport class NullSchema extends Schema<null> {\n _parse(value: unknown): null {\n if (value !== null) throw new SchemaError(msg('type_null'))\n return null\n }\n}\n\n// ─── NaNSchema ──────────────────────────────────────────────\n\nexport class NaNSchema extends Schema<number> {\n _parse(value: unknown): number {\n if (typeof value !== 'number' || !Number.isNaN(value)) {\n throw new SchemaError(msg('type_nan'))\n }\n return value as number\n }\n}\n\n// ─── Internal email validator ───────────────────────────────\n\nfunction isValidEmail(value: string): boolean {\n if (value.length > 254) return false\n\n const atIndex = value.lastIndexOf('@')\n if (atIndex < 1 || atIndex === value.length - 1) return false\n\n const localPart = value.slice(0, atIndex)\n const domainPart = value.slice(atIndex + 1)\n\n if (localPart.length > 64) return false\n if (domainPart.length > 255) return false\n if (domainPart.split('.').length < 2) return false\n\n if (localPart.startsWith('\"') && localPart.endsWith('\"')) {\n if (localPart.length < 2) return false\n let i = 1\n while (i < localPart.length - 1) {\n const ch = localPart[i]!\n if (ch === '\\\\') {\n i++\n if (i >= localPart.length - 1) return false\n } else if (ch === '\"') {\n return false\n }\n i++\n }\n return true\n }\n\n if (localPart.length === 0 || localPart.startsWith('.') || localPart.endsWith('.')) return false\n for (let i = 0; i < localPart.length; i++) {\n const ch = localPart[i]!\n if ('<>=()[]\\\\,;:\\u0040\\u0022'.includes(ch)) return false\n }\n for (let i = 1; i < localPart.length; i++) {\n if (localPart[i] === '.' && localPart[i - 1] === '.') return false\n }\n\n for (const label of domainPart.split('.')) {\n if (label.length === 0 || label.length > 63) return false\n if (label.startsWith('-') || label.endsWith('-')) return false\n for (let i = 0; i < label.length; i++) {\n const ch = label[i]!\n if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '-')) {\n return false\n }\n }\n }\n\n return true\n}\n","import { Schema, SchemaError, Infer, OptionalSchema } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── ObjectSchema ───────────────────────────────────────────\n\ntype Shape = Record<string, Schema<unknown>>\n\nexport class ObjectSchema<T extends Shape> extends Schema<{ [K in keyof T]: Infer<T[K]> }> {\n readonly shape: T\n private isStrictMode = false\n private isPassthroughMode = false\n\n constructor(shape: T) {\n super()\n this.shape = shape\n }\n\n strict(): this {\n this.isStrictMode = true\n this.isPassthroughMode = false\n return this\n }\n\n passthrough(): this {\n this.isPassthroughMode = true\n this.isStrictMode = false\n return this\n }\n\n partial(): ObjectSchema<{ [K in keyof T]: Schema<Infer<T[K]> | undefined> }> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key)) {\n newShape[key] = new OptionalSchema(this.shape[key]!)\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<{ [K in keyof T]: Schema<Infer<T[K]> | undefined> }>\n }\n\n pick<K extends keyof T>(keys: K[]): ObjectSchema<Pick<T, K>> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key of keys) {\n const strKey = key as string\n if (Object.prototype.hasOwnProperty.call(this.shape, strKey)) {\n newShape[strKey] = this.shape[strKey]!\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<Pick<T, K>>\n }\n\n omit<K extends keyof T>(keys: K[]): ObjectSchema<Omit<T, K>> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key) && !(keys as string[]).includes(key)) {\n newShape[key] = this.shape[key]!\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<Omit<T, K>>\n }\n\n extend<U extends Shape>(shape: U): ObjectSchema<T & U> {\n return new ObjectSchema({ ...this.shape, ...shape } as T & U)\n }\n\n merge<U extends Shape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return new ObjectSchema({ ...this.shape, ...other.shape } as T & U)\n }\n\n _parse(value: unknown): { [K in keyof T]: Infer<T[K]> } {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new SchemaError(msg('type_object'))\n }\n const obj = value as Record<string, unknown>\n const result: Record<string, unknown> = {}\n\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key)) {\n const schema = this.shape[key]!\n try {\n result[key] = schema._parse(obj[key])\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `${key}.${e.path}` : key,\n received: obj[key],\n })\n }\n throw e\n }\n }\n }\n\n if (this.isStrictMode) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && !(key in this.shape)) {\n throw new SchemaError(msg('object_strict', { key }))\n }\n }\n }\n\n if (this.isPassthroughMode) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && !(key in this.shape)) {\n result[key] = obj[key]\n }\n }\n }\n\n return result as { [K in keyof T]: Infer<T[K]> }\n }\n}\n\n// ─── ArraySchema ────────────────────────────────────────────\n\nexport class ArraySchema<T> extends Schema<T[]> {\n private checks: Array<(val: T[]) => void> = []\n\n constructor(private readonly itemSchema: Schema<T>) {\n super()\n }\n\n min(n: number): this {\n this.checks.push(val => {\n if (val.length < n) throw new SchemaError(msg('array_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val.length > n) throw new SchemaError(msg('array_max', { max: n }))\n })\n return this\n }\n\n length(n: number): this {\n this.checks.push(val => {\n if (val.length !== n) throw new SchemaError(msg('array_length', { length: n }))\n })\n return this\n }\n\n nonempty(): this {\n this.checks.push(val => {\n if (val.length === 0) throw new SchemaError(msg('array_nonempty'))\n })\n return this\n }\n\n unique(): this {\n this.checks.push(val => {\n const seen = new Set<T>()\n for (const item of val) {\n if (seen.has(item)) throw new SchemaError(msg('array_unique'))\n seen.add(item)\n }\n })\n return this\n }\n\n _parse(value: unknown): T[] {\n if (!Array.isArray(value)) throw new SchemaError(msg('type_array'))\n const result: T[] = []\n for (let i = 0; i < value.length; i++) {\n try {\n result.push(this.itemSchema._parse(value[i]))\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `[${i}].${e.path}` : `[${i}]`,\n received: value[i],\n })\n }\n throw e\n }\n }\n for (const check of this.checks) check(result)\n return result\n }\n}\n\n// ─── TupleSchema ────────────────────────────────────────────\n\ntype TupleSchemaTypes<T extends Schema<unknown>[]> = {\n [K in keyof T]: Infer<T[K]>\n}\n\nexport class TupleSchema<T extends Schema<unknown>[]> extends Schema<TupleSchemaTypes<T>> {\n constructor(private readonly schemas: [...T]) {\n super()\n }\n\n _parse(value: unknown): TupleSchemaTypes<T> {\n if (!Array.isArray(value)) throw new SchemaError(msg('type_array'))\n if (value.length !== this.schemas.length) {\n throw new SchemaError(msg('tuple_length', { length: this.schemas.length }))\n }\n const result: unknown[] = []\n for (let i = 0; i < this.schemas.length; i++) {\n try {\n result.push(this.schemas[i]!._parse(value[i]))\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `[${i}].${e.path}` : `[${i}]`,\n received: value[i],\n })\n }\n throw e\n }\n }\n return result as TupleSchemaTypes<T>\n }\n}\n\n// ─── EnumSchema ─────────────────────────────────────────────\n\nexport class EnumSchema<T extends string> extends Schema<T> {\n constructor(private readonly values: readonly T[]) {\n super()\n }\n\n _parse(value: unknown): T {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n for (const v of this.values) {\n if (v === value) return value as T\n }\n throw new SchemaError(msg('enum_invalid', { values: this.values.join(', ') }))\n }\n\n get enum(): readonly T[] {\n return this.values\n }\n}\n\n// ─── UnionSchema ────────────────────────────────────────────\n\nexport class UnionSchema<T> extends Schema<T> {\n constructor(private readonly schemas: readonly Schema<unknown>[]) {\n super()\n }\n\n _parse(value: unknown): T {\n const errors: string[] = []\n for (const schema of this.schemas) {\n try {\n return schema._parse(value) as T\n } catch (e) {\n errors.push(e instanceof SchemaError ? e.message : String(e))\n }\n }\n throw new SchemaError(msg('union_fail'))\n }\n}\n\n// ─── IntersectionSchema ─────────────────────────────────────\n\nexport class IntersectionSchema<A, B> extends Schema<A & B> {\n constructor(\n private readonly left: Schema<A>,\n private readonly right: Schema<B>,\n ) {\n super()\n }\n\n _parse(value: unknown): A & B {\n const a = this.left._parse(value)\n const b = this.right._parse(value)\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n return { ...a, ...b } as A & B\n }\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n if (a === (b as unknown)) return a as unknown as A & B\n }\n throw new SchemaError(msg('intersection_fail'))\n }\n}\n\n// ─── RecordSchema ───────────────────────────────────────────\n\nexport class RecordSchema<V> extends Schema<Record<string, V>> {\n constructor(private readonly valueSchema: Schema<V>) {\n super()\n }\n\n _parse(value: unknown): Record<string, V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new SchemaError(msg('type_object'))\n }\n const result: Record<string, V> = {}\n const obj = value as Record<string, unknown>\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.valueSchema._parse(obj[key])\n }\n }\n return result\n }\n}\n\n// ─── MapSchema ──────────────────────────────────────────────\n\nexport class MapSchema<K, V> extends Schema<Map<K, V>> {\n constructor(\n private readonly keySchema: Schema<K>,\n private readonly valueSchema: Schema<V>,\n ) {\n super()\n }\n\n _parse(value: unknown): Map<K, V> {\n if (!(value instanceof Map)) throw new SchemaError(msg('map_not_map'))\n const result = new Map<K, V>()\n for (const [k, v] of value) {\n result.set(this.keySchema._parse(k), this.valueSchema._parse(v))\n }\n return result\n }\n}\n\n// ─── SetSchema ──────────────────────────────────────────────\n\nexport class SetSchema<T> extends Schema<Set<T>> {\n constructor(private readonly itemSchema: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): Set<T> {\n if (!(value instanceof Set)) throw new SchemaError(msg('set_not_set'))\n const result = new Set<T>()\n for (const item of value) {\n result.add(this.itemSchema._parse(item))\n }\n return result\n }\n}\n\n// ─── DateSchema ─────────────────────────────────────────────\n\nexport class DateSchema extends Schema<Date> {\n _parse(value: unknown): Date {\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) throw new SchemaError(msg('date_invalid'))\n return value\n }\n if (typeof value === 'number' || typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) throw new SchemaError(msg('date_invalid'))\n return date\n }\n throw new SchemaError(msg('type_date'))\n }\n}\n\n// ─── LiteralSchema ──────────────────────────────────────────\n\ntype LiteralValue = string | number | boolean | null | undefined\n\nexport class LiteralSchema<T extends LiteralValue> extends Schema<T> {\n constructor(private readonly expected: T) {\n super()\n }\n\n _parse(value: unknown): T {\n if (value !== this.expected) {\n throw new SchemaError(msg('literal_fail', { expected: String(this.expected) }))\n }\n return value as T\n }\n}\n\n// ─── AnySchema ──────────────────────────────────────────────\n\nexport class AnySchema extends Schema<any> {\n _parse(value: unknown): any {\n return value\n }\n}\n\n// ─── UnknownSchema ──────────────────────────────────────────\n\nexport class UnknownSchema extends Schema<unknown> {\n _parse(value: unknown): unknown {\n return value\n }\n}\n","import { Schema, SchemaError } from './types.js'\nimport { msg } from './messages.js'\n\n//\n// Validator functions below are derived from speexjs-core/validation.\n// When the monorepo workspace is active, these can be replaced with:\n// import { isNIK, isNPWP, isPhone } from 'speexjs-core/validation'\n//\n\n// ─── NIK validator ──────────────────────────────────────────\n\nfunction isNIK(value: string): boolean {\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 16) return false\n\n const rawDay = Number.parseInt(digits.slice(6, 8), 10)\n const month = Number.parseInt(digits.slice(8, 10), 10)\n const year = Number.parseInt(digits.slice(10, 12), 10)\n\n if (rawDay < 1 || rawDay > 71) return false\n if (month < 1 || month > 12) return false\n\n let day = rawDay\n if (day >= 41) day -= 40\n\n const fullYear = year < 70 ? 2000 + year : 1900 + year\n const date = new Date(fullYear, month - 1, day)\n\n return (\n date.getFullYear() === fullYear &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n )\n}\n\n// ─── NPWP validator ─────────────────────────────────────────\n\nfunction isNPWP(value: string): boolean {\n const digits = value.replace(/\\D/g, '')\n if (digits.length !== 15 && digits.length !== 16) return false\n\n const nums: number[] = []\n for (let i = 0; i < digits.length; i++) {\n nums.push(Number.parseInt(digits[i]!, 10))\n }\n\n const checkDigit = nums[nums.length - 1]!\n\n let sum = 0\n for (let i = 0; i < nums.length - 1; i++) {\n sum += nums[i]! * [3, 7, 1][i % 3]!\n }\n\n const computed = (11 - (sum % 11)) % 10\n return computed === checkDigit\n}\n\n// ─── Phone validator ────────────────────────────────────────\n\nconst INDONESIAN_PREFIXES: ReadonlyArray<[number, number]> = [\n [11, 19],\n [21, 29],\n [51, 59],\n [77, 79],\n [95, 99],\n]\n\nfunction isValidIndonesianPrefix(prefix: number): boolean {\n for (const [min, max] of INDONESIAN_PREFIXES) {\n if (prefix >= min && prefix <= max) return true\n }\n return false\n}\n\nfunction isPhone(value: string, country: 'id' | 'any' = 'id'): boolean {\n const digits = value.replace(/\\D/g, '')\n\n if (country === 'any') {\n return digits.length >= 10 && digits.length <= 15\n }\n\n if (digits.length < 10) return false\n\n let normalized: string\n if (digits.startsWith('62')) {\n normalized = digits.slice(2)\n } else if (digits.startsWith('0')) {\n normalized = digits.slice(1)\n } else {\n normalized = digits\n }\n\n if (normalized.length < 10 || normalized.length > 13) return false\n if (!normalized.startsWith('8')) return false\n\n const prefix = Number.parseInt(normalized.slice(1, 3), 10)\n return isValidIndonesianPrefix(prefix)\n}\n\n// ─── Schema classes ─────────────────────────────────────────\n\nexport class NIKSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n if (!isNIK(value)) throw new SchemaError(msg('indonesia_nik'))\n return value\n }\n}\n\nexport class NPWPSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n if (!isNPWP(value)) throw new SchemaError(msg('indonesia_npwp'))\n return value\n }\n}\n\nexport class PhoneSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n if (!isPhone(value, 'id')) throw new SchemaError(msg('indonesia_phone'))\n return value\n }\n}\n\nconst ALAMAT_KEYWORDS = [\n /^jl[.\\s]/i,\n /^jalan\\s/i,\n /^gg[.\\s]/i,\n /^gang\\s/i,\n /rt\\s*\\d/i,\n /rw\\s*\\d/i,\n /dsn/i,\n /dusun/i,\n /kec/i,\n /kelurahan/i,\n /desa/i,\n /perum/i,\n /komplek/i,\n]\n\nexport class AlamatSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n if (value.length < 10) throw new SchemaError(msg('indonesia_alamat'))\n\n let hasKeyword = false\n for (const pattern of ALAMAT_KEYWORDS) {\n if (pattern.test(value)) {\n hasKeyword = true\n break\n }\n }\n if (!hasKeyword) throw new SchemaError(msg('indonesia_alamat'))\n\n return value\n }\n}\n\nexport class KodeposSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n const digits = value.replace(/\\s/g, '')\n if (!/^\\d{5}$/.test(digits)) throw new SchemaError(msg('indonesia_kodepos'))\n return digits\n }\n}\n\nexport class RekeningSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n const digits = value.replace(/\\s/g, '')\n if (!/^\\d{10,16}$/.test(digits)) throw new SchemaError(msg('indonesia_rekening'))\n return digits\n }\n}\n","import { Schema, SchemaError } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── CoerceStringSchema ─────────────────────────────────────\n\nexport class CoerceStringSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (value === null || value === undefined) throw new SchemaError(msg('type_string'))\n return String(value)\n }\n}\n\n// ─── CoerceNumberSchema ─────────────────────────────────────\n\nexport class CoerceNumberSchema extends Schema<number> {\n _parse(value: unknown): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (trimmed.length === 0) throw new SchemaError(msg('coerce_number_fail'))\n const num = Number(trimmed)\n if (Number.isNaN(num)) throw new SchemaError(msg('coerce_number_fail'))\n return num\n }\n if (typeof value === 'bigint') return Number(value)\n if (value instanceof Date) return value.getTime()\n throw new SchemaError(msg('coerce_number_fail'))\n }\n}\n\n// ─── CoerceBooleanSchema ────────────────────────────────────\n\nexport class CoerceBooleanSchema extends Schema<boolean> {\n _parse(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (value === 0 || value === 1) return value === 1\n if (typeof value === 'string') {\n const lower = value.toLowerCase().trim()\n if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') return true\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') return false\n }\n return Boolean(value)\n }\n}\n\n// ─── CoerceDateSchema ───────────────────────────────────────\n\nexport class CoerceDateSchema extends Schema<Date> {\n _parse(value: unknown): Date {\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) throw new SchemaError(msg('coerce_date_fail'))\n return value\n }\n if (typeof value === 'number' || typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) throw new SchemaError(msg('coerce_date_fail'))\n return date\n }\n throw new SchemaError(msg('coerce_date_fail'))\n }\n}\n\n// ─── TransformSchema (standalone) ──────────────────────────\n\nexport class StandaloneTransformSchema<T> extends Schema<T> {\n constructor(private readonly fn: (value: unknown) => T) {\n super()\n }\n\n _parse(value: unknown): T {\n return this.fn(value)\n }\n}\n","// ─── Types ──────────────────────────────────────────────────\n\nexport { Schema, SchemaError } from './types.js'\nexport type { Infer } from './types.js'\n\n// ─── Messages ───────────────────────────────────────────────\n\nexport { setLocale, getLocale } from './messages.js'\n\n// ─── Primitives ─────────────────────────────────────────────\n\nexport { StringSchema, NumberSchema, BooleanSchema, BigIntSchema, SymbolSchema, UndefinedSchema, NullSchema, NaNSchema } from './primitives.js'\n\n// ─── Complex ────────────────────────────────────────────────\n\nexport { ObjectSchema, ArraySchema, TupleSchema, EnumSchema, UnionSchema, IntersectionSchema, RecordSchema, MapSchema, SetSchema, DateSchema, LiteralSchema, AnySchema, UnknownSchema } from './complex.js'\n\n// ─── Indonesia ──────────────────────────────────────────────\n\nexport { NIKSchema, NPWPSchema, PhoneSchema, AlamatSchema, KodeposSchema, RekeningSchema } from './indonesia.js'\n\n// ─── Transform ──────────────────────────────────────────────\n\nexport { CoerceStringSchema, CoerceNumberSchema, CoerceBooleanSchema, CoerceDateSchema } from './transform.js'\n\n// ─── Factory imports ────────────────────────────────────────\n\nimport { Schema as SchemaBase } from './types.js'\nimport { StringSchema, NumberSchema, BooleanSchema, BigIntSchema, SymbolSchema, UndefinedSchema, NullSchema, NaNSchema } from './primitives.js'\nimport { ObjectSchema, ArraySchema, TupleSchema, EnumSchema, UnionSchema, IntersectionSchema, RecordSchema, MapSchema, SetSchema, DateSchema, LiteralSchema, AnySchema, UnknownSchema } from './complex.js'\nimport { NIKSchema, NPWPSchema, PhoneSchema, AlamatSchema, KodeposSchema, RekeningSchema } from './indonesia.js'\nimport { CoerceStringSchema, CoerceNumberSchema, CoerceBooleanSchema, CoerceDateSchema, StandaloneTransformSchema } from './transform.js'\n\n// ─── s namespace ────────────────────────────────────────────\n\nexport const s = {\n string(): StringSchema {\n return new StringSchema()\n },\n\n number(): NumberSchema {\n return new NumberSchema()\n },\n\n boolean(): BooleanSchema {\n return new BooleanSchema()\n },\n\n bigint(): BigIntSchema {\n return new BigIntSchema()\n },\n\n symbol(): SymbolSchema {\n return new SymbolSchema()\n },\n\n undefined(): UndefinedSchema {\n return new UndefinedSchema()\n },\n\n null(): NullSchema {\n return new NullSchema()\n },\n\n nan(): NaNSchema {\n return new NaNSchema()\n },\n\n object<T extends Record<string, SchemaBase<unknown>>>(shape: T): ObjectSchema<T> {\n return new ObjectSchema(shape)\n },\n\n array<T>(itemSchema: SchemaBase<T>): ArraySchema<T> {\n return new ArraySchema(itemSchema)\n },\n\n tuple<T extends SchemaBase<unknown>[]>(...schemas: T): TupleSchema<T> {\n return new TupleSchema(schemas as any) as TupleSchema<T>\n },\n\n enum<T extends string>(values: readonly T[]): EnumSchema<T> {\n return new EnumSchema(values)\n },\n\n union<T extends SchemaBase<unknown>[]>(...schemas: T): UnionSchema<T[number] extends SchemaBase<infer U> ? U : never> {\n return new UnionSchema(schemas) as any\n },\n\n intersection<A, B>(left: SchemaBase<A>, right: SchemaBase<B>): IntersectionSchema<A, B> {\n return new IntersectionSchema(left, right)\n },\n\n record<V>(valueSchema: SchemaBase<V>): RecordSchema<V> {\n return new RecordSchema(valueSchema)\n },\n\n map<K, V>(keySchema: SchemaBase<K>, valueSchema: SchemaBase<V>): MapSchema<K, V> {\n return new MapSchema(keySchema, valueSchema)\n },\n\n set<T>(itemSchema: SchemaBase<T>): SetSchema<T> {\n return new SetSchema(itemSchema)\n },\n\n date(): DateSchema {\n return new DateSchema()\n },\n\n literal<T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> {\n return new LiteralSchema(value)\n },\n\n any(): AnySchema {\n return new AnySchema()\n },\n\n unknown(): UnknownSchema {\n return new UnknownSchema()\n },\n\n // ─── Indonesia ──────────────────────────────────────────\n\n nik(): NIKSchema {\n return new NIKSchema()\n },\n\n npwp(): NPWPSchema {\n return new NPWPSchema()\n },\n\n phone(): PhoneSchema {\n return new PhoneSchema()\n },\n\n alamat(): AlamatSchema {\n return new AlamatSchema()\n },\n\n kodepos(): KodeposSchema {\n return new KodeposSchema()\n },\n\n rekening(): RekeningSchema {\n return new RekeningSchema()\n },\n\n // ─── Coerce ─────────────────────────────────────────────\n\n coerce: {\n string(): CoerceStringSchema {\n return new CoerceStringSchema()\n },\n\n number(): CoerceNumberSchema {\n return new CoerceNumberSchema()\n },\n\n boolean(): CoerceBooleanSchema {\n return new CoerceBooleanSchema()\n },\n\n date(): CoerceDateSchema {\n return new CoerceDateSchema()\n },\n },\n\n // ─── Transform ──────────────────────────────────────────\n\n transform<T>(fn: (value: unknown) => T): StandaloneTransformSchema<T> {\n return new StandaloneTransformSchema(fn)\n },\n} as const\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/schema/messages.ts","../../src/schema/types.ts","../../src/schema/primitives.ts","../../src/schema/complex.ts","../../src/schema/transform.ts","../../src/schema/index.ts"],"sourcesContent":["const EN: Record<string, string> = {\n required: 'Value is required',\n type_string: 'Expected a string',\n type_number: 'Expected a number',\n type_boolean: 'Expected a boolean',\n type_bigint: 'Expected a BigInt',\n type_symbol: 'Expected a Symbol',\n type_undefined: 'Expected undefined',\n type_null: 'Expected null',\n type_nan: 'Expected NaN',\n type_object: 'Expected an object',\n type_array: 'Expected an array',\n type_date: 'Expected a valid date',\n type_function: 'Expected a function',\n type_string_or_number: 'Expected a string or number',\n string_min: 'Minimum {min} characters',\n string_max: 'Maximum {max} characters',\n string_length: 'Exactly {length} characters required',\n string_email: 'Invalid email format',\n string_url: 'Invalid URL format',\n string_regex: 'Format does not match expected pattern',\n string_includes: 'Must contain \"{substring}\"',\n string_starts_with: 'Must start with \"{prefix}\"',\n string_ends_with: 'Must end with \"{suffix}\"',\n number_min: 'Minimum value is {min}',\n number_max: 'Maximum value is {max}',\n number_int: 'Expected an integer',\n number_positive: 'Expected a positive number',\n number_negative: 'Expected a negative number',\n number_finite: 'Expected a finite number',\n number_safe: 'Expected a safe integer',\n array_min: 'Minimum {min} items',\n array_max: 'Maximum {max} items',\n array_length: 'Exactly {length} items required',\n array_nonempty: 'Array must not be empty',\n array_unique: 'All items must be unique',\n object_strict: 'Unexpected key: \"{key}\"',\n enum_invalid: 'Value must be one of: {values}',\n tuple_length: 'Tuple must have exactly {length} items',\n union_fail: 'Value does not match any schema',\n intersection_fail: 'Value does not match intersection schema',\n literal_fail: 'Value must be {expected}',\n refine_fail: '{message}',\n date_invalid: 'Invalid date',\n date_not_date: 'Value must be a valid date',\n coerce_number_fail: 'Value cannot be coerced to a number',\n coerce_date_fail: 'Value cannot be coerced to a date',\n map_not_map: 'Expected a Map',\n set_not_set: 'Expected a Set',\n}\n\nconst store: Record<string, string> = { ...EN }\n\nexport function msg(key: string, params?: Record<string, string | number | undefined>): string {\n let template = store[key]\n if (!template) return key\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n template = template.replace(`{${k}}`, v !== undefined ? String(v) : '')\n }\n }\n return template\n}\n\nexport function setLocale(_locale: 'en'): void {\n const source = EN\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n store[key] = source[key]!\n }\n }\n}\n\nexport function getLocale(): 'en' {\n return 'en'\n}\n","import { msg } from './messages.js'\n\n// ─── SchemaError ────────────────────────────────────────────\n\nexport class SchemaError extends Error {\n readonly path: string\n readonly received: unknown\n\n constructor(message: string, options?: { path?: string; received?: unknown }) {\n super(message)\n this.name = 'SchemaError'\n this.path = options?.path ?? ''\n this.received = options?.received\n }\n\n toJSON(): { name: string; message: string; path: string; received: unknown } {\n return { name: this.name, message: this.message, path: this.path, received: this.received }\n }\n}\n\n// ─── Schema base class ──────────────────────────────────────\n\nexport abstract class Schema<T> {\n /**\n * Parse a value. Internal method — subclasses override this.\n * @internal\n */\n abstract _parse(value: unknown): T\n\n parse(value: unknown): T {\n return this._parse(value)\n }\n\n safeParse(value: unknown): { success: boolean; data?: T; error?: string } {\n try {\n const data = this._parse(value)\n return { success: true, data }\n } catch (e) {\n if (e instanceof SchemaError) {\n return { success: false, error: e.message }\n }\n return { success: false, error: String(e) }\n }\n }\n\n optional(): Schema<T | undefined> {\n return new OptionalSchema(this)\n }\n\n nullable(): Schema<T | null> {\n return new NullableSchema(this)\n }\n\n default(defaultValue: T): Schema<T> {\n return new DefaultSchema(this, defaultValue)\n }\n\n describe(_description: string): this {\n return this\n }\n\n refine(fn: (val: T) => boolean, message: string): Schema<T> {\n return new RefineSchema(this, fn, message)\n }\n\n transform<U>(fn: (val: T) => U): Schema<U> {\n return new TransformSchema(this, fn)\n }\n\n /** @internal used by schema.enum() etc */\n get _internal(): this {\n return this\n }\n}\n\n// ─── Wrapper schemas ────────────────────────────────────────\n\nclass OptionalSchema<T> extends Schema<T | undefined> {\n constructor(private readonly inner: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): T | undefined {\n if (value === undefined) return undefined\n return this.inner._parse(value)\n }\n}\n\nclass NullableSchema<T> extends Schema<T | null> {\n constructor(private readonly inner: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): T | null {\n if (value === null) return null\n return this.inner._parse(value)\n }\n}\n\nclass DefaultSchema<T> extends Schema<T> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly defaultValue: T,\n ) {\n super()\n }\n\n _parse(value: unknown): T {\n if (value === undefined) return this.defaultValue\n return this.inner._parse(value)\n }\n}\n\nclass RefineSchema<T> extends Schema<T> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly fn: (val: T) => boolean,\n private readonly errorMsg: string,\n ) {\n super()\n }\n\n _parse(value: unknown): T {\n const result = this.inner._parse(value)\n if (!this.fn(result)) {\n throw new SchemaError(msg('refine_fail', { message: this.errorMsg }))\n }\n return result\n }\n}\n\nclass TransformSchema<T, U> extends Schema<U> {\n constructor(\n private readonly inner: Schema<T>,\n private readonly fn: (val: T) => U,\n ) {\n super()\n }\n\n _parse(value: unknown): U {\n const result = this.inner._parse(value)\n return this.fn(result)\n }\n}\n\n// ─── Infer type helper ──────────────────────────────────────\n\nexport type Infer<S extends Schema<unknown>> = S extends Schema<infer T> ? T : never\n\n// ─── Re-export wrappers for use by other files ──────────────\n\nexport { OptionalSchema, NullableSchema, DefaultSchema, RefineSchema, TransformSchema }\n","import { Schema, SchemaError } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── StringSchema ───────────────────────────────────────────\n\nexport class StringSchema extends Schema<string> {\n private checks: Array<(val: string) => void> = []\n\n min(n: number): this {\n this.checks.push(val => {\n if (val.length < n) throw new SchemaError(msg('string_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val.length > n) throw new SchemaError(msg('string_max', { max: n }))\n })\n return this\n }\n\n length(n: number): this {\n this.checks.push(val => {\n if (val.length !== n) throw new SchemaError(msg('string_length', { length: n }))\n })\n return this\n }\n\n email(): this {\n this.checks.push(val => {\n if (!isValidEmail(val)) throw new SchemaError(msg('string_email'))\n })\n return this\n }\n\n url(): this {\n this.checks.push(val => {\n try {\n const url = new URL(val)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') throw new Error()\n } catch {\n throw new SchemaError(msg('string_url'))\n }\n })\n return this\n }\n\n regex(pattern: RegExp): this {\n this.checks.push(val => {\n if (!pattern.test(val)) throw new SchemaError(msg('string_regex'))\n })\n return this\n }\n\n includes(substring: string): this {\n this.checks.push(val => {\n if (!val.includes(substring)) throw new SchemaError(msg('string_includes', { substring }))\n })\n return this\n }\n\n startsWith(prefix: string): this {\n this.checks.push(val => {\n if (!val.startsWith(prefix)) throw new SchemaError(msg('string_starts_with', { prefix }))\n })\n return this\n }\n\n endsWith(suffix: string): this {\n this.checks.push(val => {\n if (!val.endsWith(suffix)) throw new SchemaError(msg('string_ends_with', { suffix }))\n })\n return this\n }\n\n trim(): StringTrimSchema {\n return new StringTrimSchema(this)\n }\n\n lowercase(): StringLowercaseSchema {\n return new StringLowercaseSchema(this)\n }\n\n uppercase(): StringUppercaseSchema {\n return new StringUppercaseSchema(this)\n }\n\n _parse(value: unknown): string {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n for (const check of this.checks) check(value)\n return value\n }\n}\n\n// ─── String transform variants ──────────────────────────────\n\nclass StringTrimSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.trim()\n }\n}\n\nclass StringLowercaseSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.toLowerCase()\n }\n}\n\nclass StringUppercaseSchema extends Schema<string> {\n constructor(private readonly inner: StringSchema) {\n super()\n }\n\n _parse(value: unknown): string {\n const result = this.inner._parse(value)\n return result.toUpperCase()\n }\n}\n\n// ─── NumberSchema ───────────────────────────────────────────\n\nexport class NumberSchema extends Schema<number> {\n private checks: Array<(val: number) => void> = []\n\n min(n: number): this {\n this.checks.push(val => {\n if (val < n) throw new SchemaError(msg('number_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val > n) throw new SchemaError(msg('number_max', { max: n }))\n })\n return this\n }\n\n int(): this {\n this.checks.push(val => {\n if (!Number.isInteger(val)) throw new SchemaError(msg('number_int'))\n })\n return this\n }\n\n positive(): this {\n this.checks.push(val => {\n if (val <= 0) throw new SchemaError(msg('number_positive'))\n })\n return this\n }\n\n negative(): this {\n this.checks.push(val => {\n if (val >= 0) throw new SchemaError(msg('number_negative'))\n })\n return this\n }\n\n finite(): this {\n this.checks.push(val => {\n if (!Number.isFinite(val)) throw new SchemaError(msg('number_finite'))\n })\n return this\n }\n\n safe(): this {\n this.checks.push(val => {\n if (!Number.isSafeInteger(val)) throw new SchemaError(msg('number_safe'))\n })\n return this\n }\n\n _parse(value: unknown): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new SchemaError(msg('type_number'))\n }\n for (const check of this.checks) check(value)\n return value\n }\n}\n\n// ─── BooleanSchema ──────────────────────────────────────────\n\nexport class BooleanSchema extends Schema<boolean> {\n _parse(value: unknown): boolean {\n if (typeof value !== 'boolean') throw new SchemaError(msg('type_boolean'))\n return value\n }\n}\n\n// ─── BigIntSchema ───────────────────────────────────────────\n\nexport class BigIntSchema extends Schema<bigint> {\n _parse(value: unknown): bigint {\n if (typeof value !== 'bigint') throw new SchemaError(msg('type_bigint'))\n return value\n }\n}\n\n// ─── SymbolSchema ───────────────────────────────────────────\n\nexport class SymbolSchema extends Schema<symbol> {\n _parse(value: unknown): symbol {\n if (typeof value !== 'symbol') throw new SchemaError(msg('type_symbol'))\n return value\n }\n}\n\n// ─── UndefinedSchema ────────────────────────────────────────\n\nexport class UndefinedSchema extends Schema<undefined> {\n _parse(value: unknown): undefined {\n if (value !== undefined) throw new SchemaError(msg('type_undefined'))\n return undefined\n }\n}\n\n// ─── NullSchema ─────────────────────────────────────────────\n\nexport class NullSchema extends Schema<null> {\n _parse(value: unknown): null {\n if (value !== null) throw new SchemaError(msg('type_null'))\n return null\n }\n}\n\n// ─── NaNSchema ──────────────────────────────────────────────\n\nexport class NaNSchema extends Schema<number> {\n _parse(value: unknown): number {\n if (typeof value !== 'number' || !Number.isNaN(value)) {\n throw new SchemaError(msg('type_nan'))\n }\n return value as number\n }\n}\n\n// ─── Internal email validator ───────────────────────────────\n\nfunction isValidEmail(value: string): boolean {\n if (value.length > 254) return false\n\n const atIndex = value.lastIndexOf('@')\n if (atIndex < 1 || atIndex === value.length - 1) return false\n\n const localPart = value.slice(0, atIndex)\n const domainPart = value.slice(atIndex + 1)\n\n if (localPart.length > 64) return false\n if (domainPart.length > 255) return false\n if (domainPart.split('.').length < 2) return false\n\n if (localPart.startsWith('\"') && localPart.endsWith('\"')) {\n if (localPart.length < 2) return false\n let i = 1\n while (i < localPart.length - 1) {\n const ch = localPart[i]!\n if (ch === '\\\\') {\n i++\n if (i >= localPart.length - 1) return false\n } else if (ch === '\"') {\n return false\n }\n i++\n }\n return true\n }\n\n if (localPart.length === 0 || localPart.startsWith('.') || localPart.endsWith('.')) return false\n for (let i = 0; i < localPart.length; i++) {\n const ch = localPart[i]!\n if ('<>=()[]\\\\,;:\\u0040\\u0022'.includes(ch)) return false\n }\n for (let i = 1; i < localPart.length; i++) {\n if (localPart[i] === '.' && localPart[i - 1] === '.') return false\n }\n\n for (const label of domainPart.split('.')) {\n if (label.length === 0 || label.length > 63) return false\n if (label.startsWith('-') || label.endsWith('-')) return false\n for (let i = 0; i < label.length; i++) {\n const ch = label[i]!\n if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '-')) {\n return false\n }\n }\n }\n\n return true\n}\n","import { Schema, SchemaError, Infer, OptionalSchema } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── ObjectSchema ───────────────────────────────────────────\n\ntype Shape = Record<string, Schema<unknown>>\n\nexport class ObjectSchema<T extends Shape> extends Schema<{ [K in keyof T]: Infer<T[K]> }> {\n readonly shape: T\n private isStrictMode = false\n private isPassthroughMode = false\n\n constructor(shape: T) {\n super()\n this.shape = shape\n }\n\n strict(): this {\n this.isStrictMode = true\n this.isPassthroughMode = false\n return this\n }\n\n passthrough(): this {\n this.isPassthroughMode = true\n this.isStrictMode = false\n return this\n }\n\n partial(): ObjectSchema<{ [K in keyof T]: Schema<Infer<T[K]> | undefined> }> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key)) {\n newShape[key] = new OptionalSchema(this.shape[key]!)\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<{ [K in keyof T]: Schema<Infer<T[K]> | undefined> }>\n }\n\n pick<K extends keyof T>(keys: K[]): ObjectSchema<Pick<T, K>> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key of keys) {\n const strKey = key as string\n if (Object.prototype.hasOwnProperty.call(this.shape, strKey)) {\n newShape[strKey] = this.shape[strKey]!\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<Pick<T, K>>\n }\n\n omit<K extends keyof T>(keys: K[]): ObjectSchema<Omit<T, K>> {\n const newShape = {} as Record<string, Schema<unknown>>\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key) && !(keys as string[]).includes(key)) {\n newShape[key] = this.shape[key]!\n }\n }\n return new ObjectSchema(newShape) as ObjectSchema<Omit<T, K>>\n }\n\n extend<U extends Shape>(shape: U): ObjectSchema<T & U> {\n return new ObjectSchema({ ...this.shape, ...shape } as T & U)\n }\n\n merge<U extends Shape>(other: ObjectSchema<U>): ObjectSchema<T & U> {\n return new ObjectSchema({ ...this.shape, ...other.shape } as T & U)\n }\n\n _parse(value: unknown): { [K in keyof T]: Infer<T[K]> } {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new SchemaError(msg('type_object'))\n }\n const obj = value as Record<string, unknown>\n const result: Record<string, unknown> = {}\n\n for (const key in this.shape) {\n if (Object.prototype.hasOwnProperty.call(this.shape, key)) {\n const schema = this.shape[key]!\n try {\n result[key] = schema._parse(obj[key])\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `${key}.${e.path}` : key,\n received: obj[key],\n })\n }\n throw e\n }\n }\n }\n\n if (this.isStrictMode) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && !(key in this.shape)) {\n throw new SchemaError(msg('object_strict', { key }))\n }\n }\n }\n\n if (this.isPassthroughMode) {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && !(key in this.shape)) {\n result[key] = obj[key]\n }\n }\n }\n\n return result as { [K in keyof T]: Infer<T[K]> }\n }\n}\n\n// ─── ArraySchema ────────────────────────────────────────────\n\nexport class ArraySchema<T> extends Schema<T[]> {\n private checks: Array<(val: T[]) => void> = []\n\n constructor(private readonly itemSchema: Schema<T>) {\n super()\n }\n\n min(n: number): this {\n this.checks.push(val => {\n if (val.length < n) throw new SchemaError(msg('array_min', { min: n }))\n })\n return this\n }\n\n max(n: number): this {\n this.checks.push(val => {\n if (val.length > n) throw new SchemaError(msg('array_max', { max: n }))\n })\n return this\n }\n\n length(n: number): this {\n this.checks.push(val => {\n if (val.length !== n) throw new SchemaError(msg('array_length', { length: n }))\n })\n return this\n }\n\n nonempty(): this {\n this.checks.push(val => {\n if (val.length === 0) throw new SchemaError(msg('array_nonempty'))\n })\n return this\n }\n\n unique(): this {\n this.checks.push(val => {\n const seen = new Set<T>()\n for (const item of val) {\n if (seen.has(item)) throw new SchemaError(msg('array_unique'))\n seen.add(item)\n }\n })\n return this\n }\n\n _parse(value: unknown): T[] {\n if (!Array.isArray(value)) throw new SchemaError(msg('type_array'))\n const result: T[] = []\n for (let i = 0; i < value.length; i++) {\n try {\n result.push(this.itemSchema._parse(value[i]))\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `[${i}].${e.path}` : `[${i}]`,\n received: value[i],\n })\n }\n throw e\n }\n }\n for (const check of this.checks) check(result)\n return result\n }\n}\n\n// ─── TupleSchema ────────────────────────────────────────────\n\ntype TupleSchemaTypes<T extends Schema<unknown>[]> = {\n [K in keyof T]: Infer<T[K]>\n}\n\nexport class TupleSchema<T extends Schema<unknown>[]> extends Schema<TupleSchemaTypes<T>> {\n constructor(private readonly schemas: [...T]) {\n super()\n }\n\n _parse(value: unknown): TupleSchemaTypes<T> {\n if (!Array.isArray(value)) throw new SchemaError(msg('type_array'))\n if (value.length !== this.schemas.length) {\n throw new SchemaError(msg('tuple_length', { length: this.schemas.length }))\n }\n const result: unknown[] = []\n for (let i = 0; i < this.schemas.length; i++) {\n try {\n result.push(this.schemas[i]!._parse(value[i]))\n } catch (e) {\n if (e instanceof SchemaError) {\n throw new SchemaError(e.message, {\n path: e.path ? `[${i}].${e.path}` : `[${i}]`,\n received: value[i],\n })\n }\n throw e\n }\n }\n return result as TupleSchemaTypes<T>\n }\n}\n\n// ─── EnumSchema ─────────────────────────────────────────────\n\nexport class EnumSchema<T extends string> extends Schema<T> {\n constructor(private readonly values: readonly T[]) {\n super()\n }\n\n _parse(value: unknown): T {\n if (typeof value !== 'string') throw new SchemaError(msg('type_string'))\n for (const v of this.values) {\n if (v === value) return value as T\n }\n throw new SchemaError(msg('enum_invalid', { values: this.values.join(', ') }))\n }\n\n get enum(): readonly T[] {\n return this.values\n }\n}\n\n// ─── UnionSchema ────────────────────────────────────────────\n\nexport class UnionSchema<T> extends Schema<T> {\n constructor(private readonly schemas: readonly Schema<unknown>[]) {\n super()\n }\n\n _parse(value: unknown): T {\n const errors: string[] = []\n for (const schema of this.schemas) {\n try {\n return schema._parse(value) as T\n } catch (e) {\n errors.push(e instanceof SchemaError ? e.message : String(e))\n }\n }\n throw new SchemaError(msg('union_fail'))\n }\n}\n\n// ─── IntersectionSchema ─────────────────────────────────────\n\nexport class IntersectionSchema<A, B> extends Schema<A & B> {\n constructor(\n private readonly left: Schema<A>,\n private readonly right: Schema<B>,\n ) {\n super()\n }\n\n _parse(value: unknown): A & B {\n const a = this.left._parse(value)\n const b = this.right._parse(value)\n if (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null) {\n return { ...a, ...b } as A & B\n }\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n if (a === (b as unknown)) return a as unknown as A & B\n }\n throw new SchemaError(msg('intersection_fail'))\n }\n}\n\n// ─── RecordSchema ───────────────────────────────────────────\n\nexport class RecordSchema<V> extends Schema<Record<string, V>> {\n constructor(private readonly valueSchema: Schema<V>) {\n super()\n }\n\n _parse(value: unknown): Record<string, V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new SchemaError(msg('type_object'))\n }\n const result: Record<string, V> = {}\n const obj = value as Record<string, unknown>\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = this.valueSchema._parse(obj[key])\n }\n }\n return result\n }\n}\n\n// ─── MapSchema ──────────────────────────────────────────────\n\nexport class MapSchema<K, V> extends Schema<Map<K, V>> {\n constructor(\n private readonly keySchema: Schema<K>,\n private readonly valueSchema: Schema<V>,\n ) {\n super()\n }\n\n _parse(value: unknown): Map<K, V> {\n if (!(value instanceof Map)) throw new SchemaError(msg('map_not_map'))\n const result = new Map<K, V>()\n for (const [k, v] of value) {\n result.set(this.keySchema._parse(k), this.valueSchema._parse(v))\n }\n return result\n }\n}\n\n// ─── SetSchema ──────────────────────────────────────────────\n\nexport class SetSchema<T> extends Schema<Set<T>> {\n constructor(private readonly itemSchema: Schema<T>) {\n super()\n }\n\n _parse(value: unknown): Set<T> {\n if (!(value instanceof Set)) throw new SchemaError(msg('set_not_set'))\n const result = new Set<T>()\n for (const item of value) {\n result.add(this.itemSchema._parse(item))\n }\n return result\n }\n}\n\n// ─── DateSchema ─────────────────────────────────────────────\n\nexport class DateSchema extends Schema<Date> {\n _parse(value: unknown): Date {\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) throw new SchemaError(msg('date_invalid'))\n return value\n }\n if (typeof value === 'number' || typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) throw new SchemaError(msg('date_invalid'))\n return date\n }\n throw new SchemaError(msg('type_date'))\n }\n}\n\n// ─── LiteralSchema ──────────────────────────────────────────\n\ntype LiteralValue = string | number | boolean | null | undefined\n\nexport class LiteralSchema<T extends LiteralValue> extends Schema<T> {\n constructor(private readonly expected: T) {\n super()\n }\n\n _parse(value: unknown): T {\n if (value !== this.expected) {\n throw new SchemaError(msg('literal_fail', { expected: String(this.expected) }))\n }\n return value as T\n }\n}\n\n// ─── AnySchema ──────────────────────────────────────────────\n\nexport class AnySchema extends Schema<any> {\n _parse(value: unknown): any {\n return value\n }\n}\n\n// ─── UnknownSchema ──────────────────────────────────────────\n\nexport class UnknownSchema extends Schema<unknown> {\n _parse(value: unknown): unknown {\n return value\n }\n}\n","import { Schema, SchemaError } from './types.js'\nimport { msg } from './messages.js'\n\n// ─── CoerceStringSchema ─────────────────────────────────────\n\nexport class CoerceStringSchema extends Schema<string> {\n _parse(value: unknown): string {\n if (value === null || value === undefined) throw new SchemaError(msg('type_string'))\n return String(value)\n }\n}\n\n// ─── CoerceNumberSchema ─────────────────────────────────────\n\nexport class CoerceNumberSchema extends Schema<number> {\n _parse(value: unknown): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') {\n const trimmed = value.trim()\n if (trimmed.length === 0) throw new SchemaError(msg('coerce_number_fail'))\n const num = Number(trimmed)\n if (Number.isNaN(num)) throw new SchemaError(msg('coerce_number_fail'))\n return num\n }\n if (typeof value === 'bigint') return Number(value)\n if (value instanceof Date) return value.getTime()\n throw new SchemaError(msg('coerce_number_fail'))\n }\n}\n\n// ─── CoerceBooleanSchema ────────────────────────────────────\n\nexport class CoerceBooleanSchema extends Schema<boolean> {\n _parse(value: unknown): boolean {\n if (typeof value === 'boolean') return value\n if (value === 0 || value === 1) return value === 1\n if (typeof value === 'string') {\n const lower = value.toLowerCase().trim()\n if (lower === 'true' || lower === '1' || lower === 'yes' || lower === 'on') return true\n if (lower === 'false' || lower === '0' || lower === 'no' || lower === 'off') return false\n }\n return Boolean(value)\n }\n}\n\n// ─── CoerceDateSchema ───────────────────────────────────────\n\nexport class CoerceDateSchema extends Schema<Date> {\n _parse(value: unknown): Date {\n if (value instanceof Date) {\n if (Number.isNaN(value.getTime())) throw new SchemaError(msg('coerce_date_fail'))\n return value\n }\n if (typeof value === 'number' || typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) throw new SchemaError(msg('coerce_date_fail'))\n return date\n }\n throw new SchemaError(msg('coerce_date_fail'))\n }\n}\n\n// ─── TransformSchema (standalone) ──────────────────────────\n\nexport class StandaloneTransformSchema<T> extends Schema<T> {\n constructor(private readonly fn: (value: unknown) => T) {\n super()\n }\n\n _parse(value: unknown): T {\n return this.fn(value)\n }\n}\n","// ─── Types ──────────────────────────────────────────────────\n\nexport { Schema, SchemaError } from './types.js'\nexport type { Infer } from './types.js'\n\n// ─── Messages ───────────────────────────────────────────────\n\nexport { setLocale, getLocale } from './messages.js'\n\n// ─── Primitives ─────────────────────────────────────────────\n\nexport { StringSchema, NumberSchema, BooleanSchema, BigIntSchema, SymbolSchema, UndefinedSchema, NullSchema, NaNSchema } from './primitives.js'\n\n// ─── Complex ────────────────────────────────────────────────\n\nexport { ObjectSchema, ArraySchema, TupleSchema, EnumSchema, UnionSchema, IntersectionSchema, RecordSchema, MapSchema, SetSchema, DateSchema, LiteralSchema, AnySchema, UnknownSchema } from './complex.js'\n\n// ─── Transform ──────────────────────────────────────────────\n\nexport { CoerceStringSchema, CoerceNumberSchema, CoerceBooleanSchema, CoerceDateSchema } from './transform.js'\n\n// ─── Factory imports ────────────────────────────────────────\n\nimport { Schema as SchemaBase } from './types.js'\nimport { StringSchema, NumberSchema, BooleanSchema, BigIntSchema, SymbolSchema, UndefinedSchema, NullSchema, NaNSchema } from './primitives.js'\nimport { ObjectSchema, ArraySchema, TupleSchema, EnumSchema, UnionSchema, IntersectionSchema, RecordSchema, MapSchema, SetSchema, DateSchema, LiteralSchema, AnySchema, UnknownSchema } from './complex.js'\nimport { CoerceStringSchema, CoerceNumberSchema, CoerceBooleanSchema, CoerceDateSchema, StandaloneTransformSchema } from './transform.js'\n\n// ─── schema factory namespace ────────────────────────────────\n// Factory functions to create validation schemas.\n// Usage: schema.string(), schema.object({...}), schema.array(schema.number())\n\nexport const schema = {\n string(): StringSchema {\n return new StringSchema()\n },\n\n number(): NumberSchema {\n return new NumberSchema()\n },\n\n boolean(): BooleanSchema {\n return new BooleanSchema()\n },\n\n bigint(): BigIntSchema {\n return new BigIntSchema()\n },\n\n symbol(): SymbolSchema {\n return new SymbolSchema()\n },\n\n undefined(): UndefinedSchema {\n return new UndefinedSchema()\n },\n\n null(): NullSchema {\n return new NullSchema()\n },\n\n nan(): NaNSchema {\n return new NaNSchema()\n },\n\n object<T extends Record<string, SchemaBase<unknown>>>(shape: T): ObjectSchema<T> {\n return new ObjectSchema(shape)\n },\n\n array<T>(itemSchema: SchemaBase<T>): ArraySchema<T> {\n return new ArraySchema(itemSchema)\n },\n\n tuple<T extends SchemaBase<unknown>[]>(...schemas: T): TupleSchema<T> {\n return new TupleSchema(schemas as any) as TupleSchema<T>\n },\n\n enum<T extends string>(values: readonly T[]): EnumSchema<T> {\n return new EnumSchema(values)\n },\n\n union<T extends SchemaBase<unknown>[]>(...schemas: T): UnionSchema<T[number] extends SchemaBase<infer U> ? U : never> {\n return new UnionSchema(schemas) as any\n },\n\n intersection<A, B>(left: SchemaBase<A>, right: SchemaBase<B>): IntersectionSchema<A, B> {\n return new IntersectionSchema(left, right)\n },\n\n record<V>(valueSchema: SchemaBase<V>): RecordSchema<V> {\n return new RecordSchema(valueSchema)\n },\n\n map<K, V>(keySchema: SchemaBase<K>, valueSchema: SchemaBase<V>): MapSchema<K, V> {\n return new MapSchema(keySchema, valueSchema)\n },\n\n set<T>(itemSchema: SchemaBase<T>): SetSchema<T> {\n return new SetSchema(itemSchema)\n },\n\n date(): DateSchema {\n return new DateSchema()\n },\n\n literal<T extends string | number | boolean | null | undefined>(value: T): LiteralSchema<T> {\n return new LiteralSchema(value)\n },\n\n any(): AnySchema {\n return new AnySchema()\n },\n\n unknown(): UnknownSchema {\n return new UnknownSchema()\n },\n\n // ─── Coerce ─────────────────────────────────────────────\n\n coerce: {\n string(): CoerceStringSchema {\n return new CoerceStringSchema()\n },\n\n number(): CoerceNumberSchema {\n return new CoerceNumberSchema()\n },\n\n boolean(): CoerceBooleanSchema {\n return new CoerceBooleanSchema()\n },\n\n date(): CoerceDateSchema {\n return new CoerceDateSchema()\n },\n },\n\n // ─── Transform ──────────────────────────────────────────\n\n transform<T>(fn: (value: unknown) => T): StandaloneTransformSchema<T> {\n return new StandaloneTransformSchema(fn)\n },\n} as const\n\n/** @deprecated Use `schema` instead. Will be removed in v1.0.0 */\nexport const s = schema\n"],"mappings":"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","names":["schema"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { A as AuthUser, S as SessionGuard } from '../../session-guard-CZeN87L9.js';
|
|
2
2
|
export { a as SessionGuardConfig, U as UserProvider } from '../../session-guard-CZeN87L9.js';
|
|
3
|
-
import { M as Middleware } from '../../index-
|
|
3
|
+
import { M as Middleware } from '../../index-C4xilc_E.js';
|
|
4
4
|
import '../../response-Ca8KWK5_.js';
|
|
5
5
|
import 'node:http';
|
|
6
6
|
import 'node:stream';
|
|
7
7
|
import '../container/index.js';
|
|
8
|
+
import '../../types-aW38f63o.js';
|
|
8
9
|
|
|
9
10
|
interface TokenProvider {
|
|
10
11
|
create(userId: string | number, tokenHash: string, name?: string, abilities?: string[]): Promise<void>;
|
|
@@ -30,6 +31,7 @@ declare class TokenGuard {
|
|
|
30
31
|
private config;
|
|
31
32
|
constructor(config?: TokenGuardConfig);
|
|
32
33
|
createToken(userId: string | number, name?: string, abilities?: string[]): Promise<string>;
|
|
34
|
+
private saltedHash;
|
|
33
35
|
user(token: string): Promise<AuthUser | null>;
|
|
34
36
|
validate(token: string): Promise<boolean>;
|
|
35
37
|
abilities(token: string): Promise<string[]>;
|
|
@@ -69,9 +69,6 @@ function decrypt(encrypted, key) {
|
|
|
69
69
|
decrypted += decipher.final("utf8");
|
|
70
70
|
return decrypted;
|
|
71
71
|
}
|
|
72
|
-
function hash(data, algorithm = "sha256") {
|
|
73
|
-
return nodeCrypto.createHash(algorithm).update(data, "utf8").digest("hex");
|
|
74
|
-
}
|
|
75
72
|
function constantTimeEqual(a, b) {
|
|
76
73
|
const bufA = Buffer.from(a);
|
|
77
74
|
const bufB = Buffer.from(b);
|
|
@@ -84,14 +81,17 @@ function constantTimeEqual(a, b) {
|
|
|
84
81
|
function randomHex(bytes = 32) {
|
|
85
82
|
return nodeCrypto.randomBytes(bytes).toString("hex");
|
|
86
83
|
}
|
|
84
|
+
function generateEncryptionKey() {
|
|
85
|
+
return nodeCrypto.randomBytes(32).toString("base64");
|
|
86
|
+
}
|
|
87
87
|
|
|
88
88
|
// src/native/hashing.ts
|
|
89
89
|
var SCRYPT_N = 16384;
|
|
90
90
|
var SCRYPT_R = 8;
|
|
91
91
|
var SCRYPT_P = 1;
|
|
92
92
|
var SCRYPT_KEYLEN = 64;
|
|
93
|
-
function verifyPassword(password,
|
|
94
|
-
const parts =
|
|
93
|
+
function verifyPassword(password, hash) {
|
|
94
|
+
const parts = hash.split("$");
|
|
95
95
|
if (parts.length !== 7 || parts[1] !== "scrypt") {
|
|
96
96
|
throw new Error("Invalid scrypt hash format");
|
|
97
97
|
}
|
|
@@ -126,7 +126,7 @@ var SessionGuard = class {
|
|
|
126
126
|
identifier: "email",
|
|
127
127
|
password: "password",
|
|
128
128
|
provider: void 0,
|
|
129
|
-
encryptionKey: config?.encryptionKey ?? process.env.APP_KEY ??
|
|
129
|
+
encryptionKey: config?.encryptionKey ?? process.env.APP_KEY ?? generateEncryptionKey(),
|
|
130
130
|
...config
|
|
131
131
|
};
|
|
132
132
|
}
|
|
@@ -147,9 +147,9 @@ var SessionGuard = class {
|
|
|
147
147
|
identifierValue
|
|
148
148
|
);
|
|
149
149
|
if (user === null) return false;
|
|
150
|
-
const
|
|
151
|
-
if (typeof
|
|
152
|
-
if (!verifyPassword(credentials.password,
|
|
150
|
+
const hash = user[this.config.password];
|
|
151
|
+
if (typeof hash !== "string") return false;
|
|
152
|
+
if (!verifyPassword(credentials.password, hash)) return false;
|
|
153
153
|
this.createSession(user, remember);
|
|
154
154
|
return true;
|
|
155
155
|
}
|
|
@@ -276,6 +276,7 @@ var SessionGuard = class {
|
|
|
276
276
|
};
|
|
277
277
|
|
|
278
278
|
// src/server/auth/token-guard.ts
|
|
279
|
+
import { scryptSync as scryptSync2, randomBytes as randomBytes3 } from "crypto";
|
|
279
280
|
var TokenGuard = class {
|
|
280
281
|
config;
|
|
281
282
|
constructor(config) {
|
|
@@ -296,7 +297,7 @@ var TokenGuard = class {
|
|
|
296
297
|
);
|
|
297
298
|
}
|
|
298
299
|
const plaintext = randomHex(this.config.tokenLength);
|
|
299
|
-
const tokenHash = this.config.hashTokens ?
|
|
300
|
+
const tokenHash = this.config.hashTokens ? this.saltedHash(plaintext) : plaintext;
|
|
300
301
|
await this.config.provider.create(
|
|
301
302
|
userId,
|
|
302
303
|
tokenHash,
|
|
@@ -305,6 +306,11 @@ var TokenGuard = class {
|
|
|
305
306
|
);
|
|
306
307
|
return plaintext;
|
|
307
308
|
}
|
|
309
|
+
saltedHash(plaintext) {
|
|
310
|
+
const salt = randomBytes3(16).toString("hex");
|
|
311
|
+
const hash = scryptSync2(plaintext, salt, 64).toString("hex");
|
|
312
|
+
return `$scrypt$${salt}$${hash}`;
|
|
313
|
+
}
|
|
308
314
|
async user(token) {
|
|
309
315
|
const record = await this.findTokenRecord(token);
|
|
310
316
|
if (record === null) return null;
|
|
@@ -330,7 +336,7 @@ var TokenGuard = class {
|
|
|
330
336
|
}
|
|
331
337
|
async revokeToken(token) {
|
|
332
338
|
if (this.config.provider === void 0) return;
|
|
333
|
-
const tokenHash = this.config.hashTokens ?
|
|
339
|
+
const tokenHash = this.config.hashTokens ? this.saltedHash(token) : token;
|
|
334
340
|
await this.config.provider.delete(tokenHash);
|
|
335
341
|
}
|
|
336
342
|
async revokeAllTokens(userId) {
|
|
@@ -339,7 +345,7 @@ var TokenGuard = class {
|
|
|
339
345
|
}
|
|
340
346
|
async findTokenRecord(token) {
|
|
341
347
|
if (this.config.provider === void 0) return null;
|
|
342
|
-
const tokenHash = this.config.hashTokens ?
|
|
348
|
+
const tokenHash = this.config.hashTokens ? this.saltedHash(token) : token;
|
|
343
349
|
return this.config.provider.find(tokenHash);
|
|
344
350
|
}
|
|
345
351
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/http/status.ts","../../../src/native/hashing.ts","../../../src/native/crypto.ts","../../../src/server/auth/session-guard.ts","../../../src/server/auth/token-guard.ts","../../../src/server/auth/middleware.ts","../../../src/server/auth/index.ts"],"sourcesContent":["export const HttpStatus = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n} as const\n\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus]\n\nconst statusTextMap: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n}\n\nexport function statusText(code: number): string {\n const text = statusTextMap[code]\n if (text !== undefined) return text\n if (code >= 100 && code < 200) return 'Informational'\n if (code >= 200 && code < 300) return 'Success'\n if (code >= 300 && code < 400) return 'Redirection'\n if (code >= 400 && code < 500) return 'Client Error'\n if (code >= 500 && code < 600) return 'Server Error'\n return 'Unknown'\n}\n","import * as nodeCrypto from 'crypto'\nimport { constantTimeEqual } from './crypto.js'\n\n// ─── Scrypt (OWASP recommended) ──────────────────────────\n\nconst SCRYPT_N = 16384\nconst SCRYPT_R = 8\nconst SCRYPT_P = 1\nconst SCRYPT_KEYLEN = 64\nconst SCRYPT_SALT_BYTES = 32\n\nexport function hashPassword(password: string): string {\n const salt = nodeCrypto.randomBytes(SCRYPT_SALT_BYTES).toString('base64')\n const derivedKey = nodeCrypto.scryptSync(password, salt, SCRYPT_KEYLEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n })\n return `$scrypt$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}$${salt}$${derivedKey.toString('base64')}`\n}\n\nexport function verifyPassword(password: string, hash: string): boolean {\n const parts = hash.split('$')\n if (parts.length !== 7 || parts[1] !== 'scrypt') {\n throw new Error('Invalid scrypt hash format')\n }\n const N = Number(parts[2])\n const r = Number(parts[3])\n const p = Number(parts[4])\n const salt = parts[5]!\n const storedHash = parts[6]!\n const derivedKey = nodeCrypto.scryptSync(password, salt, SCRYPT_KEYLEN, {\n N,\n r,\n p,\n })\n const derivedHash = derivedKey.toString('base64')\n return constantTimeEqual(storedHash, derivedHash)\n}\n\n// ─── PBKDF2 (faster, for non-critical use) ──────────────\n\nconst PBKDF2_ITERATIONS = 600000\nconst PBKDF2_KEYLEN = 64\nconst PBKDF2_SALT_BYTES = 32\n\nexport function hashPasswordFast(password: string): string {\n const salt = nodeCrypto.randomBytes(PBKDF2_SALT_BYTES).toString('base64')\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n salt,\n PBKDF2_ITERATIONS,\n PBKDF2_KEYLEN,\n 'sha512',\n )\n return `$pbkdf2$${PBKDF2_ITERATIONS}$${salt}$${derivedKey.toString('base64')}`\n}\n\nexport function verifyPasswordFast(password: string, hash: string): boolean {\n const parts = hash.split('$')\n if (parts.length !== 5 || parts[1] !== 'pbkdf2') {\n throw new Error('Invalid pbkdf2 hash format')\n }\n const iterations = Number(parts[2])\n const salt = parts[3]!\n const storedHash = parts[4]!\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n salt,\n iterations,\n PBKDF2_KEYLEN,\n 'sha512',\n )\n const derivedHash = derivedKey.toString('base64')\n return constantTimeEqual(storedHash, derivedHash)\n}\n\n// ─── Rehash Detection ────────────────────────────────────\n\nconst CURRENT_SCRYPT_PREFIX = `$scrypt$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}`\nconst CURRENT_PBKDF2_PREFIX = `$pbkdf2$${PBKDF2_ITERATIONS}`\n\nexport function needsRehash(hash: string): boolean {\n if (hash.startsWith('$scrypt$')) {\n const prefix = hash.split('$').slice(0, 5).join('$')\n return prefix !== CURRENT_SCRYPT_PREFIX\n }\n if (hash.startsWith('$pbkdf2$')) {\n const prefix = hash.split('$').slice(0, 3).join('$')\n return prefix !== CURRENT_PBKDF2_PREFIX\n }\n return true\n}\n","import * as nodeCrypto from 'crypto'\n\n// ─── Encryption (AES-256-GCM) ──────────────────────────\n\nexport interface EncryptedData {\n encrypted: string\n iv: string\n tag: string\n}\n\nexport function encrypt(data: string, key: string): EncryptedData {\n const keyBuffer = Buffer.from(key, 'base64')\n if (keyBuffer.length !== 32) {\n throw new Error('Key must be 32 bytes (256 bits) for AES-256-GCM')\n }\n const iv = nodeCrypto.randomBytes(16)\n const cipher = nodeCrypto.createCipheriv('aes-256-gcm', keyBuffer, iv)\n let encrypted = cipher.update(data, 'utf8', 'base64')\n encrypted += cipher.final('base64')\n const tag = cipher.getAuthTag().toString('base64')\n return { encrypted, iv: iv.toString('base64'), tag }\n}\n\nexport function decrypt(encrypted: EncryptedData, key: string): string {\n const keyBuffer = Buffer.from(key, 'base64')\n if (keyBuffer.length !== 32) {\n throw new Error('Key must be 32 bytes (256 bits) for AES-256-GCM')\n }\n const decipher = nodeCrypto.createDecipheriv(\n 'aes-256-gcm',\n keyBuffer,\n Buffer.from(encrypted.iv, 'base64'),\n )\n decipher.setAuthTag(Buffer.from(encrypted.tag, 'base64'))\n let decrypted = decipher.update(encrypted.encrypted, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n}\n\n// ─── Hashing ────────────────────────────────────────────\n\nexport function hash(\n data: string,\n algorithm: 'sha256' | 'sha384' | 'sha512' = 'sha256',\n): string {\n return nodeCrypto.createHash(algorithm).update(data, 'utf8').digest('hex')\n}\n\nexport function hmac(\n data: string,\n secret: string,\n algorithm: 'sha256' | 'sha384' = 'sha256',\n): string {\n return nodeCrypto\n .createHmac(algorithm, secret)\n .update(data, 'utf8')\n .digest('hex')\n}\n\nexport function constantTimeEqual(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) {\n nodeCrypto.timingSafeEqual(bufA, bufA)\n return false\n }\n return nodeCrypto.timingSafeEqual(bufA, bufB)\n}\n\n// ─── Random ─────────────────────────────────────────────\n\nexport function randomHex(bytes: number = 32): string {\n return nodeCrypto.randomBytes(bytes).toString('hex')\n}\n\nexport function generateToken(bytes: number = 48): string {\n return nodeCrypto.randomBytes(bytes).toString('base64url')\n}\n\nexport function generateOTP(length: number = 6): string {\n const bytes = nodeCrypto.randomBytes(Math.ceil(length * 0.5))\n let otp = ''\n for (const b of bytes) {\n otp += (b % 10).toString()\n if (otp.length >= length) break\n }\n return otp\n}\n\nexport function uuid(): string {\n return nodeCrypto.randomUUID()\n}\n\n// ─── Encoding ───────────────────────────────────────────\n\nexport function base64Encode(data: string): string {\n return Buffer.from(data, 'utf8').toString('base64')\n}\n\nexport function base64Decode(data: string): string {\n return Buffer.from(data, 'base64').toString('utf8')\n}\n\nexport function checksum(data: string): string {\n return nodeCrypto\n .createHash('sha256')\n .update(data, 'utf8')\n .digest('base64')\n .slice(0, 8)\n}\n\n// ─── Key Generation ────────────────────────────────────\n\nexport function generateEncryptionKey(): string {\n return nodeCrypto.randomBytes(32).toString('base64')\n}\n\nexport function deriveKey(\n password: string,\n salt?: string,\n iterations: number = 600000,\n): { key: string; salt: string } {\n const actualSalt = salt ?? nodeCrypto.randomBytes(32).toString('hex')\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n actualSalt,\n iterations,\n 32,\n 'sha512',\n )\n return { key: derivedKey.toString('base64'), salt: actualSalt }\n}\n","import type { SuperRequest } from '../http/request.js'\nimport type { SuperResponse } from '../http/response.js'\nimport { verifyPassword } from '../../native/hashing.js'\nimport { encrypt, decrypt, randomHex } from '../../native/crypto.js'\n\nexport interface AuthUser {\n id: string | number\n [key: string]: unknown\n}\n\nexport interface UserProvider {\n findById(id: string | number): Promise<AuthUser | null>\n findByCredential(field: string, value: string): Promise<AuthUser | null>\n}\n\nexport interface SessionGuardConfig {\n cookieName?: string\n lifetime?: number\n table?: string\n identifier?: string\n password?: string\n provider?: UserProvider\n encryptionKey?: string\n}\n\ninterface SessionPayload {\n userId: string | number\n user?: AuthUser\n data: Record<string, unknown>\n expiresAt: number\n}\n\nexport class SessionGuard {\n private config: Required<\n Omit<SessionGuardConfig, 'provider' | 'encryptionKey'>\n > & { provider: UserProvider | undefined; encryptionKey: string }\n private req: SuperRequest | null = null\n private res: SuperResponse | null = null\n private cachedPayload: SessionPayload | null = null\n\n constructor(config?: SessionGuardConfig) {\n this.config = {\n cookieName: 'speexjs_session',\n lifetime: 120,\n table: 'users',\n identifier: 'email',\n password: 'password',\n provider: undefined,\n encryptionKey: config?.encryptionKey ?? process.env.APP_KEY ?? randomHex(32),\n ...config,\n }\n }\n\n setContext(req: SuperRequest, res: SuperResponse): this {\n this.req = req\n this.res = res\n this.cachedPayload = null\n return this\n }\n\n async attempt(\n credentials: { email: string; password: string },\n remember?: boolean,\n ): Promise<boolean> {\n if (this.config.provider === undefined) return false\n\n const identifierValue =\n credentials[this.config.identifier as keyof typeof credentials]\n if (identifierValue === undefined || typeof identifierValue !== 'string') {\n return false\n }\n\n const user = await this.config.provider.findByCredential(\n this.config.identifier,\n identifierValue,\n )\n if (user === null) return false\n\n const hash = user[this.config.password]\n if (typeof hash !== 'string') return false\n\n if (!verifyPassword(credentials.password, hash)) return false\n\n this.createSession(user, remember)\n return true\n }\n\n async login(userId: string | number, remember?: boolean): Promise<void> {\n if (this.config.provider !== undefined) {\n const user = await this.config.provider.findById(userId)\n if (user !== null) {\n this.createSession(user, remember)\n return\n }\n }\n\n const payload: SessionPayload = {\n userId,\n data: {},\n expiresAt: this.calculateExpiry(remember),\n }\n this.writeSessionCookie(payload)\n }\n\n async loginUser(user: AuthUser): Promise<void> {\n const payload: SessionPayload = {\n userId: user.id,\n user,\n data: {},\n expiresAt: this.calculateExpiry(false),\n }\n this.writeSessionCookie(payload)\n }\n\n async logout(): Promise<void> {\n if (this.res !== null) {\n this.res.clearCookie(this.config.cookieName, { path: '/' })\n }\n this.cachedPayload = null\n }\n\n async user(): Promise<AuthUser | null> {\n const payload = this.readSession()\n if (payload === null) return null\n\n if (payload.user !== undefined) return payload.user\n\n if (this.config.provider !== undefined) {\n const user = await this.config.provider.findById(payload.userId)\n if (user !== null) return user\n }\n\n return { id: payload.userId }\n }\n\n async check(): Promise<boolean> {\n return this.readSession() !== null\n }\n\n async guest(): Promise<boolean> {\n return !(await this.check())\n }\n\n async id(): Promise<string | number | null> {\n const payload = this.readSession()\n return payload?.userId ?? null\n }\n\n async set(key: string, value: unknown): Promise<void> {\n const payload = this.readSession()\n if (payload === null) return\n payload.data[key] = value\n this.writeSessionCookie(payload)\n }\n\n async get(key: string): Promise<unknown> {\n const payload = this.readSession()\n if (payload === null) return undefined\n return payload.data[key]\n }\n\n private createSession(user: AuthUser, remember?: boolean): void {\n const payload: SessionPayload = {\n userId: user.id,\n user,\n data: {},\n expiresAt: this.calculateExpiry(remember),\n }\n this.writeSessionCookie(payload)\n }\n\n private readSession(): SessionPayload | null {\n if (this.cachedPayload !== null) {\n if (this.cachedPayload.expiresAt > Date.now()) {\n return this.cachedPayload\n }\n this.cachedPayload = null\n return null\n }\n\n if (this.req === null) return null\n\n const cookieValue = this.req.cookie(this.config.cookieName)\n if (cookieValue === undefined) return null\n\n try {\n const decrypted = this.decryptSession(cookieValue)\n const payload = JSON.parse(decrypted) as SessionPayload\n if (payload.expiresAt <= Date.now()) return null\n this.cachedPayload = payload\n return payload\n } catch {\n return null\n }\n }\n\n private writeSessionCookie(payload: SessionPayload): void {\n if (this.res === null) return\n this.cachedPayload = payload\n const serialized = JSON.stringify(payload)\n const encrypted = this.encryptSession(serialized)\n const maxAge = Math.max(1, Math.floor((payload.expiresAt - Date.now()) / 1000))\n this.res.cookie(this.config.cookieName, encrypted, {\n maxAge,\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n })\n }\n\n private calculateExpiry(remember?: boolean): number {\n const lifetimeMs = this.config.lifetime * 60 * 1000\n if (remember) {\n const maxRemember = 5 * 365 * 24 * 60 * 60 * 1000\n return Date.now() + Math.max(lifetimeMs, maxRemember)\n }\n return Date.now() + lifetimeMs\n }\n\n private encryptSession(data: string): string {\n const result = encrypt(data, this.config.encryptionKey)\n return JSON.stringify(result)\n }\n\n private decryptSession(cookie: string): string {\n const parsed = JSON.parse(cookie)\n return decrypt(parsed, this.config.encryptionKey)\n }\n}\n","import type { AuthUser } from './session-guard.js'\nimport { hash, randomHex } from '../../native/crypto.js'\n\nexport interface TokenProvider {\n create(\n userId: string | number,\n tokenHash: string,\n name?: string,\n abilities?: string[],\n ): Promise<void>\n find(\n tokenHash: string,\n ): Promise<{\n userId: string | number\n abilities: string[]\n } | null>\n delete(tokenHash: string): Promise<void>\n deleteAllForUser(userId: string | number): Promise<void>\n}\n\nexport interface UserLookup {\n findById(id: string | number): Promise<AuthUser | null>\n}\n\nexport interface TokenGuardConfig {\n table?: string\n tokenLength?: number\n hashTokens?: boolean\n tokenName?: string\n provider?: TokenProvider\n userLookup?: UserLookup\n}\n\ninterface TokenRecord {\n userId: string | number\n abilities: string[]\n}\n\nexport class TokenGuard {\n private config: Required<\n Omit<TokenGuardConfig, 'provider' | 'userLookup'>\n > & { provider: TokenProvider | undefined; userLookup: UserLookup | undefined }\n\n constructor(config?: TokenGuardConfig) {\n this.config = {\n table: 'personal_access_tokens',\n tokenLength: 64,\n hashTokens: true,\n tokenName: 'api-token',\n provider: undefined,\n userLookup: undefined,\n ...config,\n }\n }\n\n async createToken(\n userId: string | number,\n name?: string,\n abilities?: string[],\n ): Promise<string> {\n if (this.config.provider === undefined) {\n throw new Error(\n 'TokenProvider is required to create tokens. Configure a provider in TokenGuardConfig.',\n )\n }\n\n const plaintext = randomHex(this.config.tokenLength)\n const tokenHash = this.config.hashTokens\n ? hash(plaintext)\n : plaintext\n await this.config.provider.create(\n userId,\n tokenHash,\n name ?? this.config.tokenName,\n abilities,\n )\n return plaintext\n }\n\n async user(token: string): Promise<AuthUser | null> {\n const record = await this.findTokenRecord(token)\n if (record === null) return null\n\n if (this.config.userLookup !== undefined) {\n return this.config.userLookup.findById(record.userId)\n }\n\n return { id: record.userId }\n }\n\n async validate(token: string): Promise<boolean> {\n const record = await this.findTokenRecord(token)\n return record !== null\n }\n\n async abilities(token: string): Promise<string[]> {\n const record = await this.findTokenRecord(token)\n if (record === null) return []\n return record.abilities\n }\n\n async can(token: string, ability: string): Promise<boolean> {\n const record = await this.findTokenRecord(token)\n if (record === null) return false\n if (record.abilities.length === 0) return true\n return record.abilities.includes(ability)\n }\n\n async revokeToken(token: string): Promise<void> {\n if (this.config.provider === undefined) return\n const tokenHash = this.config.hashTokens ? hash(token) : token\n await this.config.provider.delete(tokenHash)\n }\n\n async revokeAllTokens(userId: string | number): Promise<void> {\n if (this.config.provider === undefined) return\n await this.config.provider.deleteAllForUser(userId)\n }\n\n private async findTokenRecord(\n token: string,\n ): Promise<TokenRecord | null> {\n if (this.config.provider === undefined) return null\n const tokenHash = this.config.hashTokens ? hash(token) : token\n return this.config.provider.find(tokenHash)\n }\n}\n","import type { Middleware } from '../middleware/index.js'\nimport { HttpStatus } from '../http/status.js'\nimport type { AuthManager } from './index.js'\nimport { SessionGuard } from './session-guard.js'\nimport { TokenGuard } from './token-guard.js'\n\nexport function authMiddleware(guardName?: string): Middleware {\n return async (ctx, next) => {\n const authManager = ctx.container.resolve('auth') as AuthManager\n const guard = authManager.guard(guardName)\n\n let user = null\n\n if (guard instanceof SessionGuard) {\n guard.setContext(ctx.request, ctx.response)\n user = await guard.user()\n } else if (guard instanceof TokenGuard) {\n const token = ctx.request.bearerToken()\n if (token !== undefined) {\n user = await guard.user(token)\n }\n }\n\n if (user === null) {\n const ctxAny = ctx as unknown as Record<string, unknown>\n ctxAny.user = null\n\n if (ctx.request.wantsJson()) {\n ctx.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthenticated',\n message: 'Authentication is required to access this resource',\n })\n return\n }\n\n if (authManager.getLoginPath() !== undefined) {\n ctx.response.redirect(authManager.getLoginPath()!, HttpStatus.FOUND)\n return\n }\n\n ctx.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthenticated',\n message: 'Authentication is required to access this resource',\n })\n return\n }\n\n const ctxAny = ctx as unknown as Record<string, unknown>\n ctxAny.user = user\n ctxAny.auth = guard\n\n await next()\n }\n}\n\nexport function guestMiddleware(): Middleware {\n return async (ctx, next) => {\n const authManager = ctx.container.resolve('auth') as AuthManager\n const guard = authManager.guard()\n\n let user = null\n\n if (guard instanceof SessionGuard) {\n guard.setContext(ctx.request, ctx.response)\n user = await guard.user()\n }\n\n if (user !== null) {\n if (ctx.request.wantsJson()) {\n ctx.response.status(HttpStatus.FORBIDDEN).json({\n error: 'Forbidden',\n message: 'Already authenticated',\n })\n return\n }\n\n ctx.response.redirect('/', HttpStatus.FOUND)\n return\n }\n\n await next()\n }\n}\n","import { SessionGuard } from './session-guard.js'\nimport { TokenGuard } from './token-guard.js'\nimport { authMiddleware } from './middleware.js'\nimport type { Middleware } from '../middleware/index.js'\n\nexport type Guard = SessionGuard | TokenGuard\n\nexport class AuthManager {\n private guards = new Map<string, Guard>()\n private defaultGuardName = 'web'\n private loginPath: string | undefined = '/login'\n\n guard(name: string, guardInstance: Guard): this\n guard(name?: string): Guard\n guard(name?: string, guardInstance?: Guard): this | Guard {\n if (guardInstance !== undefined) {\n this.guards.set(name!, guardInstance)\n return this\n }\n\n const guardName = name ?? this.defaultGuardName\n const found = this.guards.get(guardName)\n if (found === undefined) {\n throw new Error(`Auth guard \"${guardName}\" not registered. Call authManager.guard(\"${guardName}\", guard) first.`)\n }\n return found\n }\n\n defaultGuard(name: string): this {\n this.defaultGuardName = name\n return this\n }\n\n setLoginPath(path: string | undefined): this {\n this.loginPath = path\n return this\n }\n\n getLoginPath(): string | undefined {\n return this.loginPath\n }\n\n hasGuard(name: string): boolean {\n return this.guards.has(name)\n }\n\n removeGuard(name: string): this {\n this.guards.delete(name)\n return this\n }\n\n getGuardNames(): string[] {\n return Array.from(this.guards.keys())\n }\n}\n\nexport function auth(guardName?: string): Middleware {\n return authMiddleware(guardName)\n}\n\nexport { SessionGuard } from './session-guard.js'\nexport type { AuthUser, UserProvider, SessionGuardConfig } from './session-guard.js'\nexport { TokenGuard } from './token-guard.js'\nexport type { TokenProvider, TokenGuardConfig } from './token-guard.js'\nexport { authMiddleware, guestMiddleware } from './middleware.js'\n"],"mappings":"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","names":["nodeCrypto","hash","hash","ctxAny"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/server/http/status.ts","../../../src/native/hashing.ts","../../../src/native/crypto.ts","../../../src/server/auth/session-guard.ts","../../../src/server/auth/token-guard.ts","../../../src/server/auth/middleware.ts","../../../src/server/auth/index.ts"],"sourcesContent":["export const HttpStatus = {\n OK: 200,\n CREATED: 201,\n ACCEPTED: 202,\n NO_CONTENT: 204,\n RESET_CONTENT: 205,\n PARTIAL_CONTENT: 206,\n\n MOVED_PERMANENTLY: 301,\n FOUND: 302,\n SEE_OTHER: 303,\n NOT_MODIFIED: 304,\n TEMPORARY_REDIRECT: 307,\n PERMANENT_REDIRECT: 308,\n\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n PAYMENT_REQUIRED: 402,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n METHOD_NOT_ALLOWED: 405,\n NOT_ACCEPTABLE: 406,\n REQUEST_TIMEOUT: 408,\n CONFLICT: 409,\n GONE: 410,\n LENGTH_REQUIRED: 411,\n PRECONDITION_FAILED: 412,\n PAYLOAD_TOO_LARGE: 413,\n URI_TOO_LONG: 414,\n UNSUPPORTED_MEDIA_TYPE: 415,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n\n INTERNAL_SERVER_ERROR: 500,\n NOT_IMPLEMENTED: 501,\n BAD_GATEWAY: 502,\n SERVICE_UNAVAILABLE: 503,\n GATEWAY_TIMEOUT: 504,\n HTTP_VERSION_NOT_SUPPORTED: 505,\n} as const\n\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus]\n\nconst statusTextMap: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 205: 'Reset Content',\n 206: 'Partial Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 303: 'See Other',\n 304: 'Not Modified',\n 307: 'Temporary Redirect',\n 308: 'Permanent Redirect',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 402: 'Payment Required',\n 403: 'Forbidden',\n 404: 'Not Found',\n 405: 'Method Not Allowed',\n 406: 'Not Acceptable',\n 408: 'Request Timeout',\n 409: 'Conflict',\n 410: 'Gone',\n 411: 'Length Required',\n 412: 'Precondition Failed',\n 413: 'Payload Too Large',\n 414: 'URI Too Long',\n 415: 'Unsupported Media Type',\n 422: 'Unprocessable Entity',\n 429: 'Too Many Requests',\n 500: 'Internal Server Error',\n 501: 'Not Implemented',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n 504: 'Gateway Timeout',\n 505: 'HTTP Version Not Supported',\n}\n\nexport function statusText(code: number): string {\n const text = statusTextMap[code]\n if (text !== undefined) return text\n if (code >= 100 && code < 200) return 'Informational'\n if (code >= 200 && code < 300) return 'Success'\n if (code >= 300 && code < 400) return 'Redirection'\n if (code >= 400 && code < 500) return 'Client Error'\n if (code >= 500 && code < 600) return 'Server Error'\n return 'Unknown'\n}\n","import * as nodeCrypto from 'crypto'\nimport { constantTimeEqual } from './crypto.js'\n\n// ─── Scrypt (OWASP recommended) ──────────────────────────\n\nconst SCRYPT_N = 16384\nconst SCRYPT_R = 8\nconst SCRYPT_P = 1\nconst SCRYPT_KEYLEN = 64\nconst SCRYPT_SALT_BYTES = 32\n\nexport function hashPassword(password: string): string {\n const salt = nodeCrypto.randomBytes(SCRYPT_SALT_BYTES).toString('base64')\n const derivedKey = nodeCrypto.scryptSync(password, salt, SCRYPT_KEYLEN, {\n N: SCRYPT_N,\n r: SCRYPT_R,\n p: SCRYPT_P,\n })\n return `$scrypt$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}$${salt}$${derivedKey.toString('base64')}`\n}\n\nexport function verifyPassword(password: string, hash: string): boolean {\n const parts = hash.split('$')\n if (parts.length !== 7 || parts[1] !== 'scrypt') {\n throw new Error('Invalid scrypt hash format')\n }\n const N = Number(parts[2])\n const r = Number(parts[3])\n const p = Number(parts[4])\n const salt = parts[5]!\n const storedHash = parts[6]!\n const derivedKey = nodeCrypto.scryptSync(password, salt, SCRYPT_KEYLEN, {\n N,\n r,\n p,\n })\n const derivedHash = derivedKey.toString('base64')\n return constantTimeEqual(storedHash, derivedHash)\n}\n\n// ─── PBKDF2 (faster, for non-critical use) ──────────────\n\nconst PBKDF2_ITERATIONS = 600000\nconst PBKDF2_KEYLEN = 64\nconst PBKDF2_SALT_BYTES = 32\n\nexport function hashPasswordFast(password: string): string {\n const salt = nodeCrypto.randomBytes(PBKDF2_SALT_BYTES).toString('base64')\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n salt,\n PBKDF2_ITERATIONS,\n PBKDF2_KEYLEN,\n 'sha512',\n )\n return `$pbkdf2$${PBKDF2_ITERATIONS}$${salt}$${derivedKey.toString('base64')}`\n}\n\nexport function verifyPasswordFast(password: string, hash: string): boolean {\n const parts = hash.split('$')\n if (parts.length !== 5 || parts[1] !== 'pbkdf2') {\n throw new Error('Invalid pbkdf2 hash format')\n }\n const iterations = Number(parts[2])\n const salt = parts[3]!\n const storedHash = parts[4]!\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n salt,\n iterations,\n PBKDF2_KEYLEN,\n 'sha512',\n )\n const derivedHash = derivedKey.toString('base64')\n return constantTimeEqual(storedHash, derivedHash)\n}\n\n// ─── Rehash Detection ────────────────────────────────────\n\nconst CURRENT_SCRYPT_PREFIX = `$scrypt$${SCRYPT_N}$${SCRYPT_R}$${SCRYPT_P}`\nconst CURRENT_PBKDF2_PREFIX = `$pbkdf2$${PBKDF2_ITERATIONS}`\n\nexport function needsRehash(hash: string): boolean {\n if (hash.startsWith('$scrypt$')) {\n const prefix = hash.split('$').slice(0, 5).join('$')\n return prefix !== CURRENT_SCRYPT_PREFIX\n }\n if (hash.startsWith('$pbkdf2$')) {\n const prefix = hash.split('$').slice(0, 3).join('$')\n return prefix !== CURRENT_PBKDF2_PREFIX\n }\n return true\n}\n","import * as nodeCrypto from 'crypto'\n\n// ─── Encryption (AES-256-GCM) ──────────────────────────\n\nexport interface EncryptedData {\n encrypted: string\n iv: string\n tag: string\n}\n\nexport function encrypt(data: string, key: string): EncryptedData {\n const keyBuffer = Buffer.from(key, 'base64')\n if (keyBuffer.length !== 32) {\n throw new Error('Key must be 32 bytes (256 bits) for AES-256-GCM')\n }\n const iv = nodeCrypto.randomBytes(16)\n const cipher = nodeCrypto.createCipheriv('aes-256-gcm', keyBuffer, iv)\n let encrypted = cipher.update(data, 'utf8', 'base64')\n encrypted += cipher.final('base64')\n const tag = cipher.getAuthTag().toString('base64')\n return { encrypted, iv: iv.toString('base64'), tag }\n}\n\nexport function decrypt(encrypted: EncryptedData, key: string): string {\n const keyBuffer = Buffer.from(key, 'base64')\n if (keyBuffer.length !== 32) {\n throw new Error('Key must be 32 bytes (256 bits) for AES-256-GCM')\n }\n const decipher = nodeCrypto.createDecipheriv(\n 'aes-256-gcm',\n keyBuffer,\n Buffer.from(encrypted.iv, 'base64'),\n )\n decipher.setAuthTag(Buffer.from(encrypted.tag, 'base64'))\n let decrypted = decipher.update(encrypted.encrypted, 'base64', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n}\n\n// ─── Hashing ────────────────────────────────────────────\n\nexport function hash(\n data: string,\n algorithm: 'sha256' | 'sha384' | 'sha512' = 'sha256',\n): string {\n return nodeCrypto.createHash(algorithm).update(data, 'utf8').digest('hex')\n}\n\nexport function hmac(\n data: string,\n secret: string,\n algorithm: 'sha256' | 'sha384' = 'sha256',\n): string {\n return nodeCrypto\n .createHmac(algorithm, secret)\n .update(data, 'utf8')\n .digest('hex')\n}\n\nexport function constantTimeEqual(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) {\n nodeCrypto.timingSafeEqual(bufA, bufA)\n return false\n }\n return nodeCrypto.timingSafeEqual(bufA, bufB)\n}\n\n// ─── Random ─────────────────────────────────────────────\n\nexport function randomHex(bytes: number = 32): string {\n return nodeCrypto.randomBytes(bytes).toString('hex')\n}\n\nexport function generateToken(bytes: number = 48): string {\n return nodeCrypto.randomBytes(bytes).toString('base64url')\n}\n\nexport function generateOTP(length: number = 6): string {\n const bytes = nodeCrypto.randomBytes(Math.ceil(length * 0.5))\n let otp = ''\n for (const b of bytes) {\n otp += (b % 10).toString()\n if (otp.length >= length) break\n }\n return otp\n}\n\nexport function uuid(): string {\n return nodeCrypto.randomUUID()\n}\n\n// ─── Encoding ───────────────────────────────────────────\n\nexport function base64Encode(data: string): string {\n return Buffer.from(data, 'utf8').toString('base64')\n}\n\nexport function base64Decode(data: string): string {\n return Buffer.from(data, 'base64').toString('utf8')\n}\n\nexport function checksum(data: string): string {\n return nodeCrypto\n .createHash('sha256')\n .update(data, 'utf8')\n .digest('base64')\n .slice(0, 8)\n}\n\n// ─── Key Generation ────────────────────────────────────\n\nexport function generateEncryptionKey(): string {\n return nodeCrypto.randomBytes(32).toString('base64')\n}\n\nexport function deriveKey(\n password: string,\n salt?: string,\n iterations: number = 600000,\n): { key: string; salt: string } {\n const actualSalt = salt ?? nodeCrypto.randomBytes(32).toString('hex')\n const derivedKey = nodeCrypto.pbkdf2Sync(\n password,\n actualSalt,\n iterations,\n 32,\n 'sha512',\n )\n return { key: derivedKey.toString('base64'), salt: actualSalt }\n}\n","import type { SuperRequest } from '../http/request.js'\nimport type { SuperResponse } from '../http/response.js'\nimport { verifyPassword } from '../../native/hashing.js'\nimport { encrypt, decrypt, generateEncryptionKey } from '../../native/crypto.js'\n\nexport interface AuthUser {\n id: string | number\n [key: string]: unknown\n}\n\nexport interface UserProvider {\n findById(id: string | number): Promise<AuthUser | null>\n findByCredential(field: string, value: string): Promise<AuthUser | null>\n}\n\nexport interface SessionGuardConfig {\n cookieName?: string\n lifetime?: number\n table?: string\n identifier?: string\n password?: string\n provider?: UserProvider\n encryptionKey?: string\n}\n\ninterface SessionPayload {\n userId: string | number\n user?: AuthUser\n data: Record<string, unknown>\n expiresAt: number\n}\n\nexport class SessionGuard {\n private config: Required<\n Omit<SessionGuardConfig, 'provider' | 'encryptionKey'>\n > & { provider: UserProvider | undefined; encryptionKey: string }\n private req: SuperRequest | null = null\n private res: SuperResponse | null = null\n private cachedPayload: SessionPayload | null = null\n\n constructor(config?: SessionGuardConfig) {\n this.config = {\n cookieName: 'speexjs_session',\n lifetime: 120,\n table: 'users',\n identifier: 'email',\n password: 'password',\n provider: undefined,\n encryptionKey: config?.encryptionKey ?? process.env.APP_KEY ?? generateEncryptionKey(),\n ...config,\n }\n }\n\n setContext(req: SuperRequest, res: SuperResponse): this {\n this.req = req\n this.res = res\n this.cachedPayload = null\n return this\n }\n\n async attempt(\n credentials: { email: string; password: string },\n remember?: boolean,\n ): Promise<boolean> {\n if (this.config.provider === undefined) return false\n\n const identifierValue =\n credentials[this.config.identifier as keyof typeof credentials]\n if (identifierValue === undefined || typeof identifierValue !== 'string') {\n return false\n }\n\n const user = await this.config.provider.findByCredential(\n this.config.identifier,\n identifierValue,\n )\n if (user === null) return false\n\n const hash = user[this.config.password]\n if (typeof hash !== 'string') return false\n\n if (!verifyPassword(credentials.password, hash)) return false\n\n this.createSession(user, remember)\n return true\n }\n\n async login(userId: string | number, remember?: boolean): Promise<void> {\n if (this.config.provider !== undefined) {\n const user = await this.config.provider.findById(userId)\n if (user !== null) {\n this.createSession(user, remember)\n return\n }\n }\n\n const payload: SessionPayload = {\n userId,\n data: {},\n expiresAt: this.calculateExpiry(remember),\n }\n this.writeSessionCookie(payload)\n }\n\n async loginUser(user: AuthUser): Promise<void> {\n const payload: SessionPayload = {\n userId: user.id,\n user,\n data: {},\n expiresAt: this.calculateExpiry(false),\n }\n this.writeSessionCookie(payload)\n }\n\n async logout(): Promise<void> {\n if (this.res !== null) {\n this.res.clearCookie(this.config.cookieName, { path: '/' })\n }\n this.cachedPayload = null\n }\n\n async user(): Promise<AuthUser | null> {\n const payload = this.readSession()\n if (payload === null) return null\n\n if (payload.user !== undefined) return payload.user\n\n if (this.config.provider !== undefined) {\n const user = await this.config.provider.findById(payload.userId)\n if (user !== null) return user\n }\n\n return { id: payload.userId }\n }\n\n async check(): Promise<boolean> {\n return this.readSession() !== null\n }\n\n async guest(): Promise<boolean> {\n return !(await this.check())\n }\n\n async id(): Promise<string | number | null> {\n const payload = this.readSession()\n return payload?.userId ?? null\n }\n\n async set(key: string, value: unknown): Promise<void> {\n const payload = this.readSession()\n if (payload === null) return\n payload.data[key] = value\n this.writeSessionCookie(payload)\n }\n\n async get(key: string): Promise<unknown> {\n const payload = this.readSession()\n if (payload === null) return undefined\n return payload.data[key]\n }\n\n private createSession(user: AuthUser, remember?: boolean): void {\n const payload: SessionPayload = {\n userId: user.id,\n user,\n data: {},\n expiresAt: this.calculateExpiry(remember),\n }\n this.writeSessionCookie(payload)\n }\n\n private readSession(): SessionPayload | null {\n if (this.cachedPayload !== null) {\n if (this.cachedPayload.expiresAt > Date.now()) {\n return this.cachedPayload\n }\n this.cachedPayload = null\n return null\n }\n\n if (this.req === null) return null\n\n const cookieValue = this.req.cookie(this.config.cookieName)\n if (cookieValue === undefined) return null\n\n try {\n const decrypted = this.decryptSession(cookieValue)\n const payload = JSON.parse(decrypted) as SessionPayload\n if (payload.expiresAt <= Date.now()) return null\n this.cachedPayload = payload\n return payload\n } catch {\n return null\n }\n }\n\n private writeSessionCookie(payload: SessionPayload): void {\n if (this.res === null) return\n this.cachedPayload = payload\n const serialized = JSON.stringify(payload)\n const encrypted = this.encryptSession(serialized)\n const maxAge = Math.max(1, Math.floor((payload.expiresAt - Date.now()) / 1000))\n this.res.cookie(this.config.cookieName, encrypted, {\n maxAge,\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n })\n }\n\n private calculateExpiry(remember?: boolean): number {\n const lifetimeMs = this.config.lifetime * 60 * 1000\n if (remember) {\n const maxRemember = 5 * 365 * 24 * 60 * 60 * 1000\n return Date.now() + Math.max(lifetimeMs, maxRemember)\n }\n return Date.now() + lifetimeMs\n }\n\n private encryptSession(data: string): string {\n const result = encrypt(data, this.config.encryptionKey)\n return JSON.stringify(result)\n }\n\n private decryptSession(cookie: string): string {\n const parsed = JSON.parse(cookie)\n return decrypt(parsed, this.config.encryptionKey)\n }\n}\n","import type { AuthUser } from './session-guard.js'\nimport { randomHex } from '../../native/crypto.js'\nimport { scryptSync, randomBytes } from 'node:crypto'\n\nexport interface TokenProvider {\n create(\n userId: string | number,\n tokenHash: string,\n name?: string,\n abilities?: string[],\n ): Promise<void>\n find(\n tokenHash: string,\n ): Promise<{\n userId: string | number\n abilities: string[]\n } | null>\n delete(tokenHash: string): Promise<void>\n deleteAllForUser(userId: string | number): Promise<void>\n}\n\nexport interface UserLookup {\n findById(id: string | number): Promise<AuthUser | null>\n}\n\nexport interface TokenGuardConfig {\n table?: string\n tokenLength?: number\n hashTokens?: boolean\n tokenName?: string\n provider?: TokenProvider\n userLookup?: UserLookup\n}\n\ninterface TokenRecord {\n userId: string | number\n abilities: string[]\n}\n\nexport class TokenGuard {\n private config: Required<\n Omit<TokenGuardConfig, 'provider' | 'userLookup'>\n > & { provider: TokenProvider | undefined; userLookup: UserLookup | undefined }\n\n constructor(config?: TokenGuardConfig) {\n this.config = {\n table: 'personal_access_tokens',\n tokenLength: 64,\n hashTokens: true,\n tokenName: 'api-token',\n provider: undefined,\n userLookup: undefined,\n ...config,\n }\n }\n\n async createToken(\n userId: string | number,\n name?: string,\n abilities?: string[],\n ): Promise<string> {\n if (this.config.provider === undefined) {\n throw new Error(\n 'TokenProvider is required to create tokens. Configure a provider in TokenGuardConfig.',\n )\n }\n\n const plaintext = randomHex(this.config.tokenLength)\n const tokenHash = this.config.hashTokens\n ? this.saltedHash(plaintext)\n : plaintext\n await this.config.provider.create(\n userId,\n tokenHash,\n name ?? this.config.tokenName,\n abilities,\n )\n return plaintext\n }\n\n private saltedHash(plaintext: string): string {\n const salt = randomBytes(16).toString('hex')\n const hash = scryptSync(plaintext, salt, 64).toString('hex')\n return `$scrypt$${salt}$${hash}`\n }\n\n async user(token: string): Promise<AuthUser | null> {\n const record = await this.findTokenRecord(token)\n if (record === null) return null\n\n if (this.config.userLookup !== undefined) {\n return this.config.userLookup.findById(record.userId)\n }\n\n return { id: record.userId }\n }\n\n async validate(token: string): Promise<boolean> {\n const record = await this.findTokenRecord(token)\n return record !== null\n }\n\n async abilities(token: string): Promise<string[]> {\n const record = await this.findTokenRecord(token)\n if (record === null) return []\n return record.abilities\n }\n\n async can(token: string, ability: string): Promise<boolean> {\n const record = await this.findTokenRecord(token)\n if (record === null) return false\n if (record.abilities.length === 0) return true\n return record.abilities.includes(ability)\n }\n\n async revokeToken(token: string): Promise<void> {\n if (this.config.provider === undefined) return\n const tokenHash = this.config.hashTokens ? this.saltedHash(token) : token\n await this.config.provider.delete(tokenHash)\n }\n\n async revokeAllTokens(userId: string | number): Promise<void> {\n if (this.config.provider === undefined) return\n await this.config.provider.deleteAllForUser(userId)\n }\n\n private async findTokenRecord(\n token: string,\n ): Promise<TokenRecord | null> {\n if (this.config.provider === undefined) return null\n const tokenHash = this.config.hashTokens ? this.saltedHash(token) : token\n return this.config.provider.find(tokenHash)\n }\n}\n","import type { Middleware } from '../middleware/index.js'\nimport { HttpStatus } from '../http/status.js'\nimport type { AuthManager } from './index.js'\nimport { SessionGuard } from './session-guard.js'\nimport { TokenGuard } from './token-guard.js'\n\nexport function authMiddleware(guardName?: string): Middleware {\n return async (ctx, next) => {\n const authManager = ctx.container.resolve('auth') as AuthManager\n const guard = authManager.guard(guardName)\n\n let user = null\n\n if (guard instanceof SessionGuard) {\n guard.setContext(ctx.request, ctx.response)\n user = await guard.user()\n } else if (guard instanceof TokenGuard) {\n const token = ctx.request.bearerToken()\n if (token !== undefined) {\n user = await guard.user(token)\n }\n }\n\n if (user === null) {\n const ctxAny = ctx as unknown as Record<string, unknown>\n ctxAny.user = null\n\n if (ctx.request.wantsJson()) {\n ctx.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthenticated',\n message: 'Authentication is required to access this resource',\n })\n return\n }\n\n if (authManager.getLoginPath() !== undefined) {\n ctx.response.redirect(authManager.getLoginPath()!, HttpStatus.FOUND)\n return\n }\n\n ctx.response.status(HttpStatus.UNAUTHORIZED).json({\n error: 'Unauthenticated',\n message: 'Authentication is required to access this resource',\n })\n return\n }\n\n const ctxAny = ctx as unknown as Record<string, unknown>\n ctxAny.user = user\n ctxAny.auth = guard\n\n await next()\n }\n}\n\nexport function guestMiddleware(): Middleware {\n return async (ctx, next) => {\n const authManager = ctx.container.resolve('auth') as AuthManager\n const guard = authManager.guard()\n\n let user = null\n\n if (guard instanceof SessionGuard) {\n guard.setContext(ctx.request, ctx.response)\n user = await guard.user()\n }\n\n if (user !== null) {\n if (ctx.request.wantsJson()) {\n ctx.response.status(HttpStatus.FORBIDDEN).json({\n error: 'Forbidden',\n message: 'Already authenticated',\n })\n return\n }\n\n ctx.response.redirect('/', HttpStatus.FOUND)\n return\n }\n\n await next()\n }\n}\n","import { SessionGuard } from './session-guard.js'\nimport { TokenGuard } from './token-guard.js'\nimport { authMiddleware } from './middleware.js'\nimport type { Middleware } from '../middleware/index.js'\n\nexport type Guard = SessionGuard | TokenGuard\n\nexport class AuthManager {\n private guards = new Map<string, Guard>()\n private defaultGuardName = 'web'\n private loginPath: string | undefined = '/login'\n\n guard(name: string, guardInstance: Guard): this\n guard(name?: string): Guard\n guard(name?: string, guardInstance?: Guard): this | Guard {\n if (guardInstance !== undefined) {\n this.guards.set(name!, guardInstance)\n return this\n }\n\n const guardName = name ?? this.defaultGuardName\n const found = this.guards.get(guardName)\n if (found === undefined) {\n throw new Error(`Auth guard \"${guardName}\" not registered. Call authManager.guard(\"${guardName}\", guard) first.`)\n }\n return found\n }\n\n defaultGuard(name: string): this {\n this.defaultGuardName = name\n return this\n }\n\n setLoginPath(path: string | undefined): this {\n this.loginPath = path\n return this\n }\n\n getLoginPath(): string | undefined {\n return this.loginPath\n }\n\n hasGuard(name: string): boolean {\n return this.guards.has(name)\n }\n\n removeGuard(name: string): this {\n this.guards.delete(name)\n return this\n }\n\n getGuardNames(): string[] {\n return Array.from(this.guards.keys())\n }\n}\n\nexport function auth(guardName?: string): Middleware {\n return authMiddleware(guardName)\n}\n\nexport { SessionGuard } from './session-guard.js'\nexport type { AuthUser, UserProvider, SessionGuardConfig } from './session-guard.js'\nexport { TokenGuard } from './token-guard.js'\nexport type { TokenProvider, TokenGuardConfig } from './token-guard.js'\nexport { authMiddleware, guestMiddleware } from './middleware.js'\n"],"mappings":"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","names":["nodeCrypto","scryptSync","randomBytes","ctxAny"]}
|