@thoughtbot/superglue 0.53.4 → 0.54.0
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/.babelrc.js +15 -0
- package/.prettierignore +6 -0
- package/.prettierrc +5 -0
- package/.tool-versions +1 -0
- package/LICENSE +21 -0
- package/dist/action_creators.d.mts +25 -0
- package/dist/action_creators.mjs +17 -0
- package/dist/action_creators.mjs.map +1 -0
- package/dist/chunk-MNVGYKSD.mjs +779 -0
- package/dist/chunk-MNVGYKSD.mjs.map +1 -0
- package/dist/cjs/action_creators.cjs +597 -0
- package/dist/cjs/action_creators.cjs.map +1 -0
- package/dist/cjs/superglue.cjs +1278 -0
- package/dist/cjs/superglue.cjs.map +1 -0
- package/dist/index-DfWsUSqv.d.mts +246 -0
- package/dist/superglue.d.mts +65 -0
- package/dist/superglue.mjs +613 -0
- package/dist/superglue.mjs.map +1 -0
- package/package.json +60 -25
- package/tsconfig.json +15 -0
- package/tsup.config.ts +29 -0
- package/typedoc.json +30 -0
- package/README.md +0 -126
- package/action_creators/index.js +0 -144
- package/action_creators/requests.js +0 -207
- package/actions.js +0 -17
- package/components/Nav.js +0 -211
- package/config.js +0 -8
- package/index.js +0 -215
- package/middleware.js +0 -63
- package/reducers/index.js +0 -225
- package/utils/helpers.js +0 -33
- package/utils/immutability.js +0 -128
- package/utils/index.js +0 -45
- package/utils/react.js +0 -40
- package/utils/request.js +0 -120
- package/utils/ujs.js +0 -110
- package/utils/url.js +0 -79
- package/utils/window.js +0 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../lib/index.tsx","../../lib/utils/url.ts","../../lib/utils/helpers.ts","../../lib/utils/immutability.ts","../../lib/action_creators/index.ts","../../lib/actions.ts","../../lib/action_creators/requests.ts","../../lib/utils/react.ts","../../lib/utils/request.ts","../../lib/config.ts","../../lib/utils/ujs.ts","../../lib/utils/window.ts","../../lib/reducers/index.ts","../../lib/components/Nav.tsx","../../lib/middleware.ts"],"sourcesContent":["import React from 'react'\nimport parse from 'url-parse'\nimport { rootReducer } from './reducers'\nimport { config } from './config'\nimport { urlToPageKey, ujsHandlers, argsForHistory } from './utils'\nimport { saveAndProcessPage } from './action_creators'\nimport { HISTORY_CHANGE, SET_CSRF_TOKEN } from './actions'\nimport { ConnectedComponent, Provider, connect } from 'react-redux'\n\nimport {\n BrowserHistory,\n History,\n createBrowserHistory,\n createMemoryHistory,\n} from 'history'\n\nimport Nav from './components/Nav'\n\nexport {\n BEFORE_FETCH,\n BEFORE_VISIT,\n BEFORE_REMOTE,\n SAVE_RESPONSE,\n UPDATE_FRAGMENTS,\n COPY_PAGE,\n REMOVE_PAGE,\n GRAFTING_ERROR,\n GRAFTING_SUCCESS,\n HISTORY_CHANGE,\n} from './actions'\n\nimport { mapStateToProps, mapDispatchToProps } from './utils/react'\nimport {\n Remote,\n SuperglueStore,\n Handlers,\n Visit,\n VisitResponse,\n PageOwnProps,\n AllPages,\n Page,\n JSONValue,\n} from './types'\n// export { superglueReducer, pageReducer, rootReducer } from './reducers'\nexport { fragmentMiddleware } from './middleware'\nexport { getIn } from './utils/immutability'\nexport { urlToPageKey }\n\nfunction pageToInitialState(key: string, page: VisitResponse) {\n const slices = page.slices || {}\n const nextPage: Page = {\n ...page,\n pageKey: key, //TODO remove this\n savedAt: Date.now(),\n }\n\n return {\n pages: { [key]: nextPage },\n ...slices,\n }\n}\n\nfunction start({\n initialPage,\n baseUrl = config.baseUrl,\n maxPages = config.maxPages,\n path,\n}: {\n initialPage: VisitResponse\n baseUrl: string\n maxPages?: number\n path: string\n}) {\n const initialPageKey = urlToPageKey(parse(path).href)\n const { csrfToken } = initialPage\n const location = parse(path)\n\n config.baseUrl = baseUrl\n config.maxPages = maxPages\n\n return {\n reducer: rootReducer,\n prepareStore: function (store: SuperglueStore) {\n store.dispatch({\n type: HISTORY_CHANGE,\n payload: {\n pathname: location.pathname,\n search: location.query,\n hash: location.hash,\n },\n })\n store.dispatch(saveAndProcessPage(initialPageKey, initialPage))\n store.dispatch({ type: SET_CSRF_TOKEN, payload: { csrfToken } })\n },\n initialState: pageToInitialState(initialPageKey, initialPage),\n initialPageKey,\n }\n}\n/**\n * Props for the `ApplicationBase` component\n */\ninterface ApplicationProps {\n /**\n * The global var SUPERGLUE_INITIAL_PAGE_STATE is set by your erb\n * template, e.g., index.html.erb\n */\n initialPage: VisitResponse\n /**\n * The base url prefixed to all calls made by `visit` and\n * `remote`.\n */\n baseUrl: string\n /**\n * The path of the current page. It should equal to the `location.pathname` +\n * `location.search` + `location.hash`\n */\n path: string\n /**\n * The app element that was passed to React's `createRoot`. This will be used\n * to setup UJS helpers.\n */\n appEl: HTMLElement\n /**\n * A store to perform setup on. If none is provided, it will build a basic\n * store.\n */\n store?: SuperglueStore\n}\n\ntype ConnectedMapping = Record<\n string,\n ConnectedComponent<React.ComponentType, PageOwnProps>\n>\n/**\n * The entry point to your superglue application. You should create a class\n * (Application) that inherit from the ApplicationBase component and override\n * the {@link buildStore}, {@link mapping}, and {@link visitAndRemote} methods.\n *\n * This would be setup for you when installing Superglue at `application.js`.\n */\nexport abstract class ApplicationBase extends React.Component<ApplicationProps> {\n private hasWindow: boolean\n private navigatorRef: React.RefObject<Nav>\n private initialPageKey: string\n private store: SuperglueStore\n private history: History\n private connectedMapping: ConnectedMapping\n private ujsHandlers: Handlers\n private visit: Visit\n private remote: Remote\n\n /**\n * The constructor of the `ApplicationBase` class.\n * @param props\n */\n constructor(props: ApplicationProps) {\n super(props)\n this.hasWindow = typeof window !== 'undefined'\n\n // Create a navigator Ref for UJS attributes and to enhance the base `visit`\n // and `visit` thunks\n this.navigatorRef = React.createRef()\n\n // Retrieve initial values and methods to prepare the store.\n const { prepareStore, initialState, initialPageKey, reducer } = start({\n initialPage: this.props.initialPage,\n baseUrl: this.props.baseUrl,\n path: this.props.path,\n // The max number of pages to keep in the store. Default is 20\n // maxPages: 20\n })\n this.initialPageKey = initialPageKey\n\n // Build the store and pass Superglue's provided reducer to be combined with\n // your reducers located at `application_reducer.js`\n this.store = this.buildStore(initialState, reducer)\n\n // Fire initial events and populate the store\n prepareStore(this.store)\n\n // Build history\n this.history = this.createHistory()\n this.history.replace(...argsForHistory(this.props.path))\n\n const unconnectedMapping = this.mapping()\n const nextMapping: ConnectedMapping = {}\n for (const key in unconnectedMapping) {\n const component = unconnectedMapping[key]\n nextMapping[key] = connect(mapStateToProps, mapDispatchToProps)(component)\n }\n\n this.connectedMapping = nextMapping\n\n // Build visit and remote thunks\n // Your modified `visit` and `remote` will get passed below to the\n // Nav component then to your components\n //\n // You can access them via `this.props.visit` or `this.props.remote`. In\n // your page components\n const { visit, remote } = this.visitAndRemote(this.navigatorRef, this.store)\n this.visit = visit\n this.remote = remote\n }\n\n /**\n * Override this method to return a visit and remote function. These functions\n * will be used by Superglue to power its UJS attributes and passed to your\n * page components. You may customize this functionality to your liking, e.g,\n * adding a progress bar.\n *\n * @param navigatorRef\n * @param store\n *\n * @returns\n */\n abstract visitAndRemote(\n // eslint-disable-next-line\n navigatorRef: React.RefObject<Nav>,\n store: SuperglueStore\n ): { visit: Visit; remote: Remote }\n\n componentDidMount(): void {\n const { appEl } = this.props\n // Create the ujs event handlers. You can change the ujsAttributePrefix\n // in the event the data attribute conflicts with another.\n this.ujsHandlers = ujsHandlers({\n visit: this.visit,\n remote: this.remote,\n ujsAttributePrefix: 'data-sg',\n })\n const { onClick, onSubmit } = this.ujsHandlers\n\n appEl.addEventListener('click', onClick)\n appEl.addEventListener('submit', onSubmit)\n }\n\n componentWillUnmount(): void {\n const { appEl } = this.props\n const { onClick, onSubmit } = this.ujsHandlers\n\n appEl.removeEventListener('click', onClick)\n appEl.removeEventListener('submit', onSubmit)\n }\n\n /**\n * Override this method and return a Redux store for Superglue to use. This\n * would be setup and generated for you in `store.js`. We recommend using\n * using Redux toolkit's `configureStore` to build the store.\n *\n * @param initialState - A preconfigured intial state to pass to your store.\n * @param reducer - A preconfigured reducer\n */\n abstract buildStore(\n initialState: { pages: AllPages; [key: string]: JSONValue },\n reducer: typeof rootReducer\n ): SuperglueStore\n\n createHistory(): BrowserHistory {\n if (this.hasWindow) {\n // This is used for client side rendering\n return createBrowserHistory({})\n } else {\n // This is used for server side rendering\n return createMemoryHistory({})\n }\n }\n\n /**\n * Override this method and return a mapping between a componentIdentifier and\n * a PageComponent. This will be passed to Superglue to determine which Page component\n * to render with which payload.\n *\n * @returns\n */\n abstract mapping(): Record<string, React.ComponentType>\n\n render(): JSX.Element {\n // The Nav component is pretty bare and can be inherited from for custom\n // behavior or replaced with your own.\n return (\n <Provider store={this.store}>\n <Nav\n store={this.store}\n ref={this.navigatorRef}\n visit={this.visit}\n remote={this.remote}\n mapping={this.connectedMapping}\n history={this.history}\n initialPageKey={this.initialPageKey}\n />\n </Provider>\n )\n }\n}\n","import parse from 'url-parse'\nimport { PageKey } from '../types'\n\nexport function pathQuery(url: string): string {\n const { pathname, query } = new parse(url, {})\n\n return pathname + query\n}\n\nexport function pathQueryHash(url: string): string {\n const { pathname, query, hash } = new parse(url, {})\n\n return pathname + query + hash\n}\n\nexport function hasPropsAt(url: string): boolean {\n const parsed = new parse(url, {}, true)\n const query = parsed.query\n\n return !!query['props_at']\n}\n\nexport function withFormatJson(url: string): string {\n const parsed = new parse(url, {}, true)\n parsed.query['format'] = 'json'\n\n return parsed.toString()\n}\n\nexport function pathWithoutBZParams(url: string): string {\n const parsed = new parse(url, {}, true)\n const query = parsed.query\n\n delete query['props_at']\n delete query['format']\n parsed.set('query', query)\n\n return pathQueryHash(parsed.toString())\n}\n\nexport function removePropsAt(url: string): string {\n const parsed = new parse(url, {}, true)\n const query = parsed.query\n\n delete query['props_at']\n parsed.set('query', query)\n\n return parsed.toString()\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 parse(url, {}, true)\n const query = parsed.query\n\n delete query['props_at']\n delete query['format']\n parsed.set('query', query)\n\n return pathQuery(parsed.toString())\n}\n\nexport function withoutHash(url: string): string {\n const parsed = new parse(url, {}, true)\n parsed.set('hash', '')\n return parsed.toString()\n}\n\nexport function withoutBusters(url: string): string {\n const parsed = new parse(url, {}, true)\n const query = parsed.query\n delete query['format']\n parsed.set('query', query)\n\n return pathQuery(parsed.toString())\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","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","import { urlToPageKey, getIn } from '../utils'\nimport parse from 'url-parse'\nimport {\n SAVE_RESPONSE,\n HANDLE_GRAFT,\n GRAFTING_ERROR,\n GRAFTING_SUCCESS,\n COPY_PAGE,\n UPDATE_FRAGMENTS,\n} from '../actions'\nimport { remote } from './requests'\nimport {\n CopyAction,\n VisitResponse,\n SaveResponseAction,\n UpdateFragmentsAction,\n SaveAndProcessPageThunk,\n DefermentThunk,\n HandleGraftAction,\n GraftResponse,\n Page,\n Defer,\n JSONMappable,\n} from '../types'\nexport * from './requests'\n\nexport function copyPage({\n from,\n to,\n}: {\n from: string\n to: string\n}): CopyAction {\n return {\n type: COPY_PAGE,\n payload: {\n from,\n to,\n },\n }\n}\n\nexport function saveResponse({\n pageKey,\n page,\n}: {\n pageKey: string\n page: VisitResponse\n}): SaveResponseAction {\n pageKey = urlToPageKey(pageKey)\n\n return {\n type: SAVE_RESPONSE,\n payload: {\n pageKey,\n page,\n },\n }\n}\n\nexport function handleGraft({\n pageKey,\n page,\n}: {\n pageKey: string\n page: GraftResponse\n}): HandleGraftAction {\n pageKey = urlToPageKey(pageKey)\n\n return {\n type: HANDLE_GRAFT,\n payload: {\n pageKey,\n page,\n },\n }\n}\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 const parsedUrl = new parse(url, true)\n\n // props_at will always be present in a graft response\n // That's why this is marked `as string`\n const keyPath = parsedUrl.query.props_at 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\nfunction updateFragmentsUsing(page: Page): UpdateFragmentsAction {\n const changedFragments: Record<string, JSONMappable> = {}\n page.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 changedFragments[type] = getIn(page, path) as JSONMappable\n })\n\n return {\n type: UPDATE_FRAGMENTS,\n payload: { changedFragments },\n }\n}\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 dispatch(handleGraft({ pageKey, page }))\n } else {\n dispatch(saveResponse({ pageKey, page }))\n }\n\n const hasFetch = typeof fetch != 'undefined'\n if (hasFetch) {\n return dispatch(fetchDeferments(pageKey, defers)).then(() => {\n if (page.fragments.length > 0) {\n const finishedPage = getState().pages[pageKey]\n dispatch(updateFragmentsUsing(finishedPage))\n return Promise.resolve()\n }\n })\n } else {\n return Promise.resolve()\n }\n }\n}\n","export const BEFORE_FETCH = '@@superglue/BEFORE_FETCH'\nexport const BEFORE_VISIT = '@@superglue/BEFORE_VISIT'\nexport const BEFORE_REMOTE = '@@superglue/BEFORE_REMOTE'\n\nexport const SAVE_RESPONSE = '@@superglue/SAVE_RESPONSE'\nexport const HANDLE_GRAFT = '@@superglue/HANDLE_GRAFT'\n\nexport const SUPERGLUE_ERROR = '@@superglue/ERROR'\nexport const GRAFTING_ERROR = '@@superglue/GRAFTING_ERROR'\nexport const GRAFTING_SUCCESS = '@@superglue/GRAFTING_SUCCESS'\n\nexport const HISTORY_CHANGE = '@@superglue/HISTORY_CHANGE'\nexport const SET_CSRF_TOKEN = '@@superglue/SET_CSRF_TOKEN'\nexport const REMOVE_PAGE = '@@superglue/REMOVE_PAGE'\nexport const COPY_PAGE = '@@superglue/COPY_PAGE'\nexport const UPDATE_FRAGMENTS = '@@superglue/UPDATE_FRAGMENTS'\n","import {\n argsForFetch,\n parseResponse,\n needsRefresh,\n urlToPageKey,\n withoutBusters,\n hasPropsAt,\n removePropsAt,\n} from '../utils'\nimport {\n BEFORE_FETCH,\n BEFORE_VISIT,\n BEFORE_REMOTE,\n SUPERGLUE_ERROR,\n} from '../actions'\nimport { copyPage, saveAndProcessPage } from './index'\nimport {\n BeforeVisit,\n BeforeFetch,\n FetchArgs,\n BeforeRemote,\n HandleError,\n VisitResponse,\n PageResponse,\n Page,\n SuperglueState,\n Meta,\n Dispatch,\n RemoteCreator,\n VisitCreator,\n} from '../types'\n\nfunction beforeVisit(payload: {\n fetchArgs: FetchArgs\n currentPageKey: string\n}): BeforeVisit {\n return {\n type: BEFORE_VISIT,\n payload,\n }\n}\n\nfunction beforeRemote(payload: {\n fetchArgs: FetchArgs\n currentPageKey: string\n}): BeforeRemote {\n return {\n type: BEFORE_REMOTE,\n payload,\n }\n}\n\nfunction beforeFetch(payload: { fetchArgs: FetchArgs }): BeforeFetch {\n return {\n type: BEFORE_FETCH,\n payload,\n }\n}\n\nfunction handleError(err: Error): HandleError {\n return {\n type: SUPERGLUE_ERROR,\n payload: {\n message: err.message,\n },\n }\n}\n\nfunction handleFetchErr(\n err: Error,\n fetchArgs: FetchArgs,\n dispatch: Dispatch\n): never {\n dispatch(handleError(err))\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 const remote: RemoteCreator = (\n path,\n {\n method = 'GET',\n headers,\n body,\n pageKey: rawPageKey,\n beforeSave = (prevPage: Page, receivedPage: PageResponse) => receivedPage,\n } = {}\n) => {\n path = withoutBusters(path)\n rawPageKey = rawPageKey && urlToPageKey(rawPageKey)\n\n return (dispatch, getState) => {\n const fetchArgs = argsForFetch(getState, path, {\n method,\n headers,\n body,\n })\n if (rawPageKey === undefined) {\n rawPageKey = getState().superglue.currentPageKey\n }\n const pageKey = rawPageKey\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 const meta = buildMeta(pageKey, json, superglue, rsp, fetchArgs)\n const willReplaceCurrent = pageKey == currentPageKey\n const existingId = pages[currentPageKey]?.componentIdentifier\n const receivedId = json.componentIdentifier\n\n if (willReplaceCurrent && !!existingId && existingId != receivedId) {\n console.warn(\n `You're about replace an existing page located at pages[\"${currentPageKey}\"]\nthat has the componentIdentifier \"${existingId}\" with the contents of a\nreceived page that has a componentIdentifier of \"${receivedId}\".\n\nThis can happen if you're using data-sg-remote or remote but your response\nredirected to a completely different page. Since remote requests do not\nnavigate or change the current page component, your current page component may\nreceive a shape that is unexpected and cause issues with rendering.\n\nConsider using data-sg-visit, the visit function, or redirect_back.`\n )\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 abort: () => {\n // noop\n },\n}\n\nexport const visit: VisitCreator = (\n path,\n {\n method = 'GET',\n headers,\n body,\n placeholderKey,\n beforeSave = (prevPage: Page, receivedPage: PageResponse) => receivedPage,\n revisit = false,\n } = {}\n) => {\n path = withoutBusters(path)\n let pageKey = urlToPageKey(path)\n\n return (dispatch, getState) => {\n placeholderKey = placeholderKey && urlToPageKey(placeholderKey)\n const hasPlaceholder = !!(\n placeholderKey && getState().pages[placeholderKey]\n )\n\n if (placeholderKey && hasPlaceholder) {\n dispatch(copyPage({ from: placeholderKey, to: pageKey }))\n }\n\n if (placeholderKey && !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 if (!placeholderKey && hasPropsAt(path)) {\n console.warn(\n `visit was called with props_at param in the path ${path}, this will be ignore unless you provide a placeholder.`\n )\n path = removePropsAt(path)\n }\n\n const controller = new AbortController()\n const { signal } = controller\n const fetchArgs = argsForFetch(getState, path, {\n headers,\n body,\n method,\n signal,\n })\n\n const currentPageKey = getState().superglue.currentPageKey\n dispatch(beforeVisit({ currentPageKey, fetchArgs }))\n dispatch(beforeFetch({ fetchArgs }))\n\n lastVisitController.abort()\n lastVisitController = controller\n\n return fetch(...fetchArgs)\n .then(parseResponse)\n .then(({ rsp, json }) => {\n const { superglue, pages = {} } = getState()\n\n const meta = buildMeta(pageKey, json, superglue, rsp, fetchArgs)\n\n const isGet = fetchArgs[1].method === 'GET'\n\n meta.suggestedAction = 'push'\n if (!rsp.redirected && !isGet) {\n meta.suggestedAction = 'replace'\n }\n\n if (revisit && isGet) {\n if (rsp.redirected) {\n meta.suggestedAction = 'replace'\n } else {\n meta.suggestedAction = 'none'\n }\n }\n\n pageKey = urlToPageKey(rsp.url)\n\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\n const page = beforeSave(pages[pageKey], json)\n return dispatch(saveAndProcessPage(pageKey, page)).then(() => {\n meta.pageKey = pageKey\n return meta\n })\n })\n .catch((e) => handleFetchErr(e, fetchArgs, dispatch))\n }\n}\n","import { saveAndProcessPage, copyPage } from '../action_creators'\nimport { Content, PageOwnProps, RootState } from '../types'\nimport { urlToPageKey } from './url'\n\nexport function mapStateToProps(\n state: RootState,\n ownProps: PageOwnProps\n): Content {\n let pageKey = ownProps.pageKey\n const params = ownProps\n const csrfToken = state.superglue.csrfToken\n pageKey = urlToPageKey(pageKey)\n const { data, fragments } = state.pages[pageKey] || {\n data: {},\n fragments: [],\n }\n return { ...data, ...params, pageKey, csrfToken, fragments }\n}\n\nexport const mapDispatchToProps = {\n saveAndProcessPage,\n copyPage,\n}\n","import parse from 'url-parse'\nimport { 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) {\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 { method = 'GET', headers = {}, body = '', signal }: 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 parse(\n formatForXHR(pathQuery),\n config.baseUrl || {},\n true\n )\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 parse(\n currentState.currentPageKey,\n config.baseUrl || {},\n false\n ).href\n\n options.referrer = referrer\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 // TODO: Add coverage for this\n const nextQuery = { ...fetchPath.query, ...Object.fromEntries(allData) }\n fetchPath.set('query', nextQuery)\n }\n\n delete options.body\n }\n\n return [fetchPath.toString(), options]\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","export const config = {\n baseUrl: '',\n maxPages: 20,\n}\n","import { withoutBusters, urlToPageKey } from './url'\nimport {\n Visit,\n Remote,\n VisitProps,\n RemoteProps,\n Meta,\n Handlers,\n UJSHandlers,\n} from '../types'\n\nexport class HandlerBuilder {\n public attributePrefix: string\n public visit: Visit\n public remote: Remote\n\n constructor({\n ujsAttributePrefix,\n visit,\n remote,\n }: {\n ujsAttributePrefix: string\n visit: Visit\n remote: Remote\n }) {\n this.attributePrefix = ujsAttributePrefix\n this.isUJS = this.isUJS.bind(this)\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(event: MouseEvent): boolean {\n return (\n event.which > 1 ||\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: Event): 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 let url = form.getAttribute('action')\n if (!url) {\n return\n }\n\n const method = (form.getAttribute('method') || 'POST').toUpperCase()\n url = withoutBusters(url)\n\n this.visitOrRemote(form, url, {\n method,\n body: new FormData(form),\n })\n }\n\n handleClick(event: 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 let url = link.getAttribute('href')\n if (!url) {\n return\n }\n url = withoutBusters(url)\n\n this.visitOrRemote(link, url, { method: 'GET' })\n }\n\n visitOrRemote(\n linkOrForm: HTMLAnchorElement | HTMLFormElement,\n url: string,\n opts: VisitProps | RemoteProps\n ): Promise<Meta> | undefined {\n if (linkOrForm.getAttribute(this.attributePrefix + '-visit')) {\n const nextOpts: VisitProps = { ...opts }\n const placeholderKey = linkOrForm.getAttribute(\n this.attributePrefix + '-placeholder'\n )\n if (placeholderKey) {\n nextOpts.placeholderKey = urlToPageKey(placeholderKey)\n }\n return this.visit(url, { ...nextOpts })\n }\n\n if (linkOrForm.getAttribute(this.attributePrefix + '-remote')) {\n return this.remote(url, opts)\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}) => {\n const builder = new HandlerBuilder({\n visit,\n remote,\n ujsAttributePrefix,\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 { setIn, getIn, urlToPageKey } from '../utils'\nimport {\n REMOVE_PAGE,\n SAVE_RESPONSE,\n HANDLE_GRAFT,\n HISTORY_CHANGE,\n SET_CSRF_TOKEN,\n COPY_PAGE,\n UPDATE_FRAGMENTS,\n} from '../actions'\nimport { config } from '../config'\nimport {\n AllPages,\n Page,\n PageReducerAction,\n VisitResponse,\n Fragment,\n GraftResponse,\n SuperglueState,\n SuperglueReducerAction,\n HistoryChange,\n SaveResponseAction,\n SetCSRFToken,\n HandleGraftAction,\n UpdateFragmentsAction,\n CopyAction,\n RemovePageAction,\n JSONMappable,\n} from '../types'\nimport { UnknownAction } from 'redux'\n\nfunction addPlaceholdersToDeferredNodes(existingPage: Page, page: Page): Page {\n const { defers = [] } = existingPage\n\n const prevDefers = defers.map(({ path }) => {\n const node = getIn(existingPage, path)\n const copy = JSON.stringify(node)\n return [path, JSON.parse(copy)]\n })\n\n return prevDefers.reduce((memo, [path, node]) => {\n return setIn(page, path, node)\n }, page)\n}\n\nfunction constrainPagesSize(state: AllPages) {\n const { maxPages } = config\n const allPageKeys = Object.keys(state)\n const cacheTimesRecentFirst = allPageKeys\n .map((key) => state[key].savedAt)\n .sort((a, b) => b - a)\n\n for (const key of Array.from(allPageKeys)) {\n if (state[key].savedAt <= cacheTimesRecentFirst[maxPages - 1]) {\n delete state[key]\n }\n }\n}\n\nfunction saveResponse(\n state: AllPages,\n pageKey: string,\n page: VisitResponse\n): AllPages {\n state = { ...state }\n\n let nextPage: Page = {\n pageKey,\n ...page,\n savedAt: Date.now(),\n }\n\n const existingPage = state[pageKey]\n\n if (existingPage) {\n nextPage = addPlaceholdersToDeferredNodes(existingPage, nextPage)\n }\n constrainPagesSize(state)\n state[pageKey] = nextPage\n\n return state\n}\n\nexport function appendReceivedFragmentsOntoPage(\n state: AllPages,\n pageKey: string,\n receivedFragments: Fragment[]\n): AllPages {\n if (!pageKey) {\n return state\n }\n\n if (receivedFragments.length === 0) {\n return state\n }\n\n const currentPage = state[pageKey]\n const { fragments: prevFragments = [] } = currentPage\n const nextFragments = [...prevFragments]\n const existingKeys: Record<string, boolean> = {}\n prevFragments.forEach((frag) => (existingKeys[frag.path] = true))\n\n receivedFragments.forEach((frag) => {\n if (!existingKeys[frag.path]) {\n nextFragments.push(frag)\n }\n })\n\n const nextPage = {\n ...currentPage,\n fragments: nextFragments,\n }\n\n const nextState = { ...state }\n nextState[pageKey] = nextPage\n\n return nextState\n}\n\nexport function graftNodeOntoPage(\n state: AllPages,\n pageKey: string,\n node: JSONMappable,\n pathToNode: string\n): AllPages {\n if (!node) {\n console.warn(\n 'There was no node returned in the response. Do you have the correct key path in your props_at?'\n )\n return state\n }\n\n if (!pathToNode || !pageKey) {\n return state\n }\n const fullPathToNode = [pageKey, pathToNode].join('.')\n return setIn(state, fullPathToNode, node)\n}\n\nexport function handleGraft(\n state: AllPages,\n pageKey: string,\n page: GraftResponse\n): AllPages {\n const currentPage = state[pageKey]\n if (!currentPage) {\n const error = new Error(\n `Superglue was looking for ${pageKey} in your state, but could not find it in your mapping. Did you forget to pass in a valid pageKey to this.props.remote or this.props.visit?`\n )\n throw error\n }\n const {\n data: receivedNode,\n path: pathToNode,\n fragments: receivedFragments = [],\n } = page\n\n return [\n (nextState: AllPages) =>\n graftNodeOntoPage(nextState, pageKey, receivedNode, pathToNode),\n (nextState: AllPages) =>\n appendReceivedFragmentsOntoPage(nextState, pageKey, receivedFragments),\n ].reduce((memo, fn) => fn(memo), state)\n}\n\nexport function pageReducer(\n state: AllPages = {},\n action: PageReducerAction | UnknownAction\n): AllPages {\n switch (action.type) {\n case SAVE_RESPONSE: {\n const { pageKey, page } = action.payload as SaveResponseAction['payload']\n return saveResponse(state, pageKey, page)\n }\n case HANDLE_GRAFT: {\n const { pageKey, page } = action.payload as HandleGraftAction['payload']\n\n return handleGraft(state, pageKey, page)\n }\n case UPDATE_FRAGMENTS: {\n const { changedFragments } =\n action.payload as UpdateFragmentsAction['payload']\n let nextState = state\n\n Object.entries(state).forEach(([pageKey, page]) => {\n page.fragments.forEach((fragment) => {\n const { type, path } = fragment\n const changedNode = changedFragments[type]\n const currentNode = getIn(nextState, `${pageKey}.${path}`)\n\n if (type in changedFragments && changedNode !== currentNode) {\n const nextNode = JSON.parse(JSON.stringify(changedNode))\n nextState = setIn(nextState, `${pageKey}.${path}`, nextNode)\n }\n })\n })\n\n return nextState\n }\n case COPY_PAGE: {\n const nextState = { ...state }\n const { from, to } = action.payload as CopyAction['payload']\n\n nextState[urlToPageKey(to)] = JSON.parse(JSON.stringify(nextState[from]))\n\n return nextState\n }\n case REMOVE_PAGE: {\n const { pageKey } = action.payload as RemovePageAction['payload']\n const nextState = { ...state }\n delete nextState[pageKey]\n\n return nextState\n }\n default:\n return state\n }\n}\n\nexport function superglueReducer(\n state: Partial<SuperglueState> = {},\n action: SuperglueReducerAction | UnknownAction\n): Partial<SuperglueState> {\n switch (action.type) {\n case HISTORY_CHANGE: {\n const { pathname, search, hash } =\n action.payload as HistoryChange['payload']\n const currentPageKey = urlToPageKey(pathname + search)\n\n return {\n ...state,\n currentPageKey,\n pathname,\n search,\n hash,\n }\n }\n case SAVE_RESPONSE: {\n const {\n page: { csrfToken, assets },\n } = action.payload as SaveResponseAction['payload']\n\n return { ...state, csrfToken, assets }\n }\n case SET_CSRF_TOKEN: {\n const { csrfToken } = action.payload as SetCSRFToken['payload']\n return { ...state, csrfToken: csrfToken }\n }\n default:\n return state\n }\n}\n\nexport const rootReducer = {\n superglue: superglueReducer,\n pages: pageReducer,\n}\n","import React from 'react'\nimport { urlToPageKey, pathWithoutBZParams } from '../utils'\nimport { REMOVE_PAGE, HISTORY_CHANGE } from '../actions'\nimport {\n HistoryState,\n Keypath,\n NavigationAction,\n PageOwnProps,\n Remote,\n SuperglueStore,\n Visit,\n} from '../types'\nimport { ConnectedComponent } from 'react-redux'\nimport { History, Update } from 'history'\n\ninterface Props {\n store: SuperglueStore\n history: History\n mapping: Record<string, ConnectedComponent<React.ComponentType, PageOwnProps>>\n visit: Visit\n remote: Remote\n initialPageKey: string\n}\n\ninterface State {\n pageKey: string\n ownProps: Record<string, unknown>\n}\n\n/**\n * A Nav component for browsers. It handles changine the browser history,\n * deciding which page component to render based on a passed mapping, and\n * passes a `navigateTo` to all page components.\n */\nclass Nav extends React.Component<Props, State> {\n private history: History\n private hasWindow: boolean\n private unsubscribeHistory: () => void\n\n /**\n * @ignore\n */\n constructor(props: Props) {\n super(props)\n const { history, initialPageKey } = this.props\n this.history = history\n this.navigateTo = this.navigateTo.bind(this)\n this.scrollTo = this.scrollTo.bind(this)\n this.onHistoryChange = this.onHistoryChange.bind(this)\n this.state = {\n pageKey: initialPageKey,\n ownProps: {},\n }\n this.hasWindow = typeof window !== 'undefined'\n }\n /**\n * @ignore\n */\n componentDidMount(): void {\n this.unsubscribeHistory = this.history.listen(this.onHistoryChange)\n }\n\n /**\n * @ignore\n */\n componentWillUnmount(): void {\n this.unsubscribeHistory()\n }\n\n /**\n * Passed to every page component. Manually navigate using pages that exists\n * in the store and restores scroll position. This is what {@link Visit} in\n * your `application_visit.js` ultimately calls.\n *\n * If there is an existing page in your store `navigateTo` will restore the props,\n * render the correct component, and return `true`. Otherwise, it will return\n * `false`. This is useful if you want to restore an existing page before making a\n * call to `visit` or `remote`.\n *\n * @param path\n * @param options when `none`, immediately returns `false`\n * @returns `true` if the navigation was a success, `false` if the page was not found in the\n * store.\n */\n navigateTo(\n path: Keypath,\n {\n action,\n ownProps,\n }: { action: NavigationAction; ownProps: Record<string, unknown> } = {\n action: 'push',\n ownProps: {},\n }\n ): boolean {\n if (action === 'none') {\n return false\n }\n\n path = pathWithoutBZParams(path)\n const nextPageKey = urlToPageKey(path)\n const { store } = this.props\n const hasPage = !!store.getState().pages[nextPageKey]\n\n if (hasPage) {\n const location = this.history.location\n const state = location.state as HistoryState\n const prevPageKey = state.pageKey\n const historyArgs = [\n path,\n {\n pageKey: nextPageKey,\n superglue: true,\n posY: 0,\n posX: 0,\n },\n ] as const\n\n if (action === 'push') {\n if (this.hasWindow) {\n this.history.replace(\n {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n },\n {\n ...state,\n posY: window.pageYOffset,\n posX: window.pageXOffset,\n }\n )\n }\n\n this.history.push(...historyArgs)\n }\n\n if (action === 'replace') {\n this.history.replace(...historyArgs)\n }\n\n this.setState({ pageKey: nextPageKey, ownProps })\n this.scrollTo(0, 0)\n\n if (action === 'replace' && prevPageKey && prevPageKey !== nextPageKey) {\n store.dispatch({\n type: REMOVE_PAGE,\n payload: {\n pageKey: prevPageKey,\n },\n })\n }\n\n return true\n } else {\n console.warn(\n `\\`navigateTo\\` was called , but could not find.\n the pageKey in the store. This may happen when the wrong\n content_location was set in your non-get controller action.\n No navigation will take place`\n )\n return false\n }\n }\n\n /**\n * @ignore\n */\n scrollTo(posX: number, posY: number): void {\n this.hasWindow && window.scrollTo(posX, posY)\n }\n\n /**\n * @ignore\n */\n onHistoryChange({ location, action }: Update): void {\n const { store, visit } = this.props\n const { pathname, search, hash } = location\n const state = location.state as HistoryState\n\n if (state && 'superglue' in state) {\n store.dispatch({\n type: HISTORY_CHANGE,\n payload: { pathname, search, hash },\n })\n\n if (action !== 'POP') {\n return\n }\n\n const { pageKey, posX, posY } = state\n const containsKey = !!store.getState().pages[pageKey]\n\n if (containsKey) {\n const { restoreStrategy } = store.getState().pages[pageKey]\n\n switch (restoreStrategy) {\n case 'fromCacheOnly':\n this.setState({ pageKey })\n this.scrollTo(posX, posY)\n break\n case 'fromCacheAndRevisitInBackground':\n this.setState({ pageKey })\n this.scrollTo(posX, posY)\n visit(pageKey, { revisit: true })\n break\n case 'revisitOnly':\n default:\n visit(pageKey, { revisit: true }).then((meta) => {\n if (meta === undefined) {\n console.warn(\n `scoll restoration was skipped. Your visit's then funtion\n should return the meta object it recieved if you want your\n application to restore the page's previous scroll.`\n )\n }\n\n if (!!meta && meta.suggestedAction === 'none') {\n this.setState({ pageKey })\n this.scrollTo(posX, posY)\n }\n })\n }\n } else {\n visit(pageKey, { revisit: true }).then((meta) => {\n if (meta === undefined) {\n console.warn(\n `scoll restoration was skipped. Your visit's then funtion\n should return the meta object it recieved if you want your\n application to restore the page's previous scroll.`\n )\n }\n\n if (!!meta && meta.suggestedAction === 'none') {\n this.setState({ pageKey })\n this.scrollTo(posX, posY)\n }\n })\n }\n }\n }\n\n /**\n * @ignore\n */\n notFound(identifier: string | undefined): never {\n let reminder = ''\n if (!identifier) {\n reminder =\n 'Did you forget to add `json.componentIdentifier` in your application.json.props layout?'\n }\n\n const error = new Error(\n `Superglue Nav component was looking for ${identifier} but could not find it in your mapping. ${reminder}`\n )\n\n throw error\n }\n\n /**\n * @ignore\n */\n render(): JSX.Element {\n const { store, visit, remote } = this.props\n const { pageKey, ownProps } = this.state\n const { componentIdentifier } = store.getState().pages[pageKey]\n const Component = this.props.mapping[componentIdentifier]\n\n if (Component) {\n return (\n <Component\n pageKey={pageKey}\n navigateTo={this.navigateTo}\n visit={visit}\n remote={remote}\n {...ownProps}\n />\n )\n } else {\n this.notFound(componentIdentifier)\n }\n }\n}\n\nexport default Nav\n","import * as actions from './actions'\nimport { Dispatch, JSONValue, RootState } from './types'\nimport { getIn } from './utils/immutability'\nimport { Middleware } from 'redux'\nimport { KeyPathError } from './utils/immutability'\n\nconst actionValues = Object.values(actions).map((action) => action.toString())\n\n/**\n * A middleware that will update all {@link Fragment} across the {@link\n * AllPages} slice, if a fragment on any page was mutated.\n *\n * @experimental\n */\nconst fragmentMiddleware: Middleware<unknown, RootState, Dispatch> =\n (store) => (next) => (action) => {\n const prevState = store.getState()\n const nextAction = next(action)\n const nextState = store.getState()\n if (\n !(\n action instanceof Object &&\n 'type' in action &&\n typeof action.type === 'string'\n )\n ) {\n return nextAction\n }\n\n const type = action.type\n\n if (actionValues.includes(type)) {\n return nextAction\n }\n\n if (prevState.pages === nextState.pages) {\n return nextAction\n }\n\n const changedFragments: Record<string, JSONValue> = {}\n const changedKeys = Object.keys(nextState.pages).filter((key) => {\n return prevState.pages[key] !== nextState.pages[key]\n })\n\n if (changedKeys.length === 0) {\n return nextAction\n }\n\n changedKeys.forEach((key) => {\n nextState.pages[key].fragments.forEach((fragment) => {\n const { type, path } = fragment\n const nextPage = nextState.pages[key]\n const prevPage = prevState.pages[key]\n let nextFragment, prevFragment\n\n try {\n prevFragment = getIn(prevPage, path)\n nextFragment = getIn(nextPage, path)\n } catch (err) {\n if (err instanceof KeyPathError) {\n console.warn(err.message)\n } else {\n throw err\n }\n }\n\n if (\n nextFragment !== undefined &&\n prevFragment !== undefined &&\n nextFragment !== prevFragment &&\n nextFragment\n ) {\n changedFragments[type] = nextFragment\n }\n })\n })\n\n if (Object.keys(changedFragments).length === 0) {\n return nextAction\n }\n\n store.dispatch({\n type: actions.UPDATE_FRAGMENTS,\n payload: {\n changedFragments,\n },\n })\n\n return nextAction\n }\n\nexport { fragmentMiddleware }\n"],"mappings":"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","names":["import_react","import_url_parse","parse","parse","parse","import_url_parse","parse","import_url_parse","pathQuery","parse","remote","saveResponse","handleGraft","React","remote","type","parse","React","remote"]}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { ThunkDispatch, EnhancedStore, UnknownAction, Tuple, StoreEnhancer, ThunkAction } from '@reduxjs/toolkit';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { ConnectedComponent } from 'react-redux';
|
|
4
|
+
import { Update, History } from 'history';
|
|
5
|
+
import { Action } from 'redux';
|
|
6
|
+
|
|
7
|
+
interface SaveResponseAction extends Action {
|
|
8
|
+
type: '@@superglue/SAVE_RESPONSE';
|
|
9
|
+
payload: {
|
|
10
|
+
pageKey: string;
|
|
11
|
+
page: VisitResponse;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
interface HandleGraftAction extends Action {
|
|
15
|
+
type: '@@superglue/HANDLE_GRAFT';
|
|
16
|
+
payload: {
|
|
17
|
+
pageKey: string;
|
|
18
|
+
page: GraftResponse;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
interface CopyAction extends Action {
|
|
22
|
+
type: '@@superglue/COPY_PAGE';
|
|
23
|
+
payload: {
|
|
24
|
+
from: string;
|
|
25
|
+
to: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
interface RemovePageAction extends Action {
|
|
29
|
+
type: '@@superglue/REMOVE_PAGE';
|
|
30
|
+
payload: {
|
|
31
|
+
pageKey: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
interface UpdateFragmentsAction extends Action {
|
|
35
|
+
type: '@@superglue/UPDATE_FRAGMENTS';
|
|
36
|
+
payload: {
|
|
37
|
+
changedFragments: Record<string, unknown>;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
interface SetCSRFToken extends Action {
|
|
41
|
+
type: '@@superglue/SET_CSRF_TOKEN';
|
|
42
|
+
payload: {
|
|
43
|
+
csrfToken: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface HistoryChange extends Action {
|
|
47
|
+
type: '@@superglue/HISTORY_CHANGE';
|
|
48
|
+
payload: {
|
|
49
|
+
pathname: string;
|
|
50
|
+
search: string;
|
|
51
|
+
hash: string;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
type FetchArgs = [string, BasicRequestInit];
|
|
55
|
+
interface BeforeVisit extends Action {
|
|
56
|
+
type: '@@superglue/BEFORE_VISIT';
|
|
57
|
+
payload: {
|
|
58
|
+
fetchArgs: [string, BasicRequestInit];
|
|
59
|
+
currentPageKey: string;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
interface BeforeRemote extends Action {
|
|
63
|
+
type: '@@superglue/BEFORE_REMOTE';
|
|
64
|
+
payload: {
|
|
65
|
+
fetchArgs: [string, BasicRequestInit];
|
|
66
|
+
currentPageKey: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
interface BeforeFetch extends Action {
|
|
70
|
+
type: '@@superglue/BEFORE_FETCH';
|
|
71
|
+
payload: {
|
|
72
|
+
fetchArgs: [string, BasicRequestInit];
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
interface HandleError extends Action {
|
|
76
|
+
type: '@@superglue/ERROR';
|
|
77
|
+
payload: {
|
|
78
|
+
message: string;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
type USER_SPECIFIED_STRING = string;
|
|
82
|
+
interface GraftingSuccessAction extends Action {
|
|
83
|
+
type: '@@superglue/GRAFTING_SUCCESS' | USER_SPECIFIED_STRING;
|
|
84
|
+
payload: {
|
|
85
|
+
pageKey: string;
|
|
86
|
+
keyPath: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
interface GraftingErrorAction extends Action {
|
|
90
|
+
type: '@@superglue/GRAFTING_ERROR' | USER_SPECIFIED_STRING;
|
|
91
|
+
payload: {
|
|
92
|
+
pageKey: string;
|
|
93
|
+
url: string;
|
|
94
|
+
err: unknown;
|
|
95
|
+
keyPath: string;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
type LifecycleAction = BeforeFetch | HandleError | BeforeVisit | BeforeRemote;
|
|
99
|
+
type PageReducerAction = SaveResponseAction | HandleGraftAction | GraftingSuccessAction | GraftingErrorAction | CopyAction | RemovePageAction | UpdateFragmentsAction;
|
|
100
|
+
type SuperglueReducerAction = SaveResponseAction | SetCSRFToken | HistoryChange;
|
|
101
|
+
type AllAction = PageReducerAction | GraftingSuccessAction | GraftingErrorAction | SuperglueReducerAction | LifecycleAction;
|
|
102
|
+
|
|
103
|
+
interface Props {
|
|
104
|
+
store: SuperglueStore;
|
|
105
|
+
history: History;
|
|
106
|
+
mapping: Record<string, ConnectedComponent<React.ComponentType, PageOwnProps>>;
|
|
107
|
+
visit: Visit;
|
|
108
|
+
remote: Remote;
|
|
109
|
+
initialPageKey: string;
|
|
110
|
+
}
|
|
111
|
+
interface State {
|
|
112
|
+
pageKey: string;
|
|
113
|
+
ownProps: Record<string, unknown>;
|
|
114
|
+
}
|
|
115
|
+
declare class Nav extends React.Component<Props, State> {
|
|
116
|
+
private history;
|
|
117
|
+
private hasWindow;
|
|
118
|
+
private unsubscribeHistory;
|
|
119
|
+
constructor(props: Props);
|
|
120
|
+
componentDidMount(): void;
|
|
121
|
+
componentWillUnmount(): void;
|
|
122
|
+
navigateTo(path: Keypath, { action, ownProps, }?: {
|
|
123
|
+
action: NavigationAction;
|
|
124
|
+
ownProps: Record<string, unknown>;
|
|
125
|
+
}): boolean;
|
|
126
|
+
scrollTo(posX: number, posY: number): void;
|
|
127
|
+
onHistoryChange({ location, action }: Update): void;
|
|
128
|
+
notFound(identifier: string | undefined): never;
|
|
129
|
+
render(): JSX.Element;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface Visit {
|
|
133
|
+
(input: string | PageKey, options: VisitProps): Promise<Meta>;
|
|
134
|
+
}
|
|
135
|
+
interface VisitProps extends BaseProps {
|
|
136
|
+
placeholderKey?: PageKey;
|
|
137
|
+
revisit?: boolean;
|
|
138
|
+
}
|
|
139
|
+
interface Remote {
|
|
140
|
+
(input: string | PageKey, options: RemoteProps): Promise<Meta>;
|
|
141
|
+
}
|
|
142
|
+
interface BaseProps {
|
|
143
|
+
method?: string;
|
|
144
|
+
body?: BodyInit;
|
|
145
|
+
headers?: {
|
|
146
|
+
[key: string]: string;
|
|
147
|
+
};
|
|
148
|
+
beforeSave?: BeforeSave;
|
|
149
|
+
}
|
|
150
|
+
interface RemoteProps extends BaseProps {
|
|
151
|
+
pageKey?: PageKey;
|
|
152
|
+
}
|
|
153
|
+
interface BeforeSave {
|
|
154
|
+
(prevPage: VisitResponse, receivedPage: VisitResponse): VisitResponse;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
type PageKey = string;
|
|
158
|
+
type RestoreStrategy = 'fromCacheOnly' | 'revisitOnly' | 'fromCacheAndRevisitInBackground';
|
|
159
|
+
type SuggestedAction = 'push' | 'replace' | 'none';
|
|
160
|
+
type NavigationAction = SuggestedAction;
|
|
161
|
+
type ComponentIdentifier = string;
|
|
162
|
+
type Keypath = string;
|
|
163
|
+
|
|
164
|
+
type JSONPrimitive = string | number | boolean | null | undefined;
|
|
165
|
+
type JSONObject = {
|
|
166
|
+
[key: string]: JSONValue;
|
|
167
|
+
};
|
|
168
|
+
type JSONMappable = JSONValue[] | JSONObject;
|
|
169
|
+
type JSONValue = JSONPrimitive | JSONMappable;
|
|
170
|
+
type Defer = {
|
|
171
|
+
url: string;
|
|
172
|
+
type: 'auto' | 'manual';
|
|
173
|
+
path: Keypath;
|
|
174
|
+
successAction: string;
|
|
175
|
+
failAction: string;
|
|
176
|
+
};
|
|
177
|
+
type VisitResponse = {
|
|
178
|
+
data: JSONMappable;
|
|
179
|
+
componentIdentifier: ComponentIdentifier;
|
|
180
|
+
assets: string[];
|
|
181
|
+
csrfToken?: string;
|
|
182
|
+
fragments: Fragment[];
|
|
183
|
+
defers: Defer[];
|
|
184
|
+
slices: JSONObject;
|
|
185
|
+
renderedAt: number;
|
|
186
|
+
restoreStrategy: RestoreStrategy;
|
|
187
|
+
};
|
|
188
|
+
type Page = VisitResponse & {
|
|
189
|
+
savedAt: number;
|
|
190
|
+
pageKey: PageKey;
|
|
191
|
+
};
|
|
192
|
+
type GraftResponse = VisitResponse & {
|
|
193
|
+
action: 'graft';
|
|
194
|
+
path: Keypath;
|
|
195
|
+
};
|
|
196
|
+
type Fragment = {
|
|
197
|
+
type: string;
|
|
198
|
+
path: Keypath;
|
|
199
|
+
};
|
|
200
|
+
type AllPages = Record<PageKey, Page>;
|
|
201
|
+
interface SuperglueState {
|
|
202
|
+
currentPageKey: PageKey;
|
|
203
|
+
pathname: string;
|
|
204
|
+
search: string;
|
|
205
|
+
hash: string;
|
|
206
|
+
csrfToken: string;
|
|
207
|
+
assets: string[];
|
|
208
|
+
}
|
|
209
|
+
interface RootState {
|
|
210
|
+
superglue: SuperglueState;
|
|
211
|
+
pages: AllPages;
|
|
212
|
+
}
|
|
213
|
+
interface PageOwnProps {
|
|
214
|
+
pageKey: PageKey;
|
|
215
|
+
navigateTo: InstanceType<typeof Nav>['navigateTo'];
|
|
216
|
+
visit: Visit;
|
|
217
|
+
remote: Remote;
|
|
218
|
+
}
|
|
219
|
+
interface Meta {
|
|
220
|
+
pageKey: PageKey;
|
|
221
|
+
page: VisitResponse;
|
|
222
|
+
redirected: boolean;
|
|
223
|
+
rsp: Response;
|
|
224
|
+
fetchArgs: FetchArgs;
|
|
225
|
+
componentIdentifier: ComponentIdentifier;
|
|
226
|
+
needsRefresh: boolean;
|
|
227
|
+
suggestedAction?: SuggestedAction;
|
|
228
|
+
}
|
|
229
|
+
type VisitCreator = (input: string | PageKey, options: VisitProps) => MetaThunk;
|
|
230
|
+
type RemoteCreator = (input: string | PageKey, options: RemoteProps) => MetaThunk;
|
|
231
|
+
type Dispatch = ThunkDispatch<RootState, undefined, AllAction>;
|
|
232
|
+
type SuperglueStore = EnhancedStore<RootState, AllAction | UnknownAction, Tuple<[
|
|
233
|
+
StoreEnhancer<{
|
|
234
|
+
dispatch: Dispatch;
|
|
235
|
+
}>,
|
|
236
|
+
StoreEnhancer
|
|
237
|
+
]>>;
|
|
238
|
+
type SaveAndProcessPageThunk = ThunkAction<Promise<void>, RootState, undefined, AllAction>;
|
|
239
|
+
type MetaThunk = ThunkAction<Promise<Meta>, RootState, undefined, AllAction>;
|
|
240
|
+
interface BasicRequestInit extends RequestInit {
|
|
241
|
+
headers?: {
|
|
242
|
+
[key: string]: string;
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export { type AllPages as A, type CopyAction as C, type Dispatch as D, type GraftResponse as G, type HandleGraftAction as H, type JSONMappable as J, type Keypath as K, Nav as N, type PageReducerAction as P, type RootState as R, type SuperglueState as S, type Visit as V, type SuperglueReducerAction as a, type JSONValue as b, type PageKey as c, type SuperglueStore as d, type Remote as e, type VisitResponse as f, type RemoteCreator as g, type VisitCreator as h, type SaveResponseAction as i, type SaveAndProcessPageThunk as j };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { A as AllPages, P as PageReducerAction, S as SuperglueState, a as SuperglueReducerAction, J as JSONMappable, K as Keypath, b as JSONValue, c as PageKey, R as RootState, D as Dispatch, N as Nav, d as SuperglueStore, V as Visit, e as Remote, f as VisitResponse } from './index-DfWsUSqv.mjs';
|
|
3
|
+
import { UnknownAction, Middleware } from 'redux';
|
|
4
|
+
import { BrowserHistory } from 'history';
|
|
5
|
+
import '@reduxjs/toolkit';
|
|
6
|
+
import 'react-redux';
|
|
7
|
+
|
|
8
|
+
declare function pageReducer(state: AllPages | undefined, action: PageReducerAction | UnknownAction): AllPages;
|
|
9
|
+
declare function superglueReducer(state: Partial<SuperglueState> | undefined, action: SuperglueReducerAction | UnknownAction): Partial<SuperglueState>;
|
|
10
|
+
declare const rootReducer: {
|
|
11
|
+
superglue: typeof superglueReducer;
|
|
12
|
+
pages: typeof pageReducer;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
declare function getIn(node: JSONMappable, path: Keypath): JSONValue;
|
|
16
|
+
|
|
17
|
+
declare function urlToPageKey(url: string): PageKey;
|
|
18
|
+
|
|
19
|
+
declare const BEFORE_FETCH = "@@superglue/BEFORE_FETCH";
|
|
20
|
+
declare const BEFORE_VISIT = "@@superglue/BEFORE_VISIT";
|
|
21
|
+
declare const BEFORE_REMOTE = "@@superglue/BEFORE_REMOTE";
|
|
22
|
+
declare const SAVE_RESPONSE = "@@superglue/SAVE_RESPONSE";
|
|
23
|
+
declare const GRAFTING_ERROR = "@@superglue/GRAFTING_ERROR";
|
|
24
|
+
declare const GRAFTING_SUCCESS = "@@superglue/GRAFTING_SUCCESS";
|
|
25
|
+
declare const HISTORY_CHANGE = "@@superglue/HISTORY_CHANGE";
|
|
26
|
+
declare const REMOVE_PAGE = "@@superglue/REMOVE_PAGE";
|
|
27
|
+
declare const COPY_PAGE = "@@superglue/COPY_PAGE";
|
|
28
|
+
declare const UPDATE_FRAGMENTS = "@@superglue/UPDATE_FRAGMENTS";
|
|
29
|
+
|
|
30
|
+
declare const fragmentMiddleware: Middleware<unknown, RootState, Dispatch>;
|
|
31
|
+
|
|
32
|
+
interface ApplicationProps {
|
|
33
|
+
initialPage: VisitResponse;
|
|
34
|
+
baseUrl: string;
|
|
35
|
+
path: string;
|
|
36
|
+
appEl: HTMLElement;
|
|
37
|
+
store?: SuperglueStore;
|
|
38
|
+
}
|
|
39
|
+
declare abstract class ApplicationBase extends React.Component<ApplicationProps> {
|
|
40
|
+
private hasWindow;
|
|
41
|
+
private navigatorRef;
|
|
42
|
+
private initialPageKey;
|
|
43
|
+
private store;
|
|
44
|
+
private history;
|
|
45
|
+
private connectedMapping;
|
|
46
|
+
private ujsHandlers;
|
|
47
|
+
private visit;
|
|
48
|
+
private remote;
|
|
49
|
+
constructor(props: ApplicationProps);
|
|
50
|
+
abstract visitAndRemote(navigatorRef: React.RefObject<Nav>, store: SuperglueStore): {
|
|
51
|
+
visit: Visit;
|
|
52
|
+
remote: Remote;
|
|
53
|
+
};
|
|
54
|
+
componentDidMount(): void;
|
|
55
|
+
componentWillUnmount(): void;
|
|
56
|
+
abstract buildStore(initialState: {
|
|
57
|
+
pages: AllPages;
|
|
58
|
+
[key: string]: JSONValue;
|
|
59
|
+
}, reducer: typeof rootReducer): SuperglueStore;
|
|
60
|
+
createHistory(): BrowserHistory;
|
|
61
|
+
abstract mapping(): Record<string, React.ComponentType>;
|
|
62
|
+
render(): JSX.Element;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { ApplicationBase, BEFORE_FETCH, BEFORE_REMOTE, BEFORE_VISIT, COPY_PAGE, GRAFTING_ERROR, GRAFTING_SUCCESS, HISTORY_CHANGE, REMOVE_PAGE, SAVE_RESPONSE, UPDATE_FRAGMENTS, fragmentMiddleware, getIn, urlToPageKey };
|