UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

476 lines (473 loc) 21.2 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf, __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: !0 }); }, __copyProps = (to, from, except, desc) => { if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target, mod)), __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod); var router_exports = {}; __export(router_exports, { canDismiss: () => canDismiss, canGoBack: () => canGoBack, cleanup: () => cleanup, dismiss: () => dismiss, dismissAll: () => dismissAll, getSortedRoutes: () => getSortedRoutes, goBack: () => goBack, hasAttemptedToHideSplash: () => hasAttemptedToHideSplash, initialState: () => initialState, initialize: () => initialize, linkTo: () => linkTo, navigate: () => navigate, navigationRef: () => navigationRef, preloadRoute: () => preloadRoute, preloadedLoaderData: () => preloadedLoaderData, preloadingLoader: () => preloadingLoader, push: () => push, replace: () => replace, rootComponent: () => rootComponent, rootState: () => rootState, rootStateSnapshot: () => rootStateSnapshot, routeInfo: () => routeInfo, routeInfoSnapshot: () => routeInfoSnapshot, routeNode: () => routeNode, setLoadingState: () => setLoadingState, setParams: () => setParams, snapshot: () => snapshot, subscribeToLoadingState: () => subscribeToLoadingState, subscribeToRootState: () => subscribeToRootState, subscribeToStore: () => subscribeToStore, updateState: () => updateState, useOneRouter: () => useOneRouter, useStoreRootState: () => useStoreRootState, useStoreRouteInfo: () => useStoreRouteInfo }); module.exports = __toCommonJS(router_exports); var import_native = require("@react-navigation/native"), Linking = __toESM(require("expo-linking"), 1), import_react = require("react"), import_react_native = require("react-native"), import_href = require("../link/href.native.js"), import_path = require("../link/path.native.js"), import_assertIsReady = require("../utils/assertIsReady.native.js"), import_cleanUrl = require("../utils/cleanUrl.native.js"), import_dynamicImport = require("../utils/dynamicImport.native.js"), import_url = require("../utils/url.native.js"), import_getRouteInfo = require("./getRouteInfo.native.js"), import_getRoutes = require("./getRoutes.native.js"), import_lastAction = require("./lastAction.native.js"), import_linkingConfig = require("./linkingConfig.native.js"), import_sortRoutes = require("./sortRoutes.native.js"), import_useScreens = require("./useScreens.native.js"), import_useViteRoutes = require("./useViteRoutes.native.js"), import_getNavigateAction = require("./utils/getNavigateAction.native.js"); function _type_of(obj) { "@swc/helpers - typeof"; return obj && typeof Symbol < "u" && obj.constructor === Symbol ? "symbol" : typeof obj; } var routeNode = null, rootComponent, hasAttemptedToHideSplash = !1, initialState, rootState, nextState, routeInfo, splashScreenAnimationFrame, navigationRef = null, navigationRefSubscription, rootStateSubscribers = /* @__PURE__ */new Set(), loadingStateSubscribers = /* @__PURE__ */new Set(), storeSubscribers = /* @__PURE__ */new Set(); function initialize(context, ref, initialLocation) { if (cleanUpState(), routeNode = (0, import_getRoutes.getRoutes)(context, { ignoreEntryPoints: !0, platform: import_react_native.Platform.OS }), rootComponent = routeNode ? (0, import_useScreens.getQualifiedRouteComponent)(routeNode) : import_react.Fragment, !routeNode && process.env.NODE_ENV === "production") throw new Error("No routes found"); if (process.env.ONE_DEBUG_ROUTER && routeNode) { var formatRouteTree = function (node) { for (var indent = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "", isLast = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : !0, prefix = indent + (isLast ? "\u2514\u2500 " : "\u251C\u2500 "), childIndent = indent + (isLast ? " " : "\u2502 "), dynamicBadge = node.dynamic ? ` [${node.dynamic.map(function (d) { return d.name; }).join(", ")}]` : "", typeBadge = node.type !== "layout" ? ` (${node.type})` : "", routeName = node.route || "/", line = `${prefix}${routeName}${dynamicBadge}${typeBadge}`, visibleChildren = node.children.filter(function (child2) { return !child2.internal; }), i = 0; i < visibleChildren.length; i++) { var child = visibleChildren[i], childIsLast = i === visibleChildren.length - 1; line += ` ` + formatRouteTree(child, childIndent, childIsLast); } return line; }; console.info(`[one] \u{1F4CD} Route structure: ${formatRouteTree(routeNode)}`); } navigationRef = ref, setupLinkingAndRouteInfo(initialLocation), subscribeToNavigationChanges(); } function cleanUpState() { initialState = void 0, rootState = void 0, nextState = void 0, routeInfo = void 0, (0, import_linkingConfig.resetLinking)(), navigationRefSubscription?.(), rootStateSubscribers.clear(), storeSubscribers.clear(); } function setupLinkingAndRouteInfo(initialLocation) { initialState = (0, import_linkingConfig.setupLinking)(routeNode, initialLocation), initialState ? (rootState = initialState, routeInfo = (0, import_getRouteInfo.getRouteInfo)(initialState)) : routeInfo = { unstable_globalHref: "", pathname: "", isIndex: !1, params: {}, segments: [] }; } function subscribeToNavigationChanges() { navigationRefSubscription = navigationRef.addListener("state", function (data) { var state = { ...data.data.state }; state.key && hashes[state.key] && (state.hash = hashes[state.key], delete hashes[state.key]), hasAttemptedToHideSplash || (hasAttemptedToHideSplash = !0, splashScreenAnimationFrame = requestAnimationFrame(function () {})), nextOptions && (state = { ...state, linkOptions: nextOptions }, nextOptions = null); var shouldUpdateSubscribers = nextState === state; nextState = void 0, state && state !== rootState && (updateState(state, void 0), shouldUpdateSubscribers = !0), shouldUpdateSubscribers && (0, import_react.startTransition)(function () { var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _iterator = rootStateSubscribers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { var subscriber = _step.value; subscriber(state); } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } }); }), (0, import_react.startTransition)(function () { updateSnapshot(); var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _iterator = storeSubscribers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { var subscriber = _step.value; subscriber(); } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } }); } function navigate(url, options) { return linkTo((0, import_href.resolveHref)(url), "NAVIGATE", options); } function push(url, options) { return linkTo((0, import_href.resolveHref)(url), "PUSH", options); } function dismiss(count) { process.env.ONE_DEBUG_ROUTER && console.info(`[one] \u{1F519} dismiss${count ? ` (${count})` : ""}`), navigationRef?.dispatch(import_native.StackActions.pop(count)); } function replace(url, options) { return linkTo((0, import_href.resolveHref)(url), "REPLACE", options); } function setParams() { var params = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, _navigationRef_current; return (0, import_assertIsReady.assertIsReady)(navigationRef), navigationRef == null || (_navigationRef_current = navigationRef.current) === null || _navigationRef_current === void 0 ? void 0 : _navigationRef_current.setParams( // @ts-expect-error params); } function dismissAll() { process.env.ONE_DEBUG_ROUTER && console.info("[one] \u{1F519} dismissAll"), navigationRef?.dispatch(import_native.StackActions.popToTop()); } function goBack() { var _navigationRef_current; process.env.ONE_DEBUG_ROUTER && console.info("[one] \u{1F519} goBack"), (0, import_assertIsReady.assertIsReady)(navigationRef), navigationRef == null || (_navigationRef_current = navigationRef.current) === null || _navigationRef_current === void 0 || _navigationRef_current.goBack(); } function canGoBack() { var _navigationRef_current; if (!navigationRef.isReady()) return !1; var _navigationRef_current_canGoBack; return (_navigationRef_current_canGoBack = navigationRef == null || (_navigationRef_current = navigationRef.current) === null || _navigationRef_current === void 0 ? void 0 : _navigationRef_current.canGoBack()) !== null && _navigationRef_current_canGoBack !== void 0 ? _navigationRef_current_canGoBack : !1; } function canDismiss() { for (var state = rootState; state;) { var _state_routes_state_index, _state_routes; if (state.type === "stack" && state.routes.length > 1) return !0; if (state.index === void 0) return !1; state = (_state_routes = state.routes) === null || _state_routes === void 0 || (_state_routes_state_index = _state_routes[state.index]) === null || _state_routes_state_index === void 0 ? void 0 : _state_routes_state_index.state; } return !1; } function getSortedRoutes() { if (!routeNode) throw new Error("No routes"); return routeNode.children.filter(function (route) { return !route.internal; }).sort(import_sortRoutes.sortRoutes); } function updateState(state) { var nextStateParam = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : state; rootState = state, nextState = nextStateParam; var nextRouteInfo = (0, import_getRouteInfo.getRouteInfo)(state); if (!deepEqual(routeInfo, nextRouteInfo)) { if (process.env.ONE_DEBUG_ROUTER) { var from = routeInfo?.pathname || "(initial)", to = nextRouteInfo.pathname, params = Object.keys(nextRouteInfo.params || {}).length ? nextRouteInfo.params : void 0; console.info(`[one] \u{1F9ED} ${from} \u2192 ${to}`, params ? { params } : ""); } routeInfo = nextRouteInfo; } } function subscribeToRootState(subscriber) { return rootStateSubscribers.add(subscriber), function () { rootStateSubscribers.delete(subscriber); }; } function subscribeToStore(subscriber) { return storeSubscribers.add(subscriber), function () { storeSubscribers.delete(subscriber); }; } function subscribeToLoadingState(subscriber) { return loadingStateSubscribers.add(subscriber), function () { loadingStateSubscribers.delete(subscriber); }; } function setLoadingState(state) { (0, import_react.startTransition)(function () { var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _iterator = loadingStateSubscribers[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { var listener = _step.value; listener(state); } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } }); } var currentSnapshot = null; function updateSnapshot() { currentSnapshot = getSnapshot(); } function snapshot() { return currentSnapshot; } function getSnapshot() { return { linkTo, routeNode, rootComponent, linking: (0, import_linkingConfig.getLinking)(), hasAttemptedToHideSplash, initialState, rootState, nextState, routeInfo, splashScreenAnimationFrame, navigationRef, navigationRefSubscription, rootStateSubscribers, storeSubscribers }; } function rootStateSnapshot() { return rootState; } function routeInfoSnapshot() { return routeInfo; } function useOneRouter() { var state = (0, import_react.useSyncExternalStore)(subscribeToStore, snapshot, snapshot); return (0, import_react.useDeferredValue)(state); } function syncStoreRootState() { if (!navigationRef) throw new Error("No navigationRef, possible duplicate One dep"); if (navigationRef.isReady()) { var currentState = navigationRef.getRootState(); rootState !== currentState && updateState(currentState); } } function useStoreRootState() { syncStoreRootState(); var state = (0, import_react.useSyncExternalStore)(subscribeToRootState, rootStateSnapshot, rootStateSnapshot); return (0, import_react.useDeferredValue)(state); } function useStoreRouteInfo() { syncStoreRootState(); var state = (0, import_react.useSyncExternalStore)(subscribeToRootState, routeInfoSnapshot, routeInfoSnapshot); return (0, import_react.useDeferredValue)(state); } function cleanup() { splashScreenAnimationFrame && cancelAnimationFrame(splashScreenAnimationFrame); } var preloadingLoader = {}; async function doPreload(href) { var preloadPath = (0, import_cleanUrl.getPreloadPath)(href), loaderPath = (0, import_cleanUrl.getLoaderPath)(href), cssPreloadPath = (0, import_cleanUrl.getPreloadCSSPath)(href); try { var _dynamicImport, _dynamicImport_catch, [_preload, cssPreloadModule, loader] = await Promise.all([(0, import_dynamicImport.dynamicImport)(preloadPath), (_dynamicImport_catch = (_dynamicImport = (0, import_dynamicImport.dynamicImport)(cssPreloadPath)) === null || _dynamicImport === void 0 ? void 0 : _dynamicImport.catch(function () { return null; })) !== null && _dynamicImport_catch !== void 0 ? _dynamicImport_catch : Promise.resolve(null), // graceful fail if no CSS preload (0, import_dynamicImport.dynamicImport)(loaderPath), (0, import_useViteRoutes.preloadRouteModules)(href)]); if (cssPreloadModule?.injectCSS && (cssInjectFunctions[href] = cssPreloadModule.injectCSS), !loader?.loader) return null; var result = await loader.loader(); return result ?? null; } catch (err) { return console.error(`[one] preload error for ${href}:`, err), null; } } var preloadedLoaderData = {}, cssInjectFunctions = {}; function preloadRoute(href) { var injectCSS = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : !1; return; if (injectCSS) { var _preloadingLoader_href; return (_preloadingLoader_href = preloadingLoader[href]) === null || _preloadingLoader_href === void 0 ? void 0 : _preloadingLoader_href.then(async function (data) { var inject = cssInjectFunctions[href]; return inject && (await Promise.race([inject(), new Promise(function (r) { return setTimeout(r, 500); })])), data; }); } } async function linkTo(href, event, options) { if (process.env.ONE_DEBUG_ROUTER && console.info(`[one] \u{1F517} ${event || "NAVIGATE"} ${href}`), href[0] !== "#") { if ((0, import_url.shouldLinkExternally)(href)) { Linking.openURL(href); return; } (0, import_assertIsReady.assertIsReady)(navigationRef); var current = navigationRef.current; if (current == null) throw new Error("Couldn't find a navigation object. Is your component inside NavigationContainer?"); var linking = (0, import_linkingConfig.getLinking)(); if (!linking) throw new Error("Attempted to link to route when no routes are present"); if ((0, import_lastAction.setLastAction)(), href === ".." || href === "../") { current.goBack(); return; } if (href.startsWith(".")) { var _routeInfo_segments, _routeInfo_segments_map_filter_join, base = (_routeInfo_segments_map_filter_join = routeInfo == null || (_routeInfo_segments = routeInfo.segments) === null || _routeInfo_segments === void 0 ? void 0 : _routeInfo_segments.map(function (segment) { var _routeInfo_params; if (!segment.startsWith("[")) return segment; if (segment.startsWith("[...")) { var _routeInfo_params1, _params_split; segment = segment.slice(4, -1); var params = routeInfo == null || (_routeInfo_params1 = routeInfo.params) === null || _routeInfo_params1 === void 0 ? void 0 : _routeInfo_params1[segment]; if (Array.isArray(params)) return params.join("/"); var _params_split_join; return (_params_split_join = params == null || (_params_split = params.split(",")) === null || _params_split === void 0 ? void 0 : _params_split.join("/")) !== null && _params_split_join !== void 0 ? _params_split_join : ""; } return segment = segment.slice(1, -1), routeInfo == null || (_routeInfo_params = routeInfo.params) === null || _routeInfo_params === void 0 ? void 0 : _routeInfo_params[segment]; }).filter(Boolean).join("/")) !== null && _routeInfo_segments_map_filter_join !== void 0 ? _routeInfo_segments_map_filter_join : "/"; routeInfo?.isIndex || (base += "/.."), href = (0, import_path.resolve)(base, href); } var state = linking.getStateFromPath(href, linking.config); if (!state || state.routes.length === 0) { console.error("Could not generate a valid navigation state for the given path: " + href), console.error("linking.config", linking.config), console.error("routes", getSortedRoutes()); return; } setLoadingState("loading"), await preloadRoute(href, !0); var rootState2 = navigationRef.getRootState(), hash = href.indexOf("#"); rootState2.key && hash > 0 && (hashes[rootState2.key] = href.slice(hash)), nextOptions = options ?? null, (0, import_react.startTransition)(function () { var action = (0, import_getNavigateAction.getNavigateAction)(state, rootState2, event), current2 = navigationRef.getCurrentRoute(); navigationRef.dispatch(action); var warningTm, interval = setInterval(function () { var next = navigationRef.getCurrentRoute(); current2 !== next && setTimeout(function () { setLoadingState("loaded"); }), clearTimeout(warningTm), clearTimeout(interval); }, 16); process.env.NODE_ENV === "development" && (warningTm = setTimeout(function () { console.warn("Routing took more than 8 seconds"); }, 1e3)); }); } } var hashes = {}, nextOptions = null; function deepEqual(a, b) { if (a === b) return !0; if (Array.isArray(a) && Array.isArray(b)) { if (a.length !== b.length) return !1; for (var i = 0; i < a.length; i++) if (!deepEqual(a[i], b[i])) return !1; return !0; } if ((typeof a > "u" ? "undefined" : _type_of(a)) === "object" && (typeof b > "u" ? "undefined" : _type_of(b)) === "object") { var keysA = Object.keys(a), keysB = Object.keys(b); if (keysA.length !== keysB.length) return !1; var _iteratorNormalCompletion = !0, _didIteratorError = !1, _iteratorError = void 0; try { for (var _iterator = keysA[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) { var key = _step.value; if (!deepEqual(a[key], b[key])) return !1; } } catch (err) { _didIteratorError = !0, _iteratorError = err; } finally { try { !_iteratorNormalCompletion && _iterator.return != null && _iterator.return(); } finally { if (_didIteratorError) throw _iteratorError; } } return !0; } return !1; } //# sourceMappingURL=router.native.js.map