@inertiajs/core 2.2.11 → 2.2.13

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
@@ -1,5 +1,5 @@
1
1
  // src/router.ts
2
- import { cloneDeep as cloneDeep2, get as get3, set as set3 } from "lodash-es";
2
+ import { cloneDeep as cloneDeep3, get as get3, set as set3 } from "lodash-es";
3
3
 
4
4
  // src/config.ts
5
5
  import { get, has, set } from "lodash-es";
@@ -35,7 +35,9 @@ var config = new Config({
35
35
  recentlySuccessfulDuration: 2e3
36
36
  },
37
37
  future: {
38
- preserveEqualProps: false
38
+ preserveEqualProps: false,
39
+ useDataInertiaHeadAttribute: false,
40
+ useDialogForErrorModal: false
39
41
  },
40
42
  prefetch: {
41
43
  cacheFor: 3e4
@@ -93,7 +95,7 @@ var firePrefetchingEvent = (visit) => {
93
95
  };
94
96
 
95
97
  // src/history.ts
96
- import { isEqual } from "lodash-es";
98
+ import { cloneDeep, isEqual } from "lodash-es";
97
99
 
98
100
  // src/sessionStorage.ts
99
101
  var SessionStorage = class {
@@ -476,7 +478,8 @@ var CurrentPage = class {
476
478
  set(page2, {
477
479
  replace = false,
478
480
  preserveScroll = false,
479
- preserveState = false
481
+ preserveState = false,
482
+ viewTransition = false
480
483
  } = {}) {
481
484
  if (Object.keys(page2.deferredProps || {}).length) {
482
485
  this.pendingDeferredProps = {
@@ -503,6 +506,9 @@ var CurrentPage = class {
503
506
  replace ? history.replaceState(page2, () => resolve(null)) : history.pushState(page2, () => resolve(null));
504
507
  }).then(() => {
505
508
  const isNewComponent = !this.isTheSame(page2);
509
+ if (!isNewComponent && Object.keys(page2.props.errors || {}).length > 0) {
510
+ viewTransition = false;
511
+ }
506
512
  this.page = page2;
507
513
  this.cleared = false;
508
514
  if (isNewComponent) {
@@ -512,7 +518,12 @@ var CurrentPage = class {
512
518
  this.fireEventsFor("firstLoad");
513
519
  }
514
520
  this.isFirstPageLoad = false;
515
- return this.swap({ component, page: page2, preserveState }).then(() => {
521
+ return this.swap({
522
+ component,
523
+ page: page2,
524
+ preserveState,
525
+ viewTransition
526
+ }).then(() => {
516
527
  if (preserveScroll) {
517
528
  window.requestAnimationFrame(() => Scroll.restoreScrollRegions(scrollRegions));
518
529
  } else {
@@ -536,7 +547,7 @@ var CurrentPage = class {
536
547
  this.page = page2;
537
548
  this.cleared = false;
538
549
  history.setCurrent(page2);
539
- return this.swap({ component, page: page2, preserveState });
550
+ return this.swap({ component, page: page2, preserveState, viewTransition: false });
540
551
  });
541
552
  }
542
553
  clear() {
@@ -562,9 +573,18 @@ var CurrentPage = class {
562
573
  swap({
563
574
  component,
564
575
  page: page2,
565
- preserveState
576
+ preserveState,
577
+ viewTransition
566
578
  }) {
567
- return this.swapComponent({ component, page: page2, preserveState });
579
+ const doSwap = () => this.swapComponent({ component, page: page2, preserveState });
580
+ if (!viewTransition || !document?.startViewTransition) {
581
+ return doSwap();
582
+ }
583
+ const viewTransitionCallback = typeof viewTransition === "boolean" ? () => null : viewTransition;
584
+ return new Promise((resolve) => {
585
+ const transitionResult = document.startViewTransition(() => doSwap().then(resolve));
586
+ viewTransitionCallback(transitionResult);
587
+ });
568
588
  }
569
589
  resolve(component) {
570
590
  return Promise.resolve(this.resolveComponent(component));
@@ -657,9 +677,21 @@ var History = class {
657
677
  });
658
678
  });
659
679
  }
680
+ clonePageProps(page2) {
681
+ try {
682
+ structuredClone(page2.props);
683
+ return page2;
684
+ } catch {
685
+ return {
686
+ ...page2,
687
+ props: cloneDeep(page2.props)
688
+ };
689
+ }
690
+ }
660
691
  getPageData(page2) {
692
+ const pageWithClonedProps = this.clonePageProps(page2);
661
693
  return new Promise((resolve) => {
662
- return page2.encryptHistory ? encryptHistory(page2).then(resolve) : resolve(page2);
694
+ return page2.encryptHistory ? encryptHistory(pageWithClonedProps).then(resolve) : resolve(pageWithClonedProps);
663
695
  });
664
696
  }
665
697
  processQueue() {
@@ -1038,7 +1070,7 @@ var Polls = class {
1038
1070
  var polls = new Polls();
1039
1071
 
1040
1072
  // src/prefetched.ts
1041
- import { cloneDeep } from "lodash-es";
1073
+ import { cloneDeep as cloneDeep2 } from "lodash-es";
1042
1074
 
1043
1075
  // src/objectUtils.ts
1044
1076
  var objectsAreEqual = (obj1, obj2, excludeKeys) => {
@@ -1255,7 +1287,7 @@ var PrefetchedRequests = class {
1255
1287
  }) || null;
1256
1288
  }
1257
1289
  withoutPurposePrefetchHeader(params) {
1258
- const newParams = cloneDeep(params);
1290
+ const newParams = cloneDeep2(params);
1259
1291
  if (newParams.headers["Purpose"] === "prefetch") {
1260
1292
  delete newParams.headers["Purpose"];
1261
1293
  }
@@ -1280,7 +1312,8 @@ var PrefetchedRequests = class {
1280
1312
  "onPrefetched",
1281
1313
  "onCancelToken",
1282
1314
  "onPrefetching",
1283
- "async"
1315
+ "async",
1316
+ "viewTransition"
1284
1317
  ]
1285
1318
  );
1286
1319
  }
@@ -1437,7 +1470,7 @@ import { get as get2, isEqual as isEqual2, set as set2 } from "lodash-es";
1437
1470
  var modal_default = {
1438
1471
  modal: null,
1439
1472
  listener: null,
1440
- show(html) {
1473
+ createIframeAndPage(html) {
1441
1474
  if (typeof html === "object") {
1442
1475
  html = `All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.<hr>${JSON.stringify(
1443
1476
  html
@@ -1446,6 +1479,15 @@ var modal_default = {
1446
1479
  const page2 = document.createElement("html");
1447
1480
  page2.innerHTML = html;
1448
1481
  page2.querySelectorAll("a").forEach((a) => a.setAttribute("target", "_top"));
1482
+ const iframe = document.createElement("iframe");
1483
+ iframe.style.backgroundColor = "white";
1484
+ iframe.style.borderRadius = "5px";
1485
+ iframe.style.width = "100%";
1486
+ iframe.style.height = "100%";
1487
+ return { iframe, page: page2 };
1488
+ },
1489
+ show(html) {
1490
+ const { iframe, page: page2 } = this.createIframeAndPage(html);
1449
1491
  this.modal = document.createElement("div");
1450
1492
  this.modal.style.position = "fixed";
1451
1493
  this.modal.style.width = "100vw";
@@ -1455,11 +1497,6 @@ var modal_default = {
1455
1497
  this.modal.style.backgroundColor = "rgba(0, 0, 0, .6)";
1456
1498
  this.modal.style.zIndex = 2e5;
1457
1499
  this.modal.addEventListener("click", () => this.hide());
1458
- const iframe = document.createElement("iframe");
1459
- iframe.style.backgroundColor = "white";
1460
- iframe.style.borderRadius = "5px";
1461
- iframe.style.width = "100%";
1462
- iframe.style.height = "100%";
1463
1500
  this.modal.appendChild(iframe);
1464
1501
  document.body.prepend(this.modal);
1465
1502
  document.body.style.overflow = "hidden";
@@ -1485,6 +1522,55 @@ var modal_default = {
1485
1522
  }
1486
1523
  };
1487
1524
 
1525
+ // src/dialog.ts
1526
+ var dialog_default = {
1527
+ show(html) {
1528
+ const { iframe, page: page2 } = modal_default.createIframeAndPage(html);
1529
+ iframe.style.boxSizing = "border-box";
1530
+ iframe.style.display = "block";
1531
+ const dialog = document.createElement("dialog");
1532
+ dialog.id = "inertia-error-dialog";
1533
+ Object.assign(dialog.style, {
1534
+ width: "calc(100vw - 100px)",
1535
+ height: "calc(100vh - 100px)",
1536
+ padding: "0",
1537
+ margin: "auto",
1538
+ border: "none",
1539
+ backgroundColor: "transparent"
1540
+ });
1541
+ const dialogStyleElement = document.createElement("style");
1542
+ dialogStyleElement.textContent = `
1543
+ dialog#inertia-error-dialog::backdrop {
1544
+ background-color: rgba(0, 0, 0, 0.6);
1545
+ }
1546
+
1547
+ dialog#inertia-error-dialog:focus {
1548
+ outline: none;
1549
+ }
1550
+ `;
1551
+ document.head.appendChild(dialogStyleElement);
1552
+ dialog.addEventListener("click", (event) => {
1553
+ if (event.target === dialog) {
1554
+ dialog.close();
1555
+ }
1556
+ });
1557
+ dialog.addEventListener("close", () => {
1558
+ dialogStyleElement.remove();
1559
+ dialog.remove();
1560
+ });
1561
+ dialog.appendChild(iframe);
1562
+ document.body.prepend(dialog);
1563
+ dialog.showModal();
1564
+ dialog.focus();
1565
+ if (!iframe.contentWindow) {
1566
+ throw new Error("iframe not yet ready.");
1567
+ }
1568
+ iframe.contentWindow.document.open();
1569
+ iframe.contentWindow.document.write(page2.outerHTML);
1570
+ iframe.contentWindow.document.close();
1571
+ }
1572
+ };
1573
+
1488
1574
  // src/response.ts
1489
1575
  var queue2 = new Queue();
1490
1576
  var Response = class _Response {
@@ -1548,7 +1634,7 @@ var Response = class _Response {
1548
1634
  data: this.getDataFromResponse(this.response.data)
1549
1635
  };
1550
1636
  if (fireInvalidEvent(response)) {
1551
- return modal_default.show(response.data);
1637
+ return config.get("future.useDialogForErrorModal") ? dialog_default.show(response.data) : modal_default.show(response.data);
1552
1638
  }
1553
1639
  }
1554
1640
  isInertiaResponse() {
@@ -1601,7 +1687,8 @@ var Response = class _Response {
1601
1687
  return page.set(pageResponse, {
1602
1688
  replace: this.requestParams.all().replace,
1603
1689
  preserveScroll: this.requestParams.all().preserveScroll,
1604
- preserveState: this.requestParams.all().preserveState
1690
+ preserveState: this.requestParams.all().preserveState,
1691
+ viewTransition: this.requestParams.all().viewTransition
1605
1692
  });
1606
1693
  }
1607
1694
  getDataFromResponse(response) {
@@ -2038,7 +2125,8 @@ var Router = class {
2038
2125
  ...options,
2039
2126
  async: true,
2040
2127
  showProgress: false,
2041
- prefetch: true
2128
+ prefetch: true,
2129
+ viewTransition: false
2042
2130
  });
2043
2131
  const visitUrl = visit.url.origin + visit.url.pathname + visit.url.search;
2044
2132
  const currentUrl = window.location.origin + window.location.pathname + window.location.search;
@@ -2099,7 +2187,7 @@ var Router = class {
2099
2187
  preserveState: true,
2100
2188
  props(currentProps) {
2101
2189
  const newValue = typeof value === "function" ? value(get3(currentProps, name), currentProps) : value;
2102
- return set3(cloneDeep2(currentProps), name, newValue);
2190
+ return set3(cloneDeep3(currentProps), name, newValue);
2103
2191
  },
2104
2192
  ...options || {}
2105
2193
  });
@@ -2136,7 +2224,7 @@ var Router = class {
2136
2224
  clientVisit(params, { replace = false } = {}) {
2137
2225
  const current = page.get();
2138
2226
  const props = typeof params.props === "function" ? params.props(current.props) : params.props ?? current.props;
2139
- const { onError, onFinish, onSuccess, ...pageParams } = params;
2227
+ const { viewTransition, onError, onFinish, onSuccess, ...pageParams } = params;
2140
2228
  const page2 = {
2141
2229
  ...current,
2142
2230
  ...pageParams,
@@ -2147,7 +2235,8 @@ var Router = class {
2147
2235
  page.set(page2, {
2148
2236
  replace,
2149
2237
  preserveScroll,
2150
- preserveState
2238
+ preserveState,
2239
+ viewTransition
2151
2240
  }).then(() => {
2152
2241
  const errors = page.get().props.errors || {};
2153
2242
  if (Object.keys(errors).length === 0) {
@@ -2163,7 +2252,8 @@ var Router = class {
2163
2252
  ...options,
2164
2253
  async: true,
2165
2254
  showProgress: false,
2166
- prefetch: true
2255
+ prefetch: true,
2256
+ viewTransition: false
2167
2257
  }),
2168
2258
  ...this.getVisitEvents(options)
2169
2259
  };
@@ -2175,7 +2265,7 @@ var Router = class {
2175
2265
  options.method = options.method ?? urlMethodPair.method;
2176
2266
  }
2177
2267
  const defaultVisitOptionsCallback = config.get("visitOptions");
2178
- const configuredOptions = defaultVisitOptionsCallback ? defaultVisitOptionsCallback(href.toString(), cloneDeep2(options)) || {} : {};
2268
+ const configuredOptions = defaultVisitOptionsCallback ? defaultVisitOptionsCallback(href.toString(), cloneDeep3(options)) || {} : {};
2179
2269
  const mergedOptions = {
2180
2270
  method: "get",
2181
2271
  data: {},
@@ -2195,6 +2285,7 @@ var Router = class {
2195
2285
  preserveUrl: false,
2196
2286
  prefetch: false,
2197
2287
  invalidateCacheTags: [],
2288
+ viewTransition: false,
2198
2289
  ...options,
2199
2290
  ...configuredOptions
2200
2291
  };
@@ -2381,6 +2472,9 @@ function formDataToObject(source) {
2381
2472
 
2382
2473
  // src/head.ts
2383
2474
  var Renderer = {
2475
+ preferredAttribute() {
2476
+ return config.get("future.useDataInertiaHeadAttribute") ? "data-inertia" : "inertia";
2477
+ },
2384
2478
  buildDOMElement(tag) {
2385
2479
  const template = document.createElement("template");
2386
2480
  template.innerHTML = tag;
@@ -2396,12 +2490,13 @@ var Renderer = {
2396
2490
  return script;
2397
2491
  },
2398
2492
  isInertiaManagedElement(element) {
2399
- return element.nodeType === Node.ELEMENT_NODE && element.getAttribute("inertia") !== null;
2493
+ return element.nodeType === Node.ELEMENT_NODE && element.getAttribute(this.preferredAttribute()) !== null;
2400
2494
  },
2401
2495
  findMatchingElementIndex(element, elements) {
2402
- const key = element.getAttribute("inertia");
2496
+ const attribute = this.preferredAttribute();
2497
+ const key = element.getAttribute(attribute);
2403
2498
  if (key !== null) {
2404
- return elements.findIndex((element2) => element2.getAttribute("inertia") === key);
2499
+ return elements.findIndex((element2) => element2.getAttribute(attribute) === key);
2405
2500
  }
2406
2501
  return -1;
2407
2502
  },
@@ -2452,8 +2547,9 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2452
2547
  }
2453
2548
  function collect() {
2454
2549
  const title = titleCallback("");
2550
+ const attribute = Renderer.preferredAttribute();
2455
2551
  const defaults = {
2456
- ...title ? { title: `<title inertia="">${title}</title>` } : {}
2552
+ ...title ? { title: `<title ${attribute}="">${title}</title>` } : {}
2457
2553
  };
2458
2554
  const elements = Object.values(states).reduce((carry, elements2) => carry.concat(elements2), []).reduce((carry, element) => {
2459
2555
  if (element.indexOf("<") === -1) {
@@ -2464,7 +2560,7 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2464
2560
  carry.title = title2 ? `${title2[1]}${titleCallback(title2[2])}${title2[3]}` : element;
2465
2561
  return carry;
2466
2562
  }
2467
- const match = element.match(/ inertia="[^"]+"/);
2563
+ const match = element.match(attribute === "inertia" ? / inertia="[^"]+"/ : / data-inertia="[^"]+"/);
2468
2564
  if (match) {
2469
2565
  carry[match[0]] = element;
2470
2566
  } else {
@@ -2483,6 +2579,7 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2483
2579
  createProvider: function() {
2484
2580
  const id = connect();
2485
2581
  return {
2582
+ preferredAttribute: Renderer.preferredAttribute,
2486
2583
  reconnect: () => reconnect(id),
2487
2584
  update: (elements) => update(id, elements),
2488
2585
  disconnect: () => disconnect(id)