@vielzeug/spell 26.10.0 → 26.10.1

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.
@@ -2,7 +2,7 @@
2
2
  * Helpers for accepting raw literal values alongside schema instances in
3
3
  * sUnion() and sIntersect() arguments.
4
4
  *
5
- * Moved out of literal.ts — this infrastructure belongs to the combinator
5
+ * Moved out of literal.ts: this infrastructure belongs to the combinator
6
6
  * entry points (s.ts), not to LiteralSchema.
7
7
  */
8
8
  import type { AnySchema } from '../core';
@@ -1 +1 @@
1
- {"version":3,"file":"raw-or.js","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts — this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"iFAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAS,EAAO,IAAI,EAAc,CAAoB,CACxE,CACF"}
1
+ {"version":3,"file":"raw-or.js","names":[],"sources":["../../src/schemas/raw-or.ts"],"sourcesContent":["/**\n * Helpers for accepting raw literal values alongside schema instances in\n * sUnion() and sIntersect() arguments.\n *\n * Moved out of literal.ts: this infrastructure belongs to the combinator\n * entry points (s.ts), not to LiteralSchema.\n */\n\nimport type { AnySchema } from '../core';\n\nimport { Schema } from '../core';\nimport { LiteralSchema } from './literal';\n\nexport type LiteralValue = string | number | boolean | null | undefined;\nexport type RawOrSchema = AnySchema | LiteralValue;\nexport type NormalizeItem<T> = T extends AnySchema ? T : T extends LiteralValue ? LiteralSchema<T> : never;\nexport type NormalizeItems<T extends readonly RawOrSchema[]> = { readonly [K in keyof T]: NormalizeItem<T[K]> };\n\nexport function normalizeToSchemas<T extends readonly RawOrSchema[]>(items: T): NormalizeItems<T> {\n return items.map((item) =>\n item instanceof Schema ? item : new LiteralSchema(item as LiteralValue),\n ) as unknown as NormalizeItems<T>;\n}\n"],"mappings":"iFAkBA,SAAgB,EAAqD,EAA6B,CAChG,OAAO,EAAM,IAAK,GAChB,aAAgB,EAAS,EAAO,IAAI,EAAc,CAAoB,CACxE,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"string.cjs","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, ctx!.messages.string.type()),\n );\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.min, { min: length, value: value as string }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.string.max, { max: length, value: value as string }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.string.length, { exact, value: value as string }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.nonEmpty, { min: 1, value: value as string }),\n { min: 1 },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(prefix: string, message?: MessageFn<{ prefix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.startsWith, { prefix, value: value as string }),\n { prefix },\n );\n });\n }\n\n endsWith(suffix: string, message?: MessageFn<{ suffix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.endsWith, { suffix, value: value as string }),\n { suffix },\n );\n });\n }\n\n includes(substr: string, message?: MessageFn<{ substr: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.includes, { substr, value: value as string }),\n {\n includes: substr,\n },\n );\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n */\n regex(pattern: RegExp, message?: MessageFn<{ value: string }>): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.regex, { value: value as string }),\n {\n pattern: safePattern.source,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n warn(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from definition output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.email, { value: value as string }),\n { format: 'email' },\n );\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message, protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(\n ErrorCode.invalid_url,\n resolveMessage(message ?? ctx!.messages.string.url, { value: value as string }),\n { format: 'url' },\n );\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.uuid, { value: value as string }),\n { format: 'uuid' },\n );\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.date, { value: value as string }),\n {\n format: 'iso-date',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.dateTime, { value: value as string }),\n {\n format: 'iso-datetime',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ip, { value: value as string }),\n { format: 'ip' },\n );\n });\n }\n\n cuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid, { value: value as string }),\n { format: 'cuid' },\n );\n });\n }\n\n cuid2(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid2, { value: value as string }),\n { format: 'cuid2' },\n );\n });\n }\n\n ulid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ulid, { value: value as string }),\n { format: 'ulid' },\n );\n });\n }\n\n nanoid(length?: number, message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.nanoid, { value: value as string }),\n { format: 'nanoid' },\n );\n });\n }\n\n base64(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64, { value: value as string }),\n {\n format: 'base64',\n },\n );\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64url, { value: value as string }),\n {\n format: 'base64url',\n },\n );\n });\n }\n\n hex(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hex, { value: value as string }),\n { format: 'hex' },\n );\n });\n }\n\n hexColor(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hexColor, { value: value as string }),\n {\n format: 'hex-color',\n },\n );\n });\n }\n\n emoji(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.emoji, { value: value as string }),\n { format: 'emoji' },\n );\n });\n }\n\n jwt(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.jwt, { value: value as string }),\n { format: 'jwt' },\n );\n });\n }\n\n time(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.time, { value: value as string }),\n { format: 'time' },\n );\n });\n }\n\n duration(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_duration,\n resolveMessage(message ?? ctx!.messages.string.duration, { value: value as string }),\n {\n format: 'duration',\n },\n );\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.semver, { value: value as string }),\n { format: 'semver' },\n );\n });\n }\n\n slug(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.slug, { value: value as string }),\n { format: 'slug' },\n );\n });\n }\n\n numeric(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.numeric, { value: value as string }),\n { format: 'numeric' },\n );\n });\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"string.cjs","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, ctx!.messages.string.type()),\n );\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.min, { min: length, value: value as string }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.string.max, { max: length, value: value as string }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.string.length, { exact, value: value as string }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.nonEmpty, { min: 1, value: value as string }),\n { min: 1 },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(prefix: string, message?: MessageFn<{ prefix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.startsWith, { prefix, value: value as string }),\n { prefix },\n );\n });\n }\n\n endsWith(suffix: string, message?: MessageFn<{ suffix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.endsWith, { suffix, value: value as string }),\n { suffix },\n );\n });\n }\n\n includes(substr: string, message?: MessageFn<{ substr: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.includes, { substr, value: value as string }),\n {\n includes: substr,\n },\n );\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n */\n regex(pattern: RegExp, message?: MessageFn<{ value: string }>): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.regex, { value: value as string }),\n {\n pattern: safePattern.source,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n warn(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from definition output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.email, { value: value as string }),\n { format: 'email' },\n );\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message, protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(\n ErrorCode.invalid_url,\n resolveMessage(message ?? ctx!.messages.string.url, { value: value as string }),\n { format: 'url' },\n );\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.uuid, { value: value as string }),\n { format: 'uuid' },\n );\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.date, { value: value as string }),\n {\n format: 'iso-date',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.dateTime, { value: value as string }),\n {\n format: 'iso-datetime',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ip, { value: value as string }),\n { format: 'ip' },\n );\n });\n }\n\n cuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid, { value: value as string }),\n { format: 'cuid' },\n );\n });\n }\n\n cuid2(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid2, { value: value as string }),\n { format: 'cuid2' },\n );\n });\n }\n\n ulid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ulid, { value: value as string }),\n { format: 'ulid' },\n );\n });\n }\n\n nanoid(length?: number, message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.nanoid, { value: value as string }),\n { format: 'nanoid' },\n );\n });\n }\n\n base64(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64, { value: value as string }),\n {\n format: 'base64',\n },\n );\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64url, { value: value as string }),\n {\n format: 'base64url',\n },\n );\n });\n }\n\n hex(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hex, { value: value as string }),\n { format: 'hex' },\n );\n });\n }\n\n hexColor(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hexColor, { value: value as string }),\n {\n format: 'hex-color',\n },\n );\n });\n }\n\n emoji(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.emoji, { value: value as string }),\n { format: 'emoji' },\n );\n });\n }\n\n jwt(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.jwt, { value: value as string }),\n { format: 'jwt' },\n );\n });\n }\n\n time(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.time, { value: value as string }),\n { format: 'time' },\n );\n });\n }\n\n duration(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_duration,\n resolveMessage(message ?? ctx!.messages.string.duration, { value: value as string }),\n {\n format: 'duration',\n },\n );\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.semver, { value: value as string }),\n { format: 'semver' },\n );\n });\n }\n\n slug(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.slug, { value: value as string }),\n { format: 'slug' },\n );\n });\n }\n\n numeric(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.numeric, { value: value as string }),\n { format: 'numeric' },\n );\n });\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
@@ -111,17 +111,17 @@ export declare class StringSchema<Input = string> extends Schema<string, Input>
111
111
  value: string;
112
112
  }>): this;
113
113
  /**
114
- * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —
114
+ * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable :
115
115
  * `definition()` throws because preprocessors are not serializable.
116
116
  */
117
117
  trim(): this;
118
118
  /**
119
- * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —
119
+ * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable :
120
120
  * `definition()` throws because preprocessors are not serializable.
121
121
  */
122
122
  lowercase(): this;
123
123
  /**
124
- * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —
124
+ * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable :
125
125
  * `definition()` throws because preprocessors are not serializable.
126
126
  */
127
127
  uppercase(): this;
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, ctx!.messages.string.type()),\n );\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.min, { min: length, value: value as string }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.string.max, { max: length, value: value as string }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.string.length, { exact, value: value as string }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.nonEmpty, { min: 1, value: value as string }),\n { min: 1 },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(prefix: string, message?: MessageFn<{ prefix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.startsWith, { prefix, value: value as string }),\n { prefix },\n );\n });\n }\n\n endsWith(suffix: string, message?: MessageFn<{ suffix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.endsWith, { suffix, value: value as string }),\n { suffix },\n );\n });\n }\n\n includes(substr: string, message?: MessageFn<{ substr: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.includes, { substr, value: value as string }),\n {\n includes: substr,\n },\n );\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n */\n regex(pattern: RegExp, message?: MessageFn<{ value: string }>): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.regex, { value: value as string }),\n {\n pattern: safePattern.source,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n warn(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from definition output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.email, { value: value as string }),\n { format: 'email' },\n );\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message, protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(\n ErrorCode.invalid_url,\n resolveMessage(message ?? ctx!.messages.string.url, { value: value as string }),\n { format: 'url' },\n );\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.uuid, { value: value as string }),\n { format: 'uuid' },\n );\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.date, { value: value as string }),\n {\n format: 'iso-date',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.dateTime, { value: value as string }),\n {\n format: 'iso-datetime',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ip, { value: value as string }),\n { format: 'ip' },\n );\n });\n }\n\n cuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid, { value: value as string }),\n { format: 'cuid' },\n );\n });\n }\n\n cuid2(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid2, { value: value as string }),\n { format: 'cuid2' },\n );\n });\n }\n\n ulid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ulid, { value: value as string }),\n { format: 'ulid' },\n );\n });\n }\n\n nanoid(length?: number, message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.nanoid, { value: value as string }),\n { format: 'nanoid' },\n );\n });\n }\n\n base64(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64, { value: value as string }),\n {\n format: 'base64',\n },\n );\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64url, { value: value as string }),\n {\n format: 'base64url',\n },\n );\n });\n }\n\n hex(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hex, { value: value as string }),\n { format: 'hex' },\n );\n });\n }\n\n hexColor(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hexColor, { value: value as string }),\n {\n format: 'hex-color',\n },\n );\n });\n }\n\n emoji(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.emoji, { value: value as string }),\n { format: 'emoji' },\n );\n });\n }\n\n jwt(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.jwt, { value: value as string }),\n { format: 'jwt' },\n );\n });\n }\n\n time(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.time, { value: value as string }),\n { format: 'time' },\n );\n });\n }\n\n duration(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_duration,\n resolveMessage(message ?? ctx!.messages.string.duration, { value: value as string }),\n {\n format: 'duration',\n },\n );\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.semver, { value: value as string }),\n { format: 'semver' },\n );\n });\n }\n\n slug(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.slug, { value: value as string }),\n { format: 'slug' },\n );\n });\n }\n\n numeric(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.numeric, { value: value as string }),\n { format: 'numeric' },\n );\n });\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable —\n * `definition()` throws because preprocessors are not serializable.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"string.js","names":[],"sources":["../../src/schemas/string.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport type { MessageFn, SchemaDescriptor } from '../core';\nimport { ErrorCode, fail, resolveMessage, Schema } from '../core';\nimport {\n isBase64,\n isBase64url,\n isCuid,\n isCuid2,\n isDuration,\n isEmail,\n isEmoji,\n isHex,\n isHexColor,\n isIp,\n isIsoDate,\n isIsoDateTime,\n isJwt,\n isNanoid,\n isNumeric,\n isSemver,\n isSlug,\n isTime,\n isUlid,\n isUrl,\n isUuid,\n} from '../formats';\n\n/* -------------------- Typed annotations -------------------- */\n\ninterface StringAnnotations extends Record<string, unknown> {\n contentEncoding?: string;\n format?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string | null;\n}\n\ntype UrlOptions = {\n message?: MessageFn<{ value: string }>;\n protocols?: readonly string[];\n};\n\nexport class StringSchema<Input = string> extends Schema<string, Input> {\n protected override get _kind(): string {\n return 'string';\n }\n\n constructor() {\n super((value, ctx) =>\n typeof value === 'string' ? null : fail(ErrorCode.invalid_type, ctx!.messages.string.type()),\n );\n }\n\n min(length: number, message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length >= length) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.min, { min: length, value: value as string }),\n {\n min: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n minLength: ann.minLength === undefined ? length : Math.max(ann.minLength, length),\n };\n },\n );\n }\n\n max(length: number, message?: MessageFn<{ max: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length <= length) return null;\n\n return fail(\n ErrorCode.too_big,\n resolveMessage(message ?? ctx!.messages.string.max, { max: length, value: value as string }),\n {\n max: length,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return {\n ...ann,\n maxLength: ann.maxLength === undefined ? length : Math.min(ann.maxLength, length),\n };\n },\n );\n }\n\n length(exact: number, message?: MessageFn<{ exact: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length === exact) return null;\n\n return fail(\n ErrorCode.invalid_length,\n resolveMessage(message ?? ctx!.messages.string.length, { exact, value: value as string }),\n { exact },\n );\n },\n (ann) => ({ ...ann, maxLength: exact, minLength: exact }),\n );\n }\n\n nonEmpty(message?: MessageFn<{ min: number; value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if ((value as string).length > 0) return null;\n\n return fail(\n ErrorCode.too_small,\n resolveMessage(message ?? ctx!.messages.string.nonEmpty, { min: 1, value: value as string }),\n { min: 1 },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n return { ...ann, minLength: Math.max(ann.minLength ?? 0, 1) };\n },\n );\n }\n\n startsWith(prefix: string, message?: MessageFn<{ prefix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).startsWith(prefix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.startsWith, { prefix, value: value as string }),\n { prefix },\n );\n });\n }\n\n endsWith(suffix: string, message?: MessageFn<{ suffix: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).endsWith(suffix)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.endsWith, { suffix, value: value as string }),\n { suffix },\n );\n });\n }\n\n includes(substr: string, message?: MessageFn<{ substr: string; value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if ((value as string).includes(substr)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.includes, { substr, value: value as string }),\n {\n includes: substr,\n },\n );\n });\n }\n\n /**\n * Validates that the string matches the given regular expression.\n *\n * **Security note:** Stateful `/g` and `/y` flags are stripped automatically to prevent\n * `lastIndex`-based bugs. However, caller-supplied patterns with catastrophic backtracking\n * (e.g. `/(a+)+$/`) are a ReDoS risk when validating untrusted input in server-side contexts.\n * Prefer well-tested, bounded patterns for user-facing validation.\n *\n */\n regex(pattern: RegExp, message?: MessageFn<{ value: string }>): this {\n const safePattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n\n return this._addConstraint(\n (value, ctx) => {\n // Caller-supplied regexes still run against untrusted strings; spell can\n // neutralize stateful /g and /y flags but cannot make arbitrary patterns\n // immune to catastrophic backtracking without breaking the API.\n if (safePattern.test(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.regex, { value: value as string }),\n {\n pattern: safePattern.source,\n },\n );\n },\n (current) => {\n const ann = current as StringAnnotations;\n\n if (ann.pattern === null) return ann; // already ambiguous\n\n if (ann.pattern === undefined) return { ...ann, pattern: safePattern.source };\n\n if (ann.pattern !== safePattern.source) {\n warn(\n '[spell] Multiple .regex() constraints detected on a single string schema. ' +\n 'JSON Schema `pattern` cannot represent multiple patterns and will be omitted from definition output.',\n );\n\n return { ...ann, pattern: null };\n }\n\n return ann;\n },\n );\n }\n\n email(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isEmail(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.email, { value: value as string }),\n { format: 'email' },\n );\n },\n (ann) => ({ ...ann, format: 'email' }),\n );\n }\n\n url(options: UrlOptions = {}): this {\n const { message, protocols = ['http', 'https'] } = options;\n\n return this._addConstraint(\n (value, ctx) => {\n if (isUrl(value as string, protocols)) return null;\n\n return fail(\n ErrorCode.invalid_url,\n resolveMessage(message ?? ctx!.messages.string.url, { value: value as string }),\n { format: 'url' },\n );\n },\n (ann) => ({ ...ann, format: 'uri' }),\n );\n }\n\n uuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isUuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.uuid, { value: value as string }),\n { format: 'uuid' },\n );\n },\n (ann) => ({ ...ann, format: 'uuid' }),\n );\n }\n\n isoDate(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDate(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.date, { value: value as string }),\n {\n format: 'iso-date',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date' }),\n );\n }\n\n isoDateTime(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isIsoDateTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.dateTime, { value: value as string }),\n {\n format: 'iso-datetime',\n },\n );\n },\n (ann) => ({ ...ann, format: 'date-time' }),\n );\n }\n\n ip(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isIp(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ip, { value: value as string }),\n { format: 'ip' },\n );\n });\n }\n\n cuid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid, { value: value as string }),\n { format: 'cuid' },\n );\n });\n }\n\n cuid2(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isCuid2(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.cuid2, { value: value as string }),\n { format: 'cuid2' },\n );\n });\n }\n\n ulid(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isUlid(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.ulid, { value: value as string }),\n { format: 'ulid' },\n );\n });\n }\n\n nanoid(length?: number, message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNanoid(value as string, length)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.nanoid, { value: value as string }),\n { format: 'nanoid' },\n );\n });\n }\n\n base64(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isBase64(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64, { value: value as string }),\n {\n format: 'base64',\n },\n );\n },\n (ann) => ({ ...ann, contentEncoding: 'base64' }),\n );\n }\n\n base64url(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isBase64url(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_base64,\n resolveMessage(message ?? ctx!.messages.string.base64url, { value: value as string }),\n {\n format: 'base64url',\n },\n );\n });\n }\n\n hex(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHex(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hex, { value: value as string }),\n { format: 'hex' },\n );\n });\n }\n\n hexColor(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isHexColor(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.hexColor, { value: value as string }),\n {\n format: 'hex-color',\n },\n );\n });\n }\n\n emoji(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isEmoji(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.emoji, { value: value as string }),\n { format: 'emoji' },\n );\n });\n }\n\n jwt(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isJwt(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.jwt, { value: value as string }),\n { format: 'jwt' },\n );\n });\n }\n\n time(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isTime(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.time, { value: value as string }),\n { format: 'time' },\n );\n });\n }\n\n duration(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint(\n (value, ctx) => {\n if (isDuration(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_duration,\n resolveMessage(message ?? ctx!.messages.string.duration, { value: value as string }),\n {\n format: 'duration',\n },\n );\n },\n (ann) => ({ ...ann, format: 'duration' }),\n );\n }\n\n semver(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSemver(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.semver, { value: value as string }),\n { format: 'semver' },\n );\n });\n }\n\n slug(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isSlug(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.slug, { value: value as string }),\n { format: 'slug' },\n );\n });\n }\n\n numeric(message?: MessageFn<{ value: string }>): this {\n return this._addConstraint((value, ctx) => {\n if (isNumeric(value as string)) return null;\n\n return fail(\n ErrorCode.invalid_string,\n resolveMessage(message ?? ctx!.messages.string.numeric, { value: value as string }),\n { format: 'numeric' },\n );\n });\n }\n\n /**\n * **Note:** `trim()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n trim(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.trim() : v));\n }\n\n /**\n * **Note:** `lowercase()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n lowercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toLowerCase() : v));\n }\n\n /**\n * **Note:** `uppercase()` adds a preprocessor. Preprocessors are not serializable :\n * `definition()` throws because preprocessors are not serializable.\n */\n uppercase(): this {\n return this.preprocess((v: unknown) => (typeof v === 'string' ? v.toUpperCase() : v));\n }\n\n protected override _toDescriptorImpl(): SchemaDescriptor {\n const ann = this._annotations as StringAnnotations;\n\n return {\n ...this._describeBase(),\n ...(ann.contentEncoding !== undefined ? { contentEncoding: ann.contentEncoding } : {}),\n ...(ann.format !== undefined ? { format: ann.format } : {}),\n ...(ann.maxLength !== undefined ? { maxLength: ann.maxLength } : {}),\n ...(ann.minLength !== undefined ? { minLength: ann.minLength } : {}),\n ...(ann.pattern !== undefined ? { pattern: ann.pattern } : {}),\n kind: 'string',\n };\n }\n\n static coerce(): StringSchema<unknown> {\n return new StringSchema().preprocess((v: unknown) => (v == null ? v : String(v)));\n }\n}\n"],"mappings":"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"}