inertiax-core 11.0.34 → 11.0.37

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