@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/dist/index.esm.js CHANGED
@@ -342,14 +342,15 @@ var transformUrlAndData = (href, data, method, forceFormData, queryStringArrayFo
342
342
  return [hrefToUrl(_href), _data];
343
343
  };
344
344
  function mergeDataIntoQueryString(method, href, data, qsArrayFormat = "brackets") {
345
+ const hasDataForQueryString = method === "get" && !isFormData(data) && Object.keys(data).length > 0;
345
346
  const hasHost = /^[a-z][a-z0-9+.-]*:\/\//i.test(href.toString());
346
- const hasAbsolutePath = hasHost || href.toString().startsWith("/");
347
+ const hasAbsolutePath = hasHost || href.toString().startsWith("/") || href.toString() === "";
347
348
  const hasRelativePath = !hasAbsolutePath && !href.toString().startsWith("#") && !href.toString().startsWith("?");
348
349
  const hasRelativePathWithDotPrefix = /^[.]{1,2}([/]|$)/.test(href.toString());
349
- const hasSearch = href.toString().includes("?") || method === "get" && Object.keys(data).length;
350
+ const hasSearch = href.toString().includes("?") || hasDataForQueryString;
350
351
  const hasHash = href.toString().includes("#");
351
352
  const url = new URL(href.toString(), typeof window === "undefined" ? "http://localhost" : window.location.toString());
352
- if (method === "get" && Object.keys(data).length) {
353
+ if (hasDataForQueryString) {
353
354
  const parseOptions = { ignoreQueryPrefix: true, parseArrays: false };
354
355
  url.search = qs.stringify(
355
356
  { ...qs.parse(url.search, parseOptions), ...data },
@@ -358,7 +359,6 @@ function mergeDataIntoQueryString(method, href, data, qsArrayFormat = "brackets"
358
359
  arrayFormat: qsArrayFormat
359
360
  }
360
361
  );
361
- data = {};
362
362
  }
363
363
  return [
364
364
  [
@@ -368,7 +368,7 @@ function mergeDataIntoQueryString(method, href, data, qsArrayFormat = "brackets"
368
368
  hasSearch ? url.search : "",
369
369
  hasHash ? url.hash : ""
370
370
  ].join(""),
371
- data
371
+ hasDataForQueryString ? {} : data
372
372
  ];
373
373
  }
374
374
  function urlWithoutHash(url) {
@@ -1036,6 +1036,10 @@ var PrefetchedRequests = class {
1036
1036
  },
1037
1037
  onPrefetchResponse(response) {
1038
1038
  resolve(response);
1039
+ },
1040
+ onPrefetchError(error) {
1041
+ prefetchedRequests.removeFromInFlight(params);
1042
+ reject(error);
1039
1043
  }
1040
1044
  });
1041
1045
  }).then((response) => {
@@ -1049,9 +1053,7 @@ var PrefetchedRequests = class {
1049
1053
  inFlight: false
1050
1054
  });
1051
1055
  this.scheduleForRemoval(params, expires);
1052
- this.inFlightRequests = this.inFlightRequests.filter((prefetching) => {
1053
- return !this.paramsAreEqual(prefetching.params, params);
1054
- });
1056
+ this.removeFromInFlight(params);
1055
1057
  response.handlePrefetch();
1056
1058
  return response;
1057
1059
  });
@@ -1076,6 +1078,11 @@ var PrefetchedRequests = class {
1076
1078
  });
1077
1079
  this.clearTimer(params);
1078
1080
  }
1081
+ removeFromInFlight(params) {
1082
+ this.inFlightRequests = this.inFlightRequests.filter((prefetching) => {
1083
+ return !this.paramsAreEqual(prefetching.params, params);
1084
+ });
1085
+ }
1079
1086
  extractStaleValues(cacheFor) {
1080
1087
  const [stale, expires] = this.cacheForToStaleAndExpires(cacheFor);
1081
1088
  return [timeToMs(stale), timeToMs(expires)];
@@ -1207,6 +1214,8 @@ var RequestParams = class _RequestParams {
1207
1214
  ...params,
1208
1215
  ...wrappedCallbacks,
1209
1216
  onPrefetchResponse: params.onPrefetchResponse || (() => {
1217
+ }),
1218
+ onPrefetchError: params.onPrefetchError || (() => {
1210
1219
  })
1211
1220
  };
1212
1221
  }
@@ -1256,6 +1265,11 @@ var RequestParams = class _RequestParams {
1256
1265
  this.params.onPrefetchResponse(response);
1257
1266
  }
1258
1267
  }
1268
+ onPrefetchError(error) {
1269
+ if (this.params.onPrefetchError) {
1270
+ this.params.onPrefetchError(error);
1271
+ }
1272
+ }
1259
1273
  all() {
1260
1274
  return this.params;
1261
1275
  }
@@ -1638,6 +1652,9 @@ var Request = class _Request {
1638
1652
  return;
1639
1653
  }
1640
1654
  if (fireExceptionEvent(error)) {
1655
+ if (originallyPrefetch) {
1656
+ this.requestParams.onPrefetchError(error);
1657
+ }
1641
1658
  return Promise.reject(error);
1642
1659
  }
1643
1660
  }).finally(() => {
@@ -2071,6 +2088,137 @@ function formDataToObject(source) {
2071
2088
  return form;
2072
2089
  }
2073
2090
 
2091
+ // src/resetFormFields.ts
2092
+ function isFormElement(element) {
2093
+ return element instanceof HTMLInputElement || element instanceof HTMLSelectElement || element instanceof HTMLTextAreaElement;
2094
+ }
2095
+ function resetInputElement(input, defaultValues) {
2096
+ const oldValue = input.value;
2097
+ const oldChecked = input.checked;
2098
+ switch (input.type.toLowerCase()) {
2099
+ case "checkbox":
2100
+ input.checked = defaultValues.includes(input.value);
2101
+ break;
2102
+ case "radio":
2103
+ input.checked = defaultValues[0] === input.value;
2104
+ break;
2105
+ case "file":
2106
+ input.value = "";
2107
+ break;
2108
+ case "button":
2109
+ case "submit":
2110
+ case "reset":
2111
+ case "image":
2112
+ break;
2113
+ default:
2114
+ input.value = defaultValues[0] !== null && defaultValues[0] !== void 0 ? String(defaultValues[0]) : "";
2115
+ }
2116
+ return input.value !== oldValue || input.checked !== oldChecked;
2117
+ }
2118
+ function resetSelectElement(select, defaultValues) {
2119
+ const oldValue = select.value;
2120
+ const oldSelectedOptions = Array.from(select.selectedOptions).map((opt) => opt.value);
2121
+ if (select.multiple) {
2122
+ const defaultStrings = defaultValues.map((value) => String(value));
2123
+ Array.from(select.options).forEach((option) => {
2124
+ option.selected = defaultStrings.includes(option.value);
2125
+ });
2126
+ } else {
2127
+ select.value = defaultValues[0] !== void 0 ? String(defaultValues[0]) : "";
2128
+ }
2129
+ const newSelectedOptions = Array.from(select.selectedOptions).map((opt) => opt.value);
2130
+ const hasChanged = select.multiple ? JSON.stringify(oldSelectedOptions.sort()) !== JSON.stringify(newSelectedOptions.sort()) : select.value !== oldValue;
2131
+ return hasChanged;
2132
+ }
2133
+ function resetFormElement(element, defaultValues) {
2134
+ if (element.disabled) {
2135
+ if (element instanceof HTMLInputElement) {
2136
+ const oldValue = element.value;
2137
+ const oldChecked = element.checked;
2138
+ switch (element.type.toLowerCase()) {
2139
+ case "checkbox":
2140
+ case "radio":
2141
+ element.checked = element.defaultChecked;
2142
+ return element.checked !== oldChecked;
2143
+ case "file":
2144
+ element.value = "";
2145
+ return oldValue !== "";
2146
+ case "button":
2147
+ case "submit":
2148
+ case "reset":
2149
+ case "image":
2150
+ return false;
2151
+ default:
2152
+ element.value = element.defaultValue;
2153
+ return element.value !== oldValue;
2154
+ }
2155
+ } else if (element instanceof HTMLSelectElement) {
2156
+ const oldSelectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);
2157
+ Array.from(element.options).forEach((option) => {
2158
+ option.selected = option.defaultSelected;
2159
+ });
2160
+ const newSelectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value);
2161
+ return JSON.stringify(oldSelectedOptions.sort()) !== JSON.stringify(newSelectedOptions.sort());
2162
+ } else if (element instanceof HTMLTextAreaElement) {
2163
+ const oldValue = element.value;
2164
+ element.value = element.defaultValue;
2165
+ return element.value !== oldValue;
2166
+ }
2167
+ return false;
2168
+ }
2169
+ if (element instanceof HTMLInputElement) {
2170
+ return resetInputElement(element, defaultValues);
2171
+ } else if (element instanceof HTMLSelectElement) {
2172
+ return resetSelectElement(element, defaultValues);
2173
+ } else if (element instanceof HTMLTextAreaElement) {
2174
+ const oldValue = element.value;
2175
+ element.value = defaultValues[0] !== void 0 ? String(defaultValues[0]) : "";
2176
+ return element.value !== oldValue;
2177
+ }
2178
+ return false;
2179
+ }
2180
+ function resetFieldElements(elements, defaultValues) {
2181
+ let hasChanged = false;
2182
+ if (elements instanceof RadioNodeList || elements instanceof HTMLCollection) {
2183
+ Array.from(elements).forEach((node, index) => {
2184
+ if (node instanceof Element && isFormElement(node)) {
2185
+ if (node instanceof HTMLInputElement && ["checkbox", "radio"].includes(node.type.toLowerCase())) {
2186
+ if (resetFormElement(node, defaultValues)) {
2187
+ hasChanged = true;
2188
+ }
2189
+ } else {
2190
+ const indexedDefaultValues = defaultValues[index] !== void 0 ? [defaultValues[index]] : [defaultValues[0] ?? null].filter(Boolean);
2191
+ if (resetFormElement(node, indexedDefaultValues)) {
2192
+ hasChanged = true;
2193
+ }
2194
+ }
2195
+ }
2196
+ });
2197
+ } else if (isFormElement(elements)) {
2198
+ hasChanged = resetFormElement(elements, defaultValues);
2199
+ }
2200
+ return hasChanged;
2201
+ }
2202
+ function resetFormFields(formElement, defaults, fieldNames) {
2203
+ if (!fieldNames || fieldNames.length === 0) {
2204
+ const formData = new FormData(formElement);
2205
+ const formElementNames = Array.from(formElement.elements).map((el) => isFormElement(el) ? el.name : "").filter(Boolean);
2206
+ fieldNames = [.../* @__PURE__ */ new Set([...defaults.keys(), ...formData.keys(), ...formElementNames])];
2207
+ }
2208
+ let hasChanged = false;
2209
+ fieldNames.forEach((fieldName) => {
2210
+ const elements = formElement.elements.namedItem(fieldName);
2211
+ if (elements) {
2212
+ if (resetFieldElements(elements, defaults.getAll(fieldName))) {
2213
+ hasChanged = true;
2214
+ }
2215
+ }
2216
+ });
2217
+ if (hasChanged) {
2218
+ formElement.dispatchEvent(new Event("reset", { bubbles: true }));
2219
+ }
2220
+ }
2221
+
2074
2222
  // src/head.ts
2075
2223
  var Renderer = {
2076
2224
  buildDOMElement(tag) {
@@ -2532,6 +2680,7 @@ export {
2532
2680
  hrefToUrl,
2533
2681
  mergeDataIntoQueryString,
2534
2682
  objectToFormData,
2683
+ resetFormFields,
2535
2684
  reveal as revealProgress,
2536
2685
  router,
2537
2686
  setupProgress,