@inertiajs/core 2.2.15 → 2.2.16

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.esm.js CHANGED
@@ -349,27 +349,33 @@ var Scroll = class {
349
349
  import * as qs from "qs";
350
350
 
351
351
  // src/files.ts
352
+ var isFile = (value) => typeof File !== "undefined" && value instanceof File || value instanceof Blob || typeof FileList !== "undefined" && value instanceof FileList && value.length > 0;
352
353
  function hasFiles(data) {
353
- return data instanceof File || data instanceof Blob || data instanceof FileList && data.length > 0 || data instanceof FormData && Array.from(data.values()).some((value) => hasFiles(value)) || typeof data === "object" && data !== null && Object.values(data).some((value) => hasFiles(value));
354
+ return isFile(data) || data instanceof FormData && Array.from(data.values()).some((value) => hasFiles(value)) || typeof data === "object" && data !== null && Object.values(data).some((value) => hasFiles(value));
354
355
  }
355
356
 
356
357
  // src/formData.ts
357
358
  var isFormData = (value) => value instanceof FormData;
358
- function objectToFormData(source, form = new FormData(), parentKey = null) {
359
+ function objectToFormData(source, form = new FormData(), parentKey = null, queryStringArrayFormat = "brackets") {
359
360
  source = source || {};
360
361
  for (const key in source) {
361
362
  if (Object.prototype.hasOwnProperty.call(source, key)) {
362
- append(form, composeKey(parentKey, key), source[key]);
363
+ append(form, composeKey(parentKey, key, "indices"), source[key], queryStringArrayFormat);
363
364
  }
364
365
  }
365
366
  return form;
366
367
  }
367
- function composeKey(parent, key) {
368
- return parent ? parent + "[" + key + "]" : key;
368
+ function composeKey(parent, key, format) {
369
+ if (!parent) {
370
+ return key;
371
+ }
372
+ return format === "brackets" ? `${parent}[]` : `${parent}[${key}]`;
369
373
  }
370
- function append(form, key, value) {
374
+ function append(form, key, value, format) {
371
375
  if (Array.isArray(value)) {
372
- return Array.from(value.keys()).forEach((index) => append(form, composeKey(key, index.toString()), value[index]));
376
+ return Array.from(value.keys()).forEach(
377
+ (index) => append(form, composeKey(key, index.toString(), format), value[index], format)
378
+ );
373
379
  } else if (value instanceof Date) {
374
380
  return form.append(key, value.toISOString());
375
381
  } else if (value instanceof File) {
@@ -385,7 +391,7 @@ function append(form, key, value) {
385
391
  } else if (value === null || value === void 0) {
386
392
  return form.append(key, "");
387
393
  }
388
- objectToFormData(value, form, key);
394
+ objectToFormData(value, form, key, format);
389
395
  }
390
396
 
391
397
  // src/url.ts
@@ -395,7 +401,7 @@ function hrefToUrl(href) {
395
401
  var transformUrlAndData = (href, data, method, forceFormData, queryStringArrayFormat) => {
396
402
  let url = typeof href === "string" ? hrefToUrl(href) : href;
397
403
  if ((hasFiles(data) || forceFormData) && !isFormData(data)) {
398
- data = objectToFormData(data);
404
+ data = objectToFormData(data, new FormData(), null, queryStringArrayFormat);
399
405
  }
400
406
  if (isFormData(data)) {
401
407
  return [url, data];
@@ -654,7 +660,7 @@ var History = class {
654
660
  }
655
661
  restore(key) {
656
662
  if (!isServer) {
657
- return this.current[this.rememberedState] ? this.current[this.rememberedState]?.[key] : this.initialState?.[this.rememberedState]?.[key];
663
+ return this.current[this.rememberedState]?.[key] !== void 0 ? this.current[this.rememberedState]?.[key] : this.initialState?.[this.rememberedState]?.[key];
658
664
  }
659
665
  }
660
666
  pushState(page2, cb = null) {
@@ -1302,6 +1308,8 @@ var PrefetchedRequests = class {
1302
1308
  "showProgress",
1303
1309
  "replace",
1304
1310
  "prefetch",
1311
+ "preserveScroll",
1312
+ "preserveState",
1305
1313
  "onBefore",
1306
1314
  "onBeforeUpdate",
1307
1315
  "onStart",
@@ -2348,6 +2356,9 @@ var Router = class {
2348
2356
 
2349
2357
  // src/domUtils.ts
2350
2358
  var elementInViewport = (el) => {
2359
+ if (el.offsetParent === null) {
2360
+ return false;
2361
+ }
2351
2362
  const rect = el.getBoundingClientRect();
2352
2363
  const verticallyVisible = rect.top < window.innerHeight && rect.bottom >= 0;
2353
2364
  const horizontallyVisible = rect.left < window.innerWidth && rect.right >= 0;
@@ -2399,7 +2410,10 @@ var getScrollableParent = (element) => {
2399
2410
  }
2400
2411
  return null;
2401
2412
  };
2402
- var getElementsInViewportFromCollection = (referenceElement, elements) => {
2413
+ var getElementsInViewportFromCollection = (elements, referenceElement) => {
2414
+ if (!referenceElement) {
2415
+ return elements.filter((element) => elementInViewport(element));
2416
+ }
2403
2417
  const referenceIndex = elements.indexOf(referenceElement);
2404
2418
  const upwardElements = [];
2405
2419
  const downwardElements = [];
@@ -2421,6 +2435,15 @@ var getElementsInViewportFromCollection = (referenceElement, elements) => {
2421
2435
  }
2422
2436
  return [...upwardElements.reverse(), ...downwardElements];
2423
2437
  };
2438
+ var requestAnimationFrame = (cb, times = 1) => {
2439
+ window.requestAnimationFrame(() => {
2440
+ if (times > 1) {
2441
+ requestAnimationFrame(cb, times - 1);
2442
+ } else {
2443
+ cb();
2444
+ }
2445
+ });
2446
+ };
2424
2447
 
2425
2448
  // src/formObject.ts
2426
2449
  import { get as get4, set as set4 } from "lodash-es";
@@ -2449,6 +2472,41 @@ function parseKey(key) {
2449
2472
  }
2450
2473
  return path;
2451
2474
  }
2475
+ function setNestedObject(obj, path, value) {
2476
+ let current = obj;
2477
+ for (let i = 0; i < path.length - 1; i++) {
2478
+ if (!(path[i] in current)) {
2479
+ current[path[i]] = {};
2480
+ }
2481
+ current = current[path[i]];
2482
+ }
2483
+ current[path[path.length - 1]] = value;
2484
+ }
2485
+ function objectHasSequentialNumericKeys(value) {
2486
+ const keys = Object.keys(value);
2487
+ const numericKeys = keys.filter((k) => /^\d+$/.test(k)).map(Number).sort((a, b) => a - b);
2488
+ return keys.length === numericKeys.length && numericKeys.length > 0 && numericKeys[0] === 0 && numericKeys.every((n, i) => n === i);
2489
+ }
2490
+ function convertSequentialObjectsToArrays(value) {
2491
+ if (Array.isArray(value)) {
2492
+ return value.map(convertSequentialObjectsToArrays);
2493
+ }
2494
+ if (typeof value !== "object" || value === null || isFile(value)) {
2495
+ return value;
2496
+ }
2497
+ if (objectHasSequentialNumericKeys(value)) {
2498
+ const result2 = [];
2499
+ for (let i = 0; i < Object.keys(value).length; i++) {
2500
+ result2[i] = convertSequentialObjectsToArrays(value[i]);
2501
+ }
2502
+ return result2;
2503
+ }
2504
+ const result = {};
2505
+ for (const key in value) {
2506
+ result[key] = convertSequentialObjectsToArrays(value[key]);
2507
+ }
2508
+ return result;
2509
+ }
2452
2510
  function formDataToObject(source) {
2453
2511
  const form = {};
2454
2512
  for (const [key, value] of source.entries()) {
@@ -2461,14 +2519,17 @@ function formDataToObject(source) {
2461
2519
  const existing = get4(form, arrayPath);
2462
2520
  if (Array.isArray(existing)) {
2463
2521
  existing.push(value);
2522
+ } else if (existing && typeof existing === "object" && !isFile(existing)) {
2523
+ const numericKeys = Object.keys(existing).filter((k) => /^\d+$/.test(k)).map(Number).sort((a, b) => a - b);
2524
+ set4(form, arrayPath, numericKeys.length > 0 ? [...numericKeys.map((k) => existing[k]), value] : [value]);
2464
2525
  } else {
2465
2526
  set4(form, arrayPath, [value]);
2466
2527
  }
2467
2528
  continue;
2468
2529
  }
2469
- set4(form, path, value);
2530
+ setNestedObject(form, path.map(String), value);
2470
2531
  }
2471
- return form;
2532
+ return convertSequentialObjectsToArrays(form);
2472
2533
  }
2473
2534
 
2474
2535
  // src/head.ts
@@ -2943,7 +3004,7 @@ var useInfiniteScrollQueryString = (options) => {
2943
3004
  }
2944
3005
  const pageMap = /* @__PURE__ */ new Map();
2945
3006
  const elements = [...itemsElement.children];
2946
- getElementsInViewportFromCollection(itemElement, elements).forEach((element) => {
3007
+ getElementsInViewportFromCollection(elements, itemElement).forEach((element) => {
2947
3008
  const page2 = getPageFromElement(element) ?? "1";
2948
3009
  if (pageMap.has(page2)) {
2949
3010
  pageMap.set(page2, pageMap.get(page2) + 1);
@@ -2973,10 +3034,7 @@ var useInfiniteScrollPreservation = (options) => {
2973
3034
  const scrollableContainer = options.getScrollableParent();
2974
3035
  const itemsElement = options.getItemsElement();
2975
3036
  currentScrollTop = scrollableContainer?.scrollTop || window.scrollY;
2976
- const visibleElements = getElementsInViewportFromCollection(
2977
- itemsElement.firstElementChild,
2978
- [...itemsElement.children]
2979
- );
3037
+ const visibleElements = getElementsInViewportFromCollection([...itemsElement.children]);
2980
3038
  if (visibleElements.length > 0) {
2981
3039
  referenceElement = visibleElements[0];
2982
3040
  const containerRect = scrollableContainer?.getBoundingClientRect() || { top: 0 };
@@ -3013,7 +3071,7 @@ var useInfiniteScrollPreservation = (options) => {
3013
3071
  }
3014
3072
  restored = true;
3015
3073
  };
3016
- restore();
3074
+ window.requestAnimationFrame(restore);
3017
3075
  };
3018
3076
  return {
3019
3077
  captureScrollPosition,
@@ -3043,18 +3101,18 @@ function useInfiniteScroll(options) {
3043
3101
  onBeforeUpdate: elementManager.processManuallyAddedElements,
3044
3102
  // After successful request, tag new server content
3045
3103
  onCompletePreviousRequest: (loadedPage) => {
3046
- setTimeout(() => {
3104
+ options.onCompletePreviousRequest();
3105
+ requestAnimationFrame(() => {
3047
3106
  elementManager.processServerLoadedElements(loadedPage);
3048
- options.onCompletePreviousRequest();
3049
- window.queueMicrotask(elementManager.refreshTriggers);
3050
- });
3107
+ elementManager.refreshTriggers();
3108
+ }, 2);
3051
3109
  },
3052
3110
  onCompleteNextRequest: (loadedPage) => {
3053
- setTimeout(() => {
3111
+ options.onCompleteNextRequest();
3112
+ requestAnimationFrame(() => {
3054
3113
  elementManager.processServerLoadedElements(loadedPage);
3055
- options.onCompleteNextRequest();
3056
- window.queueMicrotask(elementManager.refreshTriggers);
3057
- });
3114
+ elementManager.refreshTriggers();
3115
+ }, 2);
3058
3116
  }
3059
3117
  });
3060
3118
  const addScrollPreservationCallbacks = (reloadOptions) => {