UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 12.1 kB
{"version":3,"file":"interceptRoutes.js","names":[],"sources":["esm/router/interceptRoutes.js"],"sourcesContent":["import {\n matchDynamicName,\n matchRoutePattern,\n stripGroupSegmentsFromPath\n} from \"./matchers\";\nimport { hasWebHistory, isNative } from \"../constants\";\nlet navigationMode = \"hard\";\nfunction setNavigationType(type) {\n navigationMode = type;\n}\nfunction getNavigationType() {\n return navigationMode;\n}\nfunction isHardNavigation() {\n return navigationMode === \"hard\";\n}\nfunction collectAllLayoutsWithSlots(node, collected = []) {\n if (node.slots && node.slots.size > 0) {\n collected.push(node);\n }\n if (node.children) {\n for (const child of node.children) {\n collectAllLayoutsWithSlots(child, collected);\n }\n }\n return collected;\n}\nfunction getLayoutPath(node) {\n let path = node.contextKey.replace(/^\\.\\//, \"\").replace(/\\/?_layout.*$/, \"\").replace(/^app\\/?/, \"\");\n path = stripGroupSegmentsFromPath(path);\n return \"/\" + path;\n}\nfunction isLayoutAncestorOfPath(layoutPath, currentPath) {\n if (!layoutPath.replace(/\\/+$/, \"\")) return true;\n return matchRoutePattern(layoutPath, currentPath) !== null;\n}\nfunction findLayoutsWithSlotsAlongPath(rootNode, currentPath) {\n if (!rootNode) return [];\n const allLayoutsWithSlots = collectAllLayoutsWithSlots(rootNode);\n const ancestorLayouts = allLayoutsWithSlots.filter((layout) => {\n const layoutPath = getLayoutPath(layout);\n return isLayoutAncestorOfPath(layoutPath, currentPath);\n });\n ancestorLayouts.sort((a, b) => {\n const depthA = getLayoutPath(a).split(\"/\").filter(Boolean).length;\n const depthB = getLayoutPath(b).split(\"/\").filter(Boolean).length;\n return depthA - depthB;\n });\n return ancestorLayouts;\n}\nfunction findInterceptRoute(targetPath, rootNode, currentPath) {\n if (isNative) {\n return null;\n }\n if (isHardNavigation()) {\n return null;\n }\n const layoutsWithSlots = findLayoutsWithSlotsAlongPath(rootNode, currentPath);\n if (layoutsWithSlots.length === 0) {\n return null;\n }\n for (let i = layoutsWithSlots.length - 1; i >= 0; i--) {\n const layoutNode = layoutsWithSlots[i];\n for (const [slotName, slotConfig] of layoutNode.slots) {\n const result = findMatchingInterceptInSlot(\n targetPath,\n slotName,\n slotConfig,\n layoutNode,\n currentPath\n );\n if (result) {\n return result;\n }\n }\n }\n return null;\n}\nfunction findMatchingInterceptInSlot(targetPath, slotName, slotConfig, layoutNode, currentPath) {\n for (const interceptRoute of slotConfig.interceptRoutes) {\n if (!interceptRoute.intercept) {\n continue;\n }\n const { levels, targetPath: interceptTargetPath } = interceptRoute.intercept;\n const resolvedTargetPath = resolveInterceptTargetPath(\n interceptTargetPath,\n levels,\n layoutNode\n );\n const params = matchPath(targetPath, resolvedTargetPath);\n if (params !== null) {\n return {\n interceptRoute,\n slotName,\n layoutContextKey: layoutNode.contextKey,\n params\n };\n }\n }\n return null;\n}\nfunction resolveInterceptTargetPath(interceptTargetPath, levels, layoutNode) {\n const fullLayoutPath = getLayoutPath(layoutNode);\n let layoutPath = fullLayoutPath === \"/\" ? \"\" : fullLayoutPath.slice(1);\n if (levels === Infinity) {\n return \"/\" + interceptTargetPath;\n }\n if (levels === 0) {\n const basePath = layoutPath ? \"/\" + layoutPath : \"\";\n return basePath + \"/\" + interceptTargetPath;\n }\n const pathParts = layoutPath.split(\"/\").filter(Boolean);\n const parentParts = pathParts.slice(0, -levels);\n const parentPath = parentParts.length > 0 ? \"/\" + parentParts.join(\"/\") : \"\";\n return parentPath + \"/\" + interceptTargetPath;\n}\nfunction matchPath(path, pattern) {\n const pathname = path.split(/[?#]/, 1)[0];\n const normalizedPath = \"/\" + pathname.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n const normalizedPattern = \"/\" + pattern.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n const pathParts = normalizedPath.split(\"/\").filter(Boolean);\n const patternParts = normalizedPattern.split(\"/\").filter(Boolean);\n const params = {};\n let pathIndex = 0;\n for (let i = 0; i < patternParts.length; i++) {\n const patternPart = patternParts[i];\n const dynamicMatch = matchDynamicName(patternPart);\n if (dynamicMatch) {\n if (dynamicMatch.deep) {\n const remaining = pathParts.slice(pathIndex);\n if (remaining.length === 0) {\n return null;\n }\n params[dynamicMatch.name] = remaining.join(\"/\");\n return params;\n } else {\n if (pathIndex >= pathParts.length) {\n return null;\n }\n params[dynamicMatch.name] = pathParts[pathIndex];\n pathIndex++;\n }\n } else {\n if (pathIndex >= pathParts.length || pathParts[pathIndex] !== patternPart) {\n return null;\n }\n pathIndex++;\n }\n }\n if (pathIndex !== pathParts.length) {\n return null;\n }\n return params;\n}\nlet preInterceptUrl = null;\nfunction updateURLWithoutNavigation(href) {\n if (hasWebHistory) {\n preInterceptUrl = window.location.pathname + window.location.search;\n window.history.pushState(\n {\n __intercepted: true,\n __actualPath: href,\n __preInterceptUrl: preInterceptUrl\n },\n \"\",\n href\n );\n }\n}\nlet clearSlotStatesCallback = null;\nfunction registerClearSlotStates(callback) {\n clearSlotStatesCallback = callback;\n}\nfunction closeIntercept() {\n if (!hasWebHistory) return false;\n const state = window.history.state;\n if (!state?.__intercepted) {\n return false;\n }\n returningFromIntercept = true;\n clearSlotStatesCallback?.();\n window.history.back();\n return true;\n}\nfunction isInterceptedNavigation() {\n if (!hasWebHistory) return false;\n return window.history.state?.__intercepted === true;\n}\nfunction getInterceptedActualPath() {\n if (!hasWebHistory) return null;\n return window.history.state?.__actualPath ?? null;\n}\nfunction getPreInterceptUrl() {\n if (!hasWebHistory) return null;\n return window.history.state?.__preInterceptUrl ?? preInterceptUrl;\n}\nlet returningFromIntercept = false;\nfunction setReturningFromIntercept(value) {\n returningFromIntercept = value;\n}\nfunction isReturningFromIntercept() {\n return returningFromIntercept;\n}\nlet setSlotStateCallback = null;\nfunction registerSetSlotState(callback) {\n setSlotStateCallback = callback;\n}\nlet lastInterceptRouteNode = null;\nlet lastInterceptSlotName = null;\nlet lastInterceptParams = null;\nfunction storeInterceptState(slotName, routeNode, params) {\n lastInterceptSlotName = slotName;\n lastInterceptRouteNode = routeNode;\n lastInterceptParams = params;\n}\nfunction restoreInterceptFromHistory() {\n if (!hasWebHistory) return false;\n const state = window.history.state;\n if (!state?.__intercepted) {\n return false;\n }\n if (lastInterceptRouteNode && lastInterceptSlotName && setSlotStateCallback) {\n setSlotStateCallback(lastInterceptSlotName, {\n activeRouteKey: lastInterceptRouteNode.contextKey,\n activeRouteNode: lastInterceptRouteNode,\n params: lastInterceptParams || {},\n isIntercepted: true\n });\n return true;\n }\n return false;\n}\nexport {\n closeIntercept,\n findInterceptRoute,\n getInterceptedActualPath,\n getNavigationType,\n getPreInterceptUrl,\n isHardNavigation,\n isInterceptedNavigation,\n isReturningFromIntercept,\n registerClearSlotStates,\n registerSetSlotState,\n restoreInterceptFromHistory,\n setNavigationType,\n setReturningFromIntercept,\n storeInterceptState,\n updateURLWithoutNavigation\n};\n//# sourceMappingURL=interceptRoutes.js.map\n"],"mappings":";;;;AAMA,IAAI,iBAAiB;AACrB,SAAS,kBAAkB,MAAM;CAC/B,iBAAiB;AACnB;AACA,SAAS,oBAAoB;CAC3B,OAAO;AACT;AACA,SAAS,mBAAmB;CAC1B,OAAO,mBAAmB;AAC5B;AACA,SAAS,2BAA2B,MAAM,YAAY,CAAC,GAAG;CACxD,IAAI,KAAK,SAAS,KAAK,MAAM,OAAO,GAAG;EACrC,UAAU,KAAK,IAAI;CACrB;CACA,IAAI,KAAK,UAAU;EACjB,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,2BAA2B,OAAO,SAAS;EAC7C;CACF;CACA,OAAO;AACT;AACA,SAAS,cAAc,MAAM;CAC3B,IAAI,OAAO,KAAK,WAAW,QAAQ,SAAS,EAAE,CAAC,CAAC,QAAQ,iBAAiB,EAAE,CAAC,CAAC,QAAQ,WAAW,EAAE;CAClG,OAAO,2BAA2B,IAAI;CACtC,OAAO,MAAM;AACf;AACA,SAAS,uBAAuB,YAAY,aAAa;CACvD,IAAI,CAAC,WAAW,QAAQ,QAAQ,EAAE,GAAG,OAAO;CAC5C,OAAO,kBAAkB,YAAY,WAAW,MAAM;AACxD;AACA,SAAS,8BAA8B,UAAU,aAAa;CAC5D,IAAI,CAAC,UAAU,OAAO,CAAC;CACvB,MAAM,sBAAsB,2BAA2B,QAAQ;CAC/D,MAAM,kBAAkB,oBAAoB,QAAQ,WAAW;EAC7D,MAAM,aAAa,cAAc,MAAM;EACvC,OAAO,uBAAuB,YAAY,WAAW;CACvD,CAAC;CACD,gBAAgB,MAAM,GAAG,MAAM;EAC7B,MAAM,SAAS,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;EAC3D,MAAM,SAAS,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;EAC3D,OAAO,SAAS;CAClB,CAAC;CACD,OAAO;AACT;AACA,SAAS,mBAAmB,YAAY,UAAU,aAAa;CAC7D,IAAI,UAAU;EACZ,OAAO;CACT;CACA,IAAI,iBAAiB,GAAG;EACtB,OAAO;CACT;CACA,MAAM,mBAAmB,8BAA8B,UAAU,WAAW;CAC5E,IAAI,iBAAiB,WAAW,GAAG;EACjC,OAAO;CACT;CACA,KAAK,IAAI,IAAI,iBAAiB,SAAS,GAAG,KAAK,GAAG,KAAK;EACrD,MAAM,aAAa,iBAAiB;EACpC,KAAK,MAAM,CAAC,UAAU,eAAe,WAAW,OAAO;GACrD,MAAM,SAAS,4BACb,YACA,UACA,YACA,YACA,WACF;GACA,IAAI,QAAQ;IACV,OAAO;GACT;EACF;CACF;CACA,OAAO;AACT;AACA,SAAS,4BAA4B,YAAY,UAAU,YAAY,YAAY,aAAa;CAC9F,KAAK,MAAM,kBAAkB,WAAW,iBAAiB;EACvD,IAAI,CAAC,eAAe,WAAW;GAC7B;EACF;EACA,MAAM,EAAE,QAAQ,YAAY,wBAAwB,eAAe;EACnE,MAAM,qBAAqB,2BACzB,qBACA,QACA,UACF;EACA,MAAM,SAAS,UAAU,YAAY,kBAAkB;EACvD,IAAI,WAAW,MAAM;GACnB,OAAO;IACL;IACA;IACA,kBAAkB,WAAW;IAC7B;GACF;EACF;CACF;CACA,OAAO;AACT;AACA,SAAS,2BAA2B,qBAAqB,QAAQ,YAAY;CAC3E,MAAM,iBAAiB,cAAc,UAAU;CAC/C,IAAI,aAAa,mBAAmB,MAAM,KAAK,eAAe,MAAM,CAAC;CACrE,IAAI,WAAW,UAAU;EACvB,OAAO,MAAM;CACf;CACA,IAAI,WAAW,GAAG;EAChB,MAAM,WAAW,aAAa,MAAM,aAAa;EACjD,OAAO,WAAW,MAAM;CAC1B;CACA,MAAM,YAAY,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;CACtD,MAAM,cAAc,UAAU,MAAM,GAAG,CAAC,MAAM;CAC9C,MAAM,aAAa,YAAY,SAAS,IAAI,MAAM,YAAY,KAAK,GAAG,IAAI;CAC1E,OAAO,aAAa,MAAM;AAC5B;AACA,SAAS,UAAU,MAAM,SAAS;CAChC,MAAM,WAAW,KAAK,MAAM,QAAQ,CAAC,CAAC,CAAC;CACvC,MAAM,iBAAiB,MAAM,SAAS,QAAQ,QAAQ,EAAE,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAC5E,MAAM,oBAAoB,MAAM,QAAQ,QAAQ,QAAQ,EAAE,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAC9E,MAAM,YAAY,eAAe,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;CAC1D,MAAM,eAAe,kBAAkB,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;CAChE,MAAM,SAAS,CAAC;CAChB,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;EAC5C,MAAM,cAAc,aAAa;EACjC,MAAM,eAAe,iBAAiB,WAAW;EACjD,IAAI,cAAc;GAChB,IAAI,aAAa,MAAM;IACrB,MAAM,YAAY,UAAU,MAAM,SAAS;IAC3C,IAAI,UAAU,WAAW,GAAG;KAC1B,OAAO;IACT;IACA,OAAO,aAAa,QAAQ,UAAU,KAAK,GAAG;IAC9C,OAAO;GACT,OAAO;IACL,IAAI,aAAa,UAAU,QAAQ;KACjC,OAAO;IACT;IACA,OAAO,aAAa,QAAQ,UAAU;IACtC;GACF;EACF,OAAO;GACL,IAAI,aAAa,UAAU,UAAU,UAAU,eAAe,aAAa;IACzE,OAAO;GACT;GACA;EACF;CACF;CACA,IAAI,cAAc,UAAU,QAAQ;EAClC,OAAO;CACT;CACA,OAAO;AACT;AACA,IAAI,kBAAkB;AACtB,SAAS,2BAA2B,MAAM;CACxC,IAAI,eAAe;EACjB,kBAAkB,OAAO,SAAS,WAAW,OAAO,SAAS;EAC7D,OAAO,QAAQ,UACb;GACE,eAAe;GACf,cAAc;GACd,mBAAmB;EACrB,GACA,IACA,IACF;CACF;AACF;AACA,IAAI,0BAA0B;AAC9B,SAAS,wBAAwB,UAAU;CACzC,0BAA0B;AAC5B;AACA,SAAS,iBAAiB;CACxB,IAAI,CAAC,eAAe,OAAO;CAC3B,MAAM,QAAQ,OAAO,QAAQ;CAC7B,IAAI,CAAC,OAAO,eAAe;EACzB,OAAO;CACT;CACA,yBAAyB;CACzB,0BAA0B;CAC1B,OAAO,QAAQ,KAAK;CACpB,OAAO;AACT;AACA,SAAS,0BAA0B;CACjC,IAAI,CAAC,eAAe,OAAO;CAC3B,OAAO,OAAO,QAAQ,OAAO,kBAAkB;AACjD;AACA,SAAS,2BAA2B;CAClC,IAAI,CAAC,eAAe,OAAO;CAC3B,OAAO,OAAO,QAAQ,OAAO,gBAAgB;AAC/C;AACA,SAAS,qBAAqB;CAC5B,IAAI,CAAC,eAAe,OAAO;CAC3B,OAAO,OAAO,QAAQ,OAAO,qBAAqB;AACpD;AACA,IAAI,yBAAyB;AAC7B,SAAS,0BAA0B,OAAO;CACxC,yBAAyB;AAC3B;AACA,SAAS,2BAA2B;CAClC,OAAO;AACT;AACA,IAAI,uBAAuB;AAC3B,SAAS,qBAAqB,UAAU;CACtC,uBAAuB;AACzB;AACA,IAAI,yBAAyB;AAC7B,IAAI,wBAAwB;AAC5B,IAAI,sBAAsB;AAC1B,SAAS,oBAAoB,UAAU,WAAW,QAAQ;CACxD,wBAAwB;CACxB,yBAAyB;CACzB,sBAAsB;AACxB;AACA,SAAS,8BAA8B;CACrC,IAAI,CAAC,eAAe,OAAO;CAC3B,MAAM,QAAQ,OAAO,QAAQ;CAC7B,IAAI,CAAC,OAAO,eAAe;EACzB,OAAO;CACT;CACA,IAAI,0BAA0B,yBAAyB,sBAAsB;EAC3E,qBAAqB,uBAAuB;GAC1C,gBAAgB,uBAAuB;GACvC,iBAAiB;GACjB,QAAQ,uBAAuB,CAAC;GAChC,eAAe;EACjB,CAAC;EACD,OAAO;CACT;CACA,OAAO;AACT"}