@thoughtbot/superglue 1.0.1 → 1.0.2

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.
@@ -3,7 +3,7 @@ import {
3
3
  remote,
4
4
  saveAndProcessPage,
5
5
  visit
6
- } from "./chunk-LGUVOEZ3.mjs";
6
+ } from "./chunk-7OMO5P27.mjs";
7
7
  export {
8
8
  MismatchedComponentError,
9
9
  remote,
@@ -1,72 +1,48 @@
1
1
  // lib/utils/url.ts
2
- import parse from "url-parse";
2
+ var FAKE_ORIGIN = "https://example.com";
3
3
  function pathQuery(url) {
4
- const { pathname, query } = new parse(url, {});
4
+ const { pathname, search: query } = new URL(url, FAKE_ORIGIN);
5
5
  return pathname + query;
6
6
  }
7
- function pathQueryHash(url) {
8
- const { pathname, query, hash } = new parse(url, {});
9
- return pathname + query + hash;
10
- }
11
7
  function hasPropsAt(url) {
12
- const parsed = new parse(url, {}, true);
13
- const query = parsed.query;
14
- return !!query["props_at"];
8
+ const { searchParams } = new URL(url, FAKE_ORIGIN);
9
+ return searchParams.has("props_at");
15
10
  }
16
11
  function propsAtParam(url) {
17
- const parsed = new parse(url, {}, true);
18
- const query = parsed.query;
19
- return query["props_at"];
12
+ const { searchParams } = new URL(url, FAKE_ORIGIN);
13
+ return searchParams.get("props_at");
20
14
  }
21
15
  function withFormatJson(url) {
22
- const parsed = new parse(url, {}, true);
23
- parsed.query["format"] = "json";
24
- return parsed.toString();
25
- }
26
- function pathWithoutBZParams(url) {
27
- const parsed = new parse(url, {}, true);
28
- const query = parsed.query;
29
- delete query["props_at"];
30
- delete query["format"];
31
- parsed.set("query", query);
32
- return pathQueryHash(parsed.toString());
16
+ const parsed = new URL(url, FAKE_ORIGIN);
17
+ parsed.searchParams.set("format", "json");
18
+ return parsed.href.replace(parsed.origin, "");
33
19
  }
34
20
  function removePropsAt(url) {
35
- const parsed = new parse(url, {}, true);
36
- const query = parsed.query;
37
- delete query["props_at"];
38
- parsed.set("query", query);
39
- return parsed.toString();
21
+ const parsed = new URL(url, FAKE_ORIGIN);
22
+ parsed.searchParams.delete("props_at");
23
+ return parsed.href.replace(parsed.origin, "");
40
24
  }
41
25
  function urlToPageKey(url) {
42
- const parsed = new parse(url, {}, true);
43
- const query = parsed.query;
44
- delete query["props_at"];
45
- delete query["format"];
46
- parsed.set("query", query);
26
+ const parsed = new URL(url, FAKE_ORIGIN);
27
+ parsed.searchParams.delete("props_at");
28
+ parsed.searchParams.delete("format");
47
29
  return pathQuery(parsed.toString());
48
30
  }
49
31
  function withoutHash(url) {
50
- const parsed = new parse(url, {}, true);
51
- parsed.set("hash", "");
52
- return parsed.toString();
53
- }
54
- function withoutBusters(url) {
55
- const parsed = new parse(url, {}, true);
56
- const query = parsed.query;
57
- delete query["format"];
58
- parsed.set("query", query);
59
- return pathQuery(parsed.toString());
32
+ const parsed = new URL(url, FAKE_ORIGIN);
33
+ parsed.hash = "";
34
+ return parsed.href.replace(parsed.origin, "");
60
35
  }
61
36
  function formatForXHR(url) {
62
37
  const formats = [withoutHash, withFormatJson];
63
38
  return formats.reduce((memo, f) => f(memo), url);
64
39
  }
65
40
  function parsePageKey(pageKey) {
66
- const { pathname, query } = new parse(pageKey, {}, true);
41
+ const { pathname, searchParams } = new URL(pageKey, FAKE_ORIGIN);
42
+ const search = Object.fromEntries(searchParams);
67
43
  return {
68
44
  pathname,
69
- search: query
45
+ search
70
46
  };
71
47
  }
72
48
 
@@ -197,9 +173,6 @@ function setIn(object, path, value) {
197
173
  return results[0];
198
174
  }
199
175
 
200
- // lib/utils/request.ts
201
- import parse2 from "url-parse";
202
-
203
176
  // lib/config.ts
204
177
  var config = {
205
178
  baseUrl: "",
@@ -271,11 +244,7 @@ function argsForFetch(getState, pathQuery2, {
271
244
  if (currentState.csrfToken) {
272
245
  nextHeaders["x-csrf-token"] = currentState.csrfToken;
273
246
  }
274
- const fetchPath = new parse2(
275
- formatForXHR(pathQuery2),
276
- config.baseUrl || {},
277
- true
278
- );
247
+ const fetchPath = new URL(formatForXHR(pathQuery2), config.baseUrl);
279
248
  const credentials = "same-origin";
280
249
  if (!(method == "GET" || method == "HEAD")) {
281
250
  nextHeaders["x-http-method-override"] = method;
@@ -289,20 +258,16 @@ function argsForFetch(getState, pathQuery2, {
289
258
  signal
290
259
  };
291
260
  if (currentState.currentPageKey) {
292
- const referrer = new parse2(
293
- currentState.currentPageKey,
294
- config.baseUrl || {},
295
- false
296
- ).href;
297
- options.referrer = referrer;
261
+ const referrer = new URL(currentState.currentPageKey, config.baseUrl);
262
+ options.referrer = referrer.toString();
298
263
  }
299
264
  if (method == "GET" || method == "HEAD") {
300
265
  if (options.body instanceof FormData) {
301
266
  const allData = new URLSearchParams(
302
267
  options.body
303
268
  );
304
- const nextQuery = { ...fetchPath.query, ...Object.fromEntries(allData) };
305
- fetchPath.set("query", nextQuery);
269
+ allData.forEach((value, key) => fetchPath.searchParams.delete(key));
270
+ allData.forEach((value, key) => fetchPath.searchParams.append(key, value));
306
271
  }
307
272
  delete options.body;
308
273
  }
@@ -360,12 +325,11 @@ var HandlerBuilder = class {
360
325
  return;
361
326
  }
362
327
  event.preventDefault();
363
- let url = form.getAttribute("action");
328
+ const url = form.getAttribute("action");
364
329
  if (!url) {
365
330
  return;
366
331
  }
367
332
  const method = (form.getAttribute("method") || "POST").toUpperCase();
368
- url = withoutBusters(url);
369
333
  this.visitOrRemote(form, url, {
370
334
  method,
371
335
  body: new FormData(form)
@@ -381,11 +345,10 @@ var HandlerBuilder = class {
381
345
  return;
382
346
  }
383
347
  event.preventDefault();
384
- let url = link.getAttribute("href");
348
+ const url = link.getAttribute("href");
385
349
  if (!url) {
386
350
  return;
387
351
  }
388
- url = withoutBusters(url);
389
352
  this.visitOrRemote(link, url, { method: "GET" });
390
353
  }
391
354
  visitOrRemote(linkOrForm, url, opts) {
@@ -434,9 +397,6 @@ function needsRefresh(prevAssets, newAssets) {
434
397
  }
435
398
  }
436
399
 
437
- // lib/action_creators/index.ts
438
- import parse3 from "url-parse";
439
-
440
400
  // lib/actions.ts
441
401
  import { createAction } from "@reduxjs/toolkit";
442
402
  var GRAFTING_ERROR = "@@superglue/GRAFTING_ERROR";
@@ -514,7 +474,6 @@ var remote = (path, {
514
474
  beforeSave = (prevPage, receivedPage) => receivedPage,
515
475
  ...rest
516
476
  } = {}) => {
517
- path = withoutBusters(path);
518
477
  targetPageKey = targetPageKey && urlToPageKey(targetPageKey);
519
478
  return (dispatch, getState) => {
520
479
  const fetchArgs = argsForFetch(getState, path, rest);
@@ -568,7 +527,6 @@ var visit = (path, {
568
527
  revisit = false,
569
528
  ...rest
570
529
  } = {}) => {
571
- path = withoutBusters(path);
572
530
  return (dispatch, getState) => {
573
531
  const currentPageKey = getState().superglue.currentPageKey;
574
532
  placeholderKey = placeholderKey && urlToPageKey(placeholderKey) || currentPageKey;
@@ -675,8 +633,7 @@ function fetchDeferments(pageKey, defers = []) {
675
633
  successAction = GRAFTING_SUCCESS,
676
634
  failAction = GRAFTING_ERROR
677
635
  }) {
678
- const parsedUrl = new parse3(url, true);
679
- const keyPath = parsedUrl.query.props_at;
636
+ const keyPath = propsAtParam(url);
680
637
  return dispatch(remote(url, { pageKey })).then(() => {
681
638
  dispatch({
682
639
  type: successAction,
@@ -762,7 +719,6 @@ function saveAndProcessPage(pageKey, page) {
762
719
 
763
720
  export {
764
721
  config,
765
- pathWithoutBZParams,
766
722
  urlToPageKey,
767
723
  parsePageKey,
768
724
  argsForHistory,
@@ -787,4 +743,4 @@ export {
787
743
  visit,
788
744
  saveAndProcessPage
789
745
  };
790
- //# sourceMappingURL=chunk-LGUVOEZ3.mjs.map
746
+ //# sourceMappingURL=chunk-7OMO5P27.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../lib/utils/url.ts","../lib/utils/helpers.ts","../lib/utils/immutability.ts","../lib/config.ts","../lib/utils/request.ts","../lib/utils/ujs.ts","../lib/utils/window.ts","../lib/actions.ts","../lib/action_creators/requests.ts","../lib/action_creators/index.ts"],"sourcesContent":["import { PageKey } from '../types'\n\nconst FAKE_ORIGIN = 'https://example.com'\n\nexport function pathQuery(url: string): string {\n const { pathname, search: query } = new URL(url, FAKE_ORIGIN)\n\n return pathname + query\n}\n\nexport function pathQueryHash(url: string): string {\n const { pathname, hash, search: query } = new URL(url, FAKE_ORIGIN)\n\n return pathname + query + hash\n}\n\nexport function hasPropsAt(url: string): boolean {\n const { searchParams } = new URL(url, FAKE_ORIGIN)\n\n return searchParams.has('props_at')\n}\n\nexport function propsAtParam(url: string): string | null {\n const { searchParams } = new URL(url, FAKE_ORIGIN)\n\n return searchParams.get('props_at')\n}\n\nexport function withFormatJson(url: string): string {\n const parsed = new URL(url, FAKE_ORIGIN)\n parsed.searchParams.set('format', 'json')\n\n return parsed.href.replace(parsed.origin, '')\n}\n\nexport function removePropsAt(url: string): string {\n const parsed = new URL(url, FAKE_ORIGIN)\n parsed.searchParams.delete('props_at')\n\n return parsed.href.replace(parsed.origin, '')\n}\n\n/**\n * Converts a url to a PageKey.\n *\n * @param url\n * @returns\n */\nexport function urlToPageKey(url: string): PageKey {\n const parsed = new URL(url, FAKE_ORIGIN)\n parsed.searchParams.delete('props_at')\n parsed.searchParams.delete('format')\n\n return pathQuery(parsed.toString())\n}\n\nexport function withoutHash(url: string): string {\n const parsed = new URL(url, FAKE_ORIGIN)\n parsed.hash = ''\n\n return parsed.href.replace(parsed.origin, '')\n}\n\nexport function formatForXHR(url: string): string {\n const formats = [withoutHash, withFormatJson]\n\n return formats.reduce((memo, f) => f(memo), url)\n}\n\nexport function parsePageKey(pageKey: PageKey) {\n const { pathname, searchParams } = new URL(pageKey, FAKE_ORIGIN)\n\n const search = Object.fromEntries(searchParams)\n\n return {\n pathname,\n search,\n }\n}\n","import { GraftResponse, HistoryState, VisitResponse } from '../types'\nimport { urlToPageKey } from './url'\n\nexport function isGraft(page: GraftResponse | VisitResponse): boolean {\n return 'action' in page && page.action === 'graft'\n}\n\nexport function extractNodeAndPath(page: GraftResponse): {\n node: unknown\n pathToNode: string\n} {\n const { data: node, action, path: pathToNode } = page\n\n if (action === 'graft') {\n return { node, pathToNode }\n } else {\n const errMsg =\n 'Expected page to be a graft response rendered from node filtering.'\n throw new Error(errMsg)\n }\n}\n\nexport function argsForHistory(path: string): [string, HistoryState] {\n const pageKey = urlToPageKey(path)\n\n return [\n path,\n {\n superglue: true,\n pageKey,\n posX: 0,\n posY: 0,\n },\n ]\n}\n","// These were taken from Scour.js\n// Then, modified to respect the id=0 keypath\n\nimport { JSONMappable, JSONValue, Keypath } from '../types'\n\nconst canLookAhead = /^[\\da-zA-Z\\-_]+=[\\da-zA-Z\\-_]+$/\n\nclass KeyPathError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'KeyPathError'\n }\n}\n\n/**\n * Retrieves data from a JSON object using a {@link Keypath}\n *\n * @param node\n * @param path\n * @returns\n */\nfunction getIn(node: JSONMappable, path: Keypath): JSONValue {\n const keyPath = normalizeKeyPath(path)\n let result: JSONValue = node\n let i: number\n\n for (i = 0; i < keyPath.length; i++) {\n const key = keyPath[i]\n\n if (typeof result === 'object' && result !== null) {\n if (!Array.isArray(result) && canLookAhead.test(key)) {\n throw new KeyPathError(\n `Expected to find an Array when using the key: ${key}`\n )\n }\n\n result = atKey(result, key)\n } else {\n throw new KeyPathError(\n `Expected to traverse an Array or Obj, got ${JSON.stringify(result)}`\n )\n }\n }\n\n if (i === keyPath.length) {\n return result\n } else {\n return undefined\n }\n}\n\nfunction clone(node: JSONMappable): JSONMappable {\n return Array.isArray(node) ? [].slice.call(node) : { ...node }\n}\n\nfunction getKey(node: JSONMappable, key: string): string | number | never {\n if (Array.isArray(node) && Number.isNaN(Number(key))) {\n const key_parts = Array.from(key.split('='))\n const attr = key_parts[0]\n const id = key_parts[1]\n\n if (!id || !attr) {\n return key\n }\n\n let i: number\n let child: JSONValue\n\n for (i = 0; i < node.length; i++) {\n child = node[i]\n if (\n typeof child === 'object' &&\n !Array.isArray(child) &&\n child !== null\n ) {\n const val = child[attr]\n if (val && val.toString() === id) {\n break\n }\n } else {\n throw new KeyPathError(`Could not look ahead ${key} at ${child}`)\n }\n }\n\n if (i === node.length) {\n throw new KeyPathError(`Could not find ${key} while looking ahead`)\n }\n\n return i\n } else {\n return key\n }\n}\n\nfunction atKey(node: JSONMappable, key: string) {\n const actualKey = getKey(node, key)\n\n if (Array.isArray(node)) {\n return node[actualKey as number]\n } else {\n return node[actualKey]\n }\n}\n\nfunction normalizeKeyPath(path: string): string[] {\n if (typeof path === 'string') {\n path = path.replace(/ /g, '')\n if (path === '') {\n return []\n }\n\n return path.split('.')\n } else {\n return path\n }\n}\n/**\n * Sets data into a JSON object using a {@link Keypath}\n *\n * @param object\n * @param path\n * @param value\n * @returns\n */\nfunction setIn<T extends JSONMappable>(\n object: T,\n path: string,\n value: JSONValue\n): T | never {\n const keypath = normalizeKeyPath(path)\n\n const results: {\n 0: T\n [key: number]: JSONValue\n } = { 0: object }\n\n const parents: {\n 0: T\n [key: number]: JSONValue\n } = { 0: object }\n\n let i: number\n\n for (i = 0; i < keypath.length; i++) {\n const parent = parents[i]\n\n if (!(typeof parent === 'object' && parent !== null)) {\n throw new KeyPathError(\n `Expected to traverse an Array or Obj, got ${JSON.stringify(parent)}`\n )\n }\n\n const child = atKey(parent, keypath[i])\n parents[i + 1] = child\n }\n\n results[keypath.length] = value\n\n for (i = keypath.length - 1; i >= 0; i--) {\n // Parents will always have a JSONValue at\n // keypath.length so this loop skips that one element\n // Every other element in parents is a JSONMappable\n const target = clone(parents[i] as JSONMappable)\n results[i] = target\n const key = getKey(results[i] as JSONMappable, keypath[i])\n if (Array.isArray(target)) {\n target[key as number] = results[i + 1]\n } else {\n target[key] = results[i + 1]\n }\n }\n\n return results[0]\n}\n\nexport { getIn, setIn, KeyPathError }\n","export const config = {\n baseUrl: '',\n maxPages: 20,\n}\n","import { formatForXHR } from './url'\nimport { config } from '../config'\nimport { BasicRequestInit, ParsedResponse, RootState } from '../types'\n\nexport function isValidResponse(xhr: Response): boolean {\n return isValidContent(xhr) && !downloadingFile(xhr)\n}\n\nexport function isValidContent(rsp: Response): boolean {\n const contentType = rsp.headers.get('content-type')\n const jsContent = /^(?:application\\/json)(?:;|$)/\n\n return !!(contentType && contentType.match(jsContent))\n}\n\nfunction downloadingFile(xhr: Response): boolean {\n const disposition = xhr.headers.get('content-disposition')\n\n return !!(disposition && disposition.match(/^attachment/) !== null)\n}\n\nclass SuperglueResponseError extends Error {\n response: Response\n\n constructor(message: string) {\n super(message)\n this.name = 'SuperglueResponseError'\n }\n}\n\nexport function validateResponse(args: ParsedResponse): ParsedResponse {\n const { rsp } = args\n if (isValidResponse(rsp)) {\n return args\n } else {\n const error = new SuperglueResponseError('Invalid Superglue Response')\n error.response = rsp\n throw error\n }\n}\n\nexport function handleServerErrors(args: ParsedResponse): ParsedResponse {\n const { rsp } = args\n if (!rsp.ok && rsp.status !== 422) {\n if (rsp.status === 406) {\n console.error(\n \"Superglue encountered a 406 Not Acceptable response. This can happen if you used respond_to and didn't specify format.json in the block. Try adding it to your respond_to. For example:\\n\\n\" +\n 'respond_to do |format|\\n' +\n ' format.html\\n' +\n ' format.json\\n' +\n ' format.csv\\n' +\n 'end'\n )\n }\n const error = new SuperglueResponseError(rsp.statusText)\n error.response = rsp\n throw error\n }\n return args\n}\n\nexport function argsForFetch(\n getState: () => RootState,\n pathQuery: string,\n {\n method = 'GET',\n headers = {},\n body = '',\n signal,\n ...rest\n }: BasicRequestInit = {}\n): [string, BasicRequestInit] {\n method = method.toUpperCase()\n const currentState = getState().superglue\n\n const nextHeaders = { ...headers }\n nextHeaders['x-requested-with'] = 'XMLHttpRequest'\n nextHeaders['accept'] = 'application/json'\n nextHeaders['x-superglue-request'] = 'true'\n\n if (method != 'GET' && method != 'HEAD') {\n nextHeaders['content-type'] = 'application/json'\n }\n\n if (body instanceof FormData) {\n delete nextHeaders['content-type']\n }\n\n if (currentState.csrfToken) {\n nextHeaders['x-csrf-token'] = currentState.csrfToken\n }\n\n const fetchPath = new URL(formatForXHR(pathQuery), config.baseUrl)\n\n const credentials = 'same-origin'\n\n if (!(method == 'GET' || method == 'HEAD')) {\n nextHeaders['x-http-method-override'] = method\n method = 'POST'\n }\n\n const options: BasicRequestInit = {\n method,\n headers: nextHeaders,\n body,\n credentials,\n signal,\n }\n\n if (currentState.currentPageKey) {\n const referrer = new URL(currentState.currentPageKey, config.baseUrl)\n\n options.referrer = referrer.toString()\n }\n\n if (method == 'GET' || method == 'HEAD') {\n if (options.body instanceof FormData) {\n const allData = new URLSearchParams(\n options.body as unknown as Record<string, string>\n )\n\n // Form data should override anything in the URL params First we\n // delete every key. Then append the new keys accounting for\n // duplicate keys that represent structural arrays.\n allData.forEach((value, key) => fetchPath.searchParams.delete(key))\n allData.forEach((value, key) => fetchPath.searchParams.append(key, value))\n }\n\n delete options.body\n }\n\n return [fetchPath.toString(), { ...options, ...rest }]\n}\n\nexport function extractJSON(rsp: Response): PromiseLike<ParsedResponse> {\n return rsp\n .json()\n .then((json) => {\n return { rsp, json }\n })\n .catch((e) => {\n e.response = rsp\n throw e\n })\n}\n\nexport function parseResponse(prm: Response): PromiseLike<ParsedResponse> {\n return Promise.resolve(prm)\n .then(extractJSON)\n .then(handleServerErrors)\n .then(validateResponse)\n}\n","import {\n Handlers,\n UJSHandlers,\n SuperglueStore,\n ApplicationVisit,\n ApplicationRemote,\n RemoteProps,\n VisitProps,\n} from '../types'\n\nexport class HandlerBuilder {\n public attributePrefix: string\n public visit: ApplicationVisit\n public remote: ApplicationRemote\n private store: SuperglueStore\n\n constructor({\n ujsAttributePrefix,\n visit,\n remote,\n store,\n }: {\n ujsAttributePrefix: string\n visit: ApplicationVisit\n remote: ApplicationRemote\n store: SuperglueStore\n }) {\n this.attributePrefix = ujsAttributePrefix\n this.isUJS = this.isUJS.bind(this)\n this.store = store\n\n this.handleSubmit = this.handleSubmit.bind(this)\n this.handleClick = this.handleClick.bind(this)\n\n this.visit = visit\n this.remote = remote\n this.visitOrRemote = this.visitOrRemote.bind(this)\n }\n\n retrieveLink(target: Element): HTMLAnchorElement | undefined {\n const link = target.closest<HTMLAnchorElement>('a')\n if (link && link.href.length !== 0) {\n return link\n }\n }\n\n isNonStandardClick(\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ): boolean {\n return (\n event.button > 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n )\n }\n\n isUJS(node: HTMLFormElement | HTMLAnchorElement): boolean {\n const hasVisit = !!node.getAttribute(this.attributePrefix + '-visit')\n const hasRemote = !!node.getAttribute(this.attributePrefix + '-remote')\n\n return hasVisit || hasRemote\n }\n\n handleSubmit(event: React.FormEvent<HTMLDivElement>): void {\n const form = event.target\n\n if (!(form instanceof HTMLFormElement)) {\n return\n }\n\n if (!this.isUJS(form)) {\n return\n }\n\n event.preventDefault()\n\n const url = form.getAttribute('action')\n if (!url) {\n return\n }\n\n const method = (form.getAttribute('method') || 'POST').toUpperCase()\n\n this.visitOrRemote(form, url, {\n method,\n body: new FormData(form),\n })\n }\n\n handleClick(event: React.MouseEvent<HTMLDivElement, MouseEvent>): void {\n if (!(event.target instanceof Element)) {\n return\n }\n\n const link = this.retrieveLink(event.target)\n const isNonStandard = this.isNonStandardClick(event)\n if (!link || isNonStandard || !this.isUJS(link)) {\n return\n }\n\n event.preventDefault()\n const url = link.getAttribute('href')\n if (!url) {\n return\n }\n\n this.visitOrRemote(link, url, { method: 'GET' })\n }\n\n visitOrRemote(\n linkOrForm: HTMLAnchorElement | HTMLFormElement,\n url: string,\n opts: RemoteProps | VisitProps\n ): void {\n const dataset = { ...linkOrForm.dataset }\n\n if (linkOrForm.getAttribute(this.attributePrefix + '-visit')) {\n this.visit(url, { ...opts, dataset })\n }\n\n if (linkOrForm.getAttribute(this.attributePrefix + '-remote')) {\n const { currentPageKey } = this.store.getState().superglue\n this.remote(url, {\n ...opts,\n pageKey: currentPageKey,\n dataset,\n })\n }\n }\n\n handlers(): Handlers {\n return {\n onClick: this.handleClick,\n onSubmit: this.handleSubmit,\n }\n }\n}\n\nexport const ujsHandlers: UJSHandlers = ({\n ujsAttributePrefix,\n visit,\n remote,\n store,\n}) => {\n const builder = new HandlerBuilder({\n visit,\n remote,\n ujsAttributePrefix,\n store,\n })\n\n return builder.handlers()\n}\n","export function needsRefresh(\n prevAssets: string[],\n newAssets: string[]\n): boolean {\n if (prevAssets && newAssets) {\n const hasNewAssets = !newAssets.every((asset) => prevAssets.includes(asset))\n return hasNewAssets\n } else {\n return false\n }\n}\n","import { createAction } from '@reduxjs/toolkit'\nimport {\n FetchArgs,\n PageKey,\n GraftResponse,\n VisitResponse,\n JSONMappable,\n Keypath,\n} from './types'\nimport { urlToPageKey } from './utils'\n\nexport const GRAFTING_ERROR = '@@superglue/GRAFTING_ERROR'\nexport const GRAFTING_SUCCESS = '@@superglue/GRAFTING_SUCCESS'\n\nexport const saveResponse = createAction(\n '@@superglue/SAVE_RESPONSE',\n ({ pageKey, page }: { pageKey: string; page: VisitResponse }) => {\n pageKey = urlToPageKey(pageKey)\n\n return {\n payload: {\n pageKey,\n page,\n },\n }\n }\n)\n\nexport const handleGraft = createAction(\n '@@superglue/HANDLE_GRAFT',\n ({ pageKey, page }: { pageKey: string; page: GraftResponse }) => {\n pageKey = urlToPageKey(pageKey)\n\n return {\n payload: {\n page,\n pageKey,\n },\n }\n }\n)\n\nexport const superglueError = createAction<{ message: string }>(\n '@@superglue/ERROR'\n)\n\n/**\n * A redux action called whenever a fragment is received from `visit` or updated\n * using `remote`. Its a useful action to use for cross cutting concerns like a\n * shared header or a shopping cart. For example:\n *\n * ```\n * import { updateFragments } from '@thoughtbot/superglue'\n *\n * export const exampleSlice = createSlice({\n * name: 'Example',\n * initialState: {},\n * extraReducers: (builder) => {\n * builder.addCase(updateFragments, (state, action) => {\n * // Update the slice using the latest and greatest.\n * return action.value\n * ```\n */\nexport const updateFragments = createAction<{\n name: string\n path: Keypath\n pageKey: PageKey\n value: JSONMappable\n previousValue?: JSONMappable\n}>('@@superglue/UPDATE_FRAGMENTS')\n\n/**\n * A redux action you can dispatch to copy a page from one pageKey to another. Its\n * a very useful way to create optimistic updates with a URL change. For example:\n *\n * ```\n * import { copyPage, remote } from '@thoughtbot/superglue'\n *\n * dispatch(copyPage({ from: originalKey, to: targetKey}))\n *\n * ... make edits to target page and finally\n *\n * navigateTo(targetKey)\n * ```\n */\nexport const copyPage = createAction<{ from: PageKey; to: PageKey }>(\n '@@superglue/COPY_PAGE'\n)\n\n/**\n * A redux action you can dispatch to remove a page from your store.\n *\n * ```\n * import { removePage } from '@thoughtbot/superglue'\n *\n * dispatch(removePage({ pageKey: '/delete_me_please\"}))\n * ```\n */\nexport const removePage = createAction<{ pageKey: PageKey }>(\n '@@superglue/REMOVE_PAGE'\n)\n\n/**\n * A redux action called before a `fetch` takes place. It will fire in `remote`\n * and `visit`. You can hook into this event in your redux slices like this:\n *\n * ```\n * import { beforeFetch } from '@thoughtbot/superglue'\n *\n * export const exampleSlice = createSlice({\n * name: 'Example',\n * initialState: {},\n * extraReducers: (builder) => {\n * builder.addCase(beforeFetch, (state, action) => {\n * ```\n */\nexport const beforeFetch = createAction<{ fetchArgs: FetchArgs }>(\n '@@superglue/BEFORE_FETCH'\n)\n\n/**\n * A redux action called before a `visit` takes place. You can hook into this event\n * in your redux slices like this:\n *\n * ```\n * import { beforeVisit } from '@thoughtbot/superglue'\n *\n * export const exampleSlice = createSlice({\n * name: 'Example',\n * initialState: {},\n * extraReducers: (builder) => {\n * builder.addCase(beforeVisit, (state, action) => {\n * ```\n */\nexport const beforeVisit = createAction<{\n currentPageKey: PageKey\n fetchArgs: FetchArgs\n}>('@@superglue/BEFORE_VISIT')\n\n/**\n * A redux action called before `remote` takes place. You can hook into this event\n * in your redux slices like this:\n *\n * ```\n * import { beforeRemote } from '@thoughtbot/superglue'\n *\n * export const exampleSlice = createSlice({\n * name: 'Example',\n * initialState: {},\n * extraReducers: (builder) => {\n * builder.addCase(beforeRemote, (state, action) => {\n * ```\n */\nexport const beforeRemote = createAction<{\n currentPageKey: PageKey\n fetchArgs: FetchArgs\n}>('@@superglue/BEFORE_REMOTE')\n\nexport const setCSRFToken = createAction<{\n csrfToken: string | undefined\n}>('@@superglue/SET_CSRF_TOKEN')\n\nexport const historyChange = createAction<{\n pageKey: PageKey\n}>('@@superglue/HISTORY_CHANGE')\n\nexport const setActivePage = createAction<{\n pageKey: PageKey\n}>('@@superglue/SET_ACTIVE_PAGE')\n","import {\n argsForFetch,\n parseResponse,\n needsRefresh,\n urlToPageKey,\n hasPropsAt,\n propsAtParam,\n removePropsAt,\n} from '../utils'\nimport {\n beforeFetch,\n beforeVisit,\n beforeRemote,\n copyPage,\n superglueError,\n} from '../actions'\nimport { saveAndProcessPage } from './index'\nimport {\n FetchArgs,\n VisitResponse,\n PageResponse,\n Page,\n SuperglueState,\n Meta,\n Dispatch,\n RemoteCreator,\n VisitCreator,\n NavigationAction,\n VisitMeta,\n} from '../types'\n\nfunction handleFetchErr(\n err: Error,\n fetchArgs: FetchArgs,\n dispatch: Dispatch\n): never {\n dispatch(superglueError({ message: err.message }))\n throw err\n}\n\nfunction buildMeta(\n pageKey: string,\n page: VisitResponse,\n state: SuperglueState,\n rsp: Response,\n fetchArgs: FetchArgs\n): Meta {\n const { assets: prevAssets } = state\n const { assets: nextAssets } = page\n\n return {\n pageKey,\n page,\n redirected: rsp.redirected,\n rsp,\n fetchArgs,\n componentIdentifier: page.componentIdentifier,\n needsRefresh: needsRefresh(prevAssets, nextAssets),\n }\n}\n\nexport class MismatchedComponentError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MismatchedComponentError'\n }\n}\n\nexport const remote: RemoteCreator = (\n path,\n {\n pageKey: targetPageKey,\n force = false,\n beforeSave = (prevPage: Page, receivedPage: PageResponse) => receivedPage,\n ...rest\n } = {}\n) => {\n targetPageKey = targetPageKey && urlToPageKey(targetPageKey)\n\n return (dispatch, getState) => {\n const fetchArgs = argsForFetch(getState, path, rest)\n const currentPageKey = getState().superglue.currentPageKey\n\n dispatch(beforeRemote({ currentPageKey, fetchArgs }))\n dispatch(beforeFetch({ fetchArgs }))\n\n return fetch(...fetchArgs)\n .then(parseResponse)\n .then(({ rsp, json }) => {\n const { superglue, pages = {} } = getState()\n\n let pageKey\n if (targetPageKey === undefined) {\n const isGet = fetchArgs[1].method === 'GET'\n pageKey = calculatePageKey(rsp, isGet, currentPageKey)\n } else {\n pageKey = targetPageKey\n }\n\n const meta = buildMeta(pageKey, json, superglue, rsp, fetchArgs)\n\n const existingId = pages[pageKey]?.componentIdentifier\n const receivedId = json.componentIdentifier\n if (!!existingId && existingId != receivedId && !force) {\n const message = `You cannot replace or update an existing page\nlocated at pages[\"${currentPageKey}\"] that has a componentIdentifier\nof \"${existingId}\" with the contents of a page response that has a\ncomponentIdentifier of \"${receivedId}\".\n\nThis can happen if you're using data-sg-remote or remote but your\nresponse redirected to a page with a different componentIdentifier\nthan the target page. \n\nThis limitation exists because the resulting page shape from grafting\n\"${receivedId}\"'s \"${propsAtParam(path)}\" into \"${existingId}\" may not be\ncompatible with the page component associated with \"${existingId}\".\n\nConsider using data-sg-visit, the visit function, or redirect_back to\nthe same page. Or if you're sure you want to proceed, use force: true.\n `\n throw new MismatchedComponentError(message)\n }\n\n const page = beforeSave(pages[pageKey], json)\n return dispatch(saveAndProcessPage(pageKey, page)).then(() => meta)\n })\n .catch((e) => handleFetchErr(e, fetchArgs, dispatch))\n }\n}\n\nlet lastVisitController = {\n /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\n abort: (_reason: string) => {\n // noop\n },\n}\n\nexport const visit: VisitCreator = (\n path,\n {\n placeholderKey,\n beforeSave = (prevPage: Page, receivedPage: PageResponse) => receivedPage,\n revisit = false,\n ...rest\n } = {}\n) => {\n return (dispatch, getState) => {\n const currentPageKey = getState().superglue.currentPageKey\n placeholderKey =\n (placeholderKey && urlToPageKey(placeholderKey)) || currentPageKey\n const hasPlaceholder = placeholderKey in getState().pages\n\n if (hasPropsAt(path) && !hasPlaceholder) {\n console.warn(\n `Could not find placeholder with key ${placeholderKey} in state. The props_at param will be ignored`\n )\n path = removePropsAt(path)\n }\n\n const controller = new AbortController()\n const { signal } = controller\n const fetchArgs = argsForFetch(getState, path, {\n ...rest,\n signal,\n })\n\n dispatch(beforeVisit({ currentPageKey, fetchArgs }))\n dispatch(beforeFetch({ fetchArgs }))\n\n lastVisitController.abort(\n 'Aborting the previous `visit`. There can be one visit at a time. Use `remote` if there is a need for async requests.'\n )\n lastVisitController = controller\n\n return fetch(...fetchArgs)\n .then(parseResponse)\n .then(({ rsp, json }) => {\n const { superglue, pages = {} } = getState()\n const isGet = fetchArgs[1].method === 'GET'\n const pageKey = calculatePageKey(rsp, isGet, currentPageKey)\n if (placeholderKey && hasPropsAt(path) && hasPlaceholder) {\n const existingId = pages[placeholderKey]?.componentIdentifier\n const receivedId = json.componentIdentifier\n if (!!existingId && existingId != receivedId) {\n const message = `You received a page response with a\ncomponentIdentifier \"${receivedId}\" that is different than the\ncomponentIdentifier \"${existingId}\" located at ${placeholderKey}.\n\nThis can happen if you're using data-sg-visit or visit with a\nprops_at param, but the response redirected to a page with a\ndifferent componentIdentifier than the target page. \n\nThis limitation exists because the resulting page shape from grafting\n\"${receivedId}\"'s \"${propsAtParam(path)}\" into \"${existingId}\" may not be\ncompatible with the page component associated with \"${existingId}\".\n\nCheck that you're rendering a page with a matching\ncomponentIdentifier, or consider using redirect_back_with_props_at\nto the same page.\n `\n throw new MismatchedComponentError(message)\n }\n dispatch(copyPage({ from: placeholderKey, to: pageKey }))\n }\n\n const meta = buildMeta(pageKey, json, superglue, rsp, fetchArgs)\n\n const visitMeta: VisitMeta = {\n ...meta,\n navigationAction: calculateNavAction(\n meta,\n rsp,\n isGet,\n pageKey,\n currentPageKey,\n revisit\n ),\n }\n\n const page = beforeSave(pages[pageKey], json)\n return dispatch(saveAndProcessPage(pageKey, page)).then(() => visitMeta)\n })\n .catch((e) => handleFetchErr(e, fetchArgs, dispatch))\n }\n}\n\nfunction calculateNavAction(\n meta: Meta,\n rsp: Response,\n isGet: boolean,\n pageKey: string,\n currentPageKey: string,\n revisit: boolean\n) {\n let navigationAction: NavigationAction = 'push'\n if (!rsp.redirected && !isGet) {\n navigationAction = 'replace'\n }\n const isSamePage = pageKey == currentPageKey\n if (isSamePage) {\n navigationAction = 'none'\n }\n if (revisit && isGet) {\n if (rsp.redirected) {\n navigationAction = 'replace'\n } else {\n navigationAction = 'none'\n }\n }\n\n return navigationAction\n}\n\nfunction calculatePageKey(\n rsp: Response,\n isGet: boolean,\n currentPageKey: string\n) {\n let pageKey = urlToPageKey(rsp.url)\n if (!isGet && !rsp.redirected) {\n pageKey = currentPageKey\n }\n\n const contentLocation = rsp.headers.get('content-location')\n if (contentLocation) {\n pageKey = urlToPageKey(contentLocation)\n }\n return pageKey\n}\n","import { urlToPageKey, getIn, propsAtParam } from '../utils'\nimport {\n saveResponse,\n GRAFTING_ERROR,\n GRAFTING_SUCCESS,\n updateFragments,\n handleGraft,\n} from '../actions'\nimport { remote } from './requests'\nimport {\n VisitResponse,\n SaveAndProcessPageThunk,\n DefermentThunk,\n GraftResponse,\n Defer,\n JSONMappable,\n} from '../types'\nexport * from './requests'\n\nfunction fetchDeferments(\n pageKey: string,\n defers: Defer[] = []\n): DefermentThunk {\n pageKey = urlToPageKey(pageKey)\n return (dispatch) => {\n const fetches = defers\n .filter(({ type }) => type === 'auto')\n .map(function ({\n url,\n successAction = GRAFTING_SUCCESS,\n failAction = GRAFTING_ERROR,\n }) {\n // props_at will always be present in a graft response\n // That's why this is marked `as string`\n const keyPath = propsAtParam(url) as string\n\n return dispatch(remote(url, { pageKey }))\n .then(() => {\n dispatch({\n type: successAction,\n payload: {\n pageKey,\n keyPath,\n },\n })\n })\n .catch((err) => {\n dispatch({\n type: failAction,\n payload: {\n url,\n err,\n pageKey,\n keyPath,\n },\n })\n })\n })\n\n return Promise.all(fetches)\n }\n}\n\n/**\n * Save and process a rendered view from PropsTemplate. This is the primitive\n * function that `visit` and `remote` calls when it receives a page.\n *\n * If you render a page outside the normal request response cycle, e.g,\n * websocket, you can use this function to save the payload.\n */\nexport function saveAndProcessPage(\n pageKey: string,\n page: VisitResponse | GraftResponse\n): SaveAndProcessPageThunk {\n return (dispatch, getState) => {\n pageKey = urlToPageKey(pageKey)\n\n const { defers = [] } = page\n\n if ('action' in page) {\n const prevPage = getState().pages[pageKey]\n dispatch(handleGraft({ pageKey, page }))\n const currentPage = getState().pages[pageKey]\n\n currentPage.fragments.forEach((fragment) => {\n const { type, path } = fragment\n // A fragment only works on a block in props_template. So using getIn\n // will always return a JSONMappable\n const currentFragment = getIn(currentPage, path) as JSONMappable\n const prevFragment = getIn(prevPage, path) as JSONMappable\n if (!prevFragment) {\n dispatch(\n updateFragments({\n name: type,\n pageKey: pageKey,\n value: currentFragment,\n path,\n })\n )\n } else if (currentFragment !== prevFragment) {\n dispatch(\n updateFragments({\n name: type,\n pageKey: pageKey,\n value: currentFragment,\n previousValue: prevFragment,\n path,\n })\n )\n }\n })\n } else {\n dispatch(saveResponse({ pageKey, page }))\n const currentPage = getState().pages[pageKey]\n\n currentPage.fragments.forEach((fragment) => {\n const { type, path } = fragment\n const currentFragment = getIn(currentPage, path) as JSONMappable\n\n dispatch(\n updateFragments({\n name: type,\n pageKey: pageKey,\n value: currentFragment,\n path,\n })\n )\n })\n }\n\n const hasFetch = typeof fetch != 'undefined'\n if (hasFetch) {\n return dispatch(fetchDeferments(pageKey, defers)).then(() =>\n Promise.resolve()\n )\n } else {\n return Promise.resolve()\n }\n }\n}\n"],"mappings":"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","names":["pathQuery","visit","remote"]}
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,14 +15,6 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
 
30
20
  // lib/action_creators/index.ts
@@ -38,52 +28,39 @@ __export(action_creators_exports, {
38
28
  module.exports = __toCommonJS(action_creators_exports);
39
29
 
40
30
  // lib/utils/url.ts
41
- var import_url_parse = __toESM(require("url-parse"));
31
+ var FAKE_ORIGIN = "https://example.com";
42
32
  function pathQuery(url) {
43
- const { pathname, query } = new import_url_parse.default(url, {});
33
+ const { pathname, search: query } = new URL(url, FAKE_ORIGIN);
44
34
  return pathname + query;
45
35
  }
46
36
  function hasPropsAt(url) {
47
- const parsed = new import_url_parse.default(url, {}, true);
48
- const query = parsed.query;
49
- return !!query["props_at"];
37
+ const { searchParams } = new URL(url, FAKE_ORIGIN);
38
+ return searchParams.has("props_at");
50
39
  }
51
40
  function propsAtParam(url) {
52
- const parsed = new import_url_parse.default(url, {}, true);
53
- const query = parsed.query;
54
- return query["props_at"];
41
+ const { searchParams } = new URL(url, FAKE_ORIGIN);
42
+ return searchParams.get("props_at");
55
43
  }
56
44
  function withFormatJson(url) {
57
- const parsed = new import_url_parse.default(url, {}, true);
58
- parsed.query["format"] = "json";
59
- return parsed.toString();
45
+ const parsed = new URL(url, FAKE_ORIGIN);
46
+ parsed.searchParams.set("format", "json");
47
+ return parsed.href.replace(parsed.origin, "");
60
48
  }
61
49
  function removePropsAt(url) {
62
- const parsed = new import_url_parse.default(url, {}, true);
63
- const query = parsed.query;
64
- delete query["props_at"];
65
- parsed.set("query", query);
66
- return parsed.toString();
50
+ const parsed = new URL(url, FAKE_ORIGIN);
51
+ parsed.searchParams.delete("props_at");
52
+ return parsed.href.replace(parsed.origin, "");
67
53
  }
68
54
  function urlToPageKey(url) {
69
- const parsed = new import_url_parse.default(url, {}, true);
70
- const query = parsed.query;
71
- delete query["props_at"];
72
- delete query["format"];
73
- parsed.set("query", query);
55
+ const parsed = new URL(url, FAKE_ORIGIN);
56
+ parsed.searchParams.delete("props_at");
57
+ parsed.searchParams.delete("format");
74
58
  return pathQuery(parsed.toString());
75
59
  }
76
60
  function withoutHash(url) {
77
- const parsed = new import_url_parse.default(url, {}, true);
78
- parsed.set("hash", "");
79
- return parsed.toString();
80
- }
81
- function withoutBusters(url) {
82
- const parsed = new import_url_parse.default(url, {}, true);
83
- const query = parsed.query;
84
- delete query["format"];
85
- parsed.set("query", query);
86
- return pathQuery(parsed.toString());
61
+ const parsed = new URL(url, FAKE_ORIGIN);
62
+ parsed.hash = "";
63
+ return parsed.href.replace(parsed.origin, "");
87
64
  }
88
65
  function formatForXHR(url) {
89
66
  const formats = [withoutHash, withFormatJson];
@@ -172,9 +149,6 @@ function normalizeKeyPath(path) {
172
149
  }
173
150
  }
174
151
 
175
- // lib/utils/request.ts
176
- var import_url_parse2 = __toESM(require("url-parse"));
177
-
178
152
  // lib/config.ts
179
153
  var config = {
180
154
  baseUrl: "",
@@ -246,11 +220,7 @@ function argsForFetch(getState, pathQuery2, {
246
220
  if (currentState.csrfToken) {
247
221
  nextHeaders["x-csrf-token"] = currentState.csrfToken;
248
222
  }
249
- const fetchPath = new import_url_parse2.default(
250
- formatForXHR(pathQuery2),
251
- config.baseUrl || {},
252
- true
253
- );
223
+ const fetchPath = new URL(formatForXHR(pathQuery2), config.baseUrl);
254
224
  const credentials = "same-origin";
255
225
  if (!(method == "GET" || method == "HEAD")) {
256
226
  nextHeaders["x-http-method-override"] = method;
@@ -264,20 +234,16 @@ function argsForFetch(getState, pathQuery2, {
264
234
  signal
265
235
  };
266
236
  if (currentState.currentPageKey) {
267
- const referrer = new import_url_parse2.default(
268
- currentState.currentPageKey,
269
- config.baseUrl || {},
270
- false
271
- ).href;
272
- options.referrer = referrer;
237
+ const referrer = new URL(currentState.currentPageKey, config.baseUrl);
238
+ options.referrer = referrer.toString();
273
239
  }
274
240
  if (method == "GET" || method == "HEAD") {
275
241
  if (options.body instanceof FormData) {
276
242
  const allData = new URLSearchParams(
277
243
  options.body
278
244
  );
279
- const nextQuery = { ...fetchPath.query, ...Object.fromEntries(allData) };
280
- fetchPath.set("query", nextQuery);
245
+ allData.forEach((value, key) => fetchPath.searchParams.delete(key));
246
+ allData.forEach((value, key) => fetchPath.searchParams.append(key, value));
281
247
  }
282
248
  delete options.body;
283
249
  }
@@ -305,9 +271,6 @@ function needsRefresh(prevAssets, newAssets) {
305
271
  }
306
272
  }
307
273
 
308
- // lib/action_creators/index.ts
309
- var import_url_parse3 = __toESM(require("url-parse"));
310
-
311
274
  // lib/actions.ts
312
275
  var import_toolkit = require("@reduxjs/toolkit");
313
276
  var GRAFTING_ERROR = "@@superglue/GRAFTING_ERROR";
@@ -385,7 +348,6 @@ var remote = (path, {
385
348
  beforeSave = (prevPage, receivedPage) => receivedPage,
386
349
  ...rest
387
350
  } = {}) => {
388
- path = withoutBusters(path);
389
351
  targetPageKey = targetPageKey && urlToPageKey(targetPageKey);
390
352
  return (dispatch, getState) => {
391
353
  const fetchArgs = argsForFetch(getState, path, rest);
@@ -439,7 +401,6 @@ var visit = (path, {
439
401
  revisit = false,
440
402
  ...rest
441
403
  } = {}) => {
442
- path = withoutBusters(path);
443
404
  return (dispatch, getState) => {
444
405
  const currentPageKey = getState().superglue.currentPageKey;
445
406
  placeholderKey = placeholderKey && urlToPageKey(placeholderKey) || currentPageKey;
@@ -546,8 +507,7 @@ function fetchDeferments(pageKey, defers = []) {
546
507
  successAction = GRAFTING_SUCCESS,
547
508
  failAction = GRAFTING_ERROR
548
509
  }) {
549
- const parsedUrl = new import_url_parse3.default(url, true);
550
- const keyPath = parsedUrl.query.props_at;
510
+ const keyPath = propsAtParam(url);
551
511
  return dispatch(remote(url, { pageKey })).then(() => {
552
512
  dispatch({
553
513
  type: successAction,