bonsai-js 1.0.0 → 1.2.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +24 -4
  3. package/dist/artifact.d.mts +47 -0
  4. package/dist/artifact.mjs +139 -0
  5. package/dist/artifact.mjs.map +1 -0
  6. package/dist/builtins/index.d.mts +91 -0
  7. package/dist/builtins/index.mjs +93 -0
  8. package/dist/builtins/index.mjs.map +1 -0
  9. package/dist/check/bind.mjs +117 -0
  10. package/dist/check/bind.mjs.map +1 -0
  11. package/dist/check/checker.mjs +34 -120
  12. package/dist/check/checker.mjs.map +1 -1
  13. package/dist/compile/compiler.mjs +2 -3
  14. package/dist/compile/compiler.mjs.map +1 -1
  15. package/dist/declared.mjs +8 -1
  16. package/dist/declared.mjs.map +1 -1
  17. package/dist/digest.mjs +109 -0
  18. package/dist/digest.mjs.map +1 -0
  19. package/dist/environment.d.mts +14 -1
  20. package/dist/environment.mjs +65 -315
  21. package/dist/environment.mjs.map +1 -1
  22. package/dist/errors.d.mts +21 -2
  23. package/dist/errors.mjs +17 -1
  24. package/dist/errors.mjs.map +1 -1
  25. package/dist/features.mjs +3 -3
  26. package/dist/features.mjs.map +1 -1
  27. package/dist/functions/builtins.mjs +551 -474
  28. package/dist/functions/builtins.mjs.map +1 -1
  29. package/dist/functions/define.mjs +53 -11
  30. package/dist/functions/define.mjs.map +1 -1
  31. package/dist/functions/descriptions.mjs +110 -0
  32. package/dist/functions/descriptions.mjs.map +1 -0
  33. package/dist/index.d.mts +4 -3
  34. package/dist/index.mjs +3 -2
  35. package/dist/lite/index.d.mts +4 -3
  36. package/dist/lite/index.mjs +3 -2
  37. package/dist/lite/index.mjs.map +1 -1
  38. package/dist/load.mjs +307 -0
  39. package/dist/load.mjs.map +1 -0
  40. package/dist/program.mjs +321 -0
  41. package/dist/program.mjs.map +1 -0
  42. package/dist/query/index.mjs +1 -1
  43. package/dist/runtime/core.d.mts +18 -0
  44. package/dist/runtime/core.mjs +31 -0
  45. package/dist/runtime/core.mjs.map +1 -0
  46. package/dist/runtime/create.d.mts +61 -0
  47. package/dist/runtime/create.mjs +76 -0
  48. package/dist/runtime/create.mjs.map +1 -0
  49. package/dist/runtime/index.d.mts +24 -0
  50. package/dist/runtime/index.mjs +34 -0
  51. package/dist/runtime/index.mjs.map +1 -0
  52. package/dist/service/index.mjs +12 -8
  53. package/dist/service/index.mjs.map +1 -1
  54. package/dist/syntax/parser.mjs +1 -1
  55. package/dist/syntax/printer.mjs +1 -1
  56. package/dist/types.mjs +103 -23
  57. package/dist/types.mjs.map +1 -1
  58. package/dist/version.mjs +7 -0
  59. package/dist/version.mjs.map +1 -0
  60. package/package.json +26 -2
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { Duration } from './runtime/values.js'\n\n/**\n * The static type vocabulary. Types are plain JSON-serializable objects so a\n * schema can be stored, sent to an editor, or generated from another schema\n * language.\n */\nexport type Type =\n | AnyType\n | NeverType\n | NullType\n | BooleanType\n | NumberType\n | StringType\n | TimestampType\n | DurationType\n | LiteralType\n | ListType\n | MapType\n | UnionType\n | OpaqueType\n | FunctionType\n | TypeVar\n\nexport interface AnyType {\n readonly kind: 'any'\n}\nexport interface NeverType {\n readonly kind: 'never'\n}\nexport interface NullType {\n readonly kind: 'null'\n}\nexport interface BooleanType {\n readonly kind: 'boolean'\n}\nexport interface NumberType {\n readonly kind: 'number'\n}\nexport interface StringType {\n readonly kind: 'string'\n}\nexport interface TimestampType {\n readonly kind: 'timestamp'\n}\nexport interface DurationType {\n readonly kind: 'duration'\n}\nexport interface LiteralType<V extends string | number | boolean = string | number | boolean> {\n readonly kind: 'literal'\n readonly value: V\n}\nexport interface ListType<E extends Type = Type> {\n readonly kind: 'list'\n readonly element: E\n}\n/**\n * A string-keyed record. `fields` are the known keys; `rest` types any other\n * key (an open record). Without `rest`, reading an unknown key is a check error.\n */\nexport interface MapType<\n F extends Readonly<Record<string, Type>> = Readonly<Record<string, Type>>,\n R extends Type | undefined = Type | undefined,\n> {\n readonly kind: 'map'\n readonly fields: F\n readonly rest?: R\n}\nexport interface UnionType<M extends readonly Type[] = readonly Type[]> {\n readonly kind: 'union'\n readonly types: M\n}\n/**\n * A value the host declares as not navigable. The checker rejects property\n * access on it; at run time objects are read through their own properties.\n */\nexport interface OpaqueType<N extends string = string> {\n readonly kind: 'opaque'\n readonly name: N\n}\n/** Only lambdas have function types; they cannot be stored in values. */\nexport interface FunctionType {\n readonly kind: 'function'\n readonly params: readonly Type[]\n readonly result: Type\n}\n/** A type variable in a built-in signature, e.g. `T` in `first(list<T>): T?`. */\nexport interface TypeVar {\n readonly kind: 'var'\n readonly name: string\n}\n\nconst ANY: AnyType = Object.freeze({ kind: 'any' })\nconst NEVER: NeverType = Object.freeze({ kind: 'never' })\nconst NULL: NullType = Object.freeze({ kind: 'null' })\nconst BOOLEAN: BooleanType = Object.freeze({ kind: 'boolean' })\nconst NUMBER: NumberType = Object.freeze({ kind: 'number' })\nconst STRING: StringType = Object.freeze({ kind: 'string' })\nconst TIMESTAMP: TimestampType = Object.freeze({ kind: 'timestamp' })\nconst DURATION: DurationType = Object.freeze({ kind: 'duration' })\n\n/**\n * Union members with nested unions flattened (and repeats of one object\n * dropped), so `t.optional(t.enum('a', 'b'))` lists \"a\", \"b\", and null.\n */\nfunction flattenMembers(types: readonly Type[]): Type[] {\n const out = new Set<Type>()\n const visit = (type: Type): void => {\n if (type.kind === 'union') type.types.forEach(visit)\n else out.add(type)\n }\n types.forEach(visit)\n return [...out]\n}\n\n/** The members of a type as a flat list: its union members, or the type itself. */\nexport function unionMembers(type: Type): readonly Type[] {\n if (type.kind !== 'union') return [type]\n return type.types.some((member) => member.kind === 'union')\n ? flattenMembers(type.types)\n : type.types\n}\n\n/** Type builders. */\n/** A literal type's value: a string, a boolean, or a finite number (NaN and infinities are never values). */\nfunction literalValue<V extends string | number | boolean>(value: V): V {\n if (typeof value === 'number' && !Number.isFinite(value))\n throw new TypeError(`A literal type must be a finite number, not ${String(value)}`)\n return value\n}\n\nexport const t = Object.freeze({\n any: (): AnyType => ANY,\n never: (): NeverType => NEVER,\n null: (): NullType => NULL,\n boolean: (): BooleanType => BOOLEAN,\n number: (): NumberType => NUMBER,\n string: (): StringType => STRING,\n timestamp: (): TimestampType => TIMESTAMP,\n duration: (): DurationType => DURATION,\n literal: <const V extends string | number | boolean>(value: V): LiteralType<V> =>\n Object.freeze({ kind: 'literal', value: literalValue(value) }),\n /** A union of literals: `t.enum('free', 'pro')`. */\n enum: <const V extends readonly (string | number | boolean)[]>(\n ...values: V\n ): UnionType<{ [K in keyof V]: LiteralType<V[K]> }> =>\n Object.freeze({\n kind: 'union',\n types: Object.freeze(\n values.map((value) => Object.freeze({ kind: 'literal', value: literalValue(value) })),\n ),\n }) as unknown as UnionType<{ [K in keyof V]: LiteralType<V[K]> }>,\n list: <E extends Type>(element: E): ListType<E> => Object.freeze({ kind: 'list', element }),\n /** A closed record with known fields. */\n object: <const F extends Readonly<Record<string, Type>>>(fields: F): MapType<F, undefined> =>\n Object.freeze({ kind: 'map', fields: Object.freeze({ ...fields }) }),\n /** An open record: every key has type `value`. */\n // oxlint-disable-next-line typescript/no-generated-empty-object-type -- no declared fields\n record: <V extends Type>(value: V): MapType<Record<never, never>, V> =>\n Object.freeze({ kind: 'map', fields: Object.freeze({}), rest: value }),\n union: <const M extends readonly Type[]>(...types: M): UnionType<M> =>\n Object.freeze({\n kind: 'union',\n types: Object.freeze(flattenMembers(types)),\n }) as unknown as UnionType<M>,\n /** `T | null`. Absent keys read as null, so this also marks a field optional. */\n optional: <T extends Type>(type: T): UnionType<readonly [T, NullType]> =>\n Object.freeze({\n kind: 'union',\n types: Object.freeze(flattenMembers([type, NULL])),\n }) as unknown as UnionType<readonly [T, NullType]>,\n opaque: <const N extends string>(name: N): OpaqueType<N> =>\n Object.freeze({ kind: 'opaque', name }),\n})\n\n// === TypeScript inference from schemas ===\n\ntype Simplify<T> = { [K in keyof T]: T[K] }\n\ntype NullableKeys<F> = {\n [K in keyof F]: null extends Infer<F[K]> ? K : never\n}[keyof F]\n\ninterface PrimitiveTypes {\n any: unknown\n never: never\n null: null\n boolean: boolean\n number: number\n string: string\n timestamp: Date\n duration: Duration\n opaque: unknown\n function: unknown\n var: unknown\n}\n\ntype InferMap<F, R> = Simplify<\n { readonly [K in Exclude<keyof F, NullableKeys<F>>]: Infer<F[K]> } & {\n readonly [K in NullableKeys<F>]?: Infer<F[K]> | undefined\n } & (R extends Type ? { readonly [key: string]: Infer<R> } : unknown)\n>\n\n/** The TypeScript type of values described by a Bonsai type. */\nexport type Infer<T> = [Type] extends [T]\n ? unknown\n : T extends { readonly kind: 'literal'; readonly value: infer V }\n ? V\n : T extends { readonly kind: 'list'; readonly element: infer E }\n ? readonly Infer<E>[]\n : T extends { readonly kind: 'map'; readonly fields: infer F; readonly rest?: infer R }\n ? InferMap<F, R>\n : T extends { readonly kind: 'union'; readonly types: infer M extends readonly unknown[] }\n ? Infer<M[number]>\n : T extends { readonly kind: infer K extends keyof PrimitiveTypes }\n ? PrimitiveTypes[K]\n : unknown\n\n/** The context type of a variable declaration record. */\nexport type InferVariables<V> = Simplify<\n { readonly [K in Exclude<keyof V, NullableKeys<V>>]: Infer<V[K]> } & {\n readonly [K in NullableKeys<V>]?: Infer<V[K]> | undefined\n }\n>\n\n// === Type operations ===\n\n/**\n * The checker's work budget. Type operations charge it so a small source that\n * builds huge types (unions of thousands of literals, maps nested by `let`)\n * fails with a limit error instead of running long. Installed per analysis.\n */\nlet meter: { remaining: number } | undefined\n\n/**\n * Large unions built during one analysis, by structural hash: the same union\n * rebuilt (a join repeated in every clause of a rule) becomes the same object,\n * so its index and comparisons are computed once.\n */\nlet interned: Map<number, UnionType[]> | undefined\n/** Unions at least this large are interned. */\nconst INTERN_MIN_MEMBERS = 32\n\nlet lastWork = 0\n\n/** Type work the last completed budget used: a machine-independent measure of checking cost. */\nexport function lastTypeWork(): number {\n return lastWork\n}\n\n/** Raised when the installed type-work budget runs out. */\nexport class TypeBudgetExceeded extends Error {}\n\n/** Runs `run` with a type-work budget; nested calls share the outer budget. */\nexport function withTypeBudget<T>(budget: number, run: () => T): T {\n if (meter !== undefined) return run()\n meter = { remaining: budget }\n interned = new Map()\n try {\n return run()\n } finally {\n lastWork = budget - meter.remaining\n meter = undefined\n interned = undefined\n }\n}\n\n/** Charges `units` of type work against the installed budget. */\nexport function chargeTypeWork(units: number): void {\n if (meter !== undefined && (meter.remaining -= units) < 0) throw new TypeBudgetExceeded()\n}\n\n// Literals written in the source are fresh: a union of thousands of them (a\n// long conditional ladder) may widen to their kind. Declared literal unions\n// (enums) never do.\nconst FRESH = new WeakSet<Type>()\n\n/** A literal type for a literal written in the source. */\nexport function freshLiteral(value: string | number | boolean): LiteralType {\n const type: LiteralType = Object.freeze({ kind: 'literal', value })\n FRESH.add(type)\n return type\n}\n\nconst widenFreshMemo = new WeakMap<Type, Type>()\n\n/**\n * Widens the source literals in a type, deeply: a call's result mentions the\n * literals it was given only as their kinds (`max(1, 2)` is a number), while\n * declared literal types (enums) pass through.\n */\nexport function widenFresh(type: Type): Type {\n if (type.kind === 'literal') return FRESH.has(type) ? widen(type) : type\n if (type.kind !== 'union' && type.kind !== 'list' && type.kind !== 'map') return type\n let result = widenFreshMemo.get(type)\n if (result === undefined) {\n chargeTypeWork(1)\n if (type.kind === 'union') {\n const members = type.types.map(widenFresh)\n result = members.every((m, i) => m === type.types[i]) ? type : unionOf(members)\n } else if (type.kind === 'list') {\n const element = widenFresh(type.element)\n result = element === type.element ? type : { kind: 'list', element }\n } else {\n const fields: Record<string, Type> = {}\n let changed = false\n for (const [key, field] of Object.entries(type.fields)) {\n fields[key] = widenFresh(field)\n changed ||= fields[key] !== field\n }\n const rest = type.rest === undefined ? undefined : widenFresh(type.rest)\n changed ||= rest !== type.rest\n if (!changed) result = type\n else if (rest === undefined) result = withFields(type, fields)\n else result = { kind: 'map', fields, rest }\n }\n widenFreshMemo.set(type, result)\n }\n return result\n}\n\n// Map literals are exact: they hold only the keys they list. Declared object\n// types are not: a record from a database carries columns the schema omits.\nconst EXACT = new WeakSet<Type>()\n\n/** A closed map type known to hold no keys beyond `fields` (a map literal). */\nexport function exactObject(fields: Readonly<Record<string, Type>>): MapType {\n const type: MapType = Object.freeze({ kind: 'map', fields: Object.freeze({ ...fields }) })\n EXACT.add(type)\n return type\n}\n\n/** Whether a map type is known to hold no keys beyond its fields. */\nexport function isExact(type: Type): boolean {\n return EXACT.has(type)\n}\n\n/** A copy of a map type with new fields, keeping its exactness. */\nexport function withFields(type: MapType, fields: Readonly<Record<string, Type>>): MapType {\n if (isExact(type) && type.rest === undefined) return exactObject(fields)\n return type.rest === undefined\n ? { kind: 'map', fields }\n : { kind: 'map', fields, rest: type.rest }\n}\n\nexport function isNullable(type: Type): boolean {\n switch (type.kind) {\n case 'any':\n case 'null':\n return true\n case 'union':\n return type.types.some(isNullable)\n case 'boolean':\n case 'duration':\n case 'function':\n case 'list':\n case 'literal':\n case 'map':\n case 'never':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n case 'var':\n default:\n return false\n }\n}\n\n/** The declared type of `key` in a map type (own fields only, never prototype names). */\nexport function fieldOf(type: MapType, key: string): Type | undefined {\n return Object.hasOwn(type.fields, key) ? type.fields[key] : undefined\n}\n\nconst nonNullMemo = new WeakMap<Type, Type>()\n\n/** Removes `null` from a type. */\nexport function nonNull(type: Type): Type {\n if (type.kind === 'null') return NEVER\n if (type.kind !== 'union') return type\n let result = nonNullMemo.get(type)\n if (result === undefined) {\n // Keeps every literal: narrowing an optional enum must not lose its values.\n result = type.types.some((member) => member.kind === 'null' || member.kind === 'union')\n ? unionOf(type.types.map(nonNull), false)\n : type\n nonNullMemo.set(type, result)\n }\n return result\n}\n\nconst widenMemo = new WeakMap<Type, Type>()\n\n/** The base kind a literal widens to. */\nexport function widen(type: Type): Type {\n if (type.kind === 'literal') {\n if (typeof type.value === 'string') return STRING\n return typeof type.value === 'number' ? NUMBER : BOOLEAN\n }\n if (type.kind !== 'union') return type\n let result = widenMemo.get(type)\n if (result === undefined) {\n result = type.types.some((member) => member.kind === 'literal' || member.kind === 'union')\n ? unionOf(type.types.map(widen))\n : type\n widenMemo.set(type, result)\n }\n return result\n}\n\n// === structural identity ===\n\nconst hashMemo = new WeakMap<Type, number>()\n\n/** FNV-1a parameters. */\nconst FNV_PRIME = 0x01_00_01_93\nconst FNV_OFFSET = 0x81_1c_9d_c5\n/** Separates a map's `rest` from its fields in a hash. */\nconst REST_MARK = 0x2a\n\nfunction mix(h: number, value: number): number {\n return Math.imul(h ^ value, FNV_PRIME) >>> 0\n}\n\nfunction hashText(text: string): number {\n let h = FNV_OFFSET\n for (let i = 0; i < text.length; i++) h = mix(h, text.charCodeAt(i))\n return h\n}\n\n/** A structural hash: equal types hash equally. Shared sub-types are hashed once. */\nfunction typeHash(type: Type): number {\n const cached = hashMemo.get(type)\n if (cached !== undefined) return cached\n chargeTypeWork(type.kind === 'union' ? 1 + (type.types.length >>> 2) : 1)\n let h: number\n switch (type.kind) {\n case 'literal':\n h = hashText(`lit:${typeof type.value}:${String(type.value)}`)\n break\n case 'list':\n h = mix(hashText('list'), typeHash(type.element))\n break\n case 'map': {\n h = hashText(isExact(type) ? 'map!' : 'map')\n for (const key of Object.keys(type.fields).sort())\n h = mix(mix(h, hashText(key)), typeHash(type.fields[key]))\n if (type.rest !== undefined) h = mix(mix(h, REST_MARK), typeHash(type.rest))\n break\n }\n case 'union': {\n // Order-independent: members are compared as a set.\n const members = type.types.map(typeHash).sort((a, b) => a - b)\n h = hashText('union')\n for (const member of members) h = mix(h, member)\n break\n }\n case 'opaque':\n h = hashText(`opaque:${type.name}`)\n break\n case 'function':\n h = mix(\n type.params.reduce((acc, param) => mix(acc, typeHash(param)), hashText('fn')),\n typeHash(type.result),\n )\n break\n case 'var':\n h = hashText(`var:${type.name}`)\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n h = hashText(type.kind)\n }\n hashMemo.set(type, h)\n return h\n}\n\nconst sameMemo = new WeakMap<Type, WeakSet<Type>>()\n\n/** Structural equality, linear in the size of the (shared) type graphs. */\nexport function sameType(a: Type, b: Type): boolean {\n if (a === b) return true\n if (a.kind !== b.kind || typeHash(a) !== typeHash(b)) return false\n if (sameMemo.get(a)?.has(b) === true) return true\n chargeTypeWork(1)\n let same: boolean\n switch (a.kind) {\n case 'literal':\n same = a.value === (b as LiteralType).value\n break\n case 'list':\n same = sameType(a.element, (b as ListType).element)\n break\n case 'map': {\n const other = b as MapType\n const keys = Object.keys(a.fields)\n same =\n isExact(a) === isExact(other) &&\n keys.length === Object.keys(other.fields).length &&\n keys.every((key) => {\n const field = fieldOf(other, key)\n return field !== undefined && sameType(a.fields[key], field)\n }) &&\n (a.rest === undefined\n ? other.rest === undefined\n : other.rest !== undefined && sameType(a.rest, other.rest))\n break\n }\n case 'union': {\n const other = b as UnionType\n if (a.types.length !== other.types.length) {\n same = false\n break\n }\n // Members are distinct, so equal sizes and every member found means equal sets.\n // Hashed lookups are cheap next to other checking work: charged per 8 members.\n chargeTypeWork(1 + ((a.types.length + other.types.length) >>> 3))\n const buckets = new Map<number, Type[]>()\n for (const candidate of other.types) {\n const h = typeHash(candidate)\n const bucket = buckets.get(h)\n if (bucket === undefined) buckets.set(h, [candidate])\n else bucket.push(candidate)\n }\n same = a.types.every(\n (member) =>\n buckets.get(typeHash(member))?.some((candidate) => sameType(member, candidate)) === true,\n )\n break\n }\n case 'opaque':\n same = a.name === (b as OpaqueType).name\n break\n case 'function': {\n const other = b as FunctionType\n same =\n a.params.length === other.params.length &&\n a.params.every((param, i) => sameType(param, other.params[i])) &&\n sameType(a.result, other.result)\n break\n }\n case 'var':\n same = a.name === (b as TypeVar).name\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n same = true\n }\n if (same) {\n let set = sameMemo.get(a)\n if (set === undefined) sameMemo.set(a, (set = new WeakSet()))\n set.add(b)\n }\n return same\n}\n\n/**\n * Unions with more source literals of one kind than this (a thousand-branch\n * `c ? \"a\" : c2 ? \"b\" : ...` ladder) widen them to the kind: always sound, and\n * it keeps building such unions linear. Declared enums are never widened.\n */\nconst MAX_UNION_LITERALS = 256\n\n/**\n * Flattens, de-duplicates, and simplifies a union, in time linear in its\n * members. `collapse` widens very wide literal unions (see MAX_UNION_LITERALS).\n */\nexport function unionOf(types: readonly Type[], collapse = true): Type {\n // One type is already its own union (unions are built flat).\n if (types.length === 1 && types[0].kind !== 'never') return types[0]\n if (collapse && types.length === 2) return unionOfTwo(types[0], types[1])\n return unionOfAll(types, collapse)\n}\n\nconst pairMemo = new WeakMap<Type, WeakMap<Type, Type>>()\n\n/**\n * The common join of two types, fast when one already holds the other (`c ? tz\n * : \"Z1\"` over a timezone enum is the enum) and remembered per pair, so a rule\n * that repeats a join of two large enums builds it once.\n */\nfunction unionOfTwo(a: Type, b: Type): Type {\n if (a === b && a.kind !== 'union') return a\n if (a.kind === 'union' && contains(a, b)) return a\n if (b.kind === 'union' && contains(b, a)) return b\n if (a.kind === 'union' && b.kind === 'union') {\n if (holdsAll(a, b)) return a\n if (holdsAll(b, a)) return b\n }\n let memo = pairMemo.get(a)\n const cached = memo?.get(b)\n if (cached !== undefined) {\n chargeTypeWork(1)\n return cached\n }\n const result = unionOfAll([a, b], true)\n if (memo === undefined) pairMemo.set(a, (memo = new WeakMap()))\n memo.set(b, result)\n return result\n}\n\n/** Whether `outer` certainly holds every member of `inner` (`Zone | null` holds `Zone`). */\nfunction holdsAll(outer: UnionType, inner: UnionType): boolean {\n if (inner.types.length > outer.types.length) return false\n chargeTypeWork(1 + (inner.types.length >>> 1))\n return inner.types.every((member) => contains(outer, member))\n}\n\n/** Whether a union certainly holds a literal or base kind already. */\nfunction contains(union: UnionType, type: Type): boolean {\n if (type.kind !== 'literal' && !PRIMITIVE_KINDS.has(type.kind)) return false\n const index = unionIndex(union)\n if (index.open) return false\n if (type.kind === 'literal')\n return index.literals.has(keyOf(type)) || index.kinds.has(widen(type).kind)\n return type.kind !== 'never' && index.kinds.has(type.kind)\n}\n\nfunction unionOfAll(types: readonly Type[], collapse: boolean): Type {\n const flat: Type[] = []\n const visit = (type: Type): void => {\n if (type.kind === 'union') type.types.forEach(visit)\n else if (type.kind !== 'never') flat.push(type)\n }\n types.forEach(visit)\n chargeTypeWork(flat.length)\n if (flat.some((type) => type.kind === 'any')) return ANY\n // A literal next to its own base kind is redundant.\n const baseKinds = new Set<string>()\n for (const type of flat) if (type.kind !== 'literal') baseKinds.add(type.kind)\n if (collapse && flat.length > MAX_UNION_LITERALS) {\n const counts = new Map<string, number>()\n for (const type of flat) {\n if (type.kind !== 'literal' || !FRESH.has(type)) continue\n const kind = widen(type).kind\n const count = (counts.get(kind) ?? 0) + 1\n counts.set(kind, count)\n if (count > MAX_UNION_LITERALS) baseKinds.add(kind)\n }\n const bases: Readonly<Record<string, Type>> = {\n string: STRING,\n number: NUMBER,\n boolean: BOOLEAN,\n }\n for (const kind of counts.keys()) {\n const base = bases[kind]\n if (base !== undefined && baseKinds.has(kind) && !flat.some((type) => type.kind === kind))\n flat.push(base)\n }\n }\n const out: Type[] = []\n const seen = new Map<number, Type[]>()\n for (const type of flat) {\n if (type.kind === 'literal' && baseKinds.has(widen(type).kind)) continue\n const h = typeHash(type)\n const bucket = seen.get(h)\n if (bucket?.some((existing) => sameType(existing, type)) === true) continue\n if (bucket === undefined) seen.set(h, [type])\n else bucket.push(type)\n out.push(type)\n }\n if (out.length === 0) return NEVER\n if (out.length === 1) return out[0]\n // Not frozen: freezing a large member array costs more than building it, and\n // checker types are only read (a program's result type is frozen when exposed).\n const union: UnionType = { kind: 'union', types: out }\n if (interned === undefined || out.length < INTERN_MIN_MEMBERS) return union\n const h = typeHash(union)\n const bucket = interned.get(h)\n const existing = bucket?.find((candidate) => sameType(candidate, union))\n if (existing !== undefined) return existing\n if (bucket === undefined) interned.set(h, [union])\n else bucket.push(union)\n return union\n}\n\nconst assignableMemo = [\n new WeakMap<Type, WeakMap<Type, boolean>>(),\n new WeakMap<Type, WeakMap<Type, boolean>>(),\n]\n\n/**\n * Whether every value of `source` is a valid `target` (gradual: `any` both ways).\n * Declared object types are open: a value may carry keys its type does not list.\n */\nexport function isAssignable(source: Type, target: Type): boolean {\n return assignableIn(source, target, false)\n}\n\n/**\n * Like isAssignable, but only what the types prove: an open object that does\n * not list an optional key of the target may hold that key with any value, so\n * it is accepted gradually (checked at run time) but not proven.\n */\nexport function isProvenAssignable(source: Type, target: Type): boolean {\n return assignableIn(source, target, true)\n}\n\nfunction assignableIn(source: Type, target: Type, proven: boolean): boolean {\n if (source === target) return true\n if (source.kind === 'any' || target.kind === 'any' || source.kind === 'never') return true\n if (target.kind === 'var' || source.kind === 'var') return true\n // Charged even when memoized: a loop over union members pays for every step.\n chargeTypeWork(1)\n const memos = assignableMemo[proven ? 1 : 0]\n let memo = memos.get(source)\n const cached = memo?.get(target)\n if (cached !== undefined) return cached\n const result = assignable(source, target, proven)\n if (memo === undefined) memos.set(source, (memo = new WeakMap()))\n memo.set(target, result)\n return result\n}\n\n/** A type's members indexed for membership and overlap tests. */\ninterface UnionIndex {\n /** Literal members, by literalKey. */\n readonly literals: ReadonlySet<string>\n /** Base kinds of the literal members. */\n readonly literalKinds: ReadonlySet<string>\n /** Kinds of the other members (base kinds such as string, and list, map, ...). */\n readonly kinds: ReadonlySet<string>\n /** Members that are neither literals nor base kinds (lists, maps, opaques, functions). */\n readonly others: readonly Type[]\n /** A member admits every value (`any` or a type variable). */\n readonly open: boolean\n}\n\nconst PRIMITIVE_KINDS: ReadonlySet<string> = new Set([\n 'null',\n 'boolean',\n 'number',\n 'string',\n 'timestamp',\n 'duration',\n 'never',\n])\n\nconst unionIndexMemo = new WeakMap<Type, UnionIndex>()\n\nfunction literalKey(value: string | number | boolean): string {\n return `${typeof value}:${String(value)}`\n}\n\nconst literalKeyMemo = new WeakMap<Type, string>()\n\n/** literalKey for a literal type, remembered per type (enum members recur in many unions). */\nfunction keyOf(literal: LiteralType): string {\n let key = literalKeyMemo.get(literal)\n if (key === undefined) literalKeyMemo.set(literal, (key = literalKey(literal.value)))\n return key\n}\n\nfunction unionIndex(type: Type): UnionIndex {\n let index = unionIndexMemo.get(type)\n if (index === undefined) {\n const members = unionMembers(type)\n // Twice the member count: building the sets costs more than most type work.\n chargeTypeWork(2 * members.length)\n const literals = new Set<string>()\n const literalKinds = new Set<string>()\n const kinds = new Set<string>()\n const others: Type[] = []\n let open = false\n for (const member of members) {\n if (member.kind === 'literal') {\n literals.add(keyOf(member))\n literalKinds.add(typeof member.value)\n } else if (member.kind === 'any' || member.kind === 'var') open = true\n else {\n kinds.add(member.kind)\n if (!PRIMITIVE_KINDS.has(member.kind)) others.push(member)\n }\n }\n index = { literals, literalKinds, kinds, others, open }\n unionIndexMemo.set(type, index)\n }\n return index\n}\n\nfunction assignable(source: Type, target: Type, proven: boolean): boolean {\n if (source.kind === 'union') {\n chargeTypeWork(source.types.length)\n return source.types.every((member) => assignableIn(member, target, proven))\n }\n if (target.kind === 'union') {\n const index = unionIndex(target)\n if (index.open) return true\n if (source.kind === 'literal')\n return index.literals.has(keyOf(source)) || index.kinds.has(widen(source).kind)\n if (PRIMITIVE_KINDS.has(source.kind)) return index.kinds.has(source.kind)\n chargeTypeWork(index.others.length)\n return index.others.some((member) => assignableIn(source, member, proven))\n }\n switch (target.kind) {\n case 'literal':\n return source.kind === 'literal' && source.value === target.value\n case 'list':\n return source.kind === 'list' && assignableIn(source.element, target.element, proven)\n case 'map': {\n if (source.kind !== 'map') return false\n const targetKeys = Object.keys(target.fields)\n chargeTypeWork(targetKeys.length)\n // A map literal type holds only its keys: so must anything assigned to it.\n if (isExact(target) && target.rest === undefined) {\n if (!isExact(source) || source.rest !== undefined) return false\n for (const key of Object.keys(source.fields))\n if (!Object.hasOwn(target.fields, key)) return false\n }\n for (const key of targetKeys) {\n const fieldType = target.fields[key]\n const sourceField = fieldOf(source, key)\n if (sourceField !== undefined) {\n if (!assignableIn(sourceField, fieldType, proven)) return false\n } else if (!isNullable(fieldType)) {\n // An absent key reads as null.\n return false\n } else if (source.rest !== undefined) {\n if (!assignableIn(source.rest, fieldType, proven)) return false\n } else if (proven && !isExact(source)) {\n // A declared object may hold this key with a value of any type.\n return false\n }\n }\n if (target.rest !== undefined) {\n const rest = target.rest\n const sourceFields = Object.values(source.fields)\n chargeTypeWork(sourceFields.length)\n for (const fieldType of sourceFields) {\n if (!assignableIn(fieldType, rest, proven)) return false\n }\n if (source.rest !== undefined) return assignableIn(source.rest, rest, proven)\n // A declared object may hold keys it does not list, of any type.\n return isExact(source) || rest.kind === 'any'\n }\n return true\n }\n case 'opaque':\n return source.kind === 'opaque' && source.name === target.name\n case 'function':\n return source.kind === 'function'\n case 'any':\n case 'var':\n return true\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n return (\n source.kind === target.kind ||\n (source.kind === 'literal' && widen(source).kind === target.kind)\n )\n }\n}\n\n/** Whether two types can hold a common value (used for always-false comparisons). */\nconst overlapMemo = new WeakMap<Type, WeakMap<Type, boolean>>()\n\nexport function overlaps(a: Type, b: Type): boolean {\n chargeTypeWork(1)\n let memo = overlapMemo.get(a)\n const cached = memo?.get(b)\n if (cached !== undefined) return cached\n const result = computeOverlaps(unionIndex(a), unionIndex(b))\n if (memo === undefined) overlapMemo.set(a, (memo = new WeakMap()))\n memo.set(b, result)\n return result\n}\n\nfunction computeOverlaps(left: UnionIndex, right: UnionIndex): boolean {\n if (left.open || right.open) return true\n // Literals overlap equal literals or their base kind; other kinds overlap by kind.\n const [small, large] = left.literals.size <= right.literals.size ? [left, right] : [right, left]\n for (const kind of small.kinds) {\n if (large.kinds.has(kind) || large.literalKinds.has(kind)) return true\n }\n let visited = 0\n try {\n for (const literal of small.literals) {\n visited++\n if (large.literals.has(literal) || large.kinds.has(literalBase(literal))) return true\n }\n return false\n } finally {\n chargeTypeWork(visited)\n }\n}\n\n/** The base kind of a literal key from literalKey. */\nfunction literalBase(key: string): string {\n return key.slice(0, key.indexOf(':'))\n}\n\n/** Longest type text shown in messages and hovers; longer text ends in an ellipsis. */\nconst MAX_TYPE_TEXT = 1000\n\n/** Human-readable type text, e.g. `{ name: string, tags: string[] } | null`. */\nconst formatMemo = new WeakMap<Type, string>()\n\nexport function formatType(type: Type, maxLength = MAX_TYPE_TEXT): string {\n // Messages repeat a type's text (every unknown field of one large object).\n if (maxLength === MAX_TYPE_TEXT) {\n let text = formatMemo.get(type)\n if (text === undefined) formatMemo.set(type, (text = formatTypeText(type, maxLength)))\n return text\n }\n return formatTypeText(type, maxLength)\n}\n\nconst HIGH_SURROGATE_FIRST = 0xd800\nconst HIGH_SURROGATE_LAST = 0xdbff\n\nfunction formatTypeText(type: Type, maxLength: number): string {\n let out = ''\n let full = false\n const emit = (text: string): boolean => {\n if (full) return false\n if (out.length + text.length > maxLength) {\n let keep = Math.max(0, maxLength - out.length)\n // Never end between the halves of a surrogate pair.\n const last = text.charCodeAt(keep - 1)\n if (keep > 0 && last >= HIGH_SURROGATE_FIRST && last <= HIGH_SURROGATE_LAST) keep--\n out += `${text.slice(0, keep)}…`\n full = true\n return false\n }\n out += text\n return true\n }\n const write = (node: Type): void => {\n if (full) return\n switch (node.kind) {\n case 'literal':\n emit(JSON.stringify(node.value))\n return\n case 'list': {\n const wrap = node.element.kind === 'union' || node.element.kind === 'function'\n if (wrap) emit('(')\n write(node.element)\n emit(wrap ? ')[]' : '[]')\n return\n }\n case 'map': {\n const keys = Object.keys(node.fields)\n if (keys.length === 0 && node.rest === undefined) {\n emit('{}')\n return\n }\n emit('{ ')\n keys.forEach((k, i) => {\n if (full) return\n if (i > 0) emit(', ')\n emit(`${/^[A-Za-z_$][\\w$]*$/u.test(k) ? k : JSON.stringify(k)}: `)\n write(node.fields[k])\n })\n if (node.rest !== undefined) {\n if (keys.length > 0) emit(', ')\n emit('[key: string]: ')\n write(node.rest)\n }\n emit(' }')\n return\n }\n case 'union':\n node.types.forEach((member, i) => {\n if (full) return\n if (i > 0) emit(' | ')\n write(member)\n })\n return\n case 'opaque':\n emit(node.name)\n return\n case 'function':\n emit('(')\n node.params.forEach((param, i) => {\n if (full) return\n if (i > 0) emit(', ')\n write(param)\n })\n emit(') => ')\n write(node.result)\n return\n case 'var':\n emit(node.name)\n return\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n emit(node.kind)\n }\n }\n write(type)\n return out\n}\n"],"mappings":";AA4FA,MAAM,MAAe,OAAO,OAAO,EAAE,MAAM,MAAM,CAAC;AAClD,MAAM,QAAmB,OAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AACxD,MAAM,OAAiB,OAAO,OAAO,EAAE,MAAM,OAAO,CAAC;AACrD,MAAM,UAAuB,OAAO,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9D,MAAM,SAAqB,OAAO,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3D,MAAM,SAAqB,OAAO,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3D,MAAM,YAA2B,OAAO,OAAO,EAAE,MAAM,YAAY,CAAC;AACpE,MAAM,WAAyB,OAAO,OAAO,EAAE,MAAM,WAAW,CAAC;;;;;AAMjE,SAAS,eAAe,OAAgC;CACtD,MAAM,sBAAM,IAAI,IAAU;CAC1B,MAAM,SAAS,SAAqB;EAClC,IAAI,KAAK,SAAS,SAAS,KAAK,MAAM,QAAQ,KAAK;OAC9C,IAAI,IAAI,IAAI;CACnB;CACA,MAAM,QAAQ,KAAK;CACnB,OAAO,CAAC,GAAG,GAAG;AAChB;;AAGA,SAAgB,aAAa,MAA6B;CACxD,IAAI,KAAK,SAAS,SAAS,OAAO,CAAC,IAAI;CACvC,OAAO,KAAK,MAAM,MAAM,WAAW,OAAO,SAAS,OAAO,IACtD,eAAe,KAAK,KAAK,IACzB,KAAK;AACX;;;AAIA,SAAS,aAAkD,OAAa;CACtE,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,IAAI,UAAU,+CAA+C,OAAO,KAAK,GAAG;CACpF,OAAO;AACT;AAEA,MAAa,IAAI,OAAO,OAAO;CAC7B,WAAoB;CACpB,aAAwB;CACxB,YAAsB;CACtB,eAA4B;CAC5B,cAA0B;CAC1B,cAA0B;CAC1B,iBAAgC;CAChC,gBAA8B;CAC9B,UAAqD,UACnD,OAAO,OAAO;EAAE,MAAM;EAAW,OAAO,aAAa,KAAK;CAAE,CAAC;;CAE/D,OACE,GAAG,WAEH,OAAO,OAAO;EACZ,MAAM;EACN,OAAO,OAAO,OACZ,OAAO,KAAK,UAAU,OAAO,OAAO;GAAE,MAAM;GAAW,OAAO,aAAa,KAAK;EAAE,CAAC,CAAC,CACtF;CACF,CAAC;CACH,OAAuB,YAA4B,OAAO,OAAO;EAAE,MAAM;EAAQ;CAAQ,CAAC;;CAE1F,SAAyD,WACvD,OAAO,OAAO;EAAE,MAAM;EAAO,QAAQ,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;CAAE,CAAC;;CAGrE,SAAyB,UACvB,OAAO,OAAO;EAAE,MAAM;EAAO,QAAQ,OAAO,OAAO,CAAC,CAAC;EAAG,MAAM;CAAM,CAAC;CACvE,QAAyC,GAAG,UAC1C,OAAO,OAAO;EACZ,MAAM;EACN,OAAO,OAAO,OAAO,eAAe,KAAK,CAAC;CAC5C,CAAC;;CAEH,WAA2B,SACzB,OAAO,OAAO;EACZ,MAAM;EACN,OAAO,OAAO,OAAO,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC;CACnD,CAAC;CACH,SAAiC,SAC/B,OAAO,OAAO;EAAE,MAAM;EAAU;CAAK,CAAC;AAC1C,CAAC;;;;;;AA2DD,IAAI;;;;;;AAOJ,IAAI;;AAEJ,MAAM,qBAAqB;;AAU3B,IAAa,qBAAb,cAAwC,MAAM,CAAC;;AAG/C,SAAgB,eAAkB,QAAgB,KAAiB;CACjE,IAAI,UAAU,KAAA,GAAW,OAAO,IAAI;CACpC,QAAQ,EAAE,WAAW,OAAO;CAC5B,2BAAW,IAAI,IAAI;CACnB,IAAI;EACF,OAAO,IAAI;CACb,UAAU;EACR,AAAW,SAAS,MAAM;EAC1B,QAAQ,KAAA;EACR,WAAW,KAAA;CACb;AACF;;AAGA,SAAgB,eAAe,OAAqB;CAClD,IAAI,UAAU,KAAA,MAAc,MAAM,aAAa,SAAS,GAAG,MAAM,IAAI,mBAAmB;AAC1F;AAKA,MAAM,wBAAQ,IAAI,QAAc;;AAGhC,SAAgB,aAAa,OAA+C;CAC1E,MAAM,OAAoB,OAAO,OAAO;EAAE,MAAM;EAAW;CAAM,CAAC;CAClE,MAAM,IAAI,IAAI;CACd,OAAO;AACT;AAEA,MAAM,iCAAiB,IAAI,QAAoB;;;;;;AAO/C,SAAgB,WAAW,MAAkB;CAC3C,IAAI,KAAK,SAAS,WAAW,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI;CACpE,IAAI,KAAK,SAAS,WAAW,KAAK,SAAS,UAAU,KAAK,SAAS,OAAO,OAAO;CACjF,IAAI,SAAS,eAAe,IAAI,IAAI;CACpC,IAAI,WAAW,KAAA,GAAW;EACxB,eAAe,CAAC;EAChB,IAAI,KAAK,SAAS,SAAS;GACzB,MAAM,UAAU,KAAK,MAAM,IAAI,UAAU;GACzC,SAAS,QAAQ,OAAO,GAAG,MAAM,MAAM,KAAK,MAAM,EAAE,IAAI,OAAO,QAAQ,OAAO;EAChF,OAAO,IAAI,KAAK,SAAS,QAAQ;GAC/B,MAAM,UAAU,WAAW,KAAK,OAAO;GACvC,SAAS,YAAY,KAAK,UAAU,OAAO;IAAE,MAAM;IAAQ;GAAQ;EACrE,OAAO;GACL,MAAM,SAA+B,CAAC;GACtC,IAAI,UAAU;GACd,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,MAAM,GAAG;IACtD,OAAO,OAAO,WAAW,KAAK;IAC9B,YAAY,OAAO,SAAS;GAC9B;GACA,MAAM,OAAO,KAAK,SAAS,KAAA,IAAY,KAAA,IAAY,WAAW,KAAK,IAAI;GACvE,YAAY,SAAS,KAAK;GAC1B,IAAI,CAAC,SAAS,SAAS;QAClB,IAAI,SAAS,KAAA,GAAW,SAAS,WAAW,MAAM,MAAM;QACxD,SAAS;IAAE,MAAM;IAAO;IAAQ;GAAK;EAC5C;EACA,eAAe,IAAI,MAAM,MAAM;CACjC;CACA,OAAO;AACT;AAIA,MAAM,wBAAQ,IAAI,QAAc;;AAGhC,SAAgB,YAAY,QAAiD;CAC3E,MAAM,OAAgB,OAAO,OAAO;EAAE,MAAM;EAAO,QAAQ,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;CAAE,CAAC;CACzF,MAAM,IAAI,IAAI;CACd,OAAO;AACT;;AAGA,SAAgB,QAAQ,MAAqB;CAC3C,OAAO,MAAM,IAAI,IAAI;AACvB;;AAGA,SAAgB,WAAW,MAAe,QAAiD;CACzF,IAAI,QAAQ,IAAI,KAAK,KAAK,SAAS,KAAA,GAAW,OAAO,YAAY,MAAM;CACvE,OAAO,KAAK,SAAS,KAAA,IACjB;EAAE,MAAM;EAAO;CAAO,IACtB;EAAE,MAAM;EAAO;EAAQ,MAAM,KAAK;CAAK;AAC7C;AAEA,SAAgB,WAAW,MAAqB;CAC9C,QAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK,QACH,OAAO;EACT,KAAK,SACH,OAAO,KAAK,MAAM,KAAK,UAAU;EAanC,SACE,OAAO;CACX;AACF;;AAGA,SAAgB,QAAQ,MAAe,KAA+B;CACpE,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,IAAI,KAAK,OAAO,OAAO,KAAA;AAC9D;AAEA,MAAM,8BAAc,IAAI,QAAoB;;AAG5C,SAAgB,QAAQ,MAAkB;CACxC,IAAI,KAAK,SAAS,QAAQ,OAAO;CACjC,IAAI,KAAK,SAAS,SAAS,OAAO;CAClC,IAAI,SAAS,YAAY,IAAI,IAAI;CACjC,IAAI,WAAW,KAAA,GAAW;EAExB,SAAS,KAAK,MAAM,MAAM,WAAW,OAAO,SAAS,UAAU,OAAO,SAAS,OAAO,IAClF,QAAQ,KAAK,MAAM,IAAI,OAAO,GAAG,KAAK,IACtC;EACJ,YAAY,IAAI,MAAM,MAAM;CAC9B;CACA,OAAO;AACT;AAEA,MAAM,4BAAY,IAAI,QAAoB;;AAG1C,SAAgB,MAAM,MAAkB;CACtC,IAAI,KAAK,SAAS,WAAW;EAC3B,IAAI,OAAO,KAAK,UAAU,UAAU,OAAO;EAC3C,OAAO,OAAO,KAAK,UAAU,WAAW,SAAS;CACnD;CACA,IAAI,KAAK,SAAS,SAAS,OAAO;CAClC,IAAI,SAAS,UAAU,IAAI,IAAI;CAC/B,IAAI,WAAW,KAAA,GAAW;EACxB,SAAS,KAAK,MAAM,MAAM,WAAW,OAAO,SAAS,aAAa,OAAO,SAAS,OAAO,IACrF,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,IAC7B;EACJ,UAAU,IAAI,MAAM,MAAM;CAC5B;CACA,OAAO;AACT;AAIA,MAAM,2BAAW,IAAI,QAAsB;;AAG3C,MAAM,YAAY;AAClB,MAAM,aAAa;;AAEnB,MAAM,YAAY;AAElB,SAAS,IAAI,GAAW,OAAuB;CAC7C,OAAO,KAAK,KAAK,IAAI,OAAO,SAAS,MAAM;AAC7C;AAEA,SAAS,SAAS,MAAsB;CACtC,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,CAAC,CAAC;CACnE,OAAO;AACT;;AAGA,SAAS,SAAS,MAAoB;CACpC,MAAM,SAAS,SAAS,IAAI,IAAI;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,eAAe,KAAK,SAAS,UAAU,KAAK,KAAK,MAAM,WAAW,KAAK,CAAC;CACxE,IAAI;CACJ,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,IAAI,SAAS,OAAO,OAAO,KAAK,MAAM,GAAG,OAAO,KAAK,KAAK,GAAG;GAC7D;EACF,KAAK;GACH,IAAI,IAAI,SAAS,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC;GAChD;EACF,KAAK;GACH,IAAI,SAAS,QAAQ,IAAI,IAAI,SAAS,KAAK;GAC3C,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,KAAK,GAC9C,IAAI,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,GAAG,SAAS,KAAK,OAAO,IAAI,CAAC;GAC3D,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,IAAI,IAAI,GAAG,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;GAC3E;EAEF,KAAK,SAAS;GAEZ,MAAM,UAAU,KAAK,MAAM,IAAI,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC;GAC7D,IAAI,SAAS,OAAO;GACpB,KAAK,MAAM,UAAU,SAAS,IAAI,IAAI,GAAG,MAAM;GAC/C;EACF;EACA,KAAK;GACH,IAAI,SAAS,UAAU,KAAK,MAAM;GAClC;EACF,KAAK;GACH,IAAI,IACF,KAAK,OAAO,QAAQ,KAAK,UAAU,IAAI,KAAK,SAAS,KAAK,CAAC,GAAG,SAAS,IAAI,CAAC,GAC5E,SAAS,KAAK,MAAM,CACtB;GACA;EACF,KAAK;GACH,IAAI,SAAS,OAAO,KAAK,MAAM;GAC/B;EASF,SACE,IAAI,SAAS,KAAK,IAAI;CAC1B;CACA,SAAS,IAAI,MAAM,CAAC;CACpB,OAAO;AACT;AAEA,MAAM,2BAAW,IAAI,QAA6B;;AAGlD,SAAgB,SAAS,GAAS,GAAkB;CAClD,IAAI,MAAM,GAAG,OAAO;CACpB,IAAI,EAAE,SAAS,EAAE,QAAQ,SAAS,CAAC,MAAM,SAAS,CAAC,GAAG,OAAO;CAC7D,IAAI,SAAS,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,OAAO;CAC7C,eAAe,CAAC;CAChB,IAAI;CACJ,QAAQ,EAAE,MAAV;EACE,KAAK;GACH,OAAO,EAAE,UAAW,EAAkB;GACtC;EACF,KAAK;GACH,OAAO,SAAS,EAAE,SAAU,EAAe,OAAO;GAClD;EACF,KAAK,OAAO;GACV,MAAM,QAAQ;GACd,MAAM,OAAO,OAAO,KAAK,EAAE,MAAM;GACjC,OACE,QAAQ,CAAC,MAAM,QAAQ,KAAK,KAC5B,KAAK,WAAW,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,UAC1C,KAAK,OAAO,QAAQ;IAClB,MAAM,QAAQ,QAAQ,OAAO,GAAG;IAChC,OAAO,UAAU,KAAA,KAAa,SAAS,EAAE,OAAO,MAAM,KAAK;GAC7D,CAAC,MACA,EAAE,SAAS,KAAA,IACR,MAAM,SAAS,KAAA,IACf,MAAM,SAAS,KAAA,KAAa,SAAS,EAAE,MAAM,MAAM,IAAI;GAC7D;EACF;EACA,KAAK,SAAS;GACZ,MAAM,QAAQ;GACd,IAAI,EAAE,MAAM,WAAW,MAAM,MAAM,QAAQ;IACzC,OAAO;IACP;GACF;GAGA,eAAe,KAAM,EAAE,MAAM,SAAS,MAAM,MAAM,WAAY,EAAE;GAChE,MAAM,0BAAU,IAAI,IAAoB;GACxC,KAAK,MAAM,aAAa,MAAM,OAAO;IACnC,MAAM,IAAI,SAAS,SAAS;IAC5B,MAAM,SAAS,QAAQ,IAAI,CAAC;IAC5B,IAAI,WAAW,KAAA,GAAW,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC;SAC/C,OAAO,KAAK,SAAS;GAC5B;GACA,OAAO,EAAE,MAAM,OACZ,WACC,QAAQ,IAAI,SAAS,MAAM,CAAC,CAAC,EAAE,MAAM,cAAc,SAAS,QAAQ,SAAS,CAAC,MAAM,IACxF;GACA;EACF;EACA,KAAK;GACH,OAAO,EAAE,SAAU,EAAiB;GACpC;EACF,KAAK,YAAY;GACf,MAAM,QAAQ;GACd,OACE,EAAE,OAAO,WAAW,MAAM,OAAO,UACjC,EAAE,OAAO,OAAO,OAAO,MAAM,SAAS,OAAO,MAAM,OAAO,EAAE,CAAC,KAC7D,SAAS,EAAE,QAAQ,MAAM,MAAM;GACjC;EACF;EACA,KAAK;GACH,OAAO,EAAE,SAAU,EAAc;GACjC;EASF,SACE,OAAO;CACX;CACA,IAAI,MAAM;EACR,IAAI,MAAM,SAAS,IAAI,CAAC;EACxB,IAAI,QAAQ,KAAA,GAAW,SAAS,IAAI,GAAI,sBAAM,IAAI,QAAQ,CAAE;EAC5D,IAAI,IAAI,CAAC;CACX;CACA,OAAO;AACT;;;;;;AAOA,MAAM,qBAAqB;;;;;AAM3B,SAAgB,QAAQ,OAAwB,WAAW,MAAY;CAErE,IAAI,MAAM,WAAW,KAAK,MAAM,EAAE,CAAC,SAAS,SAAS,OAAO,MAAM;CAClE,IAAI,YAAY,MAAM,WAAW,GAAG,OAAO,WAAW,MAAM,IAAI,MAAM,EAAE;CACxE,OAAO,WAAW,OAAO,QAAQ;AACnC;AAEA,MAAM,2BAAW,IAAI,QAAmC;;;;;;AAOxD,SAAS,WAAW,GAAS,GAAe;CAC1C,IAAI,MAAM,KAAK,EAAE,SAAS,SAAS,OAAO;CAC1C,IAAI,EAAE,SAAS,WAAW,SAAS,GAAG,CAAC,GAAG,OAAO;CACjD,IAAI,EAAE,SAAS,WAAW,SAAS,GAAG,CAAC,GAAG,OAAO;CACjD,IAAI,EAAE,SAAS,WAAW,EAAE,SAAS,SAAS;EAC5C,IAAI,SAAS,GAAG,CAAC,GAAG,OAAO;EAC3B,IAAI,SAAS,GAAG,CAAC,GAAG,OAAO;CAC7B;CACA,IAAI,OAAO,SAAS,IAAI,CAAC;CACzB,MAAM,SAAS,MAAM,IAAI,CAAC;CAC1B,IAAI,WAAW,KAAA,GAAW;EACxB,eAAe,CAAC;EAChB,OAAO;CACT;CACA,MAAM,SAAS,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;CACtC,IAAI,SAAS,KAAA,GAAW,SAAS,IAAI,GAAI,uBAAO,IAAI,QAAQ,CAAE;CAC9D,KAAK,IAAI,GAAG,MAAM;CAClB,OAAO;AACT;;AAGA,SAAS,SAAS,OAAkB,OAA2B;CAC7D,IAAI,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,OAAO;CACpD,eAAe,KAAK,MAAM,MAAM,WAAW,EAAE;CAC7C,OAAO,MAAM,MAAM,OAAO,WAAW,SAAS,OAAO,MAAM,CAAC;AAC9D;;AAGA,SAAS,SAAS,OAAkB,MAAqB;CACvD,IAAI,KAAK,SAAS,aAAa,CAAC,gBAAgB,IAAI,KAAK,IAAI,GAAG,OAAO;CACvE,MAAM,QAAQ,WAAW,KAAK;CAC9B,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,KAAK,SAAS,WAChB,OAAO,MAAM,SAAS,IAAI,MAAM,IAAI,CAAC,KAAK,MAAM,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI;CAC5E,OAAO,KAAK,SAAS,WAAW,MAAM,MAAM,IAAI,KAAK,IAAI;AAC3D;AAEA,SAAS,WAAW,OAAwB,UAAyB;CACnE,MAAM,OAAe,CAAC;CACtB,MAAM,SAAS,SAAqB;EAClC,IAAI,KAAK,SAAS,SAAS,KAAK,MAAM,QAAQ,KAAK;OAC9C,IAAI,KAAK,SAAS,SAAS,KAAK,KAAK,IAAI;CAChD;CACA,MAAM,QAAQ,KAAK;CACnB,eAAe,KAAK,MAAM;CAC1B,IAAI,KAAK,MAAM,SAAS,KAAK,SAAS,KAAK,GAAG,OAAO;CAErD,MAAM,4BAAY,IAAI,IAAY;CAClC,KAAK,MAAM,QAAQ,MAAM,IAAI,KAAK,SAAS,WAAW,UAAU,IAAI,KAAK,IAAI;CAC7E,IAAI,YAAY,KAAK,SAAS,oBAAoB;EAChD,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,MAAM,QAAQ,MAAM;GACvB,IAAI,KAAK,SAAS,aAAa,CAAC,MAAM,IAAI,IAAI,GAAG;GACjD,MAAM,OAAO,MAAM,IAAI,CAAC,CAAC;GACzB,MAAM,SAAS,OAAO,IAAI,IAAI,KAAK,KAAK;GACxC,OAAO,IAAI,MAAM,KAAK;GACtB,IAAI,QAAQ,oBAAoB,UAAU,IAAI,IAAI;EACpD;EACA,MAAM,QAAwC;GAC5C,QAAQ;GACR,QAAQ;GACR,SAAS;EACX;EACA,KAAK,MAAM,QAAQ,OAAO,KAAK,GAAG;GAChC,MAAM,OAAO,MAAM;GACnB,IAAI,SAAS,KAAA,KAAa,UAAU,IAAI,IAAI,KAAK,CAAC,KAAK,MAAM,SAAS,KAAK,SAAS,IAAI,GACtF,KAAK,KAAK,IAAI;EAClB;CACF;CACA,MAAM,MAAc,CAAC;CACrB,MAAM,uBAAO,IAAI,IAAoB;CACrC,KAAK,MAAM,QAAQ,MAAM;EACvB,IAAI,KAAK,SAAS,aAAa,UAAU,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI,GAAG;EAChE,MAAM,IAAI,SAAS,IAAI;EACvB,MAAM,SAAS,KAAK,IAAI,CAAC;EACzB,IAAI,QAAQ,MAAM,aAAa,SAAS,UAAU,IAAI,CAAC,MAAM,MAAM;EACnE,IAAI,WAAW,KAAA,GAAW,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC;OACvC,OAAO,KAAK,IAAI;EACrB,IAAI,KAAK,IAAI;CACf;CACA,IAAI,IAAI,WAAW,GAAG,OAAO;CAC7B,IAAI,IAAI,WAAW,GAAG,OAAO,IAAI;CAGjC,MAAM,QAAmB;EAAE,MAAM;EAAS,OAAO;CAAI;CACrD,IAAI,aAAa,KAAA,KAAa,IAAI,SAAS,oBAAoB,OAAO;CACtE,MAAM,IAAI,SAAS,KAAK;CACxB,MAAM,SAAS,SAAS,IAAI,CAAC;CAC7B,MAAM,WAAW,QAAQ,MAAM,cAAc,SAAS,WAAW,KAAK,CAAC;CACvE,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,IAAI,WAAW,KAAA,GAAW,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC;MAC5C,OAAO,KAAK,KAAK;CACtB,OAAO;AACT;AAEA,MAAM,iBAAiB,iBACrB,IAAI,QAAsC,mBAC1C,IAAI,QAAsC,CAC5C;;;;;AAMA,SAAgB,aAAa,QAAc,QAAuB;CAChE,OAAO,aAAa,QAAQ,QAAQ,KAAK;AAC3C;;;;;;AAOA,SAAgB,mBAAmB,QAAc,QAAuB;CACtE,OAAO,aAAa,QAAQ,QAAQ,IAAI;AAC1C;AAEA,SAAS,aAAa,QAAc,QAAc,QAA0B;CAC1E,IAAI,WAAW,QAAQ,OAAO;CAC9B,IAAI,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS,OAAO;CACtF,IAAI,OAAO,SAAS,SAAS,OAAO,SAAS,OAAO,OAAO;CAE3D,eAAe,CAAC;CAChB,MAAM,QAAQ,eAAe,SAAS,IAAI;CAC1C,IAAI,OAAO,MAAM,IAAI,MAAM;CAC3B,MAAM,SAAS,MAAM,IAAI,MAAM;CAC/B,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,SAAS,WAAW,QAAQ,QAAQ,MAAM;CAChD,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,QAAS,uBAAO,IAAI,QAAQ,CAAE;CAChE,KAAK,IAAI,QAAQ,MAAM;CACvB,OAAO;AACT;AAgBA,MAAM,kCAAuC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,MAAM,iCAAiB,IAAI,QAA0B;AAErD,SAAS,WAAW,OAA0C;CAC5D,OAAO,GAAG,OAAO,MAAM,GAAG,OAAO,KAAK;AACxC;AAEA,MAAM,iCAAiB,IAAI,QAAsB;;AAGjD,SAAS,MAAM,SAA8B;CAC3C,IAAI,MAAM,eAAe,IAAI,OAAO;CACpC,IAAI,QAAQ,KAAA,GAAW,eAAe,IAAI,SAAU,MAAM,WAAW,QAAQ,KAAK,CAAE;CACpF,OAAO;AACT;AAEA,SAAS,WAAW,MAAwB;CAC1C,IAAI,QAAQ,eAAe,IAAI,IAAI;CACnC,IAAI,UAAU,KAAA,GAAW;EACvB,MAAM,UAAU,aAAa,IAAI;EAEjC,eAAe,IAAI,QAAQ,MAAM;EACjC,MAAM,2BAAW,IAAI,IAAY;EACjC,MAAM,+BAAe,IAAI,IAAY;EACrC,MAAM,wBAAQ,IAAI,IAAY;EAC9B,MAAM,SAAiB,CAAC;EACxB,IAAI,OAAO;EACX,KAAK,MAAM,UAAU,SACnB,IAAI,OAAO,SAAS,WAAW;GAC7B,SAAS,IAAI,MAAM,MAAM,CAAC;GAC1B,aAAa,IAAI,OAAO,OAAO,KAAK;EACtC,OAAO,IAAI,OAAO,SAAS,SAAS,OAAO,SAAS,OAAO,OAAO;OAC7D;GACH,MAAM,IAAI,OAAO,IAAI;GACrB,IAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,GAAG,OAAO,KAAK,MAAM;EAC3D;EAEF,QAAQ;GAAE;GAAU;GAAc;GAAO;GAAQ;EAAK;EACtD,eAAe,IAAI,MAAM,KAAK;CAChC;CACA,OAAO;AACT;AAEA,SAAS,WAAW,QAAc,QAAc,QAA0B;CACxE,IAAI,OAAO,SAAS,SAAS;EAC3B,eAAe,OAAO,MAAM,MAAM;EAClC,OAAO,OAAO,MAAM,OAAO,WAAW,aAAa,QAAQ,QAAQ,MAAM,CAAC;CAC5E;CACA,IAAI,OAAO,SAAS,SAAS;EAC3B,MAAM,QAAQ,WAAW,MAAM;EAC/B,IAAI,MAAM,MAAM,OAAO;EACvB,IAAI,OAAO,SAAS,WAClB,OAAO,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,KAAK,MAAM,MAAM,IAAI,MAAM,MAAM,CAAC,CAAC,IAAI;EAChF,IAAI,gBAAgB,IAAI,OAAO,IAAI,GAAG,OAAO,MAAM,MAAM,IAAI,OAAO,IAAI;EACxE,eAAe,MAAM,OAAO,MAAM;EAClC,OAAO,MAAM,OAAO,MAAM,WAAW,aAAa,QAAQ,QAAQ,MAAM,CAAC;CAC3E;CACA,QAAQ,OAAO,MAAf;EACE,KAAK,WACH,OAAO,OAAO,SAAS,aAAa,OAAO,UAAU,OAAO;EAC9D,KAAK,QACH,OAAO,OAAO,SAAS,UAAU,aAAa,OAAO,SAAS,OAAO,SAAS,MAAM;EACtF,KAAK,OAAO;GACV,IAAI,OAAO,SAAS,OAAO,OAAO;GAClC,MAAM,aAAa,OAAO,KAAK,OAAO,MAAM;GAC5C,eAAe,WAAW,MAAM;GAEhC,IAAI,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAA,GAAW;IAChD,IAAI,CAAC,QAAQ,MAAM,KAAK,OAAO,SAAS,KAAA,GAAW,OAAO;IAC1D,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,MAAM,GACzC,IAAI,CAAC,OAAO,OAAO,OAAO,QAAQ,GAAG,GAAG,OAAO;GACnD;GACA,KAAK,MAAM,OAAO,YAAY;IAC5B,MAAM,YAAY,OAAO,OAAO;IAChC,MAAM,cAAc,QAAQ,QAAQ,GAAG;IACvC,IAAI,gBAAgB,KAAA,GACd;SAAA,CAAC,aAAa,aAAa,WAAW,MAAM,GAAG,OAAO;IAAA,OACrD,IAAI,CAAC,WAAW,SAAS,GAE9B,OAAO;SACF,IAAI,OAAO,SAAS,KAAA,GACrB;SAAA,CAAC,aAAa,OAAO,MAAM,WAAW,MAAM,GAAG,OAAO;IAAA,OACrD,IAAI,UAAU,CAAC,QAAQ,MAAM,GAElC,OAAO;GAEX;GACA,IAAI,OAAO,SAAS,KAAA,GAAW;IAC7B,MAAM,OAAO,OAAO;IACpB,MAAM,eAAe,OAAO,OAAO,OAAO,MAAM;IAChD,eAAe,aAAa,MAAM;IAClC,KAAK,MAAM,aAAa,cACtB,IAAI,CAAC,aAAa,WAAW,MAAM,MAAM,GAAG,OAAO;IAErD,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,aAAa,OAAO,MAAM,MAAM,MAAM;IAE5E,OAAO,QAAQ,MAAM,KAAK,KAAK,SAAS;GAC1C;GACA,OAAO;EACT;EACA,KAAK,UACH,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,OAAO;EAC5D,KAAK,YACH,OAAO,OAAO,SAAS;EACzB,KAAK;EACL,KAAK,OACH,OAAO;EAQT,SACE,OACE,OAAO,SAAS,OAAO,QACtB,OAAO,SAAS,aAAa,MAAM,MAAM,CAAC,CAAC,SAAS,OAAO;CAElE;AACF;;AAGA,MAAM,8BAAc,IAAI,QAAsC;AAE9D,SAAgB,SAAS,GAAS,GAAkB;CAClD,eAAe,CAAC;CAChB,IAAI,OAAO,YAAY,IAAI,CAAC;CAC5B,MAAM,SAAS,MAAM,IAAI,CAAC;CAC1B,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,SAAS,gBAAgB,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;CAC3D,IAAI,SAAS,KAAA,GAAW,YAAY,IAAI,GAAI,uBAAO,IAAI,QAAQ,CAAE;CACjE,KAAK,IAAI,GAAG,MAAM;CAClB,OAAO;AACT;AAEA,SAAS,gBAAgB,MAAkB,OAA4B;CACrE,IAAI,KAAK,QAAQ,MAAM,MAAM,OAAO;CAEpC,MAAM,CAAC,OAAO,SAAS,KAAK,SAAS,QAAQ,MAAM,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI;CAC/F,KAAK,MAAM,QAAQ,MAAM,OACvB,IAAI,MAAM,MAAM,IAAI,IAAI,KAAK,MAAM,aAAa,IAAI,IAAI,GAAG,OAAO;CAEpE,IAAI,UAAU;CACd,IAAI;EACF,KAAK,MAAM,WAAW,MAAM,UAAU;GACpC;GACA,IAAI,MAAM,SAAS,IAAI,OAAO,KAAK,MAAM,MAAM,IAAI,YAAY,OAAO,CAAC,GAAG,OAAO;EACnF;EACA,OAAO;CACT,UAAU;EACR,eAAe,OAAO;CACxB;AACF;;AAGA,SAAS,YAAY,KAAqB;CACxC,OAAO,IAAI,MAAM,GAAG,IAAI,QAAQ,GAAG,CAAC;AACtC;;AAGA,MAAM,gBAAgB;;AAGtB,MAAM,6BAAa,IAAI,QAAsB;AAE7C,SAAgB,WAAW,MAAY,YAAY,eAAuB;CAExE,IAAI,cAAc,eAAe;EAC/B,IAAI,OAAO,WAAW,IAAI,IAAI;EAC9B,IAAI,SAAS,KAAA,GAAW,WAAW,IAAI,MAAO,OAAO,eAAe,MAAM,SAAS,CAAE;EACrF,OAAO;CACT;CACA,OAAO,eAAe,MAAM,SAAS;AACvC;AAEA,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAE5B,SAAS,eAAe,MAAY,WAA2B;CAC7D,IAAI,MAAM;CACV,IAAI,OAAO;CACX,MAAM,QAAQ,SAA0B;EACtC,IAAI,MAAM,OAAO;EACjB,IAAI,IAAI,SAAS,KAAK,SAAS,WAAW;GACxC,IAAI,OAAO,KAAK,IAAI,GAAG,YAAY,IAAI,MAAM;GAE7C,MAAM,OAAO,KAAK,WAAW,OAAO,CAAC;GACrC,IAAI,OAAO,KAAK,QAAQ,wBAAwB,QAAQ,qBAAqB;GAC7E,OAAO,GAAG,KAAK,MAAM,GAAG,IAAI,EAAE;GAC9B,OAAO;GACP,OAAO;EACT;EACA,OAAO;EACP,OAAO;CACT;CACA,MAAM,SAAS,SAAqB;EAClC,IAAI,MAAM;EACV,QAAQ,KAAK,MAAb;GACE,KAAK;IACH,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC;IAC/B;GACF,KAAK,QAAQ;IACX,MAAM,OAAO,KAAK,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS;IACpE,IAAI,MAAM,KAAK,GAAG;IAClB,MAAM,KAAK,OAAO;IAClB,KAAK,OAAO,QAAQ,IAAI;IACxB;GACF;GACA,KAAK,OAAO;IACV,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM;IACpC,IAAI,KAAK,WAAW,KAAK,KAAK,SAAS,KAAA,GAAW;KAChD,KAAK,IAAI;KACT;IACF;IACA,KAAK,IAAI;IACT,KAAK,SAAS,GAAG,MAAM;KACrB,IAAI,MAAM;KACV,IAAI,IAAI,GAAG,KAAK,IAAI;KACpB,KAAK,GAAG,sBAAsB,KAAK,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC,EAAE,GAAG;KACjE,MAAM,KAAK,OAAO,EAAE;IACtB,CAAC;IACD,IAAI,KAAK,SAAS,KAAA,GAAW;KAC3B,IAAI,KAAK,SAAS,GAAG,KAAK,IAAI;KAC9B,KAAK,iBAAiB;KACtB,MAAM,KAAK,IAAI;IACjB;IACA,KAAK,IAAI;IACT;GACF;GACA,KAAK;IACH,KAAK,MAAM,SAAS,QAAQ,MAAM;KAChC,IAAI,MAAM;KACV,IAAI,IAAI,GAAG,KAAK,KAAK;KACrB,MAAM,MAAM;IACd,CAAC;IACD;GACF,KAAK;IACH,KAAK,KAAK,IAAI;IACd;GACF,KAAK;IACH,KAAK,GAAG;IACR,KAAK,OAAO,SAAS,OAAO,MAAM;KAChC,IAAI,MAAM;KACV,IAAI,IAAI,GAAG,KAAK,IAAI;KACpB,MAAM,KAAK;IACb,CAAC;IACD,KAAK,OAAO;IACZ,MAAM,KAAK,MAAM;IACjB;GACF,KAAK;IACH,KAAK,KAAK,IAAI;IACd;GASF,SACE,KAAK,KAAK,IAAI;EAClB;CACF;CACA,MAAM,IAAI;CACV,OAAO;AACT"}
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["import type { Duration } from './runtime/values.js'\n\n/**\n * The static type vocabulary. Types are plain JSON-serializable objects so a\n * schema can be stored, sent to an editor, or generated from another schema\n * language.\n */\nexport type Type =\n | AnyType\n | NeverType\n | NullType\n | BooleanType\n | NumberType\n | StringType\n | TimestampType\n | DurationType\n | LiteralType\n | ListType\n | MapType\n | UnionType\n | OpaqueType\n | FunctionType\n | TypeVar\n\nexport interface AnyType {\n readonly kind: 'any'\n}\nexport interface NeverType {\n readonly kind: 'never'\n}\nexport interface NullType {\n readonly kind: 'null'\n}\nexport interface BooleanType {\n readonly kind: 'boolean'\n}\nexport interface NumberType {\n readonly kind: 'number'\n}\nexport interface StringType {\n readonly kind: 'string'\n}\nexport interface TimestampType {\n readonly kind: 'timestamp'\n}\nexport interface DurationType {\n readonly kind: 'duration'\n}\nexport interface LiteralType<V extends string | number | boolean = string | number | boolean> {\n readonly kind: 'literal'\n readonly value: V\n}\nexport interface ListType<E extends Type = Type> {\n readonly kind: 'list'\n readonly element: E\n}\n/**\n * A string-keyed record. `fields` are the known keys; `rest` types any other\n * key (an open record). Without `rest`, reading an unknown key is a check error.\n */\nexport interface MapType<\n F extends Readonly<Record<string, Type>> = Readonly<Record<string, Type>>,\n R extends Type | undefined = Type | undefined,\n> {\n readonly kind: 'map'\n readonly fields: F\n readonly rest?: R\n}\nexport interface UnionType<M extends readonly Type[] = readonly Type[]> {\n readonly kind: 'union'\n readonly types: M\n}\n/**\n * A value the host declares as not navigable. The checker rejects property\n * access on it; at run time objects are read through their own properties.\n */\nexport interface OpaqueType<N extends string = string> {\n readonly kind: 'opaque'\n readonly name: N\n}\n/** Only lambdas have function types; they cannot be stored in values. */\nexport interface FunctionType {\n readonly kind: 'function'\n readonly params: readonly Type[]\n readonly result: Type\n}\n/** A type variable in a built-in signature, e.g. `T` in `first(list<T>): T?`. */\nexport interface TypeVar {\n readonly kind: 'var'\n readonly name: string\n}\n\nconst ANY: AnyType = Object.freeze({ kind: 'any' })\nconst NEVER: NeverType = Object.freeze({ kind: 'never' })\nconst NULL: NullType = Object.freeze({ kind: 'null' })\nconst BOOLEAN: BooleanType = Object.freeze({ kind: 'boolean' })\nconst NUMBER: NumberType = Object.freeze({ kind: 'number' })\nconst STRING: StringType = Object.freeze({ kind: 'string' })\nconst TIMESTAMP: TimestampType = Object.freeze({ kind: 'timestamp' })\nconst DURATION: DurationType = Object.freeze({ kind: 'duration' })\n\n// Types built by t from types built by t: frozen plain data all the way down,\n// with no toJSON, so they cannot change and need no copy (see typeData).\nconst BUILT = new WeakSet<Type>([ANY, NEVER, NULL, BOOLEAN, NUMBER, STRING, TIMESTAMP, DURATION])\n\nfunction built<T extends Type>(type: T, parts: readonly Type[] = []): T {\n if (parts.every((part) => BUILT.has(part))) BUILT.add(type)\n return type\n}\n\n/**\n * Union members with nested unions flattened (and repeats of one object\n * dropped), so `t.optional(t.enum('a', 'b'))` lists \"a\", \"b\", and null.\n */\nfunction flattenMembers(types: readonly Type[]): Type[] {\n const out = new Set<Type>()\n const visit = (type: Type): void => {\n if (type.kind === 'union') type.types.forEach(visit)\n else out.add(type)\n }\n types.forEach(visit)\n return [...out]\n}\n\n/** The members of a type as a flat list: its union members, or the type itself. */\nexport function unionMembers(type: Type): readonly Type[] {\n if (type.kind !== 'union') return [type]\n return type.types.some((member) => member.kind === 'union')\n ? flattenMembers(type.types)\n : type.types\n}\n\n/** Type builders. */\n/** A literal type's value: a string, a boolean, or a finite number (NaN and infinities are never values). */\nfunction literalValue<V extends string | number | boolean>(value: V): V {\n if (typeof value === 'number' && !Number.isFinite(value))\n throw new TypeError(`A literal type must be a finite number, not ${String(value)}`)\n return value\n}\n\nexport const t = Object.freeze({\n any: (): AnyType => ANY,\n never: (): NeverType => NEVER,\n null: (): NullType => NULL,\n boolean: (): BooleanType => BOOLEAN,\n number: (): NumberType => NUMBER,\n string: (): StringType => STRING,\n timestamp: (): TimestampType => TIMESTAMP,\n duration: (): DurationType => DURATION,\n literal: <const V extends string | number | boolean>(value: V): LiteralType<V> =>\n built(Object.freeze({ kind: 'literal', value: literalValue(value) })),\n /** A union of literals: `t.enum('free', 'pro')`. */\n enum: <const V extends readonly (string | number | boolean)[]>(\n ...values: V\n ): UnionType<{ [K in keyof V]: LiteralType<V[K]> }> =>\n built(\n Object.freeze({\n kind: 'union',\n types: Object.freeze(\n values.map((value) => Object.freeze({ kind: 'literal', value: literalValue(value) })),\n ),\n }),\n ) as unknown as UnionType<{ [K in keyof V]: LiteralType<V[K]> }>,\n list: <E extends Type>(element: E): ListType<E> =>\n built(Object.freeze({ kind: 'list', element }), [element]),\n /** A closed record with known fields. */\n object: <const F extends Readonly<Record<string, Type>>>(fields: F): MapType<F, undefined> => {\n const own = Object.freeze({ ...fields })\n return built(Object.freeze({ kind: 'map', fields: own }), Object.values(own))\n },\n /** An open record: every key has type `value`. */\n // oxlint-disable-next-line typescript/no-generated-empty-object-type -- no declared fields\n record: <V extends Type>(value: V): MapType<Record<never, never>, V> =>\n built(Object.freeze({ kind: 'map', fields: Object.freeze({}), rest: value }), [value]),\n union: <const M extends readonly Type[]>(...types: M): UnionType<M> => {\n const members = Object.freeze(flattenMembers(types))\n return built(\n Object.freeze({ kind: 'union', types: members }),\n members,\n ) as unknown as UnionType<M>\n },\n /** `T | null`. Absent keys read as null, so this also marks a field optional. */\n optional: <T extends Type>(type: T): UnionType<readonly [T, NullType]> => {\n const members = Object.freeze(flattenMembers([type, NULL]))\n return built(Object.freeze({ kind: 'union', types: members }), members) as unknown as UnionType<\n readonly [T, NullType]\n >\n },\n opaque: <const N extends string>(name: N): OpaqueType<N> =>\n built(Object.freeze({ kind: 'opaque', name })),\n})\n\n// === TypeScript inference from schemas ===\n\ntype Simplify<T> = { [K in keyof T]: T[K] }\n\ntype NullableKeys<F> = {\n [K in keyof F]: null extends Infer<F[K]> ? K : never\n}[keyof F]\n\ninterface PrimitiveTypes {\n any: unknown\n never: never\n null: null\n boolean: boolean\n number: number\n string: string\n timestamp: Date\n duration: Duration\n opaque: unknown\n function: unknown\n var: unknown\n}\n\ntype InferMap<F, R> = Simplify<\n { readonly [K in Exclude<keyof F, NullableKeys<F>>]: Infer<F[K]> } & {\n readonly [K in NullableKeys<F>]?: Infer<F[K]> | undefined\n } & (R extends Type ? { readonly [key: string]: Infer<R> } : unknown)\n>\n\n/** The TypeScript type of values described by a Bonsai type. */\nexport type Infer<T> = [Type] extends [T]\n ? unknown\n : T extends { readonly kind: 'literal'; readonly value: infer V }\n ? V\n : T extends { readonly kind: 'list'; readonly element: infer E }\n ? readonly Infer<E>[]\n : T extends { readonly kind: 'map'; readonly fields: infer F; readonly rest?: infer R }\n ? InferMap<F, R>\n : T extends { readonly kind: 'union'; readonly types: infer M extends readonly unknown[] }\n ? Infer<M[number]>\n : T extends { readonly kind: infer K extends keyof PrimitiveTypes }\n ? PrimitiveTypes[K]\n : unknown\n\n/** The context type of a variable declaration record. */\nexport type InferVariables<V> = Simplify<\n { readonly [K in Exclude<keyof V, NullableKeys<V>>]: Infer<V[K]> } & {\n readonly [K in NullableKeys<V>]?: Infer<V[K]> | undefined\n }\n>\n\n// === Type operations ===\n\n/**\n * The checker's work budget. Type operations charge it so a small source that\n * builds huge types (unions of thousands of literals, maps nested by `let`)\n * fails with a limit error instead of running long. Installed per analysis.\n */\nlet meter: { remaining: number } | undefined\n\n/**\n * Large unions built during one analysis, by structural hash: the same union\n * rebuilt (a join repeated in every clause of a rule) becomes the same object,\n * so its index and comparisons are computed once.\n */\nlet interned: Map<number, UnionType[]> | undefined\n/** Unions at least this large are interned. */\nconst INTERN_MIN_MEMBERS = 32\n\nlet lastWork = 0\n\n/** Type work the last completed budget used: a machine-independent measure of checking cost. */\nexport function lastTypeWork(): number {\n return lastWork\n}\n\n/** Raised when the installed type-work budget runs out. */\nexport class TypeBudgetExceeded extends Error {}\n\n/** Runs `run` with a type-work budget; nested calls share the outer budget. */\nexport function withTypeBudget<T>(budget: number, run: () => T): T {\n if (meter !== undefined) return run()\n meter = { remaining: budget }\n interned = new Map()\n try {\n return run()\n } finally {\n lastWork = budget - meter.remaining\n meter = undefined\n interned = undefined\n }\n}\n\n/** Charges `units` of type work against the installed budget. */\nexport function chargeTypeWork(units: number): void {\n if (meter !== undefined && (meter.remaining -= units) < 0) throw new TypeBudgetExceeded()\n}\n\n// Literals written in the source are fresh: a union of thousands of them (a\n// long conditional ladder) may widen to their kind. Declared literal unions\n// (enums) never do.\nconst FRESH = new WeakSet<Type>()\n\n/** A literal type for a literal written in the source. */\nexport function freshLiteral(value: string | number | boolean): LiteralType {\n const type: LiteralType = Object.freeze({ kind: 'literal', value })\n FRESH.add(type)\n return type\n}\n\nconst widenFreshMemo = new WeakMap<Type, Type>()\n\n/**\n * Widens the source literals in a type, deeply: a call's result mentions the\n * literals it was given only as their kinds (`max(1, 2)` is a number), while\n * declared literal types (enums) pass through.\n */\nexport function widenFresh(type: Type): Type {\n if (type.kind === 'literal') return FRESH.has(type) ? widen(type) : type\n if (type.kind !== 'union' && type.kind !== 'list' && type.kind !== 'map') return type\n let result = widenFreshMemo.get(type)\n if (result === undefined) {\n chargeTypeWork(1)\n if (type.kind === 'union') {\n const members = type.types.map(widenFresh)\n result = members.every((m, i) => m === type.types[i]) ? type : unionOf(members)\n } else if (type.kind === 'list') {\n const element = widenFresh(type.element)\n result = element === type.element ? type : { kind: 'list', element }\n } else {\n const fields: Record<string, Type> = {}\n let changed = false\n for (const [key, field] of Object.entries(type.fields)) {\n fields[key] = widenFresh(field)\n changed ||= fields[key] !== field\n }\n const rest = type.rest === undefined ? undefined : widenFresh(type.rest)\n changed ||= rest !== type.rest\n if (!changed) result = type\n else if (rest === undefined) result = withFields(type, fields)\n else result = { kind: 'map', fields, rest }\n }\n widenFreshMemo.set(type, result)\n }\n return result\n}\n\n// Map literals are exact: they hold only the keys they list. Declared object\n// types are not: a record from a database carries columns the schema omits.\nconst EXACT = new WeakSet<Type>()\n\n/** A closed map type known to hold no keys beyond `fields` (a map literal). */\nexport function exactObject(fields: Readonly<Record<string, Type>>): MapType {\n const type: MapType = Object.freeze({ kind: 'map', fields: Object.freeze({ ...fields }) })\n EXACT.add(type)\n return type\n}\n\n/** Whether a map type is known to hold no keys beyond its fields. */\nexport function isExact(type: Type): boolean {\n return EXACT.has(type)\n}\n\n/**\n * A type as frozen plain data: only its kind and that kind's own fields, read\n * directly (never through toJSON), keeping exactness. Taken once from a\n * caller's type, it is what a program is checked, cached, and recorded with,\n * whatever later happens to the caller's object. A type built by t is already\n * that, and is returned as it is, so the checker's caches keyed on it stay warm.\n */\nexport function typeData(type: Type): Type {\n if (BUILT.has(type)) return type\n switch (type.kind) {\n case 'list':\n return Object.freeze({ kind: 'list', element: typeData(type.element) })\n case 'union':\n return Object.freeze({ kind: 'union', types: Object.freeze(type.types.map(typeData)) })\n case 'map': {\n const fields: Record<string, Type> = {}\n for (const key of Object.keys(type.fields))\n Object.defineProperty(fields, key, {\n value: typeData(type.fields[key]),\n enumerable: true,\n writable: true,\n configurable: true,\n })\n if (isExact(type) && type.rest === undefined) return exactObject(fields)\n return Object.freeze({\n kind: 'map',\n fields: Object.freeze(fields),\n ...(type.rest === undefined ? {} : { rest: typeData(type.rest) }),\n })\n }\n case 'literal':\n return Object.freeze({ kind: 'literal', value: type.value })\n case 'opaque':\n return Object.freeze({ kind: 'opaque', name: type.name })\n case 'any':\n case 'boolean':\n case 'duration':\n case 'function':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n case 'var':\n default:\n return Object.freeze({ kind: type.kind } as Type)\n }\n}\n\n/** A copy of a map type with new fields, keeping its exactness. */\nexport function withFields(type: MapType, fields: Readonly<Record<string, Type>>): MapType {\n if (isExact(type) && type.rest === undefined) return exactObject(fields)\n return type.rest === undefined\n ? { kind: 'map', fields }\n : { kind: 'map', fields, rest: type.rest }\n}\n\nexport function isNullable(type: Type): boolean {\n switch (type.kind) {\n case 'any':\n case 'null':\n return true\n case 'union':\n return type.types.some(isNullable)\n case 'boolean':\n case 'duration':\n case 'function':\n case 'list':\n case 'literal':\n case 'map':\n case 'never':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n case 'var':\n default:\n return false\n }\n}\n\n/** The declared type of `key` in a map type (own fields only, never prototype names). */\nexport function fieldOf(type: MapType, key: string): Type | undefined {\n return Object.hasOwn(type.fields, key) ? type.fields[key] : undefined\n}\n\nconst nonNullMemo = new WeakMap<Type, Type>()\n\n/** Removes `null` from a type. */\nexport function nonNull(type: Type): Type {\n if (type.kind === 'null') return NEVER\n if (type.kind !== 'union') return type\n let result = nonNullMemo.get(type)\n if (result === undefined) {\n // Keeps every literal: narrowing an optional enum must not lose its values.\n result = type.types.some((member) => member.kind === 'null' || member.kind === 'union')\n ? unionOf(type.types.map(nonNull), false)\n : type\n nonNullMemo.set(type, result)\n }\n return result\n}\n\nconst widenMemo = new WeakMap<Type, Type>()\n\n/** The base kind a literal widens to. */\nexport function widen(type: Type): Type {\n if (type.kind === 'literal') {\n if (typeof type.value === 'string') return STRING\n return typeof type.value === 'number' ? NUMBER : BOOLEAN\n }\n if (type.kind !== 'union') return type\n let result = widenMemo.get(type)\n if (result === undefined) {\n result = type.types.some((member) => member.kind === 'literal' || member.kind === 'union')\n ? unionOf(type.types.map(widen))\n : type\n widenMemo.set(type, result)\n }\n return result\n}\n\n// === structural identity ===\n\nconst hashMemo = new WeakMap<Type, number>()\n\n/** FNV-1a parameters. */\nconst FNV_PRIME = 0x01_00_01_93\nconst FNV_OFFSET = 0x81_1c_9d_c5\n/** Separates a map's `rest` from its fields in a hash. */\nconst REST_MARK = 0x2a\n\nfunction mix(h: number, value: number): number {\n return Math.imul(h ^ value, FNV_PRIME) >>> 0\n}\n\nfunction hashText(text: string): number {\n let h = FNV_OFFSET\n for (let i = 0; i < text.length; i++) h = mix(h, text.charCodeAt(i))\n return h\n}\n\n/** A structural hash: equal types hash equally. Shared sub-types are hashed once. */\nfunction typeHash(type: Type): number {\n const cached = hashMemo.get(type)\n if (cached !== undefined) return cached\n chargeTypeWork(type.kind === 'union' ? 1 + (type.types.length >>> 2) : 1)\n let h: number\n switch (type.kind) {\n case 'literal':\n h = hashText(`lit:${typeof type.value}:${String(type.value)}`)\n break\n case 'list':\n h = mix(hashText('list'), typeHash(type.element))\n break\n case 'map': {\n h = hashText(isExact(type) ? 'map!' : 'map')\n for (const key of Object.keys(type.fields).sort())\n h = mix(mix(h, hashText(key)), typeHash(type.fields[key]))\n if (type.rest !== undefined) h = mix(mix(h, REST_MARK), typeHash(type.rest))\n break\n }\n case 'union': {\n // Order-independent: members are compared as a set.\n const members = type.types.map(typeHash).sort((a, b) => a - b)\n h = hashText('union')\n for (const member of members) h = mix(h, member)\n break\n }\n case 'opaque':\n h = hashText(`opaque:${type.name}`)\n break\n case 'function':\n h = mix(\n type.params.reduce((acc, param) => mix(acc, typeHash(param)), hashText('fn')),\n typeHash(type.result),\n )\n break\n case 'var':\n h = hashText(`var:${type.name}`)\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n h = hashText(type.kind)\n }\n hashMemo.set(type, h)\n return h\n}\n\nconst sameMemo = new WeakMap<Type, WeakSet<Type>>()\n\n/** Structural equality, linear in the size of the (shared) type graphs. */\nexport function sameType(a: Type, b: Type): boolean {\n if (a === b) return true\n if (a.kind !== b.kind || typeHash(a) !== typeHash(b)) return false\n if (sameMemo.get(a)?.has(b) === true) return true\n chargeTypeWork(1)\n let same: boolean\n switch (a.kind) {\n case 'literal':\n same = a.value === (b as LiteralType).value\n break\n case 'list':\n same = sameType(a.element, (b as ListType).element)\n break\n case 'map': {\n const other = b as MapType\n const keys = Object.keys(a.fields)\n same =\n isExact(a) === isExact(other) &&\n keys.length === Object.keys(other.fields).length &&\n keys.every((key) => {\n const field = fieldOf(other, key)\n return field !== undefined && sameType(a.fields[key], field)\n }) &&\n (a.rest === undefined\n ? other.rest === undefined\n : other.rest !== undefined && sameType(a.rest, other.rest))\n break\n }\n case 'union': {\n const other = b as UnionType\n if (a.types.length !== other.types.length) {\n same = false\n break\n }\n // Members are distinct, so equal sizes and every member found means equal sets.\n // Hashed lookups are cheap next to other checking work: charged per 8 members.\n chargeTypeWork(1 + ((a.types.length + other.types.length) >>> 3))\n const buckets = new Map<number, Type[]>()\n for (const candidate of other.types) {\n const h = typeHash(candidate)\n const bucket = buckets.get(h)\n if (bucket === undefined) buckets.set(h, [candidate])\n else bucket.push(candidate)\n }\n same = a.types.every(\n (member) =>\n buckets.get(typeHash(member))?.some((candidate) => sameType(member, candidate)) === true,\n )\n break\n }\n case 'opaque':\n same = a.name === (b as OpaqueType).name\n break\n case 'function': {\n const other = b as FunctionType\n same =\n a.params.length === other.params.length &&\n a.params.every((param, i) => sameType(param, other.params[i])) &&\n sameType(a.result, other.result)\n break\n }\n case 'var':\n same = a.name === (b as TypeVar).name\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n same = true\n }\n if (same) {\n let set = sameMemo.get(a)\n if (set === undefined) sameMemo.set(a, (set = new WeakSet()))\n set.add(b)\n }\n return same\n}\n\n/**\n * Unions with more source literals of one kind than this (a thousand-branch\n * `c ? \"a\" : c2 ? \"b\" : ...` ladder) widen them to the kind: always sound, and\n * it keeps building such unions linear. Declared enums are never widened.\n */\nconst MAX_UNION_LITERALS = 256\n\n/**\n * Flattens, de-duplicates, and simplifies a union, in time linear in its\n * members. `collapse` widens very wide literal unions (see MAX_UNION_LITERALS).\n */\nexport function unionOf(types: readonly Type[], collapse = true): Type {\n // One type is already its own union (unions are built flat).\n if (types.length === 1 && types[0].kind !== 'never') return types[0]\n if (collapse && types.length === 2) return unionOfTwo(types[0], types[1])\n return unionOfAll(types, collapse)\n}\n\nconst pairMemo = new WeakMap<Type, WeakMap<Type, Type>>()\n\n/**\n * The common join of two types, fast when one already holds the other (`c ? tz\n * : \"Z1\"` over a timezone enum is the enum) and remembered per pair, so a rule\n * that repeats a join of two large enums builds it once.\n */\nfunction unionOfTwo(a: Type, b: Type): Type {\n if (a === b && a.kind !== 'union') return a\n if (a.kind === 'union' && contains(a, b)) return a\n if (b.kind === 'union' && contains(b, a)) return b\n if (a.kind === 'union' && b.kind === 'union') {\n if (holdsAll(a, b)) return a\n if (holdsAll(b, a)) return b\n }\n let memo = pairMemo.get(a)\n const cached = memo?.get(b)\n if (cached !== undefined) {\n chargeTypeWork(1)\n return cached\n }\n const result = unionOfAll([a, b], true)\n if (memo === undefined) pairMemo.set(a, (memo = new WeakMap()))\n memo.set(b, result)\n return result\n}\n\n/** Whether `outer` certainly holds every member of `inner` (`Zone | null` holds `Zone`). */\nfunction holdsAll(outer: UnionType, inner: UnionType): boolean {\n if (inner.types.length > outer.types.length) return false\n chargeTypeWork(1 + (inner.types.length >>> 1))\n return inner.types.every((member) => contains(outer, member))\n}\n\n/** Whether a union certainly holds a literal or base kind already. */\nfunction contains(union: UnionType, type: Type): boolean {\n if (type.kind !== 'literal' && !PRIMITIVE_KINDS.has(type.kind)) return false\n const index = unionIndex(union)\n if (index.open) return false\n if (type.kind === 'literal')\n return index.literals.has(keyOf(type)) || index.kinds.has(widen(type).kind)\n return type.kind !== 'never' && index.kinds.has(type.kind)\n}\n\nfunction unionOfAll(types: readonly Type[], collapse: boolean): Type {\n const flat: Type[] = []\n const visit = (type: Type): void => {\n if (type.kind === 'union') type.types.forEach(visit)\n else if (type.kind !== 'never') flat.push(type)\n }\n types.forEach(visit)\n chargeTypeWork(flat.length)\n if (flat.some((type) => type.kind === 'any')) return ANY\n // A literal next to its own base kind is redundant.\n const baseKinds = new Set<string>()\n for (const type of flat) if (type.kind !== 'literal') baseKinds.add(type.kind)\n if (collapse && flat.length > MAX_UNION_LITERALS) {\n const counts = new Map<string, number>()\n for (const type of flat) {\n if (type.kind !== 'literal' || !FRESH.has(type)) continue\n const kind = widen(type).kind\n const count = (counts.get(kind) ?? 0) + 1\n counts.set(kind, count)\n if (count > MAX_UNION_LITERALS) baseKinds.add(kind)\n }\n const bases: Readonly<Record<string, Type>> = {\n string: STRING,\n number: NUMBER,\n boolean: BOOLEAN,\n }\n for (const kind of counts.keys()) {\n const base = bases[kind]\n if (base !== undefined && baseKinds.has(kind) && !flat.some((type) => type.kind === kind))\n flat.push(base)\n }\n }\n const out: Type[] = []\n const seen = new Map<number, Type[]>()\n for (const type of flat) {\n if (type.kind === 'literal' && baseKinds.has(widen(type).kind)) continue\n const h = typeHash(type)\n const bucket = seen.get(h)\n if (bucket?.some((existing) => sameType(existing, type)) === true) continue\n if (bucket === undefined) seen.set(h, [type])\n else bucket.push(type)\n out.push(type)\n }\n if (out.length === 0) return NEVER\n if (out.length === 1) return out[0]\n // Not frozen: freezing a large member array costs more than building it, and\n // checker types are only read (a program's result type is frozen when exposed).\n const union: UnionType = { kind: 'union', types: out }\n if (interned === undefined || out.length < INTERN_MIN_MEMBERS) return union\n const h = typeHash(union)\n const bucket = interned.get(h)\n const existing = bucket?.find((candidate) => sameType(candidate, union))\n if (existing !== undefined) return existing\n if (bucket === undefined) interned.set(h, [union])\n else bucket.push(union)\n return union\n}\n\nconst assignableMemo = [\n new WeakMap<Type, WeakMap<Type, boolean>>(),\n new WeakMap<Type, WeakMap<Type, boolean>>(),\n]\n\n/**\n * Whether every value of `source` is a valid `target` (gradual: `any` both ways).\n * Declared object types are open: a value may carry keys its type does not list.\n */\nexport function isAssignable(source: Type, target: Type): boolean {\n return assignableIn(source, target, false)\n}\n\n/**\n * Like isAssignable, but only what the types prove: an open object that does\n * not list an optional key of the target may hold that key with any value, so\n * it is accepted gradually (checked at run time) but not proven.\n */\nexport function isProvenAssignable(source: Type, target: Type): boolean {\n return assignableIn(source, target, true)\n}\n\nfunction assignableIn(source: Type, target: Type, proven: boolean): boolean {\n if (source === target) return true\n if (source.kind === 'any' || target.kind === 'any' || source.kind === 'never') return true\n if (target.kind === 'var' || source.kind === 'var') return true\n // Charged even when memoized: a loop over union members pays for every step.\n chargeTypeWork(1)\n const memos = assignableMemo[proven ? 1 : 0]\n let memo = memos.get(source)\n const cached = memo?.get(target)\n if (cached !== undefined) return cached\n const result = assignable(source, target, proven)\n if (memo === undefined) memos.set(source, (memo = new WeakMap()))\n memo.set(target, result)\n return result\n}\n\n/** A type's members indexed for membership and overlap tests. */\ninterface UnionIndex {\n /** Literal members, by literalKey. */\n readonly literals: ReadonlySet<string>\n /** Base kinds of the literal members. */\n readonly literalKinds: ReadonlySet<string>\n /** Kinds of the other members (base kinds such as string, and list, map, ...). */\n readonly kinds: ReadonlySet<string>\n /** Members that are neither literals nor base kinds (lists, maps, opaques, functions). */\n readonly others: readonly Type[]\n /** A member admits every value (`any` or a type variable). */\n readonly open: boolean\n}\n\nconst PRIMITIVE_KINDS: ReadonlySet<string> = new Set([\n 'null',\n 'boolean',\n 'number',\n 'string',\n 'timestamp',\n 'duration',\n 'never',\n])\n\nconst unionIndexMemo = new WeakMap<Type, UnionIndex>()\n\nfunction literalKey(value: string | number | boolean): string {\n return `${typeof value}:${String(value)}`\n}\n\nconst literalKeyMemo = new WeakMap<Type, string>()\n\n/** literalKey for a literal type, remembered per type (enum members recur in many unions). */\nfunction keyOf(literal: LiteralType): string {\n let key = literalKeyMemo.get(literal)\n if (key === undefined) literalKeyMemo.set(literal, (key = literalKey(literal.value)))\n return key\n}\n\nfunction unionIndex(type: Type): UnionIndex {\n let index = unionIndexMemo.get(type)\n if (index === undefined) {\n const members = unionMembers(type)\n // Twice the member count: building the sets costs more than most type work.\n chargeTypeWork(2 * members.length)\n const literals = new Set<string>()\n const literalKinds = new Set<string>()\n const kinds = new Set<string>()\n const others: Type[] = []\n let open = false\n for (const member of members) {\n if (member.kind === 'literal') {\n literals.add(keyOf(member))\n literalKinds.add(typeof member.value)\n } else if (member.kind === 'any' || member.kind === 'var') open = true\n else {\n kinds.add(member.kind)\n if (!PRIMITIVE_KINDS.has(member.kind)) others.push(member)\n }\n }\n index = { literals, literalKinds, kinds, others, open }\n unionIndexMemo.set(type, index)\n }\n return index\n}\n\nfunction assignable(source: Type, target: Type, proven: boolean): boolean {\n if (source.kind === 'union') {\n chargeTypeWork(source.types.length)\n return source.types.every((member) => assignableIn(member, target, proven))\n }\n if (target.kind === 'union') {\n const index = unionIndex(target)\n if (index.open) return true\n if (source.kind === 'literal')\n return index.literals.has(keyOf(source)) || index.kinds.has(widen(source).kind)\n if (PRIMITIVE_KINDS.has(source.kind)) return index.kinds.has(source.kind)\n chargeTypeWork(index.others.length)\n return index.others.some((member) => assignableIn(source, member, proven))\n }\n switch (target.kind) {\n case 'literal':\n return source.kind === 'literal' && source.value === target.value\n case 'list':\n return source.kind === 'list' && assignableIn(source.element, target.element, proven)\n case 'map': {\n if (source.kind !== 'map') return false\n const targetKeys = Object.keys(target.fields)\n chargeTypeWork(targetKeys.length)\n // A map literal type holds only its keys: so must anything assigned to it.\n if (isExact(target) && target.rest === undefined) {\n if (!isExact(source) || source.rest !== undefined) return false\n for (const key of Object.keys(source.fields))\n if (!Object.hasOwn(target.fields, key)) return false\n }\n for (const key of targetKeys) {\n const fieldType = target.fields[key]\n const sourceField = fieldOf(source, key)\n if (sourceField !== undefined) {\n if (!assignableIn(sourceField, fieldType, proven)) return false\n } else if (!isNullable(fieldType)) {\n // An absent key reads as null.\n return false\n } else if (source.rest !== undefined) {\n if (!assignableIn(source.rest, fieldType, proven)) return false\n } else if (proven && !isExact(source)) {\n // A declared object may hold this key with a value of any type.\n return false\n }\n }\n if (target.rest !== undefined) {\n const rest = target.rest\n const sourceFields = Object.values(source.fields)\n chargeTypeWork(sourceFields.length)\n for (const fieldType of sourceFields) {\n if (!assignableIn(fieldType, rest, proven)) return false\n }\n if (source.rest !== undefined) return assignableIn(source.rest, rest, proven)\n // A declared object may hold keys it does not list, of any type.\n return isExact(source) || rest.kind === 'any'\n }\n return true\n }\n case 'opaque':\n return source.kind === 'opaque' && source.name === target.name\n case 'function':\n return source.kind === 'function'\n case 'any':\n case 'var':\n return true\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n return (\n source.kind === target.kind ||\n (source.kind === 'literal' && widen(source).kind === target.kind)\n )\n }\n}\n\n/** Whether two types can hold a common value (used for always-false comparisons). */\nconst overlapMemo = new WeakMap<Type, WeakMap<Type, boolean>>()\n\nexport function overlaps(a: Type, b: Type): boolean {\n chargeTypeWork(1)\n let memo = overlapMemo.get(a)\n const cached = memo?.get(b)\n if (cached !== undefined) return cached\n const result = computeOverlaps(unionIndex(a), unionIndex(b))\n if (memo === undefined) overlapMemo.set(a, (memo = new WeakMap()))\n memo.set(b, result)\n return result\n}\n\nfunction computeOverlaps(left: UnionIndex, right: UnionIndex): boolean {\n if (left.open || right.open) return true\n // Literals overlap equal literals or their base kind; other kinds overlap by kind.\n const [small, large] = left.literals.size <= right.literals.size ? [left, right] : [right, left]\n for (const kind of small.kinds) {\n if (large.kinds.has(kind) || large.literalKinds.has(kind)) return true\n }\n let visited = 0\n try {\n for (const literal of small.literals) {\n visited++\n if (large.literals.has(literal) || large.kinds.has(literalBase(literal))) return true\n }\n return false\n } finally {\n chargeTypeWork(visited)\n }\n}\n\n/** The base kind of a literal key from literalKey. */\nfunction literalBase(key: string): string {\n return key.slice(0, key.indexOf(':'))\n}\n\n/** Longest type text shown in messages and hovers; longer text ends in an ellipsis. */\nconst MAX_TYPE_TEXT = 1000\n\n/** Human-readable type text, e.g. `{ name: string, tags: string[] } | null`. */\nconst formatMemo = new WeakMap<Type, string>()\n\nexport function formatType(type: Type, maxLength = MAX_TYPE_TEXT): string {\n // Messages repeat a type's text (every unknown field of one large object).\n if (maxLength === MAX_TYPE_TEXT) {\n let text = formatMemo.get(type)\n if (text === undefined) formatMemo.set(type, (text = formatTypeText(type, maxLength)))\n return text\n }\n return formatTypeText(type, maxLength)\n}\n\n/**\n * Longest type text in a diagnostic message. A message can name a large object\n * type, and a source can repeat the mistake thousands of times, so a short cap\n * keeps diagnostics (and their JSON) near the size of the source.\n */\nconst MESSAGE_TYPE_TEXT = 120\n\nconst typeTexts = new WeakMap<Type, string>()\n\n/** A type's text for a diagnostic message, shortened with an ellipsis. */\nexport function typeText(type: Type): string {\n let text = typeTexts.get(type)\n if (text === undefined) typeTexts.set(type, (text = formatType(type, MESSAGE_TYPE_TEXT)))\n return text\n}\n\nconst HIGH_SURROGATE_FIRST = 0xd800\nconst HIGH_SURROGATE_LAST = 0xdbff\n\nfunction formatTypeText(type: Type, maxLength: number): string {\n let out = ''\n let full = false\n const emit = (text: string): boolean => {\n if (full) return false\n if (out.length + text.length > maxLength) {\n let keep = Math.max(0, maxLength - out.length)\n // Never end between the halves of a surrogate pair.\n const last = text.charCodeAt(keep - 1)\n if (keep > 0 && last >= HIGH_SURROGATE_FIRST && last <= HIGH_SURROGATE_LAST) keep--\n out += `${text.slice(0, keep)}…`\n full = true\n return false\n }\n out += text\n return true\n }\n const write = (node: Type): void => {\n if (full) return\n switch (node.kind) {\n case 'literal':\n emit(JSON.stringify(node.value))\n return\n case 'list': {\n const wrap = node.element.kind === 'union' || node.element.kind === 'function'\n if (wrap) emit('(')\n write(node.element)\n emit(wrap ? ')[]' : '[]')\n return\n }\n case 'map': {\n const keys = Object.keys(node.fields)\n if (keys.length === 0 && node.rest === undefined) {\n emit('{}')\n return\n }\n emit('{ ')\n keys.forEach((k, i) => {\n if (full) return\n if (i > 0) emit(', ')\n emit(`${/^[A-Za-z_$][\\w$]*$/u.test(k) ? k : JSON.stringify(k)}: `)\n write(node.fields[k])\n })\n if (node.rest !== undefined) {\n if (keys.length > 0) emit(', ')\n emit('[key: string]: ')\n write(node.rest)\n }\n emit(' }')\n return\n }\n case 'union':\n node.types.forEach((member, i) => {\n if (full) return\n if (i > 0) emit(' | ')\n write(member)\n })\n return\n case 'opaque':\n emit(node.name)\n return\n case 'function':\n emit('(')\n node.params.forEach((param, i) => {\n if (full) return\n if (i > 0) emit(', ')\n write(param)\n })\n emit(') => ')\n write(node.result)\n return\n case 'var':\n emit(node.name)\n return\n case 'any':\n case 'boolean':\n case 'duration':\n case 'never':\n case 'null':\n case 'number':\n case 'string':\n case 'timestamp':\n default:\n emit(node.kind)\n }\n }\n write(type)\n return out\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ //#region src/version.ts
2
+ /** This package's version, recorded in artifacts. A test keeps it equal to package.json. */
3
+ const VERSION = "1.2.0";
4
+ //#endregion
5
+ export { VERSION };
6
+
7
+ //# sourceMappingURL=version.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.mjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["/** This package's version, recorded in artifacts. A test keeps it equal to package.json. */\nexport const VERSION = '1.2.0'\n"],"mappings":";;AACA,MAAa,UAAU"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bonsai-js",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "A safe, zero-dependency expression language for rules, filters, and templates",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -16,6 +16,15 @@
16
16
  ],
17
17
  "query": [
18
18
  "./dist/query/index.d.mts"
19
+ ],
20
+ "runtime": [
21
+ "./dist/runtime/index.d.mts"
22
+ ],
23
+ "runtime/core": [
24
+ "./dist/runtime/core.d.mts"
25
+ ],
26
+ "builtins": [
27
+ "./dist/builtins/index.d.mts"
19
28
  ]
20
29
  }
21
30
  },
@@ -39,6 +48,21 @@
39
48
  "types": "./dist/query/index.d.mts",
40
49
  "import": "./dist/query/index.mjs",
41
50
  "default": "./dist/query/index.mjs"
51
+ },
52
+ "./runtime": {
53
+ "types": "./dist/runtime/index.d.mts",
54
+ "import": "./dist/runtime/index.mjs",
55
+ "default": "./dist/runtime/index.mjs"
56
+ },
57
+ "./runtime/core": {
58
+ "types": "./dist/runtime/core.d.mts",
59
+ "import": "./dist/runtime/core.mjs",
60
+ "default": "./dist/runtime/core.mjs"
61
+ },
62
+ "./builtins": {
63
+ "types": "./dist/builtins/index.d.mts",
64
+ "import": "./dist/builtins/index.mjs",
65
+ "default": "./dist/builtins/index.mjs"
42
66
  }
43
67
  },
44
68
  "files": [
@@ -155,7 +179,7 @@
155
179
  "smol-toml": "1.8.0",
156
180
  "source-map-js": "1.2.2",
157
181
  "tinypool": "2.1.2",
158
- "vite": "7.3.6",
182
+ "vite": "7.3.7",
159
183
  "vue": "3.5.43"
160
184
  }
161
185
  }