UNPKG

expo-router

Version:

Expo Router is a file-based router for React Native and web applications.

87 lines 3.68 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStaticUrlFromExpoRouter = exports.getOriginFromConstants = void 0; const expo_constants_1 = __importDefault(require("expo-constants")); const protocolWarningString = `{ plugins: [["expo-router", { origin: "...<URL>..." }]] }`; /** `lodash.memoize` */ function memoize(fn) { const cache = {}; return ((...args) => { const key = JSON.stringify(args); if (cache[key]) { return cache[key]; } const result = fn(...args); cache[key] = result; return result; }); } function sanitizeUrl(url) { const parsed = new URL(url); // Allow empty protocol, http, and https const validProtocol = !parsed.protocol || parsed.protocol === 'http:' || parsed.protocol === 'https:'; if (!validProtocol) { throwOrAlert(`Expo Head: Native origin has invalid protocol "${parsed.protocol}" for URL in Expo Config: ${protocolWarningString}.`); } parsed.pathname = ''; parsed.search = ''; parsed.hash = ''; parsed.protocol ??= 'https:'; return parsed.toString().replace(/\/$/, ''); } const memoSanitizeUrl = memoize(sanitizeUrl); function getHeadOriginFromConstants() { // This will require a rebuild in bare-workflow to update. const manifest = expo_constants_1.default.expoConfig; const origin = manifest?.extra?.router?.headOrigin ?? manifest?.extra?.router?.origin ?? manifest?.extra?.router?.generatedOrigin; if (!origin) { throwOrAlert(`Expo Head: Add the handoff origin to the Expo Config (requires rebuild). Add the Config Plugin ${protocolWarningString}, where \`origin\` is the hosted URL.`); // Fallback value that shouldn't be used for real. return 'https://expo.dev'; } // Without this, the URL will go to an IP address which is not allowed. if (!origin.match(/^http(s)?:\/\//)) { console.warn(`Expo Head: origin "${origin}" is missing a \`https://\` protocol. ${protocolWarningString}.`); } // Return the development URL last so the user gets all production warnings first. return memoSanitizeUrl(origin); } function getOriginFromConstants() { // This will require a rebuild in bare-workflow to update. const manifest = expo_constants_1.default.expoConfig; const origin = manifest?.extra?.router?.headOrigin ?? manifest?.extra?.router?.origin ?? manifest?.extra?.router?.generatedOrigin; if (!origin) { throwOrAlert(`Expo RSC: Add the origin to the Expo Config (requires rebuild). Add the Config Plugin ${protocolWarningString}, where \`origin\` is the hosted URL.`); // Fallback value that shouldn't be used for real. return 'http://localhost:3000'; } // Return the development URL last so the user gets all production warnings first. return memoSanitizeUrl(origin); } exports.getOriginFromConstants = getOriginFromConstants; function throwOrAlert(msg) { // Production apps fatally crash which is often not helpful. if ( // @ts-ignore: process is defined process.env.NODE_ENV === 'production') { console.error(msg); alert(msg); } else { throw new Error(msg); } } function getStaticUrlFromExpoRouter(pathname) { // const host = "https://expo.io"; // Append the URL we'd find in context return getHeadOriginFromConstants() + pathname; } exports.getStaticUrlFromExpoRouter = getStaticUrlFromExpoRouter; //# sourceMappingURL=url.js.map