@inertiajs/core 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inertiajs/core",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "license": "MIT",
5
5
  "description": "A framework for creating server-driven single page apps.",
6
6
  "contributors": [
package/types/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Router } from './router';
2
2
  export { objectToFormData } from './formData';
3
3
  export { formDataToObject } from './formObject';
4
+ export { resetFormFields } from './resetFormFields';
4
5
  export { default as createHeadManager } from './head';
5
6
  export { hide as hideProgress, reveal as revealProgress, default as setupProgress } from './progress';
6
7
  export { default as shouldIntercept } from './shouldIntercept';
@@ -8,6 +8,7 @@ declare class PrefetchedRequests {
8
8
  add(params: ActiveVisit, sendFunc: (params: InternalActiveVisit) => void, { cacheFor }: PrefetchOptions): Promise<void> | Promise<Response>;
9
9
  removeAll(): void;
10
10
  remove(params: ActiveVisit): void;
11
+ protected removeFromInFlight(params: ActiveVisit): void;
11
12
  protected extractStaleValues(cacheFor: PrefetchOptions['cacheFor']): [number, number];
12
13
  protected cacheForToStaleAndExpires(cacheFor: PrefetchOptions['cacheFor']): [CacheForOption, CacheForOption];
13
14
  protected clearTimer(params: ActiveVisit): void;
@@ -23,6 +23,7 @@ export declare class RequestParams {
23
23
  onStart(): void;
24
24
  onPrefetching(): void;
25
25
  onPrefetchResponse(response: Response): void;
26
+ onPrefetchError(error: Error): void;
26
27
  all(): InternalActiveVisit;
27
28
  headers(): AxiosRequestConfig['headers'];
28
29
  setPreserveOptions(page: Page): void;
@@ -0,0 +1 @@
1
+ export declare function resetFormFields(formElement: HTMLFormElement, defaults: FormData, fieldNames?: string[]): void;
package/types/router.d.ts CHANGED
@@ -24,13 +24,13 @@ export declare class Router {
24
24
  flush(href: string | URL, options?: VisitOptions): void;
25
25
  flushAll(): void;
26
26
  getPrefetching(href: string | URL, options?: VisitOptions): InFlightPrefetch | PrefetchedResponse | null;
27
- prefetch(href: string | URL, options: Partial<Visit<RequestPayload> & VisitCallbacks> | undefined, { cacheFor }: PrefetchOptions): void;
27
+ prefetch(href: string | URL, options: Partial<Visit<RequestPayload> & VisitCallbacks<RequestPayload>> | undefined, { cacheFor }: PrefetchOptions): void;
28
28
  clearHistory(): void;
29
29
  decryptHistory(): Promise<Page>;
30
30
  resolveComponent(component: string): Promise<Component>;
31
- replace(params: ClientSideVisitOptions): void;
32
- push(params: ClientSideVisitOptions): void;
33
- protected clientVisit(params: ClientSideVisitOptions, { replace }?: {
31
+ replace<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>): void;
32
+ push<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>): void;
33
+ protected clientVisit<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>, { replace }?: {
34
34
  replace?: boolean;
35
35
  }): void;
36
36
  protected getPrefetchParams(href: string | URL, options: VisitOptions): ActiveVisit;
package/types/types.d.ts CHANGED
@@ -5,13 +5,49 @@ declare module 'axios' {
5
5
  percentage: number | undefined;
6
6
  }
7
7
  }
8
- export type Errors = Record<string, string>;
8
+ export type DefaultInertiaConfig = {
9
+ errorValueType: string;
10
+ };
11
+ /**
12
+ * Designed to allow overriding of some core types using TypeScript
13
+ * interface declaration merging.
14
+ *
15
+ * @see {@link DefaultInertiaConfig} for keys to override
16
+ * @example
17
+ * ```ts
18
+ * declare module '@inertiajs/core' {
19
+ * export interface InertiaConfig {
20
+ * errorValueType: string[]
21
+ * }
22
+ * }
23
+ * ```
24
+ */
25
+ export interface InertiaConfig {
26
+ }
27
+ export type InertiaConfigFor<Key extends keyof DefaultInertiaConfig> = Key extends keyof InertiaConfig ? InertiaConfig[Key] : DefaultInertiaConfig[Key];
28
+ export type ErrorValue = InertiaConfigFor<'errorValueType'>;
29
+ export type Errors = Record<string, ErrorValue>;
9
30
  export type ErrorBag = Record<string, Errors>;
31
+ export type FormDataConvertibleValue = Blob | FormDataEntryValue | Date | boolean | number | null | undefined;
10
32
  export type FormDataConvertible = Array<FormDataConvertible> | {
11
33
  [key: string]: FormDataConvertible;
12
- } | Blob | FormDataEntryValue | Date | boolean | number | null | undefined;
13
- export type FormDataKeys<T extends Record<any, any>> = T extends T ? keyof T extends infer Key extends Extract<keyof T, string> ? Key extends Key ? T[Key] extends Record<any, any> ? `${Key}.${FormDataKeys<T[Key]>}` | Key : Key : never : never : never;
14
- export type FormDataValues<T extends Record<any, any>, K extends FormDataKeys<T>> = K extends `${infer P}.${infer Rest}` ? P extends keyof T ? Rest extends FormDataKeys<T[P]> ? FormDataValues<T[P], Rest> : never : never : K extends keyof T ? T[K] : never;
34
+ } | FormDataConvertibleValue;
35
+ export type FormDataType<T extends object> = {
36
+ [K in keyof T]: T[K] extends FormDataConvertibleValue ? T[K] : T[K] extends (...args: unknown[]) => unknown ? never : T[K] extends object | Array<unknown> ? FormDataType<T[K]> : never;
37
+ };
38
+ export type FormDataKeys<T> = T extends Function | FormDataConvertibleValue ? never : T extends Array<unknown> ? number extends T['length'] ? `${number}` | `${number}.${FormDataKeys<T[number]>}` : Extract<keyof T, `${number}`> | {
39
+ [Key in Extract<keyof T, `${number}`>]: `${Key & string}.${FormDataKeys<T[Key & string]> & string}`;
40
+ }[Extract<keyof T, `${number}`>] : string extends keyof T ? string : Extract<keyof T, string> | {
41
+ [Key in Extract<keyof T, string>]: `${Key}.${FormDataKeys<T[Key]> & string}`;
42
+ }[Extract<keyof T, string>];
43
+ type PartialFormDataErrors<T> = {
44
+ [K in string extends keyof T ? string : Extract<keyof FormDataError<T>, string>]?: ErrorValue;
45
+ };
46
+ export type FormDataErrors<T> = PartialFormDataErrors<T> & {
47
+ [K in keyof PartialFormDataErrors<T>]: NonNullable<PartialFormDataErrors<T>[K]>;
48
+ };
49
+ export type FormDataValues<T, K extends FormDataKeys<T>> = K extends `${infer P}.${infer Rest}` ? T extends unknown[] ? P extends `${infer I extends number}` ? Rest extends FormDataKeys<T[I]> ? FormDataValues<T[I], Rest> : never : never : P extends keyof T ? Rest extends FormDataKeys<T[P]> ? FormDataValues<T[P], Rest> : never : never : K extends keyof T ? T[K] : T extends unknown[] ? T[K & number] : never;
50
+ export type FormDataError<T> = Partial<Record<FormDataKeys<T>, ErrorValue>>;
15
51
  export type Method = 'get' | 'post' | 'put' | 'patch' | 'delete';
16
52
  export type RequestPayload = Record<string, FormDataConvertible> | FormData;
17
53
  export interface PageProps {
@@ -38,17 +74,17 @@ export type ScrollRegion = {
38
74
  top: number;
39
75
  left: number;
40
76
  };
41
- export interface ClientSideVisitOptions {
77
+ export interface ClientSideVisitOptions<TProps = Page['props']> {
42
78
  component?: Page['component'];
43
79
  url?: Page['url'];
44
- props?: ((props: Page['props']) => Page['props']) | Page['props'];
80
+ props?: ((props: TProps) => PageProps) | PageProps;
45
81
  clearHistory?: Page['clearHistory'];
46
82
  encryptHistory?: Page['encryptHistory'];
47
83
  preserveScroll?: VisitOptions['preserveScroll'];
48
84
  preserveState?: VisitOptions['preserveState'];
49
85
  errorBag?: string | null;
50
86
  onError?: (errors: Errors) => void;
51
- onFinish?: (visit: ClientSideVisitOptions) => void;
87
+ onFinish?: (visit: ClientSideVisitOptions<TProps>) => void;
52
88
  onSuccess?: (page: Page) => void;
53
89
  }
54
90
  export type PageResolver = (name: string) => Component;
@@ -81,18 +117,18 @@ export type Visit<T extends RequestPayload = RequestPayload> = {
81
117
  reset: string[];
82
118
  preserveUrl: boolean;
83
119
  };
84
- export type GlobalEventsMap = {
120
+ export type GlobalEventsMap<T extends RequestPayload = RequestPayload> = {
85
121
  before: {
86
- parameters: [PendingVisit];
122
+ parameters: [PendingVisit<T>];
87
123
  details: {
88
- visit: PendingVisit;
124
+ visit: PendingVisit<T>;
89
125
  };
90
126
  result: boolean | void;
91
127
  };
92
128
  start: {
93
- parameters: [PendingVisit];
129
+ parameters: [PendingVisit<T>];
94
130
  details: {
95
- visit: PendingVisit;
131
+ visit: PendingVisit<T>;
96
132
  };
97
133
  result: void;
98
134
  };
@@ -104,9 +140,9 @@ export type GlobalEventsMap = {
104
140
  result: void;
105
141
  };
106
142
  finish: {
107
- parameters: [ActiveVisit];
143
+ parameters: [ActiveVisit<T>];
108
144
  details: {
109
- visit: ActiveVisit;
145
+ visit: ActiveVisit<T>;
110
146
  };
111
147
  result: void;
112
148
  };
@@ -151,48 +187,48 @@ export type GlobalEventsMap = {
151
187
  result: boolean | void;
152
188
  };
153
189
  prefetched: {
154
- parameters: [AxiosResponse, ActiveVisit];
190
+ parameters: [AxiosResponse, ActiveVisit<T>];
155
191
  details: {
156
192
  response: AxiosResponse;
157
193
  fetchedAt: number;
158
- visit: ActiveVisit;
194
+ visit: ActiveVisit<T>;
159
195
  };
160
196
  result: void;
161
197
  };
162
198
  prefetching: {
163
- parameters: [ActiveVisit];
199
+ parameters: [ActiveVisit<T>];
164
200
  details: {
165
- visit: ActiveVisit;
201
+ visit: ActiveVisit<T>;
166
202
  };
167
203
  result: void;
168
204
  };
169
205
  };
170
206
  export type PageEvent = 'newComponent' | 'firstLoad';
171
- export type GlobalEventNames = keyof GlobalEventsMap;
172
- export type GlobalEvent<TEventName extends GlobalEventNames> = CustomEvent<GlobalEventDetails<TEventName>>;
173
- export type GlobalEventParameters<TEventName extends GlobalEventNames> = GlobalEventsMap[TEventName]['parameters'];
174
- export type GlobalEventResult<TEventName extends GlobalEventNames> = GlobalEventsMap[TEventName]['result'];
175
- export type GlobalEventDetails<TEventName extends GlobalEventNames> = GlobalEventsMap[TEventName]['details'];
176
- export type GlobalEventTrigger<TEventName extends GlobalEventNames> = (...params: GlobalEventParameters<TEventName>) => GlobalEventResult<TEventName>;
177
- export type GlobalEventCallback<TEventName extends GlobalEventNames> = (...params: GlobalEventParameters<TEventName>) => GlobalEventResult<TEventName>;
207
+ export type GlobalEventNames<T extends RequestPayload = RequestPayload> = keyof GlobalEventsMap<T>;
208
+ export type GlobalEvent<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = CustomEvent<GlobalEventDetails<TEventName, T>>;
209
+ export type GlobalEventParameters<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = GlobalEventsMap<T>[TEventName]['parameters'];
210
+ export type GlobalEventResult<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = GlobalEventsMap<T>[TEventName]['result'];
211
+ export type GlobalEventDetails<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = GlobalEventsMap<T>[TEventName]['details'];
212
+ export type GlobalEventTrigger<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = (...params: GlobalEventParameters<TEventName, T>) => GlobalEventResult<TEventName, T>;
213
+ export type GlobalEventCallback<TEventName extends GlobalEventNames<T>, T extends RequestPayload = RequestPayload> = (...params: GlobalEventParameters<TEventName, T>) => GlobalEventResult<TEventName, T>;
178
214
  export type InternalEvent = 'missingHistoryItem' | 'loadDeferredProps';
179
- export type VisitCallbacks = {
215
+ export type VisitCallbacks<T extends RequestPayload = RequestPayload> = {
180
216
  onCancelToken: {
181
217
  ({ cancel }: {
182
218
  cancel: VoidFunction;
183
219
  }): void;
184
220
  };
185
- onBefore: GlobalEventCallback<'before'>;
186
- onStart: GlobalEventCallback<'start'>;
187
- onProgress: GlobalEventCallback<'progress'>;
188
- onFinish: GlobalEventCallback<'finish'>;
189
- onCancel: GlobalEventCallback<'cancel'>;
190
- onSuccess: GlobalEventCallback<'success'>;
191
- onError: GlobalEventCallback<'error'>;
192
- onPrefetched: GlobalEventCallback<'prefetched'>;
193
- onPrefetching: GlobalEventCallback<'prefetching'>;
221
+ onBefore: GlobalEventCallback<'before', T>;
222
+ onStart: GlobalEventCallback<'start', T>;
223
+ onProgress: GlobalEventCallback<'progress', T>;
224
+ onFinish: GlobalEventCallback<'finish', T>;
225
+ onCancel: GlobalEventCallback<'cancel', T>;
226
+ onSuccess: GlobalEventCallback<'success', T>;
227
+ onError: GlobalEventCallback<'error', T>;
228
+ onPrefetched: GlobalEventCallback<'prefetched', T>;
229
+ onPrefetching: GlobalEventCallback<'prefetching', T>;
194
230
  };
195
- export type VisitOptions<T extends RequestPayload = RequestPayload> = Partial<Visit<T> & VisitCallbacks>;
231
+ export type VisitOptions<T extends RequestPayload = RequestPayload> = Partial<Visit<T> & VisitCallbacks<T>>;
196
232
  export type ReloadOptions<T extends RequestPayload = RequestPayload> = Omit<VisitOptions<T>, 'preserveScroll' | 'preserveState'>;
197
233
  export type PollOptions = {
198
234
  keepAlive?: boolean;
@@ -210,10 +246,11 @@ export type PendingVisitOptions = {
210
246
  cancelled: boolean;
211
247
  interrupted: boolean;
212
248
  };
213
- export type PendingVisit = Visit & PendingVisitOptions;
214
- export type ActiveVisit = PendingVisit & Required<VisitOptions>;
249
+ export type PendingVisit<T extends RequestPayload = RequestPayload> = Visit<T> & PendingVisitOptions;
250
+ export type ActiveVisit<T extends RequestPayload = RequestPayload> = PendingVisit<T> & Required<VisitOptions<T>>;
215
251
  export type InternalActiveVisit = ActiveVisit & {
216
252
  onPrefetchResponse?: (response: Response) => void;
253
+ onPrefetchError?: (error: Error) => void;
217
254
  };
218
255
  export type VisitId = unknown;
219
256
  export type Component = unknown;
@@ -226,6 +263,16 @@ export type CacheForOption = number | string;
226
263
  export type PrefetchOptions = {
227
264
  cacheFor: CacheForOption | CacheForOption[];
228
265
  };
266
+ export interface LinkComponentBaseProps extends Partial<Pick<Visit<RequestPayload>, 'data' | 'method' | 'replace' | 'preserveScroll' | 'preserveState' | 'only' | 'except' | 'headers' | 'queryStringArrayFormat' | 'async'> & Omit<VisitCallbacks, 'onCancelToken'> & {
267
+ href: string | {
268
+ url: string;
269
+ method: Method;
270
+ };
271
+ onCancelToken: (cancelToken: import('axios').CancelTokenSource) => void;
272
+ prefetch: boolean | LinkPrefetchOption | LinkPrefetchOption[];
273
+ cacheFor: CacheForOption | CacheForOption[];
274
+ }> {
275
+ }
229
276
  type PrefetchObject = {
230
277
  params: ActiveVisit;
231
278
  response: Promise<Response>;
@@ -264,22 +311,27 @@ export type ProgressSettings = {
264
311
  color: string;
265
312
  };
266
313
  export type FormComponentOptions = Pick<VisitOptions, 'preserveScroll' | 'preserveState' | 'preserveUrl' | 'replace' | 'only' | 'except' | 'reset'>;
267
- export type FormComponentProps = Partial<Pick<Visit, 'method' | 'headers' | 'queryStringArrayFormat' | 'errorBag' | 'showProgress'> & Omit<VisitCallbacks, 'onPrefetched' | 'onPrefetching'>> & {
314
+ export type FormComponentProps = Partial<Pick<Visit, 'headers' | 'queryStringArrayFormat' | 'errorBag' | 'showProgress'> & Omit<VisitCallbacks, 'onPrefetched' | 'onPrefetching'>> & {
315
+ method?: Method | Uppercase<Method>;
268
316
  action?: string | {
269
317
  url: string;
270
318
  method: Method;
271
319
  };
272
320
  transform?: (data: Record<string, FormDataConvertible>) => Record<string, FormDataConvertible>;
273
321
  options?: FormComponentOptions;
322
+ onSubmitComplete?: (props: FormComponentonSubmitCompleteArguments) => void;
323
+ disableWhileProcessing?: boolean;
274
324
  };
275
325
  export type FormComponentMethods = {
276
326
  clearErrors: (...fields: string[]) => void;
277
327
  resetAndClearErrors: (...fields: string[]) => void;
278
328
  setError(field: string, value: string): void;
279
329
  setError(errors: Record<string, string>): void;
280
- reset: () => void;
330
+ reset: (...fields: string[]) => void;
281
331
  submit: () => void;
332
+ defaults: () => void;
282
333
  };
334
+ export type FormComponentonSubmitCompleteArguments = Pick<FormComponentMethods, 'reset' | 'defaults'>;
283
335
  export type FormComponentState = {
284
336
  errors: Record<string, string>;
285
337
  hasErrors: boolean;
package/types/url.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { FormDataConvertible, Method, RequestPayload, VisitOptions } from './types';
2
2
  export declare function hrefToUrl(href: string | URL): URL;
3
3
  export declare const transformUrlAndData: (href: string | URL, data: RequestPayload, method: Method, forceFormData: VisitOptions['forceFormData'], queryStringArrayFormat: VisitOptions['queryStringArrayFormat']) => [URL, RequestPayload];
4
- export declare function mergeDataIntoQueryString(method: Method, href: URL | string, data: Record<string, FormDataConvertible>, qsArrayFormat?: 'indices' | 'brackets'): [string, Record<string, FormDataConvertible>];
4
+ type MergeDataIntoQueryStringDataReturnType<T extends RequestPayload> = T extends Record<string, FormDataConvertible> ? Record<string, FormDataConvertible> : RequestPayload;
5
+ export declare function mergeDataIntoQueryString<T extends RequestPayload>(method: Method, href: URL | string, data: T, qsArrayFormat?: 'indices' | 'brackets'): [string, MergeDataIntoQueryStringDataReturnType<T>];
5
6
  export declare function urlWithoutHash(url: URL | Location): URL;
6
7
  export declare const setHashIfSameUrl: (originUrl: URL | Location, destinationUrl: URL | Location) => void;
7
8
  export declare const isSameUrlWithoutHash: (url1: URL | Location, url2: URL | Location) => boolean;
9
+ export {};