@orieljs/inertia-client 0.1.0-alpha.3 → 0.1.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +31 -13
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -72,17 +72,34 @@ declare class RouteError extends Error {
|
|
|
72
72
|
declare function route<N extends RouteName>(name: N, ...[parameters, absolute]: RouteArguments<N>): string;
|
|
73
73
|
/** Is `name` a registered route? */
|
|
74
74
|
declare function hasRoute(name: string): boolean;
|
|
75
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* The name of the GET route matching the current path (the browser's, or during SSR the page being rendered), or
|
|
77
|
+
* undefined. The server and the browser agree on it, so markup that uses it hydrates unchanged.
|
|
78
|
+
*/
|
|
76
79
|
declare function currentRoute(): string | undefined;
|
|
77
80
|
/** Does the current route match one of the names or wildcard patterns ('posts.*')? */
|
|
78
81
|
declare function isCurrentRoute(...patterns: string[]): boolean;
|
|
79
82
|
|
|
80
83
|
type Data = Record<string, unknown>;
|
|
81
84
|
type Listener = () => void;
|
|
85
|
+
/** A field value the form keeps whole: dotted keys don't reach into it. */
|
|
86
|
+
type FormLeaf = string | number | boolean | bigint | symbol | null | undefined | Date | Blob | ((...args: never[]) => unknown);
|
|
87
|
+
/**
|
|
88
|
+
* A form's field names, dotted for nested fields ('title', 'address.city', 'tags.0'), as Inertia's useForm names them.
|
|
89
|
+
* (@inertiajs/core's FormDataKeys needs the DOM types; this one also works in a program without them.)
|
|
90
|
+
*/
|
|
91
|
+
type FormKey<T> = 0 extends 1 & T ? string : T extends FormLeaf ? never : T extends readonly unknown[] ? `${number}` | DottedKey<`${number}`, T[number]> : string extends keyof T ? string : {
|
|
92
|
+
[K in keyof T & string]: K | DottedKey<K, T[K]>;
|
|
93
|
+
}[keyof T & string];
|
|
94
|
+
type DottedKey<K extends string, V> = 0 extends 1 & V ? `${K}.${string}` : NonNullable<V> extends FormLeaf ? never : `${K}.${FormKey<NonNullable<V>>}`;
|
|
95
|
+
/** The type of the field a FormKey names (unknown for a key cast to `never`, the workaround before keys were typed). */
|
|
96
|
+
type FormValue<T, K extends string> = [K] extends [never] ? unknown : FieldValue<T, K>;
|
|
97
|
+
type FieldValue<T, K extends string> = K extends `${infer Head}.${infer Rest}` ? unknown extends FieldOf<T, Head> ? unknown : FieldValue<NonNullable<FieldOf<T, Head>>, Rest> : FieldOf<T, K>;
|
|
98
|
+
type FieldOf<T, K extends string> = T extends readonly (infer E)[] ? (K extends `${number}` ? E : never) : K extends keyof T ? T[K] : never;
|
|
82
99
|
/** Form options passed through to the visit; the helper wraps the callbacks. */
|
|
83
100
|
type FormSubmitOptions = Omit<VisitOptions, 'data'>;
|
|
84
101
|
/** The state a form helper exposes (what React's useForm returns, minus the framework plumbing). */
|
|
85
|
-
interface FormState<T extends
|
|
102
|
+
interface FormState<T extends object> {
|
|
86
103
|
readonly data: T;
|
|
87
104
|
readonly defaults: T;
|
|
88
105
|
readonly errors: Partial<Record<keyof T | string, string>>;
|
|
@@ -95,19 +112,20 @@ interface FormState<T extends Data> {
|
|
|
95
112
|
}
|
|
96
113
|
/**
|
|
97
114
|
* A framework-agnostic form helper on the real Inertia router: the core that Solid and Angular adapters wrap in
|
|
98
|
-
* signals (React, Vue and Svelte use the official useForm). Every change notifies subscribers.
|
|
115
|
+
* signals (React, Vue and Svelte use the official useForm). Every change notifies subscribers. The data may be
|
|
116
|
+
* declared as an interface; fields are named like the official useForm's, dotted for nested ones ('address.city').
|
|
99
117
|
*/
|
|
100
|
-
interface FormHelper<T extends
|
|
118
|
+
interface FormHelper<T extends object> extends FormState<T> {
|
|
101
119
|
subscribe(listener: Listener): () => void;
|
|
102
|
-
setData(key:
|
|
120
|
+
setData<K extends FormKey<T>>(key: K, value: FormValue<T, K>): void;
|
|
103
121
|
setData(data: Partial<T> | ((data: T) => T)): void;
|
|
104
122
|
setDefaults(): void;
|
|
105
|
-
setDefaults(key:
|
|
123
|
+
setDefaults<K extends FormKey<T>>(key: K, value: FormValue<T, K>): void;
|
|
106
124
|
setDefaults(fields: Partial<T>): void;
|
|
107
|
-
reset(...fields: Array<
|
|
108
|
-
clearErrors(...fields: Array<
|
|
109
|
-
resetAndClearErrors(...fields: Array<
|
|
110
|
-
setError(field:
|
|
125
|
+
reset(...fields: Array<FormKey<T>>): void;
|
|
126
|
+
clearErrors(...fields: Array<FormKey<T>>): void;
|
|
127
|
+
resetAndClearErrors(...fields: Array<FormKey<T>>): void;
|
|
128
|
+
setError(field: FormKey<T>, message: string): void;
|
|
111
129
|
setError(errors: Record<string, string>): void;
|
|
112
130
|
transform(callback: (data: T) => Data): void;
|
|
113
131
|
submit(method: Method, url: string, options?: FormSubmitOptions): void;
|
|
@@ -119,7 +137,7 @@ interface FormHelper<T extends Data> extends FormState<T> {
|
|
|
119
137
|
cancel(): void;
|
|
120
138
|
}
|
|
121
139
|
/** createForm({ title: '' }): a headless form helper (Inertia's useForm without remember or Precognition). */
|
|
122
|
-
declare function createForm<T extends
|
|
140
|
+
declare function createForm<T extends object>(initial: T | (() => T)): FormHelper<T>;
|
|
123
141
|
|
|
124
142
|
/**
|
|
125
143
|
* The Oriel client contract: what every adapter package (@orieljs/inertia-react, -vue, -svelte, -solid,
|
|
@@ -156,10 +174,10 @@ interface OrielClientApi {
|
|
|
156
174
|
isCurrentRoute(...patterns: string[]): boolean;
|
|
157
175
|
}
|
|
158
176
|
/** What an adapter's useForm returns (the official useForm types satisfy it for the fields used here). */
|
|
159
|
-
type AdapterForm<T extends
|
|
177
|
+
type AdapterForm<T extends object> = Pick<FormHelper<T>, 'data' | 'errors' | 'hasErrors' | 'processing' | 'isDirty' | 'wasSuccessful' | 'recentlySuccessful' | 'setData' | 'reset' | 'clearErrors' | 'setError' | 'submit' | 'get' | 'post' | 'put' | 'patch' | 'delete' | 'cancel' | 'transform'>;
|
|
160
178
|
/** usePage() in every adapter. */
|
|
161
179
|
type UsePage = <N extends PageName = PageName>() => TypedPage<N>;
|
|
162
180
|
/** Visit options a Link forwards to router.visit(). */
|
|
163
181
|
type LinkVisitOptions = Pick<VisitOptions, 'method' | 'data' | 'replace' | 'preserveScroll' | 'preserveState' | 'only' | 'except' | 'headers'>;
|
|
164
182
|
|
|
165
|
-
export { type AdapterForm, type ErrorBags, type Errors, type FormHelper, type FormState, type FormSubmitOptions, type LinkProps, type LinkVisitOptions, type OrielClientApi, type PageName, type PageProps, type Pages, type RouteArguments, type RouteDefinition, RouteError, type RouteList, type RouteName, type RouteParameter, type RouteParameters, type RouteTable, type SharedProps, type SharedPropsRegistry, type TypedPage, type UsePage, createForm, currentRoute, defineRoutes, hasRoute, isCurrentRoute, route };
|
|
183
|
+
export { type AdapterForm, type ErrorBags, type Errors, type FormHelper, type FormKey, type FormState, type FormSubmitOptions, type FormValue, type LinkProps, type LinkVisitOptions, type OrielClientApi, type PageName, type PageProps, type Pages, type RouteArguments, type RouteDefinition, RouteError, type RouteList, type RouteName, type RouteParameter, type RouteParameters, type RouteTable, type SharedProps, type SharedPropsRegistry, type TypedPage, type UsePage, createForm, currentRoute, defineRoutes, hasRoute, isCurrentRoute, route };
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,14 @@ import { router as router2 } from "@inertiajs/core";
|
|
|
5
5
|
function browserLocation() {
|
|
6
6
|
return globalThis.location;
|
|
7
7
|
}
|
|
8
|
+
var RENDERING_URL = /* @__PURE__ */ Symbol.for("oriel:inertia.rendering-url");
|
|
9
|
+
function currentPath() {
|
|
10
|
+
const location = browserLocation();
|
|
11
|
+
if (location !== void 0) return location.pathname;
|
|
12
|
+
const rendering = globalThis[RENDERING_URL];
|
|
13
|
+
const url = typeof rendering === "function" ? rendering() : void 0;
|
|
14
|
+
return typeof url === "string" ? new URL(url, "http://localhost").pathname : void 0;
|
|
15
|
+
}
|
|
8
16
|
|
|
9
17
|
// routes.ts
|
|
10
18
|
var PARAMETER = /\{(\w+)(?::(\w+))?(\?)?\}/g;
|
|
@@ -96,10 +104,10 @@ function uriPattern(uri) {
|
|
|
96
104
|
return new RegExp(`^${body === "" ? "/" : body}/?$`);
|
|
97
105
|
}
|
|
98
106
|
function currentRoute() {
|
|
99
|
-
const
|
|
100
|
-
if (
|
|
107
|
+
const path = currentPath();
|
|
108
|
+
if (path === void 0) return void 0;
|
|
101
109
|
for (const [name, definition] of Object.entries(registry().table)) {
|
|
102
|
-
if (definition.methods.includes("GET") && uriPattern(definition.uri).test(
|
|
110
|
+
if (definition.methods.includes("GET") && uriPattern(definition.uri).test(path)) return name;
|
|
103
111
|
}
|
|
104
112
|
return void 0;
|
|
105
113
|
}
|
|
@@ -164,6 +172,9 @@ function setPath(target, path, value) {
|
|
|
164
172
|
return target;
|
|
165
173
|
}
|
|
166
174
|
function createForm(initial) {
|
|
175
|
+
return createDataForm(initial);
|
|
176
|
+
}
|
|
177
|
+
function createDataForm(initial) {
|
|
167
178
|
const resolve = () => clone(typeof initial === "function" ? initial() : initial);
|
|
168
179
|
const listeners = /* @__PURE__ */ new Set();
|
|
169
180
|
let data = resolve();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts","../browser.ts","../routes.ts","../form.ts"],"sourcesContent":["export { router } from '@inertiajs/core'\nexport type { Errors as InertiaErrors, Method, Page, Progress, VisitOptions } from '@inertiajs/core'\nexport type { ErrorBags, Errors, PageName, PageProps, Pages, SharedProps, SharedPropsRegistry, TypedPage } from './types'\nexport {\n currentRoute,\n defineRoutes,\n hasRoute,\n isCurrentRoute,\n route,\n RouteError,\n type RouteArguments,\n type RouteDefinition,\n type RouteList,\n type RouteName,\n type RouteParameter,\n type RouteParameters,\n type RouteTable,\n} from './routes'\nexport { createForm, type FormHelper, type FormState, type FormSubmitOptions } from './form'\nexport type { AdapterForm, LinkProps, LinkVisitOptions, OrielClientApi, UsePage } from './adapter'\n","/**\n * The few browser globals this package reads, typed structurally so the package compiles both against the DOM\n * lib (its own build) and without it (the monorepo's Node program). Nothing here exists during SSR.\n */\ninterface BrowserLocation {\n readonly origin: string\n readonly pathname: string\n readonly search: string\n readonly href: string\n}\n\nexport function browserLocation(): BrowserLocation | undefined {\n return (globalThis as { location?: BrowserLocation }).location\n}\n","import { browserLocation } from './browser'\n\n/** Route name → its parameters. Augmented by the generated routes module (oriel route:types). */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface RouteList {}\n\n/** A route name: the generated ones, or any string before types are generated. */\nexport type RouteName = [keyof RouteList] extends [never] ? string : Extract<keyof RouteList, string>\n\n/** A parameter value: a scalar, or a model-like object (its `id`, or the {post:slug} field, is used). */\nexport type RouteParameter = string | number | boolean | { readonly [key: string]: unknown }\n\ntype ParametersOf<N> = N extends keyof RouteList ? RouteList[N] : Record<string, RouteParameter>\ntype RequiredKeys<T> = { [K in keyof T]-?: Record<never, never> extends Pick<T, K> ? never : K }[keyof T]\n\n/** Named parameters (extras become the query string), one value, or values in URI order. */\nexport type RouteParameters<N> = (ParametersOf<N> & Record<string, unknown>) | RouteParameter | RouteParameter[]\n\n/** route(name) is allowed only when the route has no required parameters. */\nexport type RouteArguments<N> = [RequiredKeys<ParametersOf<N>>] extends [never]\n ? [parameters?: RouteParameters<N>, absolute?: boolean]\n : [parameters: RouteParameters<N>, absolute?: boolean]\n\n/** One named route: its URI (Laravel syntax) and methods. */\nexport interface RouteDefinition {\n readonly uri: string\n readonly methods: readonly string[]\n}\nexport type RouteTable = Readonly<Record<string, RouteDefinition>>\n\nconst PARAMETER = /\\{(\\w+)(?::(\\w+))?(\\?)?\\}/g\nconst WHOLE_OPTIONAL = /^\\{(\\w+)(?::\\w+)?\\?\\}$/\nconst TABLE = Symbol.for('oriel:inertia.routes')\n\nconst registry = (): { table: RouteTable } => {\n const globals = globalThis as unknown as Record<symbol, { table: RouteTable } | undefined>\n return (globals[TABLE] ??= { table: {} })\n}\n\n/** Registers the route table (the generated routes module calls this) and returns it. */\nexport function defineRoutes<const T extends RouteTable>(table: T): T {\n registry().table = table\n return table\n}\n\nexport class RouteError extends Error {\n override readonly name = 'RouteError'\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const prototype = Object.getPrototypeOf(value) as unknown\n return prototype === Object.prototype || prototype === null\n}\n\n/** PHP's http_build_query, like the server's UrlGenerator: a[b]=1&a[0]=2, booleans as 1/0. */\nfunction buildQuery(values: Record<string, unknown>): string {\n const pairs: string[] = []\n const add = (key: string, value: unknown): void => {\n if (value === null || value === undefined) return\n if (typeof value === 'object' && (Array.isArray(value) || isPlainObject(value))) {\n for (const [child, nested] of Object.entries(value)) add(`${key}[${child}]`, nested)\n return\n }\n const text = value === true ? '1' : value === false ? '0' : String(value)\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(text)}`)\n }\n for (const [key, value] of Object.entries(values)) add(key, value)\n return pairs.join('&')\n}\n\n/** A model-like object's URL value: the {post:slug} field, else `id`; scalars as they are. */\nfunction routeKey(value: unknown, field: string | undefined): unknown {\n if (typeof value !== 'object' || value === null) return value\n const object = value as Record<string, unknown>\n return field !== undefined ? object[field] : object.id\n}\n\nfunction parametersOf(uri: string): Array<{ name: string; field: string | undefined; optional: boolean }> {\n return [...uri.matchAll(PARAMETER)].map((match) => ({ name: match[1]!, field: match[2], optional: match[3] === '?' }))\n}\n\n/**\n * The URL of a named route, like the server's route(): route('posts.show', post), route('posts.show', { post: 1,\n * page: 2 }), route('posts.show', [post, comment]). Relative ('/posts/1') unless `absolute` is true.\n */\nexport function route<N extends RouteName>(name: N, ...[parameters, absolute = false]: RouteArguments<N>): string {\n const definition = registry().table[name]\n if (definition === undefined) throw new RouteError(`Route [${name}] not defined.`)\n const declared = parametersOf(definition.uri)\n // A lone model-like object (route('posts.show', post)) is the value of the route's only parameter, when that\n // parameter is required. For an optional one the server reads the object's keys as the query, and so does this.\n const only = declared.length === 1 && !declared[0]!.optional ? declared[0]! : undefined\n const isModel = only !== undefined && isPlainObject(parameters) && !Object.hasOwn(parameters, only.name) && Object.hasOwn(parameters, only.field ?? 'id')\n const named: Record<string, unknown> = isModel ? { [only.name]: parameters } : isPlainObject(parameters) ? { ...parameters } : {}\n const positional: unknown[] = Array.isArray(parameters) ? [...parameters] : parameters === undefined || parameters === null || isPlainObject(parameters) ? [] : [parameters]\n\n const values = new Map<string, string | undefined>()\n const missing: string[] = []\n for (const parameter of declared) {\n let value: unknown\n if (Object.hasOwn(named, parameter.name)) {\n value = named[parameter.name]\n delete named[parameter.name]\n } else if (positional.length > 0) {\n value = positional.shift()\n }\n const key = routeKey(value, parameter.field)\n const text = key === undefined || key === null ? undefined : String(key)\n if (text === undefined && !parameter.optional) missing.push(parameter.name)\n values.set(parameter.name, text)\n }\n if (missing.length > 0) {\n throw new RouteError(`Missing required parameter for [Route: ${name}] [URI: ${definition.uri}] [Missing parameter: ${missing.join(', ')}].`)\n }\n\n const path =\n definition.uri === '/'\n ? ''\n : definition.uri\n .split('/')\n .filter((segment) => {\n const whole = WHOLE_OPTIONAL.exec(segment)\n return whole === null || values.get(whole[1]!) !== undefined\n })\n .map((segment) => segment.replace(PARAMETER, (_match, parameter: string) => encodeURIComponent(values.get(parameter) ?? '')))\n .join('/')\n const query = buildQuery(named)\n const relative = `/${path.replace(/^\\/+|\\/+$/g, '')}${query === '' ? '' : `?${query}`}`\n if (!absolute) return relative\n return `${browserLocation()?.origin ?? ''}${relative}`\n}\n\n/** Is `name` a registered route? */\nexport function hasRoute(name: string): boolean {\n return Object.hasOwn(registry().table, name)\n}\n\nconst escape = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** A regex for the paths a URI matches: parameters match one segment, whole optional segments may be absent. */\nfunction uriPattern(uri: string): RegExp {\n const segments = uri.replace(/^\\/+|\\/+$/g, '').split('/').filter((segment) => segment !== '')\n const body = segments\n .map((segment) => {\n if (WHOLE_OPTIONAL.test(segment)) return '(?:/[^/]+)?'\n return `/${segment\n .split(PARAMETER)\n .map((part, index) => (index % 4 === 0 ? escape(part) : index % 4 === 1 ? '[^/]+' : ''))\n .join('')}`\n })\n .join('')\n return new RegExp(`^${body === '' ? '/' : body}/?$`)\n}\n\n/** The name of the GET route matching the browser's current path, or undefined (also during SSR). */\nexport function currentRoute(): string | undefined {\n const location = browserLocation()\n if (location === undefined) return undefined\n for (const [name, definition] of Object.entries(registry().table)) {\n if (definition.methods.includes('GET') && uriPattern(definition.uri).test(location.pathname)) return name\n }\n return undefined\n}\n\n/** 'posts.*' style wildcard match. */\nfunction matches(pattern: string, name: string): boolean {\n return new RegExp(`^${pattern.split('*').map(escape).join('.*')}$`).test(name)\n}\n\n/** Does the current route match one of the names or wildcard patterns ('posts.*')? */\nexport function isCurrentRoute(...patterns: string[]): boolean {\n const current = currentRoute()\n return current !== undefined && patterns.some((pattern) => matches(pattern, current))\n}\n","import { config, router, type Errors, type Method, type Page, type Progress, type RequestPayload, type VisitOptions } from '@inertiajs/core'\n\ntype Data = Record<string, unknown>\ntype Listener = () => void\n\n/** Form options passed through to the visit; the helper wraps the callbacks. */\nexport type FormSubmitOptions = Omit<VisitOptions, 'data'>\n\n/** The state a form helper exposes (what React's useForm returns, minus the framework plumbing). */\nexport interface FormState<T extends Data> {\n readonly data: T\n readonly defaults: T\n readonly errors: Partial<Record<keyof T | string, string>>\n readonly hasErrors: boolean\n readonly isDirty: boolean\n readonly processing: boolean\n readonly progress: Progress | null\n readonly wasSuccessful: boolean\n readonly recentlySuccessful: boolean\n}\n\n/**\n * A framework-agnostic form helper on the real Inertia router: the core that Solid and Angular adapters wrap in\n * signals (React, Vue and Svelte use the official useForm). Every change notifies subscribers.\n */\nexport interface FormHelper<T extends Data> extends FormState<T> {\n subscribe(listener: Listener): () => void\n setData(key: keyof T & string, value: unknown): void\n setData(data: Partial<T> | ((data: T) => T)): void\n setDefaults(): void\n setDefaults(key: keyof T & string, value: unknown): void\n setDefaults(fields: Partial<T>): void\n reset(...fields: Array<keyof T & string>): void\n clearErrors(...fields: Array<keyof T & string>): void\n resetAndClearErrors(...fields: Array<keyof T & string>): void\n setError(field: keyof T & string, message: string): void\n setError(errors: Record<string, string>): void\n transform(callback: (data: T) => Data): void\n submit(method: Method, url: string, options?: FormSubmitOptions): void\n get(url: string, options?: FormSubmitOptions): void\n post(url: string, options?: FormSubmitOptions): void\n put(url: string, options?: FormSubmitOptions): void\n patch(url: string, options?: FormSubmitOptions): void\n delete(url: string, options?: FormSubmitOptions): void\n cancel(): void\n}\n\nconst isPlain = (value: object) => Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null\n\n/** Deep-copies plain objects, arrays and dates; files, blobs and other instances are kept by reference so identity comparison holds. */\nfunction clone<V>(value: V): V {\n if (typeof value !== 'object' || value === null) return value\n if (value instanceof Date) return new Date(value.getTime()) as V\n if (!isPlain(value)) return value\n if (Array.isArray(value)) return value.map(clone) as V\n return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clone(entry)])) as V\n}\n\nfunction equal(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n if (a instanceof Date || b instanceof Date) return a instanceof Date && b instanceof Date && a.getTime() === b.getTime()\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (!isPlain(a) || !isPlain(b)) return false\n const keys = Object.keys(a)\n if (keys.length !== Object.keys(b).length) return false\n return keys.every((key) => Object.hasOwn(b, key) && equal((a as Data)[key], (b as Data)[key]))\n}\n\nfunction getPath(target: Data, path: string): unknown {\n return path.split('.').reduce<unknown>((current, segment) => (typeof current === 'object' && current !== null ? (current as Data)[segment] : undefined), target)\n}\n\nfunction hasPath(target: Data, path: string): boolean {\n const segments = path.split('.')\n const last = segments.pop()!\n const parent = segments.length === 0 ? target : getPath(target, segments.join('.'))\n return typeof parent === 'object' && parent !== null && Object.hasOwn(parent, last)\n}\n\n/**\n * A copy of `target` with `path` set to `value`: the plain objects and arrays along the path are copied, so whoever\n * holds the old ones (a computed, an OnPush child) sees the change; everything off the path stays shared. Other\n * instances along the path (a File, a class) are written in place, as before.\n */\nfunction withPath<V>(target: V, path: string, value: unknown): V {\n const [segment, ...rest] = path.split('.') as [string, ...string[]]\n const node = typeof target === 'object' && target !== null ? (target as Data) : {}\n const next = rest.length === 0 ? value : withPath(node[segment], rest.join('.'), value)\n if (!isPlain(node)) {\n node[segment] = next\n return node as V\n }\n const copy = (Array.isArray(node) ? [...node] : { ...node }) as Data\n copy[segment] = next\n return copy as V\n}\n\nfunction setPath<V extends Data>(target: V, path: string, value: unknown): V {\n const segments = path.split('.')\n const last = segments.pop()!\n let current: Data = target\n for (const segment of segments) {\n if (typeof current[segment] !== 'object' || current[segment] === null) current[segment] = {}\n current = current[segment] as Data\n }\n current[last] = value\n return target\n}\n\n/** createForm({ title: '' }): a headless form helper (Inertia's useForm without remember or Precognition). */\nexport function createForm<T extends Data>(initial: T | (() => T)): FormHelper<T> {\n const resolve = (): T => clone(typeof initial === 'function' ? (initial as () => T)() : initial)\n const listeners = new Set<Listener>()\n let data = resolve()\n let defaults = clone(data)\n let errors: Record<string, string> = {}\n let processing = false\n let progress: Progress | null = null\n let wasSuccessful = false\n let recentlySuccessful = false\n let recentlyTimer: ReturnType<typeof setTimeout> | undefined\n let transformer: (data: T) => Data = (value) => value\n let cancelToken: { cancel(): void } | undefined\n let defaultsSetInOnSuccess = false\n\n const notify = () => {\n for (const listener of [...listeners]) listener()\n }\n\n const clearErrors = (...fields: string[]) => {\n errors = fields.length === 0 ? {} : Object.fromEntries(Object.entries(errors).filter(([field]) => !fields.includes(field)))\n notify()\n }\n\n const setError = (fieldOrErrors: string | Record<string, string>, message?: string) => {\n errors = { ...errors, ...(typeof fieldOrErrors === 'string' ? { [fieldOrErrors]: message ?? '' } : fieldOrErrors) }\n notify()\n }\n\n const reset = (...fields: string[]) => {\n const source = typeof initial === 'function' ? resolve() : clone(defaults)\n if (fields.length === 0) {\n if (typeof initial === 'function') defaults = clone(source)\n data = source\n } else {\n let next = data\n for (const field of fields) if (hasPath(source, field)) next = withPath(next, field, getPath(source, field))\n data = next\n }\n notify()\n }\n\n const submit = (method: Method, url: string, options: FormSubmitOptions = {}) => {\n defaultsSetInOnSuccess = false\n const payload = transformer(data) as RequestPayload\n const visit: VisitOptions = {\n ...options,\n onCancelToken: (token) => {\n cancelToken = token\n return options.onCancelToken?.(token)\n },\n onBefore: (pending) => {\n wasSuccessful = false\n recentlySuccessful = false\n clearTimeout(recentlyTimer)\n notify()\n return options.onBefore?.(pending)\n },\n onStart: (pending) => {\n processing = true\n notify()\n return options.onStart?.(pending)\n },\n onProgress: (event) => {\n progress = event ?? null\n notify()\n return options.onProgress?.(event)\n },\n onSuccess: async (page: Page) => {\n errors = {}\n wasSuccessful = true\n recentlySuccessful = true\n recentlyTimer = setTimeout(() => {\n recentlySuccessful = false\n notify()\n }, config.get('form.recentlySuccessfulDuration') as number)\n notify()\n const result = await options.onSuccess?.(page)\n if (!defaultsSetInOnSuccess) defaults = clone(data)\n notify()\n return result\n },\n onError: (received: Errors) => {\n errors = Object.fromEntries(Object.entries(received).map(([field, value]) => [field, Array.isArray(value) ? String(value[0] ?? '') : String(value)]))\n notify()\n return options.onError?.(received)\n },\n onCancel: () => options.onCancel?.(),\n onFinish: (visitInfo) => {\n processing = false\n progress = null\n cancelToken = undefined\n notify()\n return options.onFinish?.(visitInfo)\n },\n }\n if (method === 'delete') router.delete(url, { ...visit, data: payload })\n else router[method](url, payload, visit)\n }\n\n const helper = {\n get data() {\n return data\n },\n get defaults() {\n return defaults\n },\n get errors() {\n return errors\n },\n get hasErrors() {\n return Object.keys(errors).length > 0\n },\n get isDirty() {\n return !equal(data, defaults)\n },\n get processing() {\n return processing\n },\n get progress() {\n return progress\n },\n get wasSuccessful() {\n return wasSuccessful\n },\n get recentlySuccessful() {\n return recentlySuccessful\n },\n subscribe(listener: Listener) {\n listeners.add(listener)\n return () => void listeners.delete(listener)\n },\n setData(keyOrData: string | Partial<T> | ((data: T) => T), value?: unknown) {\n if (typeof keyOrData === 'string') data = withPath(data, keyOrData, value)\n else if (typeof keyOrData === 'function') data = keyOrData(data)\n else data = { ...data, ...keyOrData }\n notify()\n },\n setDefaults(keyOrFields?: string | Partial<T>, value?: unknown) {\n defaultsSetInOnSuccess = true\n if (keyOrFields === undefined) defaults = clone(data)\n else if (typeof keyOrFields === 'string') defaults = setPath(clone(defaults), keyOrFields, value)\n else defaults = { ...clone(defaults), ...keyOrFields }\n notify()\n },\n reset,\n clearErrors,\n resetAndClearErrors(...fields: string[]) {\n reset(...fields)\n clearErrors(...fields)\n },\n setError,\n transform(callback: (data: T) => Data) {\n transformer = callback\n },\n submit,\n get: (url: string, options?: FormSubmitOptions) => submit('get', url, options),\n post: (url: string, options?: FormSubmitOptions) => submit('post', url, options),\n put: (url: string, options?: FormSubmitOptions) => submit('put', url, options),\n patch: (url: string, options?: FormSubmitOptions) => submit('patch', url, options),\n delete: (url: string, options?: FormSubmitOptions) => submit('delete', url, options),\n cancel() {\n cancelToken?.cancel()\n },\n }\n return helper as unknown as FormHelper<T>\n}\n"],"mappings":"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","names":["router"]}
|
|
1
|
+
{"version":3,"sources":["../index.ts","../browser.ts","../routes.ts","../form.ts"],"sourcesContent":["export { router } from '@inertiajs/core'\nexport type { Errors as InertiaErrors, Method, Page, Progress, VisitOptions } from '@inertiajs/core'\nexport type { ErrorBags, Errors, PageName, PageProps, Pages, SharedProps, SharedPropsRegistry, TypedPage } from './types'\nexport {\n currentRoute,\n defineRoutes,\n hasRoute,\n isCurrentRoute,\n route,\n RouteError,\n type RouteArguments,\n type RouteDefinition,\n type RouteList,\n type RouteName,\n type RouteParameter,\n type RouteParameters,\n type RouteTable,\n} from './routes'\nexport { createForm, type FormHelper, type FormKey, type FormState, type FormSubmitOptions, type FormValue } from './form'\nexport type { AdapterForm, LinkProps, LinkVisitOptions, OrielClientApi, UsePage } from './adapter'\n","/**\n * The few browser globals this package reads, typed structurally so the package compiles both against the DOM\n * lib (its own build) and without it (the monorepo's Node program). Nothing here exists during SSR: there the SSR entry\n * @orieljs/vite generates says which page is being rendered.\n */\ninterface BrowserLocation {\n readonly origin: string\n readonly pathname: string\n readonly search: string\n readonly href: string\n}\n\nexport function browserLocation(): BrowserLocation | undefined {\n return (globalThis as { location?: BrowserLocation }).location\n}\n\n/** Set by the SSR entry @orieljs/vite generates: returns the URL of the page being rendered (per render, async-safe). */\nconst RENDERING_URL = Symbol.for('oriel:inertia.rendering-url')\n\n/** The path of the page being shown: the browser's location, or during SSR the URL of the page being rendered. */\nexport function currentPath(): string | undefined {\n const location = browserLocation()\n if (location !== undefined) return location.pathname\n const rendering = (globalThis as unknown as Record<symbol, unknown>)[RENDERING_URL]\n const url = typeof rendering === 'function' ? (rendering as () => unknown)() : undefined\n return typeof url === 'string' ? new URL(url, 'http://localhost').pathname : undefined\n}\n","import { browserLocation, currentPath } from './browser'\n\n/** Route name → its parameters. Augmented by the generated routes module (oriel route:types). */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface RouteList {}\n\n/** A route name: the generated ones, or any string before types are generated. */\nexport type RouteName = [keyof RouteList] extends [never] ? string : Extract<keyof RouteList, string>\n\n/** A parameter value: a scalar, or a model-like object (its `id`, or the {post:slug} field, is used). */\nexport type RouteParameter = string | number | boolean | { readonly [key: string]: unknown }\n\ntype ParametersOf<N> = N extends keyof RouteList ? RouteList[N] : Record<string, RouteParameter>\ntype RequiredKeys<T> = { [K in keyof T]-?: Record<never, never> extends Pick<T, K> ? never : K }[keyof T]\n\n/** Named parameters (extras become the query string), one value, or values in URI order. */\nexport type RouteParameters<N> = (ParametersOf<N> & Record<string, unknown>) | RouteParameter | RouteParameter[]\n\n/** route(name) is allowed only when the route has no required parameters. */\nexport type RouteArguments<N> = [RequiredKeys<ParametersOf<N>>] extends [never]\n ? [parameters?: RouteParameters<N>, absolute?: boolean]\n : [parameters: RouteParameters<N>, absolute?: boolean]\n\n/** One named route: its URI (Laravel syntax) and methods. */\nexport interface RouteDefinition {\n readonly uri: string\n readonly methods: readonly string[]\n}\nexport type RouteTable = Readonly<Record<string, RouteDefinition>>\n\nconst PARAMETER = /\\{(\\w+)(?::(\\w+))?(\\?)?\\}/g\nconst WHOLE_OPTIONAL = /^\\{(\\w+)(?::\\w+)?\\?\\}$/\nconst TABLE = Symbol.for('oriel:inertia.routes')\n\nconst registry = (): { table: RouteTable } => {\n const globals = globalThis as unknown as Record<symbol, { table: RouteTable } | undefined>\n return (globals[TABLE] ??= { table: {} })\n}\n\n/** Registers the route table (the generated routes module calls this) and returns it. */\nexport function defineRoutes<const T extends RouteTable>(table: T): T {\n registry().table = table\n return table\n}\n\nexport class RouteError extends Error {\n override readonly name = 'RouteError'\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n const prototype = Object.getPrototypeOf(value) as unknown\n return prototype === Object.prototype || prototype === null\n}\n\n/** PHP's http_build_query, like the server's UrlGenerator: a[b]=1&a[0]=2, booleans as 1/0. */\nfunction buildQuery(values: Record<string, unknown>): string {\n const pairs: string[] = []\n const add = (key: string, value: unknown): void => {\n if (value === null || value === undefined) return\n if (typeof value === 'object' && (Array.isArray(value) || isPlainObject(value))) {\n for (const [child, nested] of Object.entries(value)) add(`${key}[${child}]`, nested)\n return\n }\n const text = value === true ? '1' : value === false ? '0' : String(value)\n pairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(text)}`)\n }\n for (const [key, value] of Object.entries(values)) add(key, value)\n return pairs.join('&')\n}\n\n/** A model-like object's URL value: the {post:slug} field, else `id`; scalars as they are. */\nfunction routeKey(value: unknown, field: string | undefined): unknown {\n if (typeof value !== 'object' || value === null) return value\n const object = value as Record<string, unknown>\n return field !== undefined ? object[field] : object.id\n}\n\nfunction parametersOf(uri: string): Array<{ name: string; field: string | undefined; optional: boolean }> {\n return [...uri.matchAll(PARAMETER)].map((match) => ({ name: match[1]!, field: match[2], optional: match[3] === '?' }))\n}\n\n/**\n * The URL of a named route, like the server's route(): route('posts.show', post), route('posts.show', { post: 1,\n * page: 2 }), route('posts.show', [post, comment]). Relative ('/posts/1') unless `absolute` is true.\n */\nexport function route<N extends RouteName>(name: N, ...[parameters, absolute = false]: RouteArguments<N>): string {\n const definition = registry().table[name]\n if (definition === undefined) throw new RouteError(`Route [${name}] not defined.`)\n const declared = parametersOf(definition.uri)\n // A lone model-like object (route('posts.show', post)) is the value of the route's only parameter, when that\n // parameter is required. For an optional one the server reads the object's keys as the query, and so does this.\n const only = declared.length === 1 && !declared[0]!.optional ? declared[0]! : undefined\n const isModel = only !== undefined && isPlainObject(parameters) && !Object.hasOwn(parameters, only.name) && Object.hasOwn(parameters, only.field ?? 'id')\n const named: Record<string, unknown> = isModel ? { [only.name]: parameters } : isPlainObject(parameters) ? { ...parameters } : {}\n const positional: unknown[] = Array.isArray(parameters) ? [...parameters] : parameters === undefined || parameters === null || isPlainObject(parameters) ? [] : [parameters]\n\n const values = new Map<string, string | undefined>()\n const missing: string[] = []\n for (const parameter of declared) {\n let value: unknown\n if (Object.hasOwn(named, parameter.name)) {\n value = named[parameter.name]\n delete named[parameter.name]\n } else if (positional.length > 0) {\n value = positional.shift()\n }\n const key = routeKey(value, parameter.field)\n const text = key === undefined || key === null ? undefined : String(key)\n if (text === undefined && !parameter.optional) missing.push(parameter.name)\n values.set(parameter.name, text)\n }\n if (missing.length > 0) {\n throw new RouteError(`Missing required parameter for [Route: ${name}] [URI: ${definition.uri}] [Missing parameter: ${missing.join(', ')}].`)\n }\n\n const path =\n definition.uri === '/'\n ? ''\n : definition.uri\n .split('/')\n .filter((segment) => {\n const whole = WHOLE_OPTIONAL.exec(segment)\n return whole === null || values.get(whole[1]!) !== undefined\n })\n .map((segment) => segment.replace(PARAMETER, (_match, parameter: string) => encodeURIComponent(values.get(parameter) ?? '')))\n .join('/')\n const query = buildQuery(named)\n const relative = `/${path.replace(/^\\/+|\\/+$/g, '')}${query === '' ? '' : `?${query}`}`\n if (!absolute) return relative\n return `${browserLocation()?.origin ?? ''}${relative}`\n}\n\n/** Is `name` a registered route? */\nexport function hasRoute(name: string): boolean {\n return Object.hasOwn(registry().table, name)\n}\n\nconst escape = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** A regex for the paths a URI matches: parameters match one segment, whole optional segments may be absent. */\nfunction uriPattern(uri: string): RegExp {\n const segments = uri.replace(/^\\/+|\\/+$/g, '').split('/').filter((segment) => segment !== '')\n const body = segments\n .map((segment) => {\n if (WHOLE_OPTIONAL.test(segment)) return '(?:/[^/]+)?'\n return `/${segment\n .split(PARAMETER)\n .map((part, index) => (index % 4 === 0 ? escape(part) : index % 4 === 1 ? '[^/]+' : ''))\n .join('')}`\n })\n .join('')\n return new RegExp(`^${body === '' ? '/' : body}/?$`)\n}\n\n/**\n * The name of the GET route matching the current path (the browser's, or during SSR the page being rendered), or\n * undefined. The server and the browser agree on it, so markup that uses it hydrates unchanged.\n */\nexport function currentRoute(): string | undefined {\n const path = currentPath()\n if (path === undefined) return undefined\n for (const [name, definition] of Object.entries(registry().table)) {\n if (definition.methods.includes('GET') && uriPattern(definition.uri).test(path)) return name\n }\n return undefined\n}\n\n/** 'posts.*' style wildcard match. */\nfunction matches(pattern: string, name: string): boolean {\n return new RegExp(`^${pattern.split('*').map(escape).join('.*')}$`).test(name)\n}\n\n/** Does the current route match one of the names or wildcard patterns ('posts.*')? */\nexport function isCurrentRoute(...patterns: string[]): boolean {\n const current = currentRoute()\n return current !== undefined && patterns.some((pattern) => matches(pattern, current))\n}\n","import { config, router, type Errors, type Method, type Progress, type RequestPayload, type VisitOptions } from '@inertiajs/core'\n\ntype Data = Record<string, unknown>\ntype Listener = () => void\n\n/** A field value the form keeps whole: dotted keys don't reach into it. */\ntype FormLeaf = string | number | boolean | bigint | symbol | null | undefined | Date | Blob | ((...args: never[]) => unknown)\n\n/**\n * A form's field names, dotted for nested fields ('title', 'address.city', 'tags.0'), as Inertia's useForm names them.\n * (@inertiajs/core's FormDataKeys needs the DOM types; this one also works in a program without them.)\n */\nexport type FormKey<T> = 0 extends 1 & T\n ? string\n : T extends FormLeaf\n ? never\n : T extends readonly unknown[]\n ? `${number}` | DottedKey<`${number}`, T[number]>\n : string extends keyof T\n ? string\n : { [K in keyof T & string]: K | DottedKey<K, T[K]> }[keyof T & string]\n\ntype DottedKey<K extends string, V> = 0 extends 1 & V ? `${K}.${string}` : NonNullable<V> extends FormLeaf ? never : `${K}.${FormKey<NonNullable<V>>}`\n\n/** The type of the field a FormKey names (unknown for a key cast to `never`, the workaround before keys were typed). */\nexport type FormValue<T, K extends string> = [K] extends [never] ? unknown : FieldValue<T, K>\n\ntype FieldValue<T, K extends string> = K extends `${infer Head}.${infer Rest}`\n ? unknown extends FieldOf<T, Head>\n ? unknown\n : FieldValue<NonNullable<FieldOf<T, Head>>, Rest>\n : FieldOf<T, K>\n\ntype FieldOf<T, K extends string> = T extends readonly (infer E)[] ? (K extends `${number}` ? E : never) : K extends keyof T ? T[K] : never\n\n/** Form options passed through to the visit; the helper wraps the callbacks. */\nexport type FormSubmitOptions = Omit<VisitOptions, 'data'>\n\n/** The state a form helper exposes (what React's useForm returns, minus the framework plumbing). */\nexport interface FormState<T extends object> {\n readonly data: T\n readonly defaults: T\n readonly errors: Partial<Record<keyof T | string, string>>\n readonly hasErrors: boolean\n readonly isDirty: boolean\n readonly processing: boolean\n readonly progress: Progress | null\n readonly wasSuccessful: boolean\n readonly recentlySuccessful: boolean\n}\n\n/**\n * A framework-agnostic form helper on the real Inertia router: the core that Solid and Angular adapters wrap in\n * signals (React, Vue and Svelte use the official useForm). Every change notifies subscribers. The data may be\n * declared as an interface; fields are named like the official useForm's, dotted for nested ones ('address.city').\n */\nexport interface FormHelper<T extends object> extends FormState<T> {\n subscribe(listener: Listener): () => void\n setData<K extends FormKey<T>>(key: K, value: FormValue<T, K>): void\n setData(data: Partial<T> | ((data: T) => T)): void\n setDefaults(): void\n setDefaults<K extends FormKey<T>>(key: K, value: FormValue<T, K>): void\n setDefaults(fields: Partial<T>): void\n reset(...fields: Array<FormKey<T>>): void\n clearErrors(...fields: Array<FormKey<T>>): void\n resetAndClearErrors(...fields: Array<FormKey<T>>): void\n setError(field: FormKey<T>, message: string): void\n setError(errors: Record<string, string>): void\n transform(callback: (data: T) => Data): void\n submit(method: Method, url: string, options?: FormSubmitOptions): void\n get(url: string, options?: FormSubmitOptions): void\n post(url: string, options?: FormSubmitOptions): void\n put(url: string, options?: FormSubmitOptions): void\n patch(url: string, options?: FormSubmitOptions): void\n delete(url: string, options?: FormSubmitOptions): void\n cancel(): void\n}\n\nconst isPlain = (value: object) => Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null\n\n/** Deep-copies plain objects, arrays and dates; files, blobs and other instances are kept by reference so identity comparison holds. */\nfunction clone<V>(value: V): V {\n if (typeof value !== 'object' || value === null) return value\n if (value instanceof Date) return new Date(value.getTime()) as V\n if (!isPlain(value)) return value\n if (Array.isArray(value)) return value.map(clone) as V\n return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clone(entry)])) as V\n}\n\nfunction equal(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n if (a instanceof Date || b instanceof Date) return a instanceof Date && b instanceof Date && a.getTime() === b.getTime()\n if (Array.isArray(a) !== Array.isArray(b)) return false\n if (!isPlain(a) || !isPlain(b)) return false\n const keys = Object.keys(a)\n if (keys.length !== Object.keys(b).length) return false\n return keys.every((key) => Object.hasOwn(b, key) && equal((a as Data)[key], (b as Data)[key]))\n}\n\nfunction getPath(target: Data, path: string): unknown {\n return path.split('.').reduce<unknown>((current, segment) => (typeof current === 'object' && current !== null ? (current as Data)[segment] : undefined), target)\n}\n\nfunction hasPath(target: Data, path: string): boolean {\n const segments = path.split('.')\n const last = segments.pop()!\n const parent = segments.length === 0 ? target : getPath(target, segments.join('.'))\n return typeof parent === 'object' && parent !== null && Object.hasOwn(parent, last)\n}\n\n/**\n * A copy of `target` with `path` set to `value`: the plain objects and arrays along the path are copied, so whoever\n * holds the old ones (a computed, an OnPush child) sees the change; everything off the path stays shared. Other\n * instances along the path (a File, a class) are written in place, as before.\n */\nfunction withPath<V>(target: V, path: string, value: unknown): V {\n const [segment, ...rest] = path.split('.') as [string, ...string[]]\n const node = typeof target === 'object' && target !== null ? (target as Data) : {}\n const next = rest.length === 0 ? value : withPath(node[segment], rest.join('.'), value)\n if (!isPlain(node)) {\n node[segment] = next\n return node as V\n }\n const copy = (Array.isArray(node) ? [...node] : { ...node }) as Data\n copy[segment] = next\n return copy as V\n}\n\nfunction setPath<V extends Data>(target: V, path: string, value: unknown): V {\n const segments = path.split('.')\n const last = segments.pop()!\n let current: Data = target\n for (const segment of segments) {\n if (typeof current[segment] !== 'object' || current[segment] === null) current[segment] = {}\n current = current[segment] as Data\n }\n current[last] = value\n return target\n}\n\n/** createForm({ title: '' }): a headless form helper (Inertia's useForm without remember or Precognition). */\nexport function createForm<T extends object>(initial: T | (() => T)): FormHelper<T> {\n return createDataForm(initial as unknown as Data | (() => Data)) as unknown as FormHelper<T>\n}\n\n/** The helper itself, over plain records (the public type takes interfaces too). */\nfunction createDataForm<T extends Data>(initial: T | (() => T)): FormHelper<T> {\n const resolve = (): T => clone(typeof initial === 'function' ? (initial as () => T)() : initial)\n const listeners = new Set<Listener>()\n let data = resolve()\n let defaults = clone(data)\n let errors: Record<string, string> = {}\n let processing = false\n let progress: Progress | null = null\n let wasSuccessful = false\n let recentlySuccessful = false\n let recentlyTimer: ReturnType<typeof setTimeout> | undefined\n let transformer: (data: T) => Data = (value) => value\n let cancelToken: { cancel(): void } | undefined\n let defaultsSetInOnSuccess = false\n\n const notify = () => {\n for (const listener of [...listeners]) listener()\n }\n\n const clearErrors = (...fields: string[]) => {\n errors = fields.length === 0 ? {} : Object.fromEntries(Object.entries(errors).filter(([field]) => !fields.includes(field)))\n notify()\n }\n\n const setError = (fieldOrErrors: string | Record<string, string>, message?: string) => {\n errors = { ...errors, ...(typeof fieldOrErrors === 'string' ? { [fieldOrErrors]: message ?? '' } : fieldOrErrors) }\n notify()\n }\n\n const reset = (...fields: string[]) => {\n const source = typeof initial === 'function' ? resolve() : clone(defaults)\n if (fields.length === 0) {\n if (typeof initial === 'function') defaults = clone(source)\n data = source\n } else {\n let next = data\n for (const field of fields) if (hasPath(source, field)) next = withPath(next, field, getPath(source, field))\n data = next\n }\n notify()\n }\n\n const submit = (method: Method, url: string, options: FormSubmitOptions = {}) => {\n defaultsSetInOnSuccess = false\n const payload = transformer(data) as RequestPayload\n const visit: VisitOptions = {\n ...options,\n onCancelToken: (token) => {\n cancelToken = token\n return options.onCancelToken?.(token)\n },\n onBefore: (pending) => {\n wasSuccessful = false\n recentlySuccessful = false\n clearTimeout(recentlyTimer)\n notify()\n return options.onBefore?.(pending)\n },\n onStart: (pending) => {\n processing = true\n notify()\n return options.onStart?.(pending)\n },\n onProgress: (event) => {\n progress = event ?? null\n notify()\n return options.onProgress?.(event)\n },\n onSuccess: async (page) => {\n errors = {}\n wasSuccessful = true\n recentlySuccessful = true\n recentlyTimer = setTimeout(() => {\n recentlySuccessful = false\n notify()\n }, config.get('form.recentlySuccessfulDuration') as number)\n notify()\n const result = await options.onSuccess?.(page)\n if (!defaultsSetInOnSuccess) defaults = clone(data)\n notify()\n return result\n },\n onError: (received: Errors) => {\n errors = Object.fromEntries(Object.entries(received).map(([field, value]) => [field, Array.isArray(value) ? String(value[0] ?? '') : String(value)]))\n notify()\n return options.onError?.(received)\n },\n onCancel: () => options.onCancel?.(),\n onFinish: (visitInfo) => {\n processing = false\n progress = null\n cancelToken = undefined\n notify()\n return options.onFinish?.(visitInfo)\n },\n }\n if (method === 'delete') router.delete(url, { ...visit, data: payload })\n else router[method](url, payload, visit)\n }\n\n const helper = {\n get data() {\n return data\n },\n get defaults() {\n return defaults\n },\n get errors() {\n return errors\n },\n get hasErrors() {\n return Object.keys(errors).length > 0\n },\n get isDirty() {\n return !equal(data, defaults)\n },\n get processing() {\n return processing\n },\n get progress() {\n return progress\n },\n get wasSuccessful() {\n return wasSuccessful\n },\n get recentlySuccessful() {\n return recentlySuccessful\n },\n subscribe(listener: Listener) {\n listeners.add(listener)\n return () => void listeners.delete(listener)\n },\n setData(keyOrData: string | Partial<T> | ((data: T) => T), value?: unknown) {\n if (typeof keyOrData === 'string') data = withPath(data, keyOrData, value)\n else if (typeof keyOrData === 'function') data = keyOrData(data)\n else data = { ...data, ...keyOrData }\n notify()\n },\n setDefaults(keyOrFields?: string | Partial<T>, value?: unknown) {\n defaultsSetInOnSuccess = true\n if (keyOrFields === undefined) defaults = clone(data)\n else if (typeof keyOrFields === 'string') defaults = setPath(clone(defaults), keyOrFields, value)\n else defaults = { ...clone(defaults), ...keyOrFields }\n notify()\n },\n reset,\n clearErrors,\n resetAndClearErrors(...fields: string[]) {\n reset(...fields)\n clearErrors(...fields)\n },\n setError,\n transform(callback: (data: T) => Data) {\n transformer = callback\n },\n submit,\n get: (url: string, options?: FormSubmitOptions) => submit('get', url, options),\n post: (url: string, options?: FormSubmitOptions) => submit('post', url, options),\n put: (url: string, options?: FormSubmitOptions) => submit('put', url, options),\n patch: (url: string, options?: FormSubmitOptions) => submit('patch', url, options),\n delete: (url: string, options?: FormSubmitOptions) => submit('delete', url, options),\n cancel() {\n cancelToken?.cancel()\n },\n }\n return helper as unknown as FormHelper<T>\n}\n"],"mappings":"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","names":["router"]}
|
package/package.json
CHANGED