inertiax-core 11.0.36 → 11.0.38

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.js CHANGED
@@ -103,6 +103,9 @@ var firePrefetchingEvent = (visit) => {
103
103
  var fireFlashEvent = (flash) => {
104
104
  return fireEvent("flash", { detail: { flash } });
105
105
  };
106
+ var fireLocationEvent = (url, versionChange) => {
107
+ return fireEvent("location", { cancelable: true, detail: { url, versionChange } });
108
+ };
106
109
 
107
110
  // src/history.ts
108
111
  import { cloneDeep, isEqual } from "es-toolkit";
@@ -1544,6 +1547,8 @@ var CurrentFramePage = class {
1544
1547
  const viewTransitionCallback = typeof viewTransition === "boolean" ? () => null : viewTransition;
1545
1548
  return new Promise((resolve) => {
1546
1549
  const transitionResult = document.startViewTransition(() => doSwap().then(resolve));
1550
+ transitionResult.ready.catch(() => {
1551
+ });
1547
1552
  viewTransitionCallback(transitionResult);
1548
1553
  });
1549
1554
  }
@@ -1896,7 +1901,8 @@ var InitialVisit = class {
1896
1901
  page.setUrlHash(window.location.hash, frameId);
1897
1902
  }
1898
1903
  const visitId = uid();
1899
- page.set(page.get(frameId), { preserveScroll: true, preserveState: true, visitId }, frameId).then(() => {
1904
+ const preserveScroll = frameId === "_top";
1905
+ page.set(page.get(frameId), { preserveScroll, preserveState: true, visitId }, frameId).then(() => {
1900
1906
  if (navigationType.isReload()) {
1901
1907
  Scroll.restore(history.getScrollRegions(), frameId);
1902
1908
  } else {
@@ -2155,11 +2161,17 @@ function parseHeaders(xhr) {
2155
2161
  });
2156
2162
  return headers;
2157
2163
  }
2164
+ function isFormDataRequestBody(value) {
2165
+ return typeof FormData !== "undefined" && value instanceof FormData;
2166
+ }
2167
+ function isRawRequestBody(value) {
2168
+ return typeof value === "string" || isFormDataRequestBody(value) || typeof Blob !== "undefined" && value instanceof Blob || typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer || typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value) || typeof URLSearchParams !== "undefined" && value instanceof URLSearchParams;
2169
+ }
2158
2170
  function setHeaders(xhr, config2) {
2159
2171
  if (!config2.headers) {
2160
2172
  return;
2161
2173
  }
2162
- const isFormData2 = config2.data instanceof FormData;
2174
+ const isFormData2 = isFormDataRequestBody(config2.data);
2163
2175
  Object.entries(config2.headers).forEach(([key, value]) => {
2164
2176
  if (key.toLowerCase() !== "content-type" || !isFormData2) {
2165
2177
  xhr.setRequestHeader(key, String(value));
@@ -2201,9 +2213,15 @@ var XhrHttpClient = class {
2201
2213
  if (xsrfToken) {
2202
2214
  xhr.setRequestHeader(this.xsrfHeaderName, xsrfToken);
2203
2215
  }
2216
+ const hasRequestedWithHeader = Object.keys(config2.headers ?? {}).some(
2217
+ (key) => key.toLowerCase() === "x-requested-with"
2218
+ );
2219
+ if (!hasRequestedWithHeader) {
2220
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
2221
+ }
2204
2222
  let body = null;
2205
2223
  if (config2.data !== null && config2.data !== void 0) {
2206
- if (config2.data instanceof FormData) {
2224
+ if (isRawRequestBody(config2.data)) {
2207
2225
  body = config2.data;
2208
2226
  } else if (typeof config2.data === "object") {
2209
2227
  body = JSON.stringify(config2.data);
@@ -2398,6 +2416,9 @@ var RequestParams = class _RequestParams {
2398
2416
  isDeferredPropsRequest() {
2399
2417
  return this.params.deferredProps === true;
2400
2418
  }
2419
+ isPollRequest() {
2420
+ return this.params.poll === true;
2421
+ }
2401
2422
  onCancelToken(cb) {
2402
2423
  this.params.onCancelToken({
2403
2424
  cancel: cb
@@ -2728,9 +2749,6 @@ var Response = class _Response {
2728
2749
  */
2729
2750
  locationVisit(url) {
2730
2751
  try {
2731
- SessionStorage.set(SessionStorage.locationVisitKey, {
2732
- preserveScroll: this.requestParams.all().preserveScroll === true
2733
- });
2734
2752
  if (typeof window === "undefined") {
2735
2753
  return;
2736
2754
  }
@@ -2738,6 +2756,17 @@ var Response = class _Response {
2738
2756
  window.location.reload();
2739
2757
  return;
2740
2758
  }
2759
+ const responseVersion = this.getHeader("x-inertia-version");
2760
+ const versionChange = !!responseVersion && responseVersion !== page.get().version;
2761
+ if (!fireLocationEvent(url, versionChange)) {
2762
+ return;
2763
+ }
2764
+ if (versionChange && this.requestParams.all().async) {
2765
+ return;
2766
+ }
2767
+ SessionStorage.set(SessionStorage.locationVisitKey, {
2768
+ preserveScroll: this.requestParams.all().preserveScroll === true
2769
+ });
2741
2770
  if (isSameUrlWithoutHash(window.location, url)) {
2742
2771
  window.location.reload();
2743
2772
  } else {
@@ -3407,7 +3436,8 @@ var Router = class {
3407
3436
  interval,
3408
3437
  ({ onStart, onFinish }) => {
3409
3438
  const resolved = typeof requestOptions === "function" ? requestOptions() : requestOptions;
3410
- this.reload({
3439
+ this.doReload({
3440
+ poll: true,
3411
3441
  preserveErrors: true,
3412
3442
  ...resolved,
3413
3443
  onCancelToken: (token) => {
@@ -3974,6 +4004,12 @@ function normalizeHeaders(headers) {
3974
4004
  }
3975
4005
  return normalized;
3976
4006
  }
4007
+ function isBinaryRequestBody(value) {
4008
+ return typeof Blob !== "undefined" && value instanceof Blob || typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer || typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value);
4009
+ }
4010
+ function hasContentTypeHeader(headers) {
4011
+ return Object.keys(headers ?? {}).some((key) => key.toLowerCase() === "content-type");
4012
+ }
3977
4013
  function toHttpProgressEvent(axiosEvent) {
3978
4014
  return {
3979
4015
  progress: axiosEvent.progress,
@@ -4014,13 +4050,17 @@ var AxiosHttpClient = class {
4014
4050
  }
4015
4051
  async doRequest(config2) {
4016
4052
  const axios = await this.getAxios();
4053
+ const headers = { ...config2.headers ?? {} };
4054
+ if (isBinaryRequestBody(config2.data) && !hasContentTypeHeader(config2.headers)) {
4055
+ headers["Content-Type"] = false;
4056
+ }
4017
4057
  try {
4018
4058
  const response = await axios({
4019
4059
  method: config2.method,
4020
4060
  url: config2.url,
4021
4061
  data: config2.data,
4022
4062
  params: config2.params,
4023
- headers: config2.headers,
4063
+ headers,
4024
4064
  signal: config2.signal,
4025
4065
  responseType: "text",
4026
4066
  onUploadProgress: config2.onUploadProgress ? (event) => config2.onUploadProgress(toHttpProgressEvent(event)) : void 0
@@ -4148,6 +4188,23 @@ function formDataToObject(source) {
4148
4188
  }
4149
4189
 
4150
4190
  // src/head.ts
4191
+ var serverHeadProviderId = "server";
4192
+ function ensureElementHasInertiaAttribute(element, index) {
4193
+ if (element.match(/\sdata-inertia(=|\s|>)/)) {
4194
+ return element;
4195
+ }
4196
+ return element.replace(/^<([a-zA-Z][^\s/>]*)/, `<$1 data-inertia="server-head-${index}"`);
4197
+ }
4198
+ function resolveServerHead(page2, serverHead) {
4199
+ if (!serverHead) {
4200
+ return [];
4201
+ }
4202
+ const elements = typeof serverHead === "function" ? serverHead(page2) : page2.props[serverHead === true ? "head" : serverHead];
4203
+ if (!Array.isArray(elements)) {
4204
+ return [];
4205
+ }
4206
+ return elements.map((element) => typeof element === "string" ? element.trim() : element).filter((element) => typeof element === "string" && element.length > 0).map(ensureElementHasInertiaAttribute);
4207
+ }
4151
4208
  var Renderer = {
4152
4209
  buildDOMElement(tag) {
4153
4210
  const template = document.createElement("template");
@@ -4197,8 +4254,8 @@ var Renderer = {
4197
4254
  });
4198
4255
  }, 1)
4199
4256
  };
4200
- function createHeadManager(isServer3, titleCallback, onUpdate) {
4201
- const states = {};
4257
+ function createHeadManager(isServer3, titleCallback, onUpdate, initialServerHead = []) {
4258
+ const states = initialServerHead.length ? { [serverHeadProviderId]: initialServerHead } : {};
4202
4259
  let lastProviderId = 0;
4203
4260
  function connect() {
4204
4261
  const id = lastProviderId += 1;
@@ -4223,12 +4280,22 @@ function createHeadManager(isServer3, titleCallback, onUpdate) {
4223
4280
  }
4224
4281
  commit();
4225
4282
  }
4283
+ function updateServerHead(elements = []) {
4284
+ if (elements.length) {
4285
+ states[serverHeadProviderId] = elements;
4286
+ } else {
4287
+ delete states[serverHeadProviderId];
4288
+ }
4289
+ commit();
4290
+ }
4226
4291
  function collect() {
4227
4292
  const title = titleCallback("");
4293
+ const serverHead = states[serverHeadProviderId] || [];
4294
+ const providerHead = Object.keys(states).filter((id) => id !== serverHeadProviderId).flatMap((id) => states[id]);
4228
4295
  const defaults = {
4229
4296
  ...title ? { title: `<title data-inertia="">${title}</title>` } : {}
4230
4297
  };
4231
- const elements = Object.values(states).reduce((carry, elements2) => carry.concat(elements2), []).reduce((carry, element) => {
4298
+ const elements = serverHead.concat(providerHead).reduce((carry, element) => {
4232
4299
  if (element.indexOf("<") === -1) {
4233
4300
  return carry;
4234
4301
  }
@@ -4237,7 +4304,7 @@ function createHeadManager(isServer3, titleCallback, onUpdate) {
4237
4304
  carry.title = title2 ? `${title2[1]}${titleCallback(title2[2])}${title2[3]}` : element;
4238
4305
  return carry;
4239
4306
  }
4240
- const match = element.match(/ data-inertia="[^"]+"/);
4307
+ const match = element.match(/ data-inertia=(["'])[^"']+\1/);
4241
4308
  if (match) {
4242
4309
  carry[match[0]] = element;
4243
4310
  } else {
@@ -4253,6 +4320,7 @@ function createHeadManager(isServer3, titleCallback, onUpdate) {
4253
4320
  commit();
4254
4321
  return {
4255
4322
  forceUpdate: commit,
4323
+ updateServerHead,
4256
4324
  createProvider: function() {
4257
4325
  const id = connect();
4258
4326
  return {
@@ -4904,7 +4972,8 @@ function isContentEditableOrPrevented(event) {
4904
4972
  }
4905
4973
  function shouldIntercept(event) {
4906
4974
  const isLink = event.currentTarget.tagName.toLowerCase() === "a";
4907
- return !(isContentEditableOrPrevented(event) || isLink && event.altKey || isLink && event.ctrlKey || isLink && event.metaKey || isLink && event.shiftKey || isLink && "button" in event && event.button !== 0);
4975
+ const target = isLink ? event.currentTarget.target : "";
4976
+ return !(isContentEditableOrPrevented(event) || isLink && event.altKey || isLink && event.ctrlKey || isLink && event.metaKey || isLink && event.shiftKey || isLink && target !== "" && target !== "_self" || isLink && "button" in event && event.button !== 0);
4908
4977
  }
4909
4978
  function shouldNavigate(event) {
4910
4979
  const isButton = event.currentTarget.tagName.toLowerCase() === "button";
@@ -4922,17 +4991,17 @@ var settings = {
4922
4991
  trickle: true,
4923
4992
  trickleSpeed: 200,
4924
4993
  showSpinner: true,
4925
- barSelector: '[role="bar"]',
4926
- spinnerSelector: '[role="spinner"]',
4994
+ barSelector: '.bar, [role="bar"]',
4995
+ spinnerSelector: '.spinner, [role="spinner"]',
4927
4996
  parent: "body",
4928
4997
  color: "#29d",
4929
4998
  includeCSS: true,
4930
4999
  popover: null,
4931
5000
  template: [
4932
- '<div class="bar" role="bar">',
5001
+ '<div class="bar">',
4933
5002
  '<div class="peg"></div>',
4934
5003
  "</div>",
4935
- '<div class="spinner" role="spinner">',
5004
+ '<div class="spinner">',
4936
5005
  '<div class="spinner-icon"></div>',
4937
5006
  "</div>"
4938
5007
  ].join("")
@@ -4947,6 +5016,7 @@ var configure = (options) => {
4947
5016
  }
4948
5017
  progress2 = document.createElement("div");
4949
5018
  progress2.id = baseComponentSelector;
5019
+ progress2.setAttribute("aria-hidden", "true");
4950
5020
  progress2.innerHTML = settings.template;
4951
5021
  if (usePopover) {
4952
5022
  progress2.popover = "manual";
@@ -5502,6 +5572,7 @@ export {
5502
5572
  partialReloadRequestsSomeProps,
5503
5573
  progress,
5504
5574
  resetFormFields,
5575
+ resolveServerHead,
5505
5576
  resolveUrlMethodPairComponent,
5506
5577
  router,
5507
5578
  setupProgress,