@whatsaaaa/form-builder-schema 0.1.0 → 0.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/field-types.ts","../src/rules.ts","../src/create-schema-builder.ts"],"sourcesContent":["import * as v from 'valibot'\nimport type { FieldTypeDef } from './types'\n\nexport const defaultFieldTypes = {\n text: { kind: 'string', base: (m) => v.string(m) },\n password: { kind: 'string', base: (m) => v.string(m) },\n email: {\n kind: 'string',\n base: (m) => v.string(m),\n defaultRules: [{ rule: 'email', message: 'Invalid email' }],\n },\n number: { kind: 'number', base: (m) => v.number(m) },\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport type { AnySchema, RuleDef } from './types'\n\nexport const defineRule = <T extends AnySchema>(def: RuleDef<T>): RuleDef<T> => def\n\nconst nonNegInt = v.pipe(v.number(), v.integer(), v.minValue(0))\nconst noParams = v.object({})\n\nexport const defaultRules = {\n minLength: defineRule({\n kinds: ['string'],\n params: v.object({ value: nonNegInt }),\n create: (p, m) => v.minLength(p.value, m),\n }),\n maxLength: defineRule({\n kinds: ['string'],\n params: v.object({ value: nonNegInt }),\n create: (p, m) => v.maxLength(p.value, m),\n }),\n regex: defineRule({\n kinds: ['string'],\n params: v.object({ pattern: v.string(), flags: v.optional(v.string()) }),\n create: (p, m) => v.regex(new RegExp(p.pattern, p.flags), m),\n }),\n email: defineRule({ kinds: ['string'], params: noParams, create: (_, m) => v.email(m) }),\n url: defineRule({ kinds: ['string'], params: noParams, create: (_, m) => v.url(m) }),\n minValue: defineRule({\n kinds: ['number'],\n params: v.object({ value: v.number() }),\n create: (p, m) => v.minValue(p.value, m),\n }),\n maxValue: defineRule({\n kinds: ['number'],\n params: v.object({ value: v.number() }),\n create: (p, m) => v.maxValue(p.value, m),\n }),\n integer: defineRule({ kinds: ['number'], params: noParams, create: (_, m) => v.integer(m) }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defaultFieldTypes } from './field-types'\nimport { defaultRules } from './rules'\nimport type {\n AnyAction,\n AnySchema,\n FieldTypeDef,\n JsonField,\n JsonFormSchema,\n JsonRule,\n RuleDef,\n ValueKind,\n} from './types'\n\nexport interface SchemaBuilderOptions {\n fieldTypes?: Record<string, FieldTypeDef>\n rules?: Record<string, RuleDef>\n}\n\nexport function createSchemaBuilder(opts: SchemaBuilderOptions = {}) {\n const fieldTypes: Record<string, FieldTypeDef> = { ...defaultFieldTypes, ...opts.fieldTypes }\n const rules: Record<string, RuleDef> = { ...defaultRules, ...opts.rules }\n\n function buildAction(rule: JsonRule, kind: ValueKind, at: string): AnyAction {\n const def = rules[rule.rule]\n if (!def) throw new Error(`${at}: unknown rule \"${rule.rule}\"`)\n if (!def.kinds.includes(kind))\n throw new Error(`${at}: rule \"${rule.rule}\" can't be used on ${kind} fields`)\n\n const parsed = v.safeParse(def.params, rule)\n if (!parsed.success)\n throw new Error(`${at}: invalid params for \"${rule.rule}\"\\n${v.summarize(parsed.issues)}`)\n\n return def.create(parsed.output, rule.message)\n }\n\n function buildField(field: JsonField, i: number): AnySchema {\n const at = `fields[${i}] \"${field.name}\"`\n const type = fieldTypes[field.type]\n if (!type) throw new Error(`${at}: unknown field type \"${field.type}\"`)\n\n const userRules = field.rules ?? []\n const overridden = new Set(userRules.map((r) => r.rule))\n const allRules = [\n ...(type.defaultRules ?? []).filter((r) => !overridden.has(r.rule)),\n ...userRules,\n ]\n\n const required = !!field.required\n const requiredMsg = typeof field.required === 'object' ? field.required.message : undefined\n\n const actions: AnyAction[] = []\n\n if (required && type.kind === 'string') {\n actions.push(v.nonEmpty(requiredMsg ?? 'Required'))\n }\n\n allRules.forEach((r, j) => {\n actions.push(buildAction(r, type.kind, `${at}.rules[${j}]`))\n })\n\n // An empty number input is not a number, so required ones report it via the type check.\n const baseMsg = required && type.kind === 'number' ? (requiredMsg ?? 'Required') : requiredMsg\n const schema = actions.reduce<AnySchema>((s, a) => v.pipe(s, a), type.base(baseMsg))\n\n if (required) return schema\n if (type.kind === 'string') return v.optional(v.union([v.literal(''), schema]))\n\n // A cleared number input holds '', which means \"no value\".\n const empty = v.pipe(\n v.literal(''),\n v.transform(() => undefined),\n )\n return v.optional(v.union([empty, schema]))\n }\n\n return function build(json: JsonFormSchema) {\n const entries: v.ObjectEntries = {}\n\n json.fields.forEach((field, i) => {\n if (field.name in entries) throw new Error(`fields[${i}]: duplicate name \"${field.name}\"`)\n entries[field.name] = buildField(field, i)\n })\n\n return v.object(entries)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["meta","meta","kinds","meta","kinds","meta","meta","kinds","meta"],"sources":["../src/builder/build-field-schema.ts","../src/field-types/default-field-types.ts","../src/kinds/default-kinds.ts","../src/rules/define-rule.ts","../src/rules/param-schemas.ts","../src/rules/comparison-rules.ts","../src/rules/content-rules.ts","../src/rules/date-rules.ts","../src/rules/file-rules.ts","../src/rules/format-rules.ts","../src/rules/length-rules.ts","../src/rules/normalize-rules.ts","../src/rules/number-rules.ts","../src/rules/text-unit-rules.ts","../src/rules/default-rules.ts","../src/builder/registry.ts","../src/errors/definition-error.ts","../src/rules/rule-params.ts","../src/shared/reserved-keys.ts","../src/builder/validate-definition.ts","../src/builder/create-schema-builder.ts","../src/field-types/define-field-type.ts"],"sourcesContent":["import * as v from 'valibot'\nimport type { JsonField } from '../definition/json-form-schema'\nimport type { DefinitionPath } from '../errors/definition-error'\nimport type { CheckedField } from './validate-definition'\nimport type { AnyAction, AnySchema } from '../shared/valibot-types'\n\nexport interface MessageContext {\n field: JsonField\n rule?: string\n path: DefinitionPath\n}\n\nexport interface Messages {\n required: string\n resolve(text: string, ctx: MessageContext): string\n}\n\n/**\n * The schema runs in this order: empty check, base schema, normalize rules, required check,\n * then the type's default rules and the field's rules.\n */\nexport function buildFieldSchema(checked: CheckedField, messages: Messages): AnySchema {\n const { field, path, type, kind } = checked\n const required = !!field.required\n const requiredMessage = messages.resolve(\n (typeof field.required === 'object' && field.required.message) || messages.required,\n { field, path },\n )\n\n const normalize: AnyAction[] = []\n const validate: AnyAction[] = []\n\n for (const rule of checked.rules) {\n const message =\n rule.message === undefined\n ? undefined\n : messages.resolve(rule.message, { field, rule: rule.name, path })\n const action = rule.def.create(rule.params, message)\n if (rule.def.stage === 'normalize') {\n normalize.push(action)\n } else {\n validate.push(action)\n }\n }\n\n const base = (type.schema as NonNullable<typeof type.schema>)(field, { path })\n const requiredCheck = required ? kind.required?.(requiredMessage) : undefined\n const head = pipe(base, requiredCheck ? [...normalize, requiredCheck] : normalize)\n\n const empty = required\n ? v.never(requiredMessage)\n : v.pipe(\n v.unknown(),\n v.transform(() => undefined),\n )\n\n const whenFilled = (schema: AnySchema): AnySchema =>\n v.lazy((input) => (kind.isEmpty(input) ? empty : schema))\n\n const schema = whenFilled(v.pipe(head, whenFilled(pipe(v.unknown(), validate))))\n\n return required ? schema : v.optional(schema)\n}\n\nconst pipe = (schema: AnySchema, actions: readonly AnyAction[]): AnySchema =>\n actions.reduce<AnySchema>((acc, action) => v.pipe(acc, action), schema)\n","import * as v from 'valibot'\nimport type { FieldTypeDef } from './field-type-def'\n\nexport const defaultFieldTypes = {\n text: { kind: 'string', schema: () => v.string() },\n password: { kind: 'string', schema: () => v.string() },\n email: { kind: 'string', schema: () => v.string(), defaultRules: [{ rule: 'email' }] },\n number: { kind: 'number', schema: () => v.number() },\n} satisfies Record<string, FieldTypeDef>\n","import * as v from 'valibot'\nimport type { KindDef } from './kind-def'\n\nconst isNil = (input: unknown) => input === undefined || input === null\n\nexport const defaultKinds = {\n string: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n // A cleared <input type=\"number\"/> holds '' or NaN, depending on the adapter.\n number: {\n isEmpty: (input) => isNil(input) || input === '' || Number.isNaN(input),\n },\n // Required means \"must be ticked\", e.g accepting terms.\n boolean: {\n isEmpty: isNil,\n required: (message) => v.value(true, message),\n },\n date: {\n isEmpty: (input) => isNil(input) || input === '',\n required: (message) => v.nonEmpty(message),\n },\n array: {\n isEmpty: (input) => isNil(input) || (Array.isArray(input) && input.length === 0),\n required: (message) => v.minLength(1, message),\n },\n file: { isEmpty: isNil },\n object: { isEmpty: isNil },\n // Display elements (headings, dividers) have no value, so the builder never calls this.\n none: { isEmpty: () => true },\n} satisfies Record<string, KindDef>\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nexport const defineRule = <T extends AnyObjectSchema>(def: RuleDef<T>): RuleDef<T> => def\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\n\n/** A length, count or size: a whole number from 0. */\nexport const count = v.pipe(v.number(), v.integer(), v.minValue(0))\n\nexport const countParams = v.object({ value: count })\n\nconst isIsoValue = (input: string) =>\n v.ISO_DATE_REGEX.test(input) || v.ISO_DATE_TIME_REGEX.test(input) || v.ISO_TIME_REGEX.test(input)\n\n/** Valibot compares dates as ISO strings, so the param must be one too. */\nexport const isoValue = v.pipe(\n v.string(),\n v.check(isIsoValue, 'Use an ISO date, date-time or time, such as 2026-01-01'),\n)\n\nexport const valueSchema = (kind: ValueKind) => {\n switch (kind) {\n case 'date':\n return isoValue\n case 'string':\n return v.string()\n case 'boolean':\n return v.boolean()\n default:\n return v.number()\n }\n}\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport { valueSchema } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\ntype Value = string | number | boolean\n\nconst ordered = ['number', 'date'] as const\nconst any = ['number', 'date', 'string', 'boolean'] as const\nconst meta = (label: string) => ({ label, category: 'comparison' }) as const\n\n// The param has the field's type: a number on a number field, an ISO string on a date field.\nconst valueParams = (kind: ValueKind) => v.object({ value: valueSchema(kind) })\nconst valuesParams = (kind: ValueKind) =>\n v.object({\n values: v.pipe(v.array(valueSchema(kind)), v.minLength(1, 'Give at least one value')),\n })\n\n/** Compares the value with a param of the same type. */\nexport const comparisonRules = {\n minValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Minimum'),\n create: (p, m) => v.minValue(p.value as Value, m) as AnyAction,\n }),\n maxValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Maximum'),\n create: (p, m) => v.maxValue(p.value as Value, m) as AnyAction,\n }),\n gtValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Greater than'),\n create: (p, m) => v.gtValue(p.value as Value, m) as AnyAction,\n }),\n ltValue: defineRule({\n kinds: ordered,\n params: valueParams,\n meta: meta('Less than'),\n create: (p, m) => v.ltValue(p.value as Value, m) as AnyAction,\n }),\n value: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Equals'),\n create: (p, m) => v.value(p.value as Value, m) as AnyAction,\n }),\n notValue: defineRule({\n kinds: any,\n params: valueParams,\n meta: meta('Does not equal'),\n create: (p, m) => v.notValue(p.value as Value, m) as AnyAction,\n }),\n values: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('One of'),\n create: (p, m) => v.values(p.values as Value[], m) as AnyAction,\n }),\n notValues: defineRule({\n kinds: ordered,\n params: valuesParams,\n meta: meta('None of'),\n create: (p, m) => v.notValues(p.values as Value[], m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { ValueKind } from '../shared/value-kind'\nimport { defineRule } from './define-rule'\nimport type { AnyAction } from '../shared/valibot-types'\nimport type { RuleDef } from './rule-def'\n\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'content' }) as const\n\nconst regexError = (pattern: string, flags = '') => {\n try {\n new RegExp(pattern, flags)\n return undefined\n } catch (error) {\n return (error as Error).message\n }\n}\n\nconst FLAGS = /^[dgimsuvy]*$/\n\nconst regexParams = v.pipe(\n v.object({\n pattern: v.string(),\n flags: v.optional(v.pipe(v.string(), v.regex(FLAGS, 'Flags can be d, g, i, m, s, u, v and y'))),\n }),\n v.forward(\n v.check(\n (p) => !FLAGS.test(p.flags ?? '') || regexError(p.pattern, p.flags) === undefined,\n (issue) => regexError(issue.input.pattern, issue.input.flags) ?? 'Invalid pattern',\n ),\n ['pattern'],\n ),\n)\n\nconst item = v.union([v.string(), v.number(), v.boolean()])\nconst stringParams = v.object({ value: v.string() })\nconst contentParams = (kind: ValueKind) => v.object({ value: kind === 'array' ? item : v.string() })\n\nexport const contentRules = {\n regex: defineRule({\n kinds: ['string'],\n params: regexParams,\n meta: meta('Matches pattern', 'A JavaScript regular expression, without the slashes.'),\n create: (p, m) => v.regex(new RegExp(p.pattern, p.flags?.replace(/[gy]/g, '')), m),\n }),\n startsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Starts with'),\n create: (p, m) => v.startsWith(p.value, m),\n }),\n endsWith: defineRule({\n kinds: ['string'],\n params: stringParams,\n meta: meta('Ends with'),\n create: (p, m) => v.endsWith(p.value, m),\n }),\n includes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Contains'),\n create: (p, m) => v.includes(p.value, m) as AnyAction,\n }),\n excludes: defineRule({\n kinds: ['string', 'array'],\n params: contentParams,\n meta: meta('Does not contain'),\n create: (p, m) => v.excludes(p.value, m) as AnyAction,\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst iso = (label: string, description: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string', 'date'],\n meta: { label, description, category: 'date' },\n create: (_, message) => create(message),\n })\n\nexport const dateRules = {\n isoDate: iso('ISO date', 'Like 2026-10-28', (m) => v.isoDate(m)),\n isoDateTime: iso('ISO date and time', 'Like 2026-10-28T14:30', (m) => v.isoDateTime(m)),\n isoTime: iso('ISO time', 'Like 14:30', (m) => v.isoTime(m)),\n isoTimeSecond: iso('ISO time with seconds', 'Like 14:30:15', (m) => v.isoTimeSecond(m)),\n isoTimestamp: iso('ISO timestamp', 'Like 2026-10-28T14:30:15.000z', (m) => v.isoTimestamp(m)),\n isoWeek: iso('ISO week', 'Like 2026-W44', (m) => v.isoWeek(m)),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['file'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'file' }) as const\nconst bytes = 'In bytes, e.g. 1048576 for 1 MiB.'\n\ntype MimeType = `${string}/${string}`\n\n// A File only carries its MIME type, and Valibot compares it exactly, so image/* can't work.\nconst mimeTypeParams = v.object({\n types: v.pipe(\n v.array(\n v.pipe(v.string(), v.regex(/^[\\w.+-]+\\/[\\w.+-]+$/, 'Use a MIME type, such as image/png')),\n ),\n v.minLength(1, 'Give at least one MIME type'),\n ),\n})\n\n/** Size and type of a File or Blob. */\nexport const fileRules = {\n minSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum size', bytes),\n create: (p, m) => v.minSize(p.value, m),\n }),\n maxSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum size', bytes),\n create: (p, m) => v.maxSize(p.value, m),\n }),\n size: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact size', bytes),\n create: (p, m) => v.size(p.value, m),\n }),\n notSize: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this size', bytes),\n create: (p, m) => v.notSize(p.value, m),\n }),\n mimeType: defineRule({\n kinds,\n params: mimeTypeParams,\n meta: meta('File type'),\n create: (p, m) => v.mimeType(p.types as MimeType[], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport type { AnyAction } from '../shared/valibot-types'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\n/** A string format without params. */\nconst format = (label: string, create: (message?: string) => AnyAction) =>\n defineRule({\n kinds: ['string'],\n meta: { label, category: 'format' },\n create: (_, message) => create(message),\n })\n\n/** Valibot's hash types. Valibot doesn't export the list, only the type. */\nconst HASH_TYPES = [\n 'md4',\n 'md5',\n 'sha1',\n 'sha256',\n 'sha384',\n 'sha512',\n 'ripemd128',\n 'ripemd160',\n 'tiger128',\n 'tiger160',\n 'tiger192',\n 'crc32',\n 'crc32b',\n 'adler32',\n] as const satisfies readonly v.HashType[]\n\nconst hashParams = v.object({\n types: v.pipe(v.array(v.picklist(HASH_TYPES)), v.minLength(1, 'Pick at least one hash type')),\n})\n\n/** Formats Valibot can check on a string. */\nexport const formatRules = {\n email: format('Email', (m) => v.email(m)),\n rfcEmail: format('Email (RFC 5322)', (m) => v.rfcEmail(m)),\n url: format('URL', (m) => v.url(m)),\n domain: format('Domain', (m) => v.domain(m)),\n slug: format('Slug', (m) => v.slug(m)),\n uuid: format('UUID', (m) => v.uuid(m)),\n ulid: format('ULID', (m) => v.ulid(m)),\n cuid2: format('CUID2', (m) => v.cuid2(m)),\n nanoid: format('Nano ID', (m) => v.nanoid(m)),\n ip: format('IP address', (m) => v.ip(m)),\n ipv4: format('IPv4 address', (m) => v.ipv4(m)),\n ipv6: format('IPv6 address', (m) => v.ipv6(m)),\n mac: format('MAC address', (m) => v.mac(m)),\n mac48: format('MAC-48 address', (m) => v.mac48(m)),\n mac64: format('MAC-64 address', (m) => v.mac64(m)),\n hexColor: format('Hex colour', (m) => v.hexColor(m)),\n hexadecimal: format('Hexadecimal', (m) => v.hexadecimal(m)),\n octal: format('Octal', (m) => v.octal(m)),\n decimal: format('Decimal number', (m) => v.decimal(m)),\n digits: format('Digits only', (m) => v.digits(m)),\n base64: format('Base64', (m) => v.base64(m)),\n bic: format('BIC (SWIFT code)', (m) => v.bic(m)),\n creditCard: format('Credit card number', (m) => v.creditCard(m)),\n imei: format('IMEI', (m) => v.imei(m)),\n isbn: format('ISBN', (m) => v.isbn(m)),\n isrc: format('ISRC', (m) => v.isrc(m)),\n emoji: format('Emoji', (m) => v.emoji(m)),\n hash: defineRule({\n kinds: ['string'],\n params: hashParams,\n meta: { label: 'Hash', category: 'format' },\n create: (p, m) => v.hash(p.types as [v.HashType, ...v.HashType[]], m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport { countParams } from './param-schemas'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string', 'array'] as const\nconst meta = (label: string) => ({ label, category: 'length' }) as const\n\n/** Characters of a string, or items of an array */\nexport const lengthRules = {\n length: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact length'),\n create: (p, m) => v.length(p.value, m),\n }),\n minLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum length'),\n create: (p, m) => v.minLength(p.value, m),\n }),\n maxLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum length'),\n create: (p, m) => v.maxLength(p.value, m),\n }),\n notLength: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this length'),\n create: (p, m) => v.notLength(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst stage = 'normalize'\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'normalize' }) as const\nconst limit = v.object({ value: v.number() })\n\n/**\n * Rules that change the value instead of checking it. They run before the required check, so\n * `' '` with `trim` is empty. Their `message` is never shown.\n */\nexport const normalizeRules = {\n trim: defineRule({ kinds: ['string'], stage, meta: meta('Trim'), create: () => v.trim() }),\n trimStart: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim start'),\n create: () => v.trimStart(),\n }),\n trimEnd: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Trim end'),\n create: () => v.trimEnd(),\n }),\n toLowerCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Lowercase'),\n create: () => v.toLowerCase(),\n }),\n toUpperCase: defineRule({\n kinds: ['string'],\n stage,\n meta: meta('Uppercase'),\n create: () => v.toUpperCase(),\n }),\n normalize: defineRule({\n kinds: ['string'],\n stage,\n params: v.object({ form: v.optional(v.picklist(['NFC', 'NFD', 'NFKC', 'NFKD'])) }),\n meta: meta('Unicode normalize', 'Defaults to NFC.'),\n create: (p) => v.normalize(p.form),\n }),\n toMinValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Raise to minimum', 'Replaces a smaller number with the minimum.'),\n create: (p) => v.toMinValue(p.value),\n }),\n toMaxValue: defineRule({\n kinds: ['number'],\n stage,\n params: limit,\n meta: meta('Lower to maximum', 'Replaces a larger number with the maximum.'),\n create: (p) => v.toMaxValue(p.value),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['number'] as const\nconst meta = (label: string) => ({ label, category: 'number' }) as const\n\nconst divisor = v.pipe(v.number(), v.finite(), v.notValue(0, \"Can't be 0\"))\n\n/** Checks only numbers have. */\nexport const numberRules = {\n integer: defineRule({ kinds, meta: meta('Whole number'), create: (_, m) => v.integer(m) }),\n safeInteger: defineRule({\n kinds,\n meta: meta('Safe whole number'),\n create: (_, m) => v.safeInteger(m),\n }),\n finite: defineRule({ kinds, meta: meta('Finite number'), create: (_, m) => v.finite(m) }),\n multipleOf: defineRule({\n kinds,\n params: v.object({ value: divisor }),\n meta: meta('Multiple of'),\n create: (p, m) => v.multipleOf(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import * as v from 'valibot'\nimport { count, countParams } from './param-schemas'\nimport { defineRule } from './define-rule'\nimport type { RuleDef } from './rule-def'\n\nconst kinds = ['string'] as const\nconst meta = (label: string, description?: string) =>\n ({ label, description, category: 'text' }) as const\n\nconst isLocale = (input: string) => {\n try {\n return Intl.getCanonicalLocales(input).length === 1\n } catch {\n return false\n }\n}\n\nconst wordsParams = v.object({\n locale: v.optional(\n v.pipe(v.string(), v.check(isLocale, 'Use a language tag, such as en or sr-Latn')),\n ),\n value: count,\n})\n\nconst graphemesInfo = 'Counts characters as people see them, so an emoji is one.'\nconst bytesInfo = 'Counts UTF-8 bytes, e.g. to fit a database column,'\n\nexport const textUnitRules = {\n graphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact characters', graphemesInfo),\n create: (p, m) => v.graphemes(p.value, m),\n }),\n minGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum characters', graphemesInfo),\n create: (p, m) => v.minGraphemes(p.value, m),\n }),\n maxGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum characters', graphemesInfo),\n create: (p, m) => v.maxGraphemes(p.value, m),\n }),\n notGraphemes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many characters', graphemesInfo),\n create: (p, m) => v.notGraphemes(p.value, m),\n }),\n words: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Exact words'),\n create: (p, m) => v.words(p.locale, p.value, m),\n }),\n minWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Minimum words'),\n create: (p, m) => v.minWords(p.locale, p.value, m),\n }),\n maxWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Maximum words'),\n create: (p, m) => v.maxWords(p.locale, p.value, m),\n }),\n notWords: defineRule({\n kinds,\n params: wordsParams,\n meta: meta('Not this many words'),\n create: (p, m) => v.notWords(p.locale, p.value, m),\n }),\n bytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Exact bytes', bytesInfo),\n create: (p, m) => v.bytes(p.value, m),\n }),\n minBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Minimum bytes', bytesInfo),\n create: (p, m) => v.minBytes(p.value, m),\n }),\n maxBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Maximum bytes', bytesInfo),\n create: (p, m) => v.maxBytes(p.value, m),\n }),\n notBytes: defineRule({\n kinds,\n params: countParams,\n meta: meta('Not this many bytes', bytesInfo),\n create: (p, m) => v.notBytes(p.value, m),\n }),\n} satisfies Record<string, RuleDef>\n","import { comparisonRules } from './comparison-rules'\nimport { contentRules } from './content-rules'\nimport { dateRules } from './date-rules'\nimport { fileRules } from './file-rules'\nimport { formatRules } from './format-rules'\nimport { lengthRules } from './length-rules'\nimport { normalizeRules } from './normalize-rules'\nimport { numberRules } from './number-rules'\nimport { textUnitRules } from './text-unit-rules'\n\n/** Every built-in rule. Register single families with `includeDefaultRules: false`. */\nexport const defaultRules = {\n ...lengthRules,\n ...textUnitRules,\n ...contentRules,\n ...formatRules,\n ...dateRules,\n ...comparisonRules,\n ...numberRules,\n ...fileRules,\n ...normalizeRules,\n}\n","import { defaultFieldTypes } from '../field-types/default-field-types'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport { defaultKinds } from '../kinds/default-kinds'\nimport type { KindDef } from '../kinds/kind-def'\nimport { defaultRules } from '../rules/default-rules'\nimport type { RuleDef } from '../rules/rule-def'\n\nexport interface Registry {\n readonly kinds: Readonly<Record<string, KindDef>>\n readonly fieldTypes: Readonly<Record<string, FieldTypeDef>>\n readonly rules: Readonly<Record<string, RuleDef>>\n}\n\nexport interface RegistryOptions extends Partial<Registry> {\n /** With false, only the consumer's own rules are registered. Defaults to true. */\n includeDefaultRules?: boolean\n}\n\n/** Consumer entries replace defaults with the same key. */\nexport function mergeRegistry(custom: RegistryOptions): Registry {\n const rules = custom.includeDefaultRules === false ? {} : defaultRules\n return {\n kinds: Object.freeze({ ...defaultKinds, ...custom.kinds }),\n fieldTypes: Object.freeze({ ...defaultFieldTypes, ...custom.fieldTypes }),\n rules: Object.freeze({ ...rules, ...custom.rules }),\n }\n}\n\nexport function lookup<T>(record: Readonly<Record<string, T>>, key: string): T | undefined {\n return Object.hasOwn(record, key) ? record[key] : undefined\n}\n","/** Where something is in a definition, e.g. `['fields', 0, 'rules', 1]`. */\nexport type DefinitionPath = readonly (string | number)[]\n\n/** Public API: adding a code is a minor change, renaming one is breaking, */\nexport type DefinitionIssueCode =\n | 'invalid_shape'\n | 'unsupported_version'\n | 'unknown_key'\n | 'unknown_type'\n | 'missing_name'\n | 'duplicate_name'\n | 'invalid_props'\n | 'unknown_rule'\n | 'unknown_param'\n | 'invalid_params'\n | 'kind_mismatch'\n\nexport interface DefinitionIssue {\n code: DefinitionIssueCode\n path: DefinitionPath\n message: string\n}\n\nexport type ValidateResult =\n | { success: true; issues: [] }\n | { success: false; issues: DefinitionIssue[] }\n\nexport function formatPath(path: DefinitionPath): string {\n return path.reduce<string>((out, key) => {\n if (typeof key === 'number') return `${out}[${key}]`\n return out ? `${out}.${key}` : key\n }, '')\n}\n\n/** Thrown by `build()` when the definition has issues. Lists all of them. */\nexport class DefinitionError extends Error {\n readonly issues: readonly DefinitionIssue[]\n\n constructor(issues: readonly DefinitionIssue[]) {\n const lines = issues.map(\n (issue) => ` ${formatPath(issue.path) || '(root)'}: ${issue.message}`,\n )\n super(`Invalid form definition:\\n${lines.join('\\n')}`)\n this.name = 'DefinitionError'\n this.issues = issues\n }\n}\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { ValueKind } from '../shared/value-kind'\nimport type { RuleDef } from './rule-def'\n\nconst cache = new WeakMap<RuleDef, Map<ValueKind, AnyObjectSchema>>()\n\nexport function paramsFor(def: RuleDef, kind: ValueKind): AnyObjectSchema | undefined {\n if (typeof def.params !== 'function') return def.params\n\n let byKind = cache.get(def)\n\n if (!byKind) {\n byKind = new Map()\n cache.set(def, byKind)\n }\n\n let params = byKind.get(kind)\n if (!params) {\n params = def.params(kind)\n byKind.set(kind, params)\n }\n\n return params\n}\n","/**\n * Field keys this package owns. A field type's props can't use them.\n */\nexport const RESERVED_FIELD_KEYS = [\n 'name',\n 'type',\n 'label',\n 'description',\n 'placeholder',\n 'default',\n 'required',\n 'rules',\n 'ui',\n] as const\n\n/**\n * Rule keys this package own. A rule's params can't use them.\n */\nexport const RESERVED_RULE_KEYS = ['rule', 'message'] as const\n\nconst fieldKeys: ReadonlySet<string> = new Set(RESERVED_FIELD_KEYS)\nconst ruleKeys: ReadonlySet<string> = new Set(RESERVED_RULE_KEYS)\n\nexport const isReservedFieldKey = (key: string): boolean => fieldKeys.has(key)\nexport const isReservedRuleKey = (key: string): boolean => ruleKeys.has(key)\n","import * as v from 'valibot'\nimport type { JsonField, JsonRule } from '../definition/json-form-schema'\nimport {\n type DefinitionPath,\n type DefinitionIssue,\n type DefinitionIssueCode,\n formatPath,\n} from '../errors/definition-error'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { paramsFor } from '../rules/rule-params'\nimport { lookup, type Registry } from './registry'\nimport { isReservedFieldKey, isReservedRuleKey } from '../shared/reserved-keys'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface CheckedField {\n name: string\n field: JsonField\n path: DefinitionPath\n type: FieldTypeDef\n kind: KindDef\n rules: CheckedRule[]\n}\n\nexport interface CheckedRule {\n name: string\n def: RuleDef\n params: Record<string, unknown>\n message?: string\n}\n\ninterface CheckResult {\n issues: DefinitionIssue[]\n fields: CheckedField[]\n}\n\nconst formShape = v.object({ version: v.string(), fields: v.array(v.unknown()) })\nconst fieldShape = v.looseObject({\n name: v.optional(v.string()),\n type: v.string(),\n label: v.optional(v.string()),\n description: v.optional(v.string()),\n placeholder: v.optional(v.string()),\n default: v.optional(v.unknown()),\n required: v.optional(v.union([v.boolean(), v.strictObject({ message: v.optional(v.string()) })])),\n rules: v.optional(v.array(v.unknown())),\n ui: v.optional(v.record(v.string(), v.unknown())),\n})\nconst ruleShape = v.looseObject({ rule: v.string(), message: v.optional(v.string()) })\nconst noParams = v.object({})\n\n/**\n * Checks a whole definition and collects every issue, in document order. Never throws.\n */\nexport function checkDefinition(json: unknown, registry: Registry): CheckResult {\n const issues: DefinitionIssue[] = []\n const fields: CheckedField[] = []\n\n const form = v.safeParse(formShape, json)\n if (!form.success) return { issues: toIssues('invalid_shape', [], form.issues), fields }\n\n if (form.output.version !== '1') {\n const message = `Unsupported version \"${form.output.version}\". This package reads version '1'.`\n return { issues: [{ code: 'unsupported_version', path: ['version'], message }], fields }\n }\n\n const names = new Set<string>()\n form.output.fields.forEach((raw, i) => {\n const field = checkField(raw, ['fields', i], registry, names, issues)\n if (field) fields.push(field)\n })\n\n return { issues, fields }\n}\n\nfunction checkField(\n raw: unknown,\n path: DefinitionPath,\n registry: Registry,\n names: Set<string>,\n issues: DefinitionIssue[],\n): CheckedField | undefined {\n const shape = v.safeParse(fieldShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const field = shape.output as JsonField\n const issueCount = issues.length\n const type = lookup(registry.fieldTypes, field.type)\n const hasValue = type?.kind !== 'none'\n\n if (!field.name) {\n if (type && hasValue) {\n issues.push(issue('missing_name', [...path, 'name'], 'A field needs a name'))\n }\n } else if (hasValue) {\n if (names.has(field.name)) {\n issues.push(issue('duplicate_name', [...path, 'name'], `Duplicate name \"${field.name}\"`))\n }\n names.add(field.name)\n }\n\n if (!type) {\n issues.push(issue('unknown_type', [...path, 'type'], `Unknown field type \"${field.type}\"`))\n return undefined\n }\n\n const props = checkProps(field, type, path, issues)\n\n if (!hasValue) {\n for (const key of ['required', 'rules'] as const) {\n if (field[key] !== undefined) {\n const message = `A \"${field.type}\" field has no value, so it can't have \"${key}\"`\n issues.push(issue('invalid_shape', [...path, key], message))\n }\n }\n return undefined\n }\n\n const fieldRules = (shape.output.rules ?? []).flatMap(\n (rule, j) => checkRule(rule, type?.kind, [...path, 'rules', j], registry, issues) ?? [],\n )\n if (issues.length > issueCount || !field.name) return undefined\n\n const overridden = new Set(fieldRules.map((rule) => rule.name))\n const defaultRules = (type?.defaultRules ?? [])\n .filter((rule) => !overridden.has(rule.rule))\n .flatMap((rule) => checkRule(rule, type?.kind, path, registry, []) ?? [])\n\n return {\n name: field.name,\n field: { ...field, ...props },\n path,\n type,\n kind: registry.kinds[type?.kind] as KindDef,\n rules: [...defaultRules, ...fieldRules],\n }\n}\n\nfunction checkProps(\n field: JsonField,\n type: FieldTypeDef,\n path: DefinitionPath,\n issues: DefinitionIssue[],\n): Record<string, unknown> {\n const propKeys = Object.keys(type.props?.entries ?? {})\n const input: Record<string, unknown> = {}\n\n for (const key of Object.keys(field)) {\n if (isReservedFieldKey(key)) continue\n if (propKeys.includes(key)) {\n input[key] = field[key]\n } else {\n issues.push(\n issue('unknown_key', [...path, key], `Unknown key \"${key}\" on a \"${field.type}\" field`),\n )\n }\n }\n\n if (!type.props) return {}\n const parsed = v.safeParse(type.props, input)\n if (parsed.success) return parsed.output\n issues.push(...toIssues('invalid_props', path, parsed.issues))\n return {}\n}\n\nexport function checkRule(\n raw: unknown,\n kind: ValueKind,\n path: DefinitionPath,\n registry: Registry,\n issues: DefinitionIssue[],\n): CheckedRule | undefined {\n const shape = v.safeParse(ruleShape, raw)\n if (!shape.success) {\n issues.push(...toIssues('invalid_shape', path, shape.issues))\n return undefined\n }\n\n const rule: JsonRule = shape.output\n const def = lookup(registry.rules, rule.rule)\n if (!def) {\n issues.push(issue('unknown_rule', [...path, 'rule'], `Unknown rule \"${rule.rule}\"`))\n return undefined\n }\n\n // Params can depend on the kind, so they can't be checked for a kind the rule doesn't support.\n if (!def.kinds.includes(kind)) {\n const message = `Rule \"${rule.rule}\" can't be used on ${kind} fields`\n issues.push(issue('kind_mismatch', [...path, 'rule'], message))\n return undefined\n }\n\n const issueCount = issues.length\n const params = paramsFor(def, kind)\n const paramKeys = Object.keys(params?.entries ?? {})\n const input: Record<string, unknown> = {}\n for (const key of Object.keys(rule)) {\n if (isReservedRuleKey(key)) continue\n if (paramKeys.includes(key)) {\n input[key] = rule[key]\n } else {\n issues.push(\n issue('unknown_param', [...path, key], `Rule \"${rule.rule}\" has no param \"${key}\"`),\n )\n }\n }\n\n const parsed = v.safeParse(params ?? noParams, input)\n if (!parsed.success) issues.push(...toIssues('invalid_params', path, parsed.issues))\n if (!parsed.success || issues.length > issueCount) return undefined\n\n return { name: rule.rule, def, params: parsed.output, message: rule.message }\n}\n\nexport function checkRegistry(registry: Registry): void {\n for (const [name, rule] of Object.entries(registry.rules)) {\n // Params can depend on the kind, so check them for every kind the rule supports.\n for (const kind of rule.kinds) {\n for (const key of Object.keys(paramsFor(rule, kind)?.entries ?? {})) {\n if (isReservedRuleKey(key)) {\n throw new TypeError(`Rule \"${name}\": params can't use the reserved key \"${key}\"`)\n }\n }\n }\n }\n\n for (const [name, type] of Object.entries(registry.fieldTypes)) {\n const at = `Field type \"${name}\"`\n if (!lookup(registry.kinds, type.kind)) {\n throw new TypeError(`${at}: kind \"${type.kind}\" is not registered`)\n }\n if (type.kind !== 'none' && !type.schema) {\n throw new TypeError(`${at}: schema() is required unless the kind is 'none'`)\n }\n for (const key of Object.keys(type.props?.entries ?? {})) {\n if (isReservedFieldKey(key)) {\n throw new TypeError(`${at}: props can't use the reserved key \"${key}\"`)\n }\n }\n\n const issues: DefinitionIssue[] = []\n type.defaultRules?.forEach((rule, j) => {\n checkRule(rule, type.kind, ['defaultRules', j], registry, issues)\n })\n const [first] = issues\n if (first) throw new TypeError(`${at}: ${formatPath(first.path)}: ${first.message}`)\n }\n}\n\nfunction issue(code: DefinitionIssueCode, path: DefinitionPath, message: string): DefinitionIssue {\n return { code, path, message }\n}\n\nfunction toIssues(\n code: DefinitionIssueCode,\n path: DefinitionPath,\n valibotIssues: readonly v.BaseIssue<unknown>[],\n): DefinitionIssue[] {\n return valibotIssues.map((valibotIssue) => {\n const keys = valibotIssue.path?.map((item) => item.key as string | number) ?? []\n return issue(code, [...path, ...keys], valibotIssue.message)\n })\n}\n","import * as v from 'valibot'\nimport type { KindDef } from '../kinds/kind-def'\nimport type { FieldTypeDef } from '../field-types/field-type-def'\nimport type { RuleDef } from '../rules/rule-def'\nimport { buildFieldSchema, type MessageContext, type Messages } from './build-field-schema'\nimport { mergeRegistry } from './registry'\nimport { checkDefinition, checkRegistry } from './validate-definition'\nimport { DefinitionError, type ValidateResult } from '../errors/definition-error'\nimport type { JsonForm } from '../definition/json-form-schema'\nimport type { ValueKind } from '../shared/value-kind'\n\nexport interface SchemaBuilderOptions {\n kinds?: Record<string, KindDef>\n fieldTypes?: Record<string, FieldTypeDef>\n rules?: Record<string, RuleDef>\n includeDefaultRules?: boolean\n messages?: { required?: string }\n /**\n * Called with every message from the definition and with `messages.required`, e.g. to treat\n * them as i18n keys. Return undefined to use the text as written.\n */\n resolveMessage?(key: string, ctx: MessageContext): string | undefined\n}\n\nexport function createSchemaBuilder(options: SchemaBuilderOptions = {}) {\n const registry = mergeRegistry(options)\n checkRegistry(registry)\n\n const messages: Messages = {\n required: options.messages?.required ?? 'Required',\n resolve: (text, ctx) => options.resolveMessage?.(text, ctx) ?? text,\n }\n\n /** Every issue in the definition, in document order. Never throws on bad input. */\n function validate(json: unknown): ValidateResult {\n const { issues } = checkDefinition(json, registry)\n return issues.length ? { success: false, issues } : { success: true, issues: [] }\n }\n\n function build(json: JsonForm) {\n const { issues, fields } = checkDefinition(json, registry)\n if (issues.length) throw new DefinitionError(issues)\n\n const entries: v.ObjectEntries = {}\n for (const field of fields) {\n entries[field.name] = buildFieldSchema(field, messages)\n }\n return v.object(entries)\n }\n\n /**\n * The registered rules that can be used on a field of `kind`, e.g. for a rule picker.\n */\n function rulesForKind(kind: ValueKind): [name: string, def: RuleDef][] {\n return Object.entries(registry.rules).filter(([, def]) => def.kinds.includes(kind))\n }\n\n return {\n build,\n validate,\n rulesForKind,\n kinds: registry.kinds,\n fieldTypes: registry.fieldTypes,\n rules: registry.rules,\n }\n}\n","import type { AnyObjectSchema } from '../shared/valibot-types'\nimport type { FieldTypeDef } from './field-type-def'\n\nexport const defineFieldType = <T extends AnyObjectSchema>(def: FieldTypeDef<T>): FieldTypeDef<T> =>\n def\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,15 @@
1
1
  {
2
2
  "name": "@whatsaaaa/form-builder-schema",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Build Formisch-ready Valibot schemas from JSON form definitions.",
5
+ "keywords": [
6
+ "form",
7
+ "formisch",
8
+ "json",
9
+ "schema"
10
+ ],
11
+ "homepage": "https://github.com/whatsaaaa/form-builder",
12
+ "bugs": "https://github.com/whatsaaaa/form-builder/issues",
5
13
  "license": "MIT",
6
14
  "author": "Whatsaaaa",
7
15
  "repository": {
@@ -12,14 +20,6 @@
12
20
  "files": [
13
21
  "dist"
14
22
  ],
15
- "homepage": "https://github.com/whatsaaaa/form-builder",
16
- "bugs": "https://github.com/whatsaaaa/form-builder/issues",
17
- "keywords": [
18
- "formisch",
19
- "form",
20
- "json",
21
- "schema"
22
- ],
23
23
  "type": "module",
24
24
  "sideEffects": false,
25
25
  "exports": {
@@ -33,7 +33,9 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "@arethetypeswrong/cli": "^0.18.5",
36
+ "@size-limit/preset-small-lib": "^14.3.0",
36
37
  "publint": "^0.3.25",
38
+ "size-limit": "^14.3.0",
37
39
  "tsdown": "^0.23.2",
38
40
  "typescript": "~6.0.3",
39
41
  "valibot": "^1.5.0",
@@ -46,6 +48,7 @@
46
48
  "build": "tsdown",
47
49
  "test": "vitest run",
48
50
  "type-check": "tsc --noEmit",
49
- "lint:pkg": "publint && pnpm pack --pack-destination .attw && attw .attw/*.tgz --profile esm-only"
51
+ "lint:pkg": "publint && pnpm pack --pack-destination .attw && attw .attw/*.tgz --profile esm-only",
52
+ "size": "size-limit"
50
53
  }
51
54
  }