@jfdevelops/multi-step-form-core 1.0.0-alpha.17 → 1.0.0-alpha.18

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 (147) hide show
  1. package/dist/_internals.cjs +14 -0
  2. package/dist/_internals.d.cts +4 -0
  3. package/dist/_internals.d.mts +4 -0
  4. package/dist/_internals.mjs +5 -0
  5. package/dist/index.cjs +49 -0
  6. package/dist/index.d.cts +14 -0
  7. package/dist/index.d.mts +14 -0
  8. package/dist/index.mjs +16 -0
  9. package/dist/internals/step-schema.cjs +389 -0
  10. package/dist/internals/step-schema.cjs.map +1 -0
  11. package/dist/internals/step-schema.d.cts +41 -0
  12. package/dist/internals/step-schema.d.cts.map +1 -0
  13. package/dist/internals/step-schema.d.mts +41 -0
  14. package/dist/internals/step-schema.d.mts.map +1 -0
  15. package/dist/internals/step-schema.mjs +389 -0
  16. package/dist/internals/step-schema.mjs.map +1 -0
  17. package/dist/internals/utils.cjs +94 -0
  18. package/dist/internals/utils.cjs.map +1 -0
  19. package/dist/internals/utils.d.cts +27 -0
  20. package/dist/internals/utils.d.cts.map +1 -0
  21. package/dist/internals/utils.d.mts +27 -0
  22. package/dist/internals/utils.d.mts.map +1 -0
  23. package/dist/internals/utils.mjs +91 -0
  24. package/dist/internals/utils.mjs.map +1 -0
  25. package/dist/observable.cjs +44 -0
  26. package/dist/observable.cjs.map +1 -0
  27. package/dist/observable.d.cts +26 -0
  28. package/dist/observable.d.cts.map +1 -0
  29. package/dist/observable.d.mts +26 -0
  30. package/dist/observable.d.mts.map +1 -0
  31. package/dist/observable.mjs +44 -0
  32. package/dist/observable.mjs.map +1 -0
  33. package/dist/schema.cjs +68 -0
  34. package/dist/schema.cjs.map +1 -0
  35. package/dist/schema.d.cts +28 -0
  36. package/dist/schema.d.cts.map +1 -0
  37. package/dist/schema.d.mts +28 -0
  38. package/dist/schema.d.mts.map +1 -0
  39. package/dist/schema.mjs +67 -0
  40. package/dist/schema.mjs.map +1 -0
  41. package/dist/steps/fields.cjs +23 -0
  42. package/dist/steps/fields.cjs.map +1 -0
  43. package/dist/steps/fields.d.cts +18 -0
  44. package/dist/steps/fields.d.cts.map +1 -0
  45. package/dist/steps/fields.d.mts +18 -0
  46. package/dist/steps/fields.d.mts.map +1 -0
  47. package/dist/steps/fields.mjs +18 -0
  48. package/dist/steps/fields.mjs.map +1 -0
  49. package/dist/steps/index.cjs +4 -0
  50. package/dist/steps/index.mjs +6 -0
  51. package/dist/steps/schema.cjs +194 -0
  52. package/dist/steps/schema.cjs.map +1 -0
  53. package/dist/steps/schema.d.cts +124 -0
  54. package/dist/steps/schema.d.cts.map +1 -0
  55. package/dist/steps/schema.d.mts +124 -0
  56. package/dist/steps/schema.d.mts.map +1 -0
  57. package/dist/steps/schema.mjs +194 -0
  58. package/dist/steps/schema.mjs.map +1 -0
  59. package/dist/steps/types.cjs +33 -0
  60. package/dist/steps/types.cjs.map +1 -0
  61. package/dist/steps/types.d.cts +332 -0
  62. package/dist/steps/types.d.cts.map +1 -0
  63. package/dist/steps/types.d.mts +332 -0
  64. package/dist/steps/types.d.mts.map +1 -0
  65. package/dist/steps/types.mjs +27 -0
  66. package/dist/steps/types.mjs.map +1 -0
  67. package/dist/steps/utils.cjs +96 -0
  68. package/dist/steps/utils.cjs.map +1 -0
  69. package/dist/steps/utils.d.cts +10 -0
  70. package/dist/steps/utils.d.cts.map +1 -0
  71. package/dist/steps/utils.d.mts +10 -0
  72. package/dist/steps/utils.d.mts.map +1 -0
  73. package/dist/steps/utils.mjs +94 -0
  74. package/dist/steps/utils.mjs.map +1 -0
  75. package/dist/storage.cjs +68 -0
  76. package/dist/storage.cjs.map +1 -0
  77. package/dist/storage.d.cts +33 -0
  78. package/dist/storage.d.cts.map +1 -0
  79. package/dist/storage.d.mts +33 -0
  80. package/dist/storage.d.mts.map +1 -0
  81. package/dist/storage.mjs +67 -0
  82. package/dist/storage.mjs.map +1 -0
  83. package/dist/subscribable.cjs +25 -0
  84. package/dist/subscribable.cjs.map +1 -0
  85. package/dist/subscribable.d.cts +14 -0
  86. package/dist/subscribable.d.cts.map +1 -0
  87. package/dist/subscribable.d.mts +14 -0
  88. package/dist/subscribable.d.mts.map +1 -0
  89. package/dist/subscribable.mjs +24 -0
  90. package/dist/subscribable.mjs.map +1 -0
  91. package/dist/utils/casing.cjs +63 -0
  92. package/dist/utils/casing.cjs.map +1 -0
  93. package/dist/utils/casing.d.cts +40 -0
  94. package/dist/utils/casing.d.cts.map +1 -0
  95. package/dist/utils/casing.d.mts +40 -0
  96. package/dist/utils/casing.d.mts.map +1 -0
  97. package/dist/utils/casing.mjs +57 -0
  98. package/dist/utils/casing.mjs.map +1 -0
  99. package/dist/utils/field-types.cjs +23 -0
  100. package/dist/utils/field-types.cjs.map +1 -0
  101. package/dist/utils/field-types.d.cts +11 -0
  102. package/dist/utils/field-types.d.cts.map +1 -0
  103. package/dist/utils/field-types.d.mts +11 -0
  104. package/dist/utils/field-types.d.mts.map +1 -0
  105. package/dist/utils/field-types.mjs +20 -0
  106. package/dist/utils/field-types.mjs.map +1 -0
  107. package/dist/utils/helpers.cjs +30 -0
  108. package/dist/utils/helpers.cjs.map +1 -0
  109. package/dist/utils/helpers.mjs +27 -0
  110. package/dist/utils/helpers.mjs.map +1 -0
  111. package/dist/utils/invariant.cjs +18 -0
  112. package/dist/utils/invariant.cjs.map +1 -0
  113. package/dist/utils/invariant.d.cts +5 -0
  114. package/dist/utils/invariant.d.cts.map +1 -0
  115. package/dist/utils/invariant.d.mts +5 -0
  116. package/dist/utils/invariant.d.mts.map +1 -0
  117. package/dist/utils/invariant.mjs +17 -0
  118. package/dist/utils/invariant.mjs.map +1 -0
  119. package/dist/utils/logger.cjs +58 -0
  120. package/dist/utils/logger.cjs.map +1 -0
  121. package/dist/utils/logger.d.cts +53 -0
  122. package/dist/utils/logger.d.cts.map +1 -0
  123. package/dist/utils/logger.d.mts +53 -0
  124. package/dist/utils/logger.d.mts.map +1 -0
  125. package/dist/utils/logger.mjs +56 -0
  126. package/dist/utils/logger.mjs.map +1 -0
  127. package/dist/utils/path.cjs +331 -0
  128. package/dist/utils/path.cjs.map +1 -0
  129. package/dist/utils/path.d.cts +139 -0
  130. package/dist/utils/path.d.cts.map +1 -0
  131. package/dist/utils/path.d.mts +139 -0
  132. package/dist/utils/path.d.mts.map +1 -0
  133. package/dist/utils/path.mjs +325 -0
  134. package/dist/utils/path.mjs.map +1 -0
  135. package/dist/utils/types.d.cts +25 -0
  136. package/dist/utils/types.d.cts.map +1 -0
  137. package/dist/utils/types.d.mts +25 -0
  138. package/dist/utils/types.d.mts.map +1 -0
  139. package/dist/utils/validator.cjs +12 -0
  140. package/dist/utils/validator.cjs.map +1 -0
  141. package/dist/utils/validator.d.cts +77 -0
  142. package/dist/utils/validator.d.cts.map +1 -0
  143. package/dist/utils/validator.d.mts +77 -0
  144. package/dist/utils/validator.d.mts.map +1 -0
  145. package/dist/utils/validator.mjs +11 -0
  146. package/dist/utils/validator.mjs.map +1 -0
  147. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.mjs","names":["path","finalPaths: string[]","result: Record<string, unknown>","paths: string[]","parts: string[]","m: RegExpExecArray | null","node: any","lastFn: ExpectedTransformFn | undefined","mismatches: Mismatch[]","lines: string[]","clone","keys: string[]"],"sources":["../../src/utils/path.ts"],"sourcesContent":["import type { DeepKeys, unionHelpers } from './types';\n\nexport namespace path {\n type getBy<T, TPath extends string> = TPath extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? getBy<T[K], Rest>\n : never\n : TPath extends keyof T\n ? T[TPath]\n : never;\n\n type buildFromPath<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? { [Key in K]: buildFromPath<getBy<T, K>, Rest> }\n : P extends keyof T\n ? { [Key in P]: T[P] }\n : never;\n\n /**\n * Does P have any ancestor path in All? (i.e. some Q in All such that Q is a\n * strict prefix of P)\n */\n type hasAncestor<P extends string, All extends string> = true extends (\n All extends string\n ? All extends P\n ? false // same path, not an ancestor\n : P extends `${All}.${string}`\n ? true\n : false\n : never\n )\n ? true\n : false;\n\n /**\n * Normalize a union of paths by removing those that have an ancestor path\n * also in the union.\n *\n * Example:\n * NormalizePaths<'foo.bar.baz' | 'foo.bar'> -> 'foo.bar'\n * NormalizePaths<'foo.bar' | 'other'> -> 'foo.bar' | 'other'\n */\n type normalize<\n Paths extends string,\n All extends string = Paths\n > = Paths extends string\n ? hasAncestor<Paths, All> extends true\n ? never\n : Paths\n : never;\n\n // helper to distribute BuildFromPath over union\n type distributeAndBuild<T, Paths extends string> = Paths extends unknown\n ? buildFromPath<T, Paths>\n : never;\n\n export type generateObjectConfig<T> = {\n [K in keyof T]: T[K] extends object\n ? // K's value is an object: allow stopping at K, or going deeper\n { [P in K]: true } | { [P in K]: generateObjectConfig<T[K]> }\n : // K's value is not object: can only stop at K\n { [P in K]: true };\n }[keyof T];\n export type objectToPath<O> = {\n [K in keyof O]: O[K] extends true\n ? K & string\n : O[K] extends object\n ? `${K & string}.${objectToPath<O[K]>}`\n : never;\n }[keyof O];\n\n /**\n * Pick by paths:\n * - Normalize the paths (remove descendants when parent also present)\n * - If only one normalized path:\n * return GetByPath<T, P> (relative type)\n * - If multiple:\n * intersect root-built shapes for each normalized path\n *\n * @example\n * ```ts\n * type User = {\n * foo: {\n * bar: {\n * baz: number;\n * qux: string;\n * };\n * };\n * other: string;\n * };\n *\n * type Test1 = PickByPaths<User, 'foo.bar'>;\n * // { baz: number; qux: string } ✅ relative object at foo.bar\n *\n * type Test2 = PickByPaths<User, 'foo.bar.baz'>;\n * // number ✅ leaf type\n *\n * type Test3 = PickByPaths<User, 'foo.bar' | 'other'>;\n * // { foo: { bar: { baz: number; qux: string } } } & { other: string } ✅\n *\n * type Test4 = PickByPaths<User, 'foo.bar.baz' | 'foo.bar' | 'other'>;\n * // { baz: number; qux: string } ✅ parent 'foo.bar' wins, relative\n * ```\n */\n export type pickBy<\n T,\n Paths extends DeepKeys<T>\n > = normalize<Paths> extends infer normalized extends string\n ? unionHelpers.is<normalized> extends true\n ? unionHelpers.toIntersection<distributeAndBuild<T, normalized>>\n : getBy<T, normalized>\n : never;\n\n function getBy(obj: any, path: string): any {\n return path\n .split('.')\n .reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n }\n export function setBy<\n def extends Record<string, unknown>,\n path extends DeepKeys<def>\n >(target: def, path: path, value: unknown) {\n const keys = path.split('.');\n let current = target;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (i === keys.length - 1) {\n // last key -> assign/merge\n if (\n current[k] !== undefined &&\n typeof current[k] === 'object' &&\n typeof value === 'object' &&\n value !== null\n ) {\n Object.assign(current[k] as Record<string, unknown>, value);\n } else {\n (current[k] as any) = value;\n }\n } else {\n if (typeof current[k] !== 'object' || current[k] === null) {\n (current[k] as any) = {};\n }\n (current as any) = current[k];\n }\n }\n\n return current;\n }\n\n // Runtime: normalize paths (drop descendants when ancestor exists)\n export function normalizePaths(...paths: string[]) {\n // Sort by depth (deepest first), so longer paths come before their parents.\n const sorted = [...paths].sort(\n (a, b) => b.split('.').length - a.split('.').length\n );\n\n const finalPaths: string[] = [];\n\n for (const path of sorted) {\n // If the path is contained inside another selected deeper path, skip it\n const isCovered = finalPaths.some((p) => p.startsWith(path + '.'));\n\n if (!isCovered) {\n finalPaths.push(path);\n }\n }\n\n // The order may not matter, but returning in shallow-to-deep order feels natural.\n return finalPaths.reverse();\n }\n\n /**\n * pickByPaths:\n * - paths can be a union of string literals\n * - return type is PickByPaths<T, Paths>\n */\n export function pickBy<def, paths extends DeepKeys<def>>(\n obj: def,\n ...paths: paths[]\n ): pickBy<def, paths> {\n const norm = normalizePaths(...paths);\n\n // Single normalized path -> return relative value at that path\n if (norm.length === 1) {\n return getBy(obj, norm[0]) as pickBy<def, paths>;\n }\n\n // Multiple normalized paths -> build root-based object and intersect\n const result: Record<string, unknown> = {};\n\n for (const p of norm) {\n const value = getBy(obj, p);\n\n setBy(result, p, value);\n }\n\n return result as pickBy<def, paths>;\n }\n\n /**\n * Creates an array of all deep paths in an object.\n * Recursively traverses the object and returns all possible dot-separated paths.\n *\n * @example\n * ```ts\n * const obj = {\n * foo: {\n * bar: {\n * baz: 1,\n * qux: 2\n * }\n * },\n * other: 'value'\n * };\n *\n * createPaths(obj);\n * // ['foo', 'foo.bar', 'foo.bar.baz', 'foo.bar.qux', 'other']\n * ```\n */\n export function createDeep<T>(obj: T): DeepKeys<T>[] {\n const paths: string[] = [];\n\n function traverse(current: any, prefix: string = ''): void {\n if (current === null || current === undefined) {\n return;\n }\n\n if (typeof current !== 'object' || Array.isArray(current)) {\n return;\n }\n\n const keys = Object.keys(current);\n for (const key of keys) {\n const path = prefix ? `${prefix}.${key}` : key;\n paths.push(path);\n\n const value = current[key];\n if (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n traverse(value, path);\n }\n }\n }\n\n traverse(obj);\n return paths as DeepKeys<T>[];\n }\n\n export type MismatchReason =\n | 'value-mismatch'\n | 'type-mismatch'\n | 'missing-key'\n | 'extra-key';\n export interface Mismatch {\n path: string;\n expected: unknown;\n actual: unknown;\n reason: MismatchReason;\n }\n\n export interface CompareResult {\n ok: boolean;\n mismatches: Mismatch[];\n }\n type ExpectedTransformFn<TValue = unknown> = (\n value: TValue,\n path: string\n ) => unknown;\n /**\n * Transform config:\n * - a single function: applies to the whole T\n * - or an object shaped like T, where values are either:\n * - functions (apply at/under that node)\n * - nested objects continuing the shape\n */\n export type ExpectedTransformConfig<T, V = unknown> =\n | ExpectedTransformFn<V>\n | { [K in keyof T]?: ExpectedTransformConfig<T[K], T[K]> };\n export interface EqualsOptions<T> {\n /**\n * How to transform the \"expected\" field in mismatches.\n * If omitted, a default type-ish formatting is used.\n */\n transformExpected?: ExpectedTransformConfig<T>;\n }\n interface DeepCompareOptions<T> {\n includeValueMismatch?: boolean;\n\n transformExpected?: ExpectedTransformConfig<T>;\n }\n\n function defaultExpectedFormat(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'Array';\n const t = typeof value;\n if (t !== 'object') return t; // 'string', 'number', etc.\n const ctor = (value as any)?.constructor?.name;\n return ctor && ctor !== 'Object' ? ctor : 'object';\n }\n\n function splitPath(path: string): string[] {\n if (!path) return [];\n const parts: string[] = [];\n const regex = /[^.[\\]]+|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = regex.exec(path))) {\n parts.push(m[1] ?? m[0]);\n }\n return parts;\n }\n\n function getTransformFunction<T>(\n root: ExpectedTransformConfig<T> | undefined,\n path: string\n ): ExpectedTransformFn | undefined {\n if (!root) return undefined;\n\n if (typeof root === 'function') {\n // TS now knows this is ExpectedTransformFn, but we can be explicit:\n return root as ExpectedTransformFn;\n }\n\n const segments = splitPath(path);\n let node: any = root;\n let lastFn: ExpectedTransformFn | undefined;\n\n for (const seg of segments) {\n if (!node) break;\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n\n node = node[seg];\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n }\n\n return lastFn;\n }\n\n function formatExpected<T>(\n rawExpected: unknown,\n path: string,\n cfg: ExpectedTransformConfig<T> | undefined\n ): unknown {\n const fn = getTransformFunction(cfg, path);\n if (fn) return fn(rawExpected, path);\n return defaultExpectedFormat(rawExpected);\n }\n\n function isObjectLike(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n }\n\n function deepCompare<T>(\n expected: unknown,\n actual: unknown,\n basePath: string,\n mismatches: Mismatch[],\n options: DeepCompareOptions<T>\n ): Mismatch[] {\n // identical (covers primitives + same-ref objects)\n if (expected === actual) {\n return mismatches;\n }\n\n // one is null/undefined OR types not object-like -> primitive / scalar mismatch\n if (\n expected === null ||\n actual === null ||\n typeof expected !== 'object' ||\n typeof actual !== 'object'\n ) {\n const path = basePath || '(root)';\n\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n // arrays\n if (Array.isArray(expected) || Array.isArray(actual)) {\n if (!Array.isArray(expected) || !Array.isArray(actual)) {\n const path = basePath || '(root)';\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n // Both values are arrays.\n // We *do* compare element structure/types where both have an index, but we\n // intentionally ignore length differences (no missing/extra index errors).\n const maxLen = expected.length;\n\n for (let i = 0; i < maxLen; i++) {\n const expVal = expected[i];\n const actVal = actual[i];\n const path = basePath === '' ? `[${i}]` : `${basePath}[${i}]`;\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n return mismatches;\n }\n\n // plain objects\n if (isObjectLike(expected) && isObjectLike(actual)) {\n const expKeys = Object.keys(expected);\n const actKeys = Object.keys(actual);\n\n for (const key of expKeys) {\n const expVal = (expected as any)[key];\n const actVal = (actual as any)[key];\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (!(key in actual)) {\n mismatches.push({\n path,\n expected: formatExpected(expVal, path, options.transformExpected),\n actual: undefined,\n reason: 'missing-key',\n });\n continue;\n }\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n for (const key of actKeys) {\n if (!(key in expected)) {\n const path = basePath ? `${basePath}.${key}` : key;\n mismatches.push({\n path,\n expected: undefined,\n actual: (actual as any)[key],\n reason: 'extra-key',\n });\n }\n }\n\n return mismatches;\n }\n\n const path = basePath || '(root)';\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n } else if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n export function equalsAtPaths<def, paths extends DeepKeys<def>>(\n obj: def,\n paths: paths[],\n actual: pickBy<def, paths>,\n options?: EqualsOptions<def>\n ): CompareResult {\n // expected comes from obj at the given paths\n const expected = pickBy<def, paths>(obj, ...paths);\n\n const mismatches: Mismatch[] = [];\n\n const basePath = paths.length === 1 ? (paths[0] as string) : '';\n\n deepCompare<def>(expected, actual, basePath, mismatches, {\n transformExpected: options?.transformExpected,\n });\n\n return {\n ok: mismatches.length === 0,\n mismatches,\n };\n }\n\n function formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (typeof v === 'string') return JSON.stringify(v); // add quotes\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n }\n\n function formatReason(m: Mismatch): string {\n switch (m.reason) {\n case 'missing-key':\n return 'Missing key';\n case 'extra-key':\n return 'Extra key';\n case 'type-mismatch':\n return 'Type mismatch';\n case 'value-mismatch':\n return 'Value mismatch';\n default:\n return m.reason;\n }\n }\n\n /**\n * Turn a CompareResult into a pretty error string.\n */\n export function formatMismatches(result: CompareResult) {\n if (result.ok || result.mismatches.length === 0) {\n return 'No mismatches.';\n }\n\n const lines: string[] = [];\n\n for (const m of result.mismatches) {\n lines.push(\n `\\n● ${formatReason(m)} at \"${m.path}\":`,\n ` expected: ${formatValue(m.expected)}`,\n ` actual: ${formatValue(m.actual)}`,\n '' // blank line between entries\n );\n }\n\n // trim trailing blank line\n if (lines.at(-1) === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Convenience: log to console.error.\n */\n export function printMismatches(result: CompareResult): void {\n const msg = formatMismatches(result);\n if (msg !== 'No mismatches.') {\n console.error(msg);\n }\n }\n\n function setAtImmutable<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n >(root: T, path: path, value: pickBy<T, path>) {\n const keys = path.split('.');\n\n function helper(current: T, idx: number): any {\n const key = keys[idx];\n const resolvedCurrent = Array.isArray(current)\n ? [...current]\n : { ...current };\n\n if (idx === keys.length - 1) {\n let clone =\n current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: value,\n };\n\n return clone;\n }\n\n const next =\n current && typeof current === 'object' ? current[key] : undefined;\n\n const updatedChild = helper((next as T) ?? ({} as T), idx + 1);\n\n let clone = current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: updatedChild,\n };\n\n return clone;\n }\n\n return helper(root, 0);\n }\n\n export function findMissingPaths<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(obj: obj, paths: Array<path>, actual: pickBy<obj, path>) {\n const keys: string[] = [];\n\n for (const path of paths) {\n const value = pickBy(obj, path);\n const expectedKeys = createDeep(value);\n const actualKeys = createDeep(actual);\n const missingKeys = expectedKeys\n .filter((key) => !actualKeys.includes(key))\n .map((key) => `${path}.${key}`);\n\n keys.push(...missingKeys);\n }\n\n return keys as Array<DeepKeys<obj>>;\n }\n\n export type updateAtOptions<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n > = {\n obj: T;\n paths: Array<path>;\n value: pickBy<T, path>;\n partial?: boolean;\n };\n\n function getPathThatMatter(path: string) {\n // Only works when updating a `defaultValue`\n // TODO make this work with the entire object - will need to figure out some way to normalize\n const [, ...rest] = path.split('.defaultValue.');\n\n return rest.join('.');\n }\n\n export function joinAtPath<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(paths: Array<path>, obj: obj, value: pickBy<obj, path>) {\n if (paths.length === 1) {\n const [path] = paths;\n const missingData = pickBy(obj, ...paths);\n const setPath = getPathThatMatter(path);\n\n // if (last) {\n // const data = setBy(\n // value as Record<string, unknown>,\n // last,\n // missingData\n // ) as pickBy<obj, path>;\n\n // return data;\n // }\n\n const data = setBy(\n value as Record<string, unknown>,\n setPath,\n missingData\n ) as pickBy<obj, path>;\n\n return data;\n }\n\n if (paths.length > 1) {\n let resolvedValue = {} as Record<string, unknown>;\n\n for (const path of paths) {\n const pathThatMatters = getPathThatMatter(path);\n const missing = joinAtPath([path], obj, value);\n const valueAtPathThatMatters = getBy(obj, path);\n\n // This check is here to ensure `resolvedValue` will only have\n // nested properties where they belong.\n if (\n Object.keys(resolvedValue).length > 0 &&\n valueAtPathThatMatters !== 'undefined'\n ) {\n const dataAtPath = pickBy(obj, path);\n const [key] = pathThatMatters.split('.');\n\n if (typeof dataAtPath === 'object') {\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n [key]: {\n ...(resolvedValue[key] as Record<string, unknown>),\n ...missing,\n },\n };\n }\n }\n\n continue;\n }\n\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n ...missing,\n };\n }\n }\n\n return resolvedValue as pickBy<obj, path>;\n }\n }\n\n export function updateAt<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(options: updateAtOptions<obj, path>) {\n const { obj, partial, paths, value } = options;\n const norm = normalizePaths(...paths);\n if (norm.length === 0) return obj;\n\n let result = obj;\n let resolvedValue = value;\n\n if (partial) {\n const missingPaths = findMissingPaths(obj, paths, value);\n\n const missingData = joinAtPath(\n missingPaths as Array<path>,\n obj,\n resolvedValue\n );\n\n resolvedValue = {\n ...(resolvedValue as Record<string, unknown>),\n ...(missingData as Record<string, unknown>),\n } as pickBy<obj, path>;\n }\n\n if (norm.length === 1) {\n // single path: value is relative at that path\n const path = norm[0] as DeepKeys<obj>;\n\n result = setAtImmutable(result, path, resolvedValue as never);\n\n return result;\n }\n\n // multiple paths:\n // value is the root-shaped object that contains all those paths\n for (const path of norm) {\n const sub = getBy(value, path);\n\n result = setAtImmutable(result, path as DeepKeys<obj>, sub);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ //#region src/utils/types.d.ts
2
+ type Expand<T> = T extends object ? T extends infer O ? O extends Function ? O : { [K in keyof O]: O[K] } : never : T;
3
+ type Constrain<T, TConstraint, TDefault = TConstraint> = (T extends TConstraint ? T : never) | TDefault;
4
+ type SetDefaultString<T extends string, Default extends T> = Default;
5
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
6
+ type Override<T extends object, TKey extends keyof T, TData> = Prettify<{ [K in keyof T as K extends TKey ? never : K]: T[K] } & { [K in TKey as {} extends Pick<T, K> ? K : never]?: TData } & { [K in TKey as {} extends Pick<T, K> ? never : K]: TData }>;
7
+ type Split<S extends string, Delimiter extends string> = S extends `${infer First}${Delimiter}${infer Rest}` ? [First, ...Split<Rest, Delimiter>] : [S];
8
+ type Join<T extends string[], Delimiter extends string> = T extends [infer First extends string] ? First : T extends [infer First extends string, ...infer Rest extends string[]] ? `${First}${Delimiter}${Join<Rest, Delimiter>}` : never;
9
+ declare namespace unionHelpers {
10
+ /**
11
+ * Checks if `T` is a union.
12
+ */
13
+ type is<T, U = T> = (T extends unknown ? (k: T) => void : never) extends ((k: infer I) => void) ? [U] extends [I] ? false : true : never;
14
+ type toIntersection<U> = (U extends any ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
15
+ }
16
+ declare namespace objectHelpers {
17
+ type isObject<T> = T extends object ? T extends any[] ? false : T extends Function ? false : true : false;
18
+ }
19
+ type DeepKeys<T> = T extends object ? T extends readonly any[] | Date ? never : { [K in keyof T & string]: K | (T[K] extends object ? T[K] extends readonly any[] | Date ? never : `${K}.${DeepKeys<T[K]>}` : never) }[keyof T & string] : never;
20
+ type DeepValue<T, Path extends string> = Path extends `${infer K}.${infer Rest}` ? K extends keyof T ? DeepValue<T[K], Rest> : never : Path extends keyof T ? T[Path] : never;
21
+ type Builtin = Date | Function | Error | RegExp | symbol | bigint | string | number | boolean | undefined | null | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Array<unknown> | Promise<unknown>;
22
+ type DeepPartial<T> = T extends Builtin ? T : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;
23
+ //#endregion
24
+ export { Constrain, DeepKeys, DeepPartial, DeepValue, Expand, Join, Override, SetDefaultString, Split, objectHelpers, unionHelpers };
25
+ //# sourceMappingURL=types.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/utils/types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ //#region src/utils/types.d.ts
2
+ type Expand<T> = T extends object ? T extends infer O ? O extends Function ? O : { [K in keyof O]: O[K] } : never : T;
3
+ type Constrain<T, TConstraint, TDefault = TConstraint> = (T extends TConstraint ? T : never) | TDefault;
4
+ type SetDefaultString<T extends string, Default extends T> = Default;
5
+ type Prettify<T> = { [K in keyof T]: T[K] } & {};
6
+ type Override<T extends object, TKey extends keyof T, TData> = Prettify<{ [K in keyof T as K extends TKey ? never : K]: T[K] } & { [K in TKey as {} extends Pick<T, K> ? K : never]?: TData } & { [K in TKey as {} extends Pick<T, K> ? never : K]: TData }>;
7
+ type Split<S extends string, Delimiter extends string> = S extends `${infer First}${Delimiter}${infer Rest}` ? [First, ...Split<Rest, Delimiter>] : [S];
8
+ type Join<T extends string[], Delimiter extends string> = T extends [infer First extends string] ? First : T extends [infer First extends string, ...infer Rest extends string[]] ? `${First}${Delimiter}${Join<Rest, Delimiter>}` : never;
9
+ declare namespace unionHelpers {
10
+ /**
11
+ * Checks if `T` is a union.
12
+ */
13
+ type is<T, U = T> = (T extends unknown ? (k: T) => void : never) extends ((k: infer I) => void) ? [U] extends [I] ? false : true : never;
14
+ type toIntersection<U> = (U extends any ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
15
+ }
16
+ declare namespace objectHelpers {
17
+ type isObject<T> = T extends object ? T extends any[] ? false : T extends Function ? false : true : false;
18
+ }
19
+ type DeepKeys<T> = T extends object ? T extends readonly any[] | Date ? never : { [K in keyof T & string]: K | (T[K] extends object ? T[K] extends readonly any[] | Date ? never : `${K}.${DeepKeys<T[K]>}` : never) }[keyof T & string] : never;
20
+ type DeepValue<T, Path extends string> = Path extends `${infer K}.${infer Rest}` ? K extends keyof T ? DeepValue<T[K], Rest> : never : Path extends keyof T ? T[Path] : never;
21
+ type Builtin = Date | Function | Error | RegExp | symbol | bigint | string | number | boolean | undefined | null | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Array<unknown> | Promise<unknown>;
22
+ type DeepPartial<T> = T extends Builtin ? T : T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T;
23
+ //#endregion
24
+ export { Constrain, DeepKeys, DeepPartial, DeepValue, Expand, Join, Override, SetDefaultString, Split, objectHelpers, unionHelpers };
25
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/utils/types.ts"],"sourcesContent":[],"mappings":";KAAY,YAAY,mBACpB,8BACY,uBAFJ,MAKU,CALJ,GAKQ,CALR,CAKU,CALV,CAAA,EAAM,GAAA,KAAA,GAQpB,CARoB;AACpB,KAQQ,SARR,CAAA,CAAA,EAAA,WAAA,EAAA,WAQ6C,WAR7C,CAAA,GAAA,CASC,CATD,SASW,WATX,GASyB,CATzB,GAAA,KAAA,CAAA,GAUA,QAVA;AACY,KAUJ,gBAVI,CAAA,UAAA,MAAA,EAAA,gBAU+C,CAV/C,CAAA,GAUoD,OAVpD;KAWX,QARiB,CAAA,CAAA,CAAA,GAAA,QAAI,MASZ,CATY,GASR,CATQ,CASN,CATM,CAAA,EAAE,GAAA,CAAA,CAAA;AAGxB,KAQQ,QARR,CAAA,UAAA,MAAA,EAAA,aAAA,MAQsD,CARtD,EAAA,KAAA,CAAA,GAQkE,QARlE,CAAA,QAAC,MAUW,CAVX,IAUgB,CAVhB,SAU0B,IAV1B,GAAA,KAAA,GAUyC,CAVzC,GAU6C,CAV7C,CAU+C,CAV/C,CAAA,EACL,GAAY,QAWF,IAXuC,IAAA,CAAA,CAAA,SAWpB,IAXoB,CAWf,CAXe,EAWZ,CAXY,CAAA,GAWP,CAXO,GAAA,KAAA,IAWM,KAXN,EAC5C,GAAA,QAYK,IAZK,IAAA,CAAA,CAAA,SAYc,IAZd,CAYmB,CAZnB,EAYsB,CAZtB,CAAA,GAAA,KAAA,GAYmC,CAZnC,GAYuC,KAZvC,EAAc,CAAA;AACzB,KAcQ,KAdR,CAAA,UAAA,MAAA,EAAA,kBAAA,MAAA,CAAA,GAiBA,CAjBA,SAAA,GAAA,KAAA,MAAA,GAiB2B,SAjB3B,GAAA,KAAA,KAAA,EAAA,GAAA,CAkBC,KAlBD,EAAA,GAkBW,KAlBX,CAkBiB,IAlBjB,EAkBuB,SAlBvB,CAAA,CAAA,GAAA,CAmBC,CAnBD,CAAA;AAAQ,KAqBA,IArBA,CAAA,UAAA,MAAA,EAAA,EAAA,kBAAA,MAAA,CAAA,GAqBqD,CArBrD,SAAA,CACA,KAAA,eAAgB,MAAA,CAAgD,GACvE,KAAA,GAuBD,CAvBC,SAAQ,CAAA,KAAA,eAAA,MAAA,EAAA,GAAA,KAAA,cAAA,MAAA,EAAA,CAAA,GAAA,GAwBN,KAxBM,GAwBE,SAxBF,GAwBc,IAxBd,CAwBmB,IAxBnB,EAwByB,SAxBzB,CAAA,EAAA,GAAA,KAAA;AACC,kBA0BG,YAAA,CA1BH;EAAI;;;EAEN,KAAA,EAAA,CAAA,CAAA,EAAQ,IA4BI,CA5BJ,CAAA,GAAA,CA6BhB,CA7BgB,SAAA,OAAA,GAAA,CAAA,CAAA,EA6BQ,CA7BR,EAAA,GAAA,IAAA,GAAA,KAAA,CAAA,UAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAAA,IAAA,CA+Bb,CA/Ba,CAAA,SAAA,CA+BD,CA/BC,CAAA,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA;EAAsC,KAAA,cAAA,CAAA,CAAA,CAAA,GAAA,CAoCtD,CApCsD,SAAA,GAAA,GAAA,CAAA,CAAA,EAoClC,CApCkC,EAAA,GAAA,IAAA,GAAA,KAAA,CAAA,UAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAAA,IAAA,CAAA,GAAA,KAAA;;AAErC,kBAwCJ,aAAA,CAxCI;EAAU,KAAA,QAAA,CAAA,CAAA,CAAA,GA0CH,CA1CG,SAAA,MAAA,GA2CzB,CA3CyB,SAAA,GAAA,EAAA,GAAA,KAAA,GA6CvB,CA7CuB,SA6Cb,QA7Ca,GAAA,KAAA,GAAA,IAAA,GAAA,KAAA;;AAAmB,KAmDtC,QAnDsC,CAAA,CAAA,CAAA,GAmDxB,CAnDwB,SAAA,MAAA,GAoD9C,CApD8C,SAAA,SAAA,GAAA,EAAA,GAoDnB,IApDmB,GAAA,KAAA,GAAA,QAAE,MAuDhC,CAvDgC,GAAA,MAAA,GAwDxC,CAxDwC,GAAA,CAyDvC,CAzDuC,CAyDrC,CAzDqC,CAAA,SAAA,MAAA,GA0DpC,CA1DoC,CA0DlC,CA1DkC,CAAA,SAAA,SAAA,GAAA,EAAA,GA0DN,IA1DM,GAAA,KAAA,GAAA,GA4D/B,CA5D+B,IA4D1B,QA5D0B,CA4DjB,CA5DiB,CA4Df,CA5De,CAAA,CAAA,EAAA,GAAA,KAAA,CAAA,EAE1C,CAAA,MA4DI,CA5DJ,GAAA,MAAA,CAAA,GAAA,KAAA;AAAwB,KAgEtB,SAhEsB,CAAA,CAAA,EAAA,aAAA,MAAA,CAAA,GAmE9B,IAnE8B,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,KAAA,EAAA,GAAA,CAAA,SAAA,MAoEd,CApEc,GAqE5B,SArE4B,CAqElB,CArEkB,CAqEhB,CArEgB,CAAA,EAqEZ,IArEY,CAAA,GAAA,KAAA,GAuE9B,IAvE8B,SAAA,MAuEX,CAvEW,GAwE9B,CAxE8B,CAwE5B,IAxE4B,CAAA,GAAA,KAAA;KA0E7B,OAAA,GACD,IA3EiC,GA4EjC,QA5EiC,GA6EjC,KA7EiC,GA8EjC,MA9EiC,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,SAAA,GAAA,IAAA,GAsFjC,GAtFiC,CAAA,OAAA,EAAA,OAAA,CAAA,GAuFjC,GAvFiC,CAAA,OAAA,CAAA,GAwFjC,OAxFiC,CAAA,MAAA,EAAA,OAAA,CAAA,GAyFjC,OAzFiC,CAAA,MAAA,CAAA,GA0FjC,KA1FiC,CAAA,OAAA,CAAA,GA2FjC,OA3FiC,CAAA,OAAA,CAAA;AAAR,KA6FjB,WA7FiB,CAAA,CAAA,CAAA,GA6FA,CA7FA,SA6FU,OA7FV,GA8FzB,CA9FyB,GA+FzB,CA/FyB,SAAA,MAAA,GAAA,QAAa,MAgGxB,CAhGwB,IAgGnB,WAhGmB,CAgGP,CAhGO,CAgGL,CAhGK,CAAA,CAAA,EAAa,GAiGnD,CAjGmD"}
@@ -0,0 +1,12 @@
1
+
2
+ //#region src/utils/validator.ts
3
+ function runStandardValidation(schema, input) {
4
+ const result = schema["~standard"].validate(input);
5
+ if (result instanceof Promise) throw new TypeError("Schema validation must be synchronous", { cause: schema });
6
+ if (result.issues) throw new Error(JSON.stringify(result.issues, null, 2));
7
+ return result.value;
8
+ }
9
+
10
+ //#endregion
11
+ exports.runStandardValidation = runStandardValidation;
12
+ //# sourceMappingURL=validator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.cjs","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":["export interface StandardSchemaValidator<Input = unknown, Output = Input> {\n readonly '~standard': StandardSchemaV1.Props<Input, Output>;\n}\n\nexport declare namespace StandardSchemaV1 {\n /** The Standard Schema properties interface. */\n export interface Props<Input = unknown, Output = Input> {\n /** The version number of the standard. */\n readonly version: 1;\n /** The vendor name of the schema library. */\n readonly vendor: string;\n /** Validates unknown input values. */\n readonly validate: (\n value: unknown\n ) => Result<Output> | Promise<Result<Output>>;\n /** Inferred types associated with the schema. */\n readonly types?: Types<Input, Output> | undefined;\n }\n\n /** The result interface of the validate function. */\n export type Result<Output> = SuccessResult<Output> | FailureResult;\n\n /** The result interface if validation succeeds. */\n export interface SuccessResult<Output> {\n /** The typed output value. */\n readonly value: Output;\n /** The non-existent issues. */\n readonly issues?: undefined;\n }\n\n /** The result interface if validation fails. */\n export interface FailureResult {\n /** The issues of failed validation. */\n readonly issues: ReadonlyArray<Issue>;\n }\n\n /** The issue interface of the failure output. */\n export interface Issue {\n /** The error message of the issue. */\n readonly message: string;\n /** The path of the issue, if any. */\n readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n }\n\n /** The path segment interface of the issue. */\n export interface PathSegment {\n /** The key representing a path segment. */\n readonly key: PropertyKey;\n }\n\n /** The Standard Schema types interface. */\n export interface Types<Input = unknown, Output = Input> {\n /** The input type of the schema. */\n readonly input: Input;\n /** The output type of the schema. */\n readonly output: Output;\n }\n\n /** Infers the input type of a Standard Schema. */\n export type InferInput<Schema extends StandardSchemaValidator> = NonNullable<\n Schema['~standard']['types']\n >['input'];\n\n /** Infers the output type of a Standard Schema. */\n export type InferOutput<Schema extends StandardSchemaValidator> = NonNullable<\n Schema['~standard']['types']\n >['output'];\n}\n\n// Types taken from Tanstack Router\nexport interface ValidatorAdapter<TInput, TOutput> {\n types: {\n input: TInput;\n output: TOutput;\n };\n parse: (input: unknown) => TOutput;\n}\nexport interface ValidatorObj<TInput, TOutput> {\n parse: ValidatorFn<TInput, TOutput>;\n}\nexport type ValidatorFn<Input, Output> = (input: Input) => Output;\nexport type Validator<Input, Output> =\n | ValidatorFn<Input, Output>\n | StandardSchemaValidator<Input, Output>;\nexport type AnySchema = {};\nexport type DefaultValidator = Validator<Record<string, unknown>, AnySchema>;\nexport type AnyStandardSchemaValidator = StandardSchemaValidator<any, any>;\nexport type AnyValidator = Validator<any, any>;\nexport type AnyValidatorObj = ValidatorObj<any, any>;\nexport type AnyValidatorAdapter = ValidatorAdapter<any, any>;\nexport type ResolveValidatorOutputFn<TValidator> = TValidator extends (\n ...args: any\n) => infer TSchema\n ? TSchema\n : AnySchema;\nexport type ResolveValidatorOutput<TValidator> = unknown extends TValidator\n ? TValidator\n : TValidator extends AnyStandardSchemaValidator\n ? NonNullable<TValidator['~standard']['types']>['output']\n : TValidator extends AnyValidatorAdapter\n ? TValidator['types']['output']\n : TValidator extends AnyValidatorObj\n ? ResolveValidatorOutputFn<TValidator['parse']>\n : ResolveValidatorOutputFn<TValidator>;\n\nexport function runStandardValidation<Schema extends StandardSchemaValidator>(\n schema: Schema,\n input: StandardSchemaV1.InferInput<Schema>\n): StandardSchemaV1.InferOutput<Schema> {\n const result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new TypeError('Schema validation must be synchronous', {\n cause: schema,\n });\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return result.value;\n}"],"mappings":";;AAyGA,SAAgB,sBACd,QACA,OACsC;CACtC,MAAM,SAAS,OAAO,aAAa,SAAS,MAAM;AAElD,KAAI,kBAAkB,QACpB,OAAM,IAAI,UAAU,yCAAyC,EAC3D,OAAO,QACR,CAAC;AAIJ,KAAI,OAAO,OACT,OAAM,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAC;AAGzD,QAAO,OAAO"}
@@ -0,0 +1,77 @@
1
+ //#region src/utils/validator.d.ts
2
+ interface StandardSchemaValidator<Input = unknown, Output = Input> {
3
+ readonly '~standard': StandardSchemaV1.Props<Input, Output>;
4
+ }
5
+ declare namespace StandardSchemaV1 {
6
+ /** The Standard Schema properties interface. */
7
+ interface Props<Input = unknown, Output = Input> {
8
+ /** The version number of the standard. */
9
+ readonly version: 1;
10
+ /** The vendor name of the schema library. */
11
+ readonly vendor: string;
12
+ /** Validates unknown input values. */
13
+ readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
14
+ /** Inferred types associated with the schema. */
15
+ readonly types?: Types<Input, Output> | undefined;
16
+ }
17
+ /** The result interface of the validate function. */
18
+ type Result<Output> = SuccessResult<Output> | FailureResult;
19
+ /** The result interface if validation succeeds. */
20
+ interface SuccessResult<Output> {
21
+ /** The typed output value. */
22
+ readonly value: Output;
23
+ /** The non-existent issues. */
24
+ readonly issues?: undefined;
25
+ }
26
+ /** The result interface if validation fails. */
27
+ interface FailureResult {
28
+ /** The issues of failed validation. */
29
+ readonly issues: ReadonlyArray<Issue>;
30
+ }
31
+ /** The issue interface of the failure output. */
32
+ interface Issue {
33
+ /** The error message of the issue. */
34
+ readonly message: string;
35
+ /** The path of the issue, if any. */
36
+ readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
37
+ }
38
+ /** The path segment interface of the issue. */
39
+ interface PathSegment {
40
+ /** The key representing a path segment. */
41
+ readonly key: PropertyKey;
42
+ }
43
+ /** The Standard Schema types interface. */
44
+ interface Types<Input = unknown, Output = Input> {
45
+ /** The input type of the schema. */
46
+ readonly input: Input;
47
+ /** The output type of the schema. */
48
+ readonly output: Output;
49
+ }
50
+ /** Infers the input type of a Standard Schema. */
51
+ type InferInput<Schema extends StandardSchemaValidator> = NonNullable<Schema['~standard']['types']>['input'];
52
+ /** Infers the output type of a Standard Schema. */
53
+ type InferOutput<Schema extends StandardSchemaValidator> = NonNullable<Schema['~standard']['types']>['output'];
54
+ }
55
+ interface ValidatorAdapter<TInput, TOutput> {
56
+ types: {
57
+ input: TInput;
58
+ output: TOutput;
59
+ };
60
+ parse: (input: unknown) => TOutput;
61
+ }
62
+ interface ValidatorObj<TInput, TOutput> {
63
+ parse: ValidatorFn<TInput, TOutput>;
64
+ }
65
+ type ValidatorFn<Input, Output> = (input: Input) => Output;
66
+ type Validator<Input, Output> = ValidatorFn<Input, Output> | StandardSchemaValidator<Input, Output>;
67
+ type AnySchema = {};
68
+ type DefaultValidator = Validator<Record<string, unknown>, AnySchema>;
69
+ type AnyStandardSchemaValidator = StandardSchemaValidator<any, any>;
70
+ type AnyValidator = Validator<any, any>;
71
+ type AnyValidatorObj = ValidatorObj<any, any>;
72
+ type AnyValidatorAdapter = ValidatorAdapter<any, any>;
73
+ type ResolveValidatorOutputFn<TValidator> = TValidator extends ((...args: any) => infer TSchema) ? TSchema : AnySchema;
74
+ type ResolveValidatorOutput<TValidator> = unknown extends TValidator ? TValidator : TValidator extends AnyStandardSchemaValidator ? NonNullable<TValidator['~standard']['types']>['output'] : TValidator extends AnyValidatorAdapter ? TValidator['types']['output'] : TValidator extends AnyValidatorObj ? ResolveValidatorOutputFn<TValidator['parse']> : ResolveValidatorOutputFn<TValidator>;
75
+ //#endregion
76
+ export { AnyValidator, DefaultValidator, ResolveValidatorOutput };
77
+ //# sourceMappingURL=validator.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.cts","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ //#region src/utils/validator.d.ts
2
+ interface StandardSchemaValidator<Input = unknown, Output = Input> {
3
+ readonly '~standard': StandardSchemaV1.Props<Input, Output>;
4
+ }
5
+ declare namespace StandardSchemaV1 {
6
+ /** The Standard Schema properties interface. */
7
+ interface Props<Input = unknown, Output = Input> {
8
+ /** The version number of the standard. */
9
+ readonly version: 1;
10
+ /** The vendor name of the schema library. */
11
+ readonly vendor: string;
12
+ /** Validates unknown input values. */
13
+ readonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;
14
+ /** Inferred types associated with the schema. */
15
+ readonly types?: Types<Input, Output> | undefined;
16
+ }
17
+ /** The result interface of the validate function. */
18
+ type Result<Output> = SuccessResult<Output> | FailureResult;
19
+ /** The result interface if validation succeeds. */
20
+ interface SuccessResult<Output> {
21
+ /** The typed output value. */
22
+ readonly value: Output;
23
+ /** The non-existent issues. */
24
+ readonly issues?: undefined;
25
+ }
26
+ /** The result interface if validation fails. */
27
+ interface FailureResult {
28
+ /** The issues of failed validation. */
29
+ readonly issues: ReadonlyArray<Issue>;
30
+ }
31
+ /** The issue interface of the failure output. */
32
+ interface Issue {
33
+ /** The error message of the issue. */
34
+ readonly message: string;
35
+ /** The path of the issue, if any. */
36
+ readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
37
+ }
38
+ /** The path segment interface of the issue. */
39
+ interface PathSegment {
40
+ /** The key representing a path segment. */
41
+ readonly key: PropertyKey;
42
+ }
43
+ /** The Standard Schema types interface. */
44
+ interface Types<Input = unknown, Output = Input> {
45
+ /** The input type of the schema. */
46
+ readonly input: Input;
47
+ /** The output type of the schema. */
48
+ readonly output: Output;
49
+ }
50
+ /** Infers the input type of a Standard Schema. */
51
+ type InferInput<Schema extends StandardSchemaValidator> = NonNullable<Schema['~standard']['types']>['input'];
52
+ /** Infers the output type of a Standard Schema. */
53
+ type InferOutput<Schema extends StandardSchemaValidator> = NonNullable<Schema['~standard']['types']>['output'];
54
+ }
55
+ interface ValidatorAdapter<TInput, TOutput> {
56
+ types: {
57
+ input: TInput;
58
+ output: TOutput;
59
+ };
60
+ parse: (input: unknown) => TOutput;
61
+ }
62
+ interface ValidatorObj<TInput, TOutput> {
63
+ parse: ValidatorFn<TInput, TOutput>;
64
+ }
65
+ type ValidatorFn<Input, Output> = (input: Input) => Output;
66
+ type Validator<Input, Output> = ValidatorFn<Input, Output> | StandardSchemaValidator<Input, Output>;
67
+ type AnySchema = {};
68
+ type DefaultValidator = Validator<Record<string, unknown>, AnySchema>;
69
+ type AnyStandardSchemaValidator = StandardSchemaValidator<any, any>;
70
+ type AnyValidator = Validator<any, any>;
71
+ type AnyValidatorObj = ValidatorObj<any, any>;
72
+ type AnyValidatorAdapter = ValidatorAdapter<any, any>;
73
+ type ResolveValidatorOutputFn<TValidator> = TValidator extends ((...args: any) => infer TSchema) ? TSchema : AnySchema;
74
+ type ResolveValidatorOutput<TValidator> = unknown extends TValidator ? TValidator : TValidator extends AnyStandardSchemaValidator ? NonNullable<TValidator['~standard']['types']>['output'] : TValidator extends AnyValidatorAdapter ? TValidator['types']['output'] : TValidator extends AnyValidatorObj ? ResolveValidatorOutputFn<TValidator['parse']> : ResolveValidatorOutputFn<TValidator>;
75
+ //#endregion
76
+ export { AnyValidator, DefaultValidator, ResolveValidatorOutput };
77
+ //# sourceMappingURL=validator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.mts","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ //#region src/utils/validator.ts
2
+ function runStandardValidation(schema, input) {
3
+ const result = schema["~standard"].validate(input);
4
+ if (result instanceof Promise) throw new TypeError("Schema validation must be synchronous", { cause: schema });
5
+ if (result.issues) throw new Error(JSON.stringify(result.issues, null, 2));
6
+ return result.value;
7
+ }
8
+
9
+ //#endregion
10
+ export { runStandardValidation };
11
+ //# sourceMappingURL=validator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.mjs","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":["export interface StandardSchemaValidator<Input = unknown, Output = Input> {\n readonly '~standard': StandardSchemaV1.Props<Input, Output>;\n}\n\nexport declare namespace StandardSchemaV1 {\n /** The Standard Schema properties interface. */\n export interface Props<Input = unknown, Output = Input> {\n /** The version number of the standard. */\n readonly version: 1;\n /** The vendor name of the schema library. */\n readonly vendor: string;\n /** Validates unknown input values. */\n readonly validate: (\n value: unknown\n ) => Result<Output> | Promise<Result<Output>>;\n /** Inferred types associated with the schema. */\n readonly types?: Types<Input, Output> | undefined;\n }\n\n /** The result interface of the validate function. */\n export type Result<Output> = SuccessResult<Output> | FailureResult;\n\n /** The result interface if validation succeeds. */\n export interface SuccessResult<Output> {\n /** The typed output value. */\n readonly value: Output;\n /** The non-existent issues. */\n readonly issues?: undefined;\n }\n\n /** The result interface if validation fails. */\n export interface FailureResult {\n /** The issues of failed validation. */\n readonly issues: ReadonlyArray<Issue>;\n }\n\n /** The issue interface of the failure output. */\n export interface Issue {\n /** The error message of the issue. */\n readonly message: string;\n /** The path of the issue, if any. */\n readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n }\n\n /** The path segment interface of the issue. */\n export interface PathSegment {\n /** The key representing a path segment. */\n readonly key: PropertyKey;\n }\n\n /** The Standard Schema types interface. */\n export interface Types<Input = unknown, Output = Input> {\n /** The input type of the schema. */\n readonly input: Input;\n /** The output type of the schema. */\n readonly output: Output;\n }\n\n /** Infers the input type of a Standard Schema. */\n export type InferInput<Schema extends StandardSchemaValidator> = NonNullable<\n Schema['~standard']['types']\n >['input'];\n\n /** Infers the output type of a Standard Schema. */\n export type InferOutput<Schema extends StandardSchemaValidator> = NonNullable<\n Schema['~standard']['types']\n >['output'];\n}\n\n// Types taken from Tanstack Router\nexport interface ValidatorAdapter<TInput, TOutput> {\n types: {\n input: TInput;\n output: TOutput;\n };\n parse: (input: unknown) => TOutput;\n}\nexport interface ValidatorObj<TInput, TOutput> {\n parse: ValidatorFn<TInput, TOutput>;\n}\nexport type ValidatorFn<Input, Output> = (input: Input) => Output;\nexport type Validator<Input, Output> =\n | ValidatorFn<Input, Output>\n | StandardSchemaValidator<Input, Output>;\nexport type AnySchema = {};\nexport type DefaultValidator = Validator<Record<string, unknown>, AnySchema>;\nexport type AnyStandardSchemaValidator = StandardSchemaValidator<any, any>;\nexport type AnyValidator = Validator<any, any>;\nexport type AnyValidatorObj = ValidatorObj<any, any>;\nexport type AnyValidatorAdapter = ValidatorAdapter<any, any>;\nexport type ResolveValidatorOutputFn<TValidator> = TValidator extends (\n ...args: any\n) => infer TSchema\n ? TSchema\n : AnySchema;\nexport type ResolveValidatorOutput<TValidator> = unknown extends TValidator\n ? TValidator\n : TValidator extends AnyStandardSchemaValidator\n ? NonNullable<TValidator['~standard']['types']>['output']\n : TValidator extends AnyValidatorAdapter\n ? TValidator['types']['output']\n : TValidator extends AnyValidatorObj\n ? ResolveValidatorOutputFn<TValidator['parse']>\n : ResolveValidatorOutputFn<TValidator>;\n\nexport function runStandardValidation<Schema extends StandardSchemaValidator>(\n schema: Schema,\n input: StandardSchemaV1.InferInput<Schema>\n): StandardSchemaV1.InferOutput<Schema> {\n const result = schema['~standard'].validate(input);\n\n if (result instanceof Promise) {\n throw new TypeError('Schema validation must be synchronous', {\n cause: schema,\n });\n }\n\n // if the `issues` field exists, the validation failed\n if (result.issues) {\n throw new Error(JSON.stringify(result.issues, null, 2));\n }\n\n return result.value;\n}"],"mappings":";AAyGA,SAAgB,sBACd,QACA,OACsC;CACtC,MAAM,SAAS,OAAO,aAAa,SAAS,MAAM;AAElD,KAAI,kBAAkB,QACpB,OAAM,IAAI,UAAU,yCAAyC,EAC3D,OAAO,QACR,CAAC;AAIJ,KAAI,OAAO,OACT,OAAM,IAAI,MAAM,KAAK,UAAU,OAAO,QAAQ,MAAM,EAAE,CAAC;AAGzD,QAAO,OAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jfdevelops/multi-step-form-core",
3
- "version": "1.0.0-alpha.17",
3
+ "version": "1.0.0-alpha.18",
4
4
  "description": "",
5
5
  "repository": "https://github.com/jfdevelops/multi-step-form",
6
6
  "type": "module",