one
Version:
One is a React framework for web, iOS, and Android apps.
1 lines • 21.1 kB
Source Map (JSON)
{"version":3,"file":"getStateFromPath.js","names":[],"sources":["esm/fork/getStateFromPath.js"],"sourcesContent":["import escape from \"escape-string-regexp\";\nimport { getParamValue, isDynamicPart, replacePart } from \"./_shared\";\nimport { findFocusedRoute } from \"./findFocusedRoute\";\nimport {\n appendIsInitial,\n createConfigItemAdditionalProperties,\n decodeURIComponentSafe,\n formatRegexPattern,\n getRouteConfigSorter,\n getUrlWithReactNavigationConcessions,\n matchForEmptyPath,\n parseQueryParamsExtended,\n populateParams\n} from \"./getStateFromPath-mods\";\nimport { validatePathConfig } from \"./validatePathConfig\";\nfunction getStateFromPath(path, options) {\n resetRouteKeyCounter();\n if (process.env.ONE_DEBUG_ROUTER) {\n console.info(\n `[one] getStateFromPath called with path=${path}, isServer=${typeof window === \"undefined\"}`\n );\n }\n const { initialRoutes, configs, configWithRegexes } = getConfigResources(options);\n const screens = options?.screens;\n const pathData = getUrlWithReactNavigationConcessions(path);\n let remaining = pathData.nonstandardPathname.replace(/\\/+/g, \"/\").replace(/^\\//, \"\").replace(/\\?.*$/, \"\");\n remaining = remaining.endsWith(\"/\") ? remaining : `${remaining}/`;\n const prefix = options?.path?.replace(/^\\//, \"\");\n if (prefix) {\n const normalizedPrefix = prefix.endsWith(\"/\") ? prefix : `${prefix}/`;\n if (!remaining.startsWith(normalizedPrefix)) {\n return void 0;\n }\n remaining = remaining.replace(normalizedPrefix, \"\");\n }\n if (screens === void 0) {\n const routes2 = remaining.split(\"/\").filter(Boolean).map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n if (routes2.length) {\n return createNestedStateObject(pathData, routes2, initialRoutes, []);\n }\n return void 0;\n }\n if (remaining === \"/\") {\n const match = matchForEmptyPath(configWithRegexes);\n if (match) {\n return createNestedStateObject(\n pathData,\n // @modified: pass pathData instead of path\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs\n );\n }\n return void 0;\n }\n let result;\n let current;\n const { routes, remainingPath } = matchAgainstConfigs(remaining, configWithRegexes);\n if (routes !== void 0) {\n current = createNestedStateObject(pathData, routes, initialRoutes, configs);\n remaining = remainingPath;\n result = current;\n }\n if (current == null || result == null) {\n return void 0;\n }\n return result;\n}\nconst cachedConfigResources = /* @__PURE__ */ new WeakMap();\nfunction getConfigResources(options) {\n if (!options) return prepareConfigResources();\n const cached = cachedConfigResources.get(options);\n if (cached) return cached;\n const resources = prepareConfigResources(options);\n cachedConfigResources.set(options, resources);\n return resources;\n}\nfunction prepareConfigResources(options, previousSegments) {\n if (options) {\n validatePathConfig(options);\n }\n const initialRoutes = getInitialRoutes(options);\n const configs = getNormalizedConfigs(initialRoutes, options?.screens, previousSegments);\n checkForDuplicatedConfigs(configs);\n const configWithRegexes = getConfigsWithRegexes(configs);\n return {\n initialRoutes,\n configs,\n configWithRegexes\n };\n}\nfunction getInitialRoutes(options) {\n const initialRoutes = [];\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: []\n });\n }\n return initialRoutes;\n}\nfunction getNormalizedConfigs(initialRoutes, screens = {}, previousSegments) {\n return [].concat(\n ...Object.keys(screens).map(\n (key) => createNormalizedConfigs(\n key,\n screens,\n [],\n initialRoutes,\n []\n )\n )\n ).map(appendIsInitial(initialRoutes)).sort(getRouteConfigSorter(previousSegments));\n}\nfunction checkForDuplicatedConfigs(configs) {\n configs.reduce((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n const intersects = a.length > b.length ? b.every((it, i) => a[i] === it) : a.every((it, i) => b[i] === it);\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${config.pattern}' resolves to both '${a.join(\" > \")}' and '${b.join(\n \" > \"\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n return Object.assign(acc, {\n [config.pattern]: config\n });\n }, {});\n}\nfunction getConfigsWithRegexes(configs) {\n return configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n // @modified - start\n // regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n regex: c.pattern ? new RegExp(`^(${c.pattern.split(\"/\").map(formatRegexPattern).join(\"\")})$`) : void 0\n // @modified - end\n }));\n}\nconst joinPaths = (...paths) => [].concat(...paths.map((p) => p.split(\"/\"))).filter(Boolean).join(\"/\");\nconst matchAgainstConfigs = (remaining, configs) => {\n let routes;\n let remainingPath = remaining;\n const allParams = /* @__PURE__ */ Object.create(null);\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n const match = remainingPath.match(config.regex);\n if (match) {\n const matchResult = config.pattern?.split(\"/\").reduce(\n (acc, p, index) => {\n if (!isDynamicPart(p)) {\n return acc;\n }\n acc.pos += 1;\n const decodedParamSegment = decodeURIComponentSafe(\n // @modified: use decodeURIComponent**Safe**\n // The param segments appear every second item starting from 2 in the regex match result\n match[(acc.pos + 1) * 2].replace(/\\/$/, \"\")\n );\n Object.assign(acc.matchedParams, {\n [p]: Object.assign(acc.matchedParams[p] || {}, {\n [index]: decodedParamSegment\n })\n });\n return acc;\n },\n { pos: -1, matchedParams: {} }\n );\n const matchedParams = matchResult.matchedParams || {};\n routes = config.routeNames.map((name) => {\n const routeConfig = configs.find((c) => {\n return c.screen === name && config.pattern.startsWith(c.pattern);\n });\n const normalizedPath = routeConfig?.path.split(\"/\").filter(Boolean).join(\"/\");\n const numInitialSegments = routeConfig?.pattern.replace(new RegExp(`${escape(normalizedPath)}$`), \"\")?.split(\"/\").length;\n const params = normalizedPath?.split(\"/\").reduce((acc, p, index) => {\n if (!isDynamicPart(p)) {\n return acc;\n }\n const offset = numInitialSegments ? numInitialSegments - 1 : 0;\n const value = getParamValue(p, matchedParams[p]?.[index + offset]);\n if (value) {\n const key = replacePart(p);\n acc[key] = routeConfig?.parse?.[key] ? routeConfig.parse[key](value) : value;\n }\n return acc;\n }, {});\n if (params && Object.keys(params).length) {\n Object.assign(allParams, params);\n return { name, params };\n }\n return { name };\n });\n remainingPath = remainingPath.replace(match[1], \"\");\n break;\n }\n }\n populateParams(routes, allParams);\n return { routes, remainingPath };\n};\nconst createNormalizedConfigs = (screen, routeConfig, routeNames = [], initials, parentScreens, parentPattern) => {\n const configs = [];\n routeNames.push(screen);\n parentScreens.push(screen);\n const config = routeConfig[screen];\n if (typeof config === \"string\") {\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === \"object\") {\n let pattern;\n if (typeof config.path === \"string\") {\n if (config.exact && config.path === void 0) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n pattern = config.exact !== true ? joinPaths(parentPattern || \"\", config.path || \"\") : config.path || \"\";\n configs.push(\n createConfigItem(screen, routeNames, pattern, config.path, config.parse, config)\n );\n }\n if (config.screens) {\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens\n });\n }\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n configs.push(...result);\n });\n }\n }\n routeNames.pop();\n return configs;\n};\nconst createConfigItem = (screen, routeNames, pattern, path, parse = void 0, config = {}) => {\n pattern = pattern.split(\"/\").filter(Boolean).join(\"/\");\n const regex = pattern ? new RegExp(\n `^(${pattern.split(\"/\").map((it) => {\n if (it.startsWith(\":\")) {\n return `(([^/]+\\\\/)${it.endsWith(\"?\") ? \"?\" : \"\"})`;\n }\n return `${it === \"*\" ? \".*\" : escape(it)}\\\\/`;\n }).join(\"\")})`\n ) : void 0;\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n // @modified - start\n ...createConfigItemAdditionalProperties(screen, pattern, routeNames, config)\n // @modified - end\n };\n};\nconst findParseConfigForRoute = (routeName, flatConfig) => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n return void 0;\n};\nconst findInitialRoute = (routeName, parentScreens, initialRoutes) => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName ? config.initialRouteName : void 0;\n }\n }\n }\n return void 0;\n};\nlet routeKeyCounter = 0;\nfunction resetRouteKeyCounter() {\n routeKeyCounter = 0;\n}\nfunction getRouteWithKey(route) {\n const key = `${route.name}-${routeKeyCounter++}`;\n if (process.env.ONE_DEBUG_ROUTER) {\n console.info(`[one] getRouteWithKey: ${route.name} -> key=${key}`);\n }\n return { ...route, key };\n}\nconst createStateObject = (initialRoute, route, isEmpty) => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n // @modified: add deterministic keys\n routes: [getRouteWithKey({ name: initialRoute }), getRouteWithKey(route)]\n };\n } else {\n return {\n // @modified: add deterministic keys\n routes: [getRouteWithKey(route)]\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n // @modified: add deterministic keys\n routes: [\n getRouteWithKey({ name: initialRoute }),\n getRouteWithKey({ ...route, state: { routes: [] } })\n ]\n };\n } else {\n return {\n // @modified: add deterministic keys\n routes: [getRouteWithKey({ ...route, state: { routes: [] } })]\n };\n }\n }\n};\nconst createNestedStateObject = ({ path, ...restPathData }, routes, initialRoutes, flatConfig) => {\n let route = routes.shift();\n const parentScreens = [];\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n parentScreens.push(route.name);\n const state = createStateObject(initialRoute, route, routes.length === 0);\n if (routes.length > 0) {\n let nestedState = state;\n while (route = routes.shift()) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n const nestedStateIndex = nestedState.index || nestedState.routes.length - 1;\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex].state;\n }\n parentScreens.push(route.name);\n }\n }\n route = findFocusedRoute(state);\n route.path = restPathData.pathWithoutGroups;\n const params = parseQueryParamsExtended(\n path,\n route,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : void 0,\n restPathData.hash\n );\n if (params) {\n route.params = { ...route.params, ...params };\n }\n return state;\n};\nexport {\n getStateFromPath\n};\n//# sourceMappingURL=getStateFromPath.js.map\n"],"mappings":"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"}