expo-router 5.1.3 → 5.2.0-canary-20250612-338ef55

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.
Files changed (57) hide show
  1. package/build/fork/getStateFromPath-forks.d.ts.map +1 -1
  2. package/build/fork/getStateFromPath-forks.js +1 -4
  3. package/build/fork/getStateFromPath-forks.js.map +1 -1
  4. package/build/fork/useLinking.d.ts.map +1 -1
  5. package/build/fork/useLinking.js +3 -7
  6. package/build/fork/useLinking.js.map +1 -1
  7. package/build/getRoutes.d.ts +1 -1
  8. package/build/getRoutes.d.ts.map +1 -1
  9. package/build/getRoutes.js +6 -14
  10. package/build/getRoutes.js.map +1 -1
  11. package/build/getRoutesCore.d.ts +2 -7
  12. package/build/getRoutesCore.d.ts.map +1 -1
  13. package/build/getRoutesCore.js +58 -86
  14. package/build/getRoutesCore.js.map +1 -1
  15. package/build/getRoutesRedirects.d.ts +2 -2
  16. package/build/getRoutesRedirects.d.ts.map +1 -1
  17. package/build/getRoutesRedirects.js +24 -18
  18. package/build/getRoutesRedirects.js.map +1 -1
  19. package/build/getRoutesSSR.d.ts +1 -1
  20. package/build/getRoutesSSR.d.ts.map +1 -1
  21. package/build/getRoutesSSR.js +3 -2
  22. package/build/getRoutesSSR.js.map +1 -1
  23. package/build/global-state/router-store.d.ts.map +1 -1
  24. package/build/global-state/router-store.js +0 -1
  25. package/build/global-state/router-store.js.map +1 -1
  26. package/build/link/Link.d.ts +56 -1
  27. package/build/link/Link.d.ts.map +1 -1
  28. package/build/link/Link.js +39 -3
  29. package/build/link/Link.js.map +1 -1
  30. package/build/typed-routes/generate.js +1 -1
  31. package/build/typed-routes/generate.js.map +1 -1
  32. package/build/useFocusEffect.d.ts.map +1 -1
  33. package/build/useFocusEffect.js +3 -5
  34. package/build/useFocusEffect.js.map +1 -1
  35. package/build/useScreens.js +1 -1
  36. package/build/useScreens.js.map +1 -1
  37. package/build/views/Screen.d.ts.map +1 -1
  38. package/build/views/Screen.js +40 -13
  39. package/build/views/Screen.js.map +1 -1
  40. package/build/views/Unmatched.d.ts.map +1 -1
  41. package/build/views/Unmatched.js +3 -9
  42. package/build/views/Unmatched.js.map +1 -1
  43. package/package.json +8 -9
  44. package/plugin/options.json +1 -29
  45. package/build/link/Redirect.d.ts +0 -59
  46. package/build/link/Redirect.d.ts.map +0 -1
  47. package/build/link/Redirect.js +0 -43
  48. package/build/link/Redirect.js.map +0 -1
  49. package/build/utils/stack.d.ts +0 -5
  50. package/build/utils/stack.d.ts.map +0 -1
  51. package/build/utils/stack.js +0 -10
  52. package/build/utils/stack.js.map +0 -1
  53. package/build/views/useSafeLayoutEffect.d.ts +0 -3
  54. package/build/views/useSafeLayoutEffect.d.ts.map +0 -1
  55. package/build/views/useSafeLayoutEffect.js +0 -6
  56. package/build/views/useSafeLayoutEffect.js.map +0 -1
  57. package/plugin/tsconfig.tsbuildinfo +0 -1
@@ -1,28 +1,55 @@
1
1
  "use strict";
2
2
  'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
3
36
  Object.defineProperty(exports, "__esModule", { value: true });
4
37
  exports.Screen = Screen;
5
38
  exports.isScreen = isScreen;
6
- const native_1 = require("@react-navigation/native");
7
- const react_1 = require("react");
39
+ const react_1 = __importStar(require("react"));
8
40
  const useNavigation_1 = require("../useNavigation");
9
- const useSafeLayoutEffect_1 = require("./useSafeLayoutEffect");
10
- const stack_1 = require("../utils/stack");
41
+ const useLayoutEffect = typeof window !== 'undefined' ? react_1.default.useLayoutEffect : function () { };
11
42
  /** Component for setting the current screen's options dynamically. */
12
43
  function Screen({ name, options }) {
13
- const route = (0, native_1.useRoute)();
14
44
  const navigation = (0, useNavigation_1.useNavigation)(name);
15
- const isFocused = navigation.isFocused();
16
- const isPreloaded = (0, stack_1.isRoutePreloadedInStack)(navigation.getState(), route);
17
- (0, useSafeLayoutEffect_1.useSafeLayoutEffect)(() => {
18
- if (options && Object.keys(options).length) {
45
+ useLayoutEffect(() => {
46
+ if (options &&
19
47
  // React Navigation will infinitely loop in some cases if an empty object is passed to setOptions.
20
48
  // https://github.com/expo/router/issues/452
21
- if (!isPreloaded || (isPreloaded && isFocused)) {
22
- navigation.setOptions(options);
23
- }
49
+ Object.keys(options).length) {
50
+ navigation.setOptions(options);
24
51
  }
25
- }, [isFocused, isPreloaded, navigation, options]);
52
+ }, [navigation, options]);
26
53
  return null;
27
54
  }
28
55
  function isScreen(child, contextKey) {
@@ -1 +1 @@
1
- {"version":3,"file":"Screen.js","sourceRoot":"","sources":["../../src/views/Screen.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AAsBb,wBAiBC;AAED,4BAgCC;AAxED,qDAAoD;AACpD,iCAAgE;AAEhE,oDAAiD;AACjD,+DAA4D;AAC5D,0CAAyD;AAezD,sEAAsE;AACtE,SAAgB,MAAM,CAAmC,EAAE,IAAI,EAAE,OAAO,EAAyB;IAC/F,MAAM,KAAK,GAAG,IAAA,iBAAQ,GAAE,CAAC;IACzB,MAAM,UAAU,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,IAAA,+BAAuB,EAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAE1E,IAAA,yCAAmB,EAAC,GAAG,EAAE;QACvB,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3C,kGAAkG;YAClG,4CAA4C;YAC5C,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC;gBAC/C,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAElD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,QAAQ,CACtB,KAAgB,EAChB,UAAmB;IAEnB,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5D,IACE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK;YACX,MAAM,IAAI,KAAK,CAAC,KAAK;YACrB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EACjB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,8EAA8E,CAC/I,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,IACE,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAC9E,EACD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,yHAAyH,CAC1L,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["'use client';\nimport { useRoute } from '@react-navigation/native';\nimport { isValidElement, ReactElement, ReactNode } from 'react';\n\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\n\nexport type ScreenProps<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * Name is required when used inside a Layout component.\n *\n * When used in a route, this can be an absolute path like `/(root)` to the parent route or a relative path like `../../` to the parent route.\n * This should not be used inside of a Layout component.\n * @example `/(root)` maps to a layout route `/app/(root).tsx`.\n */\n name?: string;\n initialParams?: Record<string, any>;\n options?: TOptions;\n};\n\n/** Component for setting the current screen's options dynamically. */\nexport function Screen<TOptions extends object = object>({ name, options }: ScreenProps<TOptions>) {\n const route = useRoute();\n const navigation = useNavigation(name);\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n useSafeLayoutEffect(() => {\n if (options && Object.keys(options).length) {\n // React Navigation will infinitely loop in some cases if an empty object is passed to setOptions.\n // https://github.com/expo/router/issues/452\n if (!isPreloaded || (isPreloaded && isFocused)) {\n navigation.setOptions(options);\n }\n }\n }, [isFocused, isPreloaded, navigation, options]);\n\n return null;\n}\n\nexport function isScreen(\n child: ReactNode,\n contextKey?: string\n): child is ReactElement<ScreenProps & { name: string }> {\n if (isValidElement(child) && child && child.type === Screen) {\n if (\n typeof child.props === 'object' &&\n child.props &&\n 'name' in child.props &&\n !child.props.name\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must have a \\`name\\` prop when used as a child of a Layout Route.`\n );\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (\n ['children', 'component', 'getComponent'].some(\n (key) => child.props && typeof child.props === 'object' && key in child.props\n )\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must not have a \\`children\\`, \\`component\\`, or \\`getComponent\\` prop when used as a child of a Layout Route`\n );\n }\n }\n\n return true;\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"Screen.js","sourceRoot":"","sources":["../../src/views/Screen.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBb,wBAeC;AAED,4BAgCC;AArED,+CAAuE;AAEvE,oDAAiD;AAejD,MAAM,eAAe,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAK,CAAC,eAAe,CAAC,CAAC,CAAC,cAAa,CAAC,CAAC;AAE/F,sEAAsE;AACtE,SAAgB,MAAM,CAAmC,EAAE,IAAI,EAAE,OAAO,EAAyB;IAC/F,MAAM,UAAU,GAAG,IAAA,6BAAa,EAAC,IAAI,CAAC,CAAC;IAEvC,eAAe,CAAC,GAAG,EAAE;QACnB,IACE,OAAO;YACP,kGAAkG;YAClG,4CAA4C;YAC5C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAC3B,CAAC;YACD,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,QAAQ,CACtB,KAAgB,EAChB,UAAmB;IAEnB,IAAI,IAAA,sBAAc,EAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5D,IACE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK;YACX,MAAM,IAAI,KAAK,CAAC,KAAK;YACrB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EACjB,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,8EAA8E,CAC/I,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,IACE,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,CAC5C,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAC9E,EACD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,sDAAsD,UAAU,yHAAyH,CAC1L,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["'use client';\nimport React, { isValidElement, ReactElement, ReactNode } from 'react';\n\nimport { useNavigation } from '../useNavigation';\n\nexport type ScreenProps<TOptions extends Record<string, any> = Record<string, any>> = {\n /**\n * Name is required when used inside a Layout component.\n *\n * When used in a route, this can be an absolute path like `/(root)` to the parent route or a relative path like `../../` to the parent route.\n * This should not be used inside of a Layout component.\n * @example `/(root)` maps to a layout route `/app/(root).tsx`.\n */\n name?: string;\n initialParams?: Record<string, any>;\n options?: TOptions;\n};\n\nconst useLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : function () {};\n\n/** Component for setting the current screen's options dynamically. */\nexport function Screen<TOptions extends object = object>({ name, options }: ScreenProps<TOptions>) {\n const navigation = useNavigation(name);\n\n useLayoutEffect(() => {\n if (\n options &&\n // React Navigation will infinitely loop in some cases if an empty object is passed to setOptions.\n // https://github.com/expo/router/issues/452\n Object.keys(options).length\n ) {\n navigation.setOptions(options);\n }\n }, [navigation, options]);\n\n return null;\n}\n\nexport function isScreen(\n child: ReactNode,\n contextKey?: string\n): child is ReactElement<ScreenProps & { name: string }> {\n if (isValidElement(child) && child && child.type === Screen) {\n if (\n typeof child.props === 'object' &&\n child.props &&\n 'name' in child.props &&\n !child.props.name\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must have a \\`name\\` prop when used as a child of a Layout Route.`\n );\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (\n ['children', 'component', 'getComponent'].some(\n (key) => child.props && typeof child.props === 'object' && key in child.props\n )\n ) {\n throw new Error(\n `<Screen /> component in \\`default export\\` at \\`app${contextKey}/_layout\\` must not have a \\`children\\`, \\`component\\`, or \\`getComponent\\` prop when used as a child of a Layout Route`\n );\n }\n }\n\n return true;\n }\n\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Unmatched.d.ts","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B;;;;GAIG;AACH,wBAAgB,SAAS,sBA2HxB"}
1
+ {"version":3,"file":"Unmatched.d.ts","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B;;;;GAIG;AACH,wBAAgB,SAAS,sBAqHxB"}
@@ -6,16 +6,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.Unmatched = Unmatched;
9
- const native_1 = require("@react-navigation/native");
10
9
  const expo_linking_1 = require("expo-linking");
11
10
  const react_1 = __importDefault(require("react"));
12
11
  const react_native_1 = require("react-native");
13
12
  const hooks_1 = require("../hooks");
14
13
  const Link_1 = require("../link/Link");
15
14
  const useNavigation_1 = require("../useNavigation");
16
- const useSafeLayoutEffect_1 = require("./useSafeLayoutEffect");
17
- const stack_1 = require("../utils/stack");
18
15
  const Pressable_1 = require("../views/Pressable");
16
+ const useLayoutEffect = typeof window !== 'undefined' ? react_1.default.useLayoutEffect : function () { };
19
17
  /**
20
18
  * Default screen for unmatched routes.
21
19
  *
@@ -24,21 +22,17 @@ const Pressable_1 = require("../views/Pressable");
24
22
  function Unmatched() {
25
23
  const [render, setRender] = react_1.default.useState(false);
26
24
  const router = (0, hooks_1.useRouter)();
27
- const route = (0, native_1.useRoute)();
28
25
  const navigation = (0, useNavigation_1.useNavigation)();
29
26
  const pathname = (0, hooks_1.usePathname)();
30
27
  const url = (0, expo_linking_1.createURL)(pathname);
31
28
  react_1.default.useEffect(() => {
32
29
  setRender(true);
33
30
  }, []);
34
- const isFocused = navigation.isFocused();
35
- const isPreloaded = (0, stack_1.isRoutePreloadedInStack)(navigation.getState(), route);
36
- /** This route may be prefetched if a <Link prefetch href="/<unmatched>" /> is used */
37
- (0, useSafeLayoutEffect_1.useSafeLayoutEffect)(() => {
31
+ useLayoutEffect(() => {
38
32
  navigation.setOptions({
39
33
  title: 'Not Found',
40
34
  });
41
- }, [isFocused, isPreloaded, navigation]);
35
+ }, [navigation]);
42
36
  return (<react_native_1.View style={styles.container}>
43
37
  <NotFoundAsset />
44
38
  <react_native_1.Text role="heading" aria-level={1} style={styles.title}>
@@ -1 +1 @@
1
- {"version":3,"file":"Unmatched.js","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { useRoute } from '@react-navigation/native';\nimport { createURL } from 'expo-linking';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, Image } from 'react-native';\n\nimport { usePathname, useRouter } from '../hooks';\nimport { Link } from '../link/Link';\nimport { useNavigation } from '../useNavigation';\nimport { useSafeLayoutEffect } from './useSafeLayoutEffect';\nimport { isRoutePreloadedInStack } from '../utils/stack';\nimport { Pressable } from '../views/Pressable';\n\n/**\n * Default screen for unmatched routes.\n *\n * @hidden\n */\nexport function Unmatched() {\n const [render, setRender] = React.useState(false);\n\n const router = useRouter();\n const route = useRoute();\n\n const navigation = useNavigation();\n const pathname = usePathname();\n const url = createURL(pathname);\n\n React.useEffect(() => {\n setRender(true);\n }, []);\n\n const isFocused = navigation.isFocused();\n const isPreloaded = isRoutePreloadedInStack(navigation.getState(), route);\n\n /** This route may be prefetched if a <Link prefetch href=\"/<unmatched>\" /> is used */\n useSafeLayoutEffect(() => {\n navigation.setOptions({\n title: 'Not Found',\n });\n }, [isFocused, isPreloaded, navigation]);\n\n return (\n <View style={styles.container}>\n <NotFoundAsset />\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Unmatched Route\n </Text>\n <Text role=\"heading\" aria-level={2} style={[styles.subtitle, styles.secondaryText]}>\n Page could not be found.\n </Text>\n {render ? (\n <Link href={pathname} replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.pageLink,\n styles.secondaryText,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n {url}\n </Text>\n )}\n </Pressable>\n </Link>\n ) : (\n <View style={[styles.pageLink, styles.placeholder]} />\n )}\n <View style={styles.linkContainer}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n onPress={() => {\n if (router.canGoBack()) {\n router.back();\n } else {\n router.replace('/');\n }\n }}\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Go back\n </Text>\n )}\n </Pressable>\n <Text style={[styles.linkSeparator, styles.secondaryText]}>•</Text>\n <Link href=\"/_sitemap\" replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Sitemap\n </Text>\n )}\n </Pressable>\n </Link>\n </View>\n </View>\n );\n}\n\nfunction NotFoundAsset() {\n return <Image source={require('expo-router/assets/unmatched.png')} style={styles.image} />;\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n paddingBottom: 64,\n alignItems: 'center',\n justifyContent: 'center',\n },\n image: {\n width: 270,\n height: 168,\n resizeMode: 'contain',\n marginBottom: 28,\n },\n title: {\n ...Platform.select({\n web: {\n fontSize: 64,\n lineHeight: 64,\n },\n default: {\n fontSize: 56,\n lineHeight: 56,\n },\n }),\n color: '#fff',\n fontWeight: '800',\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 34,\n marginTop: 4,\n marginBottom: 12,\n fontWeight: '200',\n textAlign: 'center',\n },\n pageLink: {\n minHeight: 20,\n },\n secondaryText: {\n color: '#9ba1a6',\n },\n placeholder: {\n backgroundColor: '#9ba1a644',\n minWidth: 180,\n borderRadius: 5,\n },\n linkContainer: {\n marginTop: 28,\n flexDirection: 'row',\n gap: 12,\n },\n link: {\n fontSize: 20,\n textAlign: 'center',\n color: '#52a9ff',\n },\n linkSeparator: {\n fontSize: 20,\n },\n});\n"]}
1
+ {"version":3,"file":"Unmatched.js","sourceRoot":"","sources":["../../src/views/Unmatched.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright © 2024 650 Industries.\n'use client';\n\nimport { createURL } from 'expo-linking';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, Image } from 'react-native';\n\nimport { usePathname, useRouter } from '../hooks';\nimport { Link } from '../link/Link';\nimport { useNavigation } from '../useNavigation';\nimport { Pressable } from '../views/Pressable';\n\nconst useLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : function () {};\n\n/**\n * Default screen for unmatched routes.\n *\n * @hidden\n */\nexport function Unmatched() {\n const [render, setRender] = React.useState(false);\n\n const router = useRouter();\n const navigation = useNavigation();\n const pathname = usePathname();\n const url = createURL(pathname);\n\n React.useEffect(() => {\n setRender(true);\n }, []);\n\n useLayoutEffect(() => {\n navigation.setOptions({\n title: 'Not Found',\n });\n }, [navigation]);\n\n return (\n <View style={styles.container}>\n <NotFoundAsset />\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Unmatched Route\n </Text>\n <Text role=\"heading\" aria-level={2} style={[styles.subtitle, styles.secondaryText]}>\n Page could not be found.\n </Text>\n {render ? (\n <Link href={pathname} replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.pageLink,\n styles.secondaryText,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n {url}\n </Text>\n )}\n </Pressable>\n </Link>\n ) : (\n <View style={[styles.pageLink, styles.placeholder]} />\n )}\n <View style={styles.linkContainer}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n onPress={() => {\n if (router.canGoBack()) {\n router.back();\n } else {\n router.replace('/');\n }\n }}\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Go back\n </Text>\n )}\n </Pressable>\n <Text style={[styles.linkSeparator, styles.secondaryText]}>•</Text>\n <Link href=\"/_sitemap\" replace {...Platform.select({ native: { asChild: true } })}>\n <Pressable>\n {({ hovered, pressed }) => (\n <Text\n style={[\n styles.link,\n Platform.select({\n web: {\n transitionDuration: '200ms',\n opacity: 1,\n },\n }),\n hovered && {\n opacity: 0.8,\n textDecorationLine: 'underline',\n },\n pressed && {\n opacity: 0.8,\n },\n ]}>\n Sitemap\n </Text>\n )}\n </Pressable>\n </Link>\n </View>\n </View>\n );\n}\n\nfunction NotFoundAsset() {\n return <Image source={require('expo-router/assets/unmatched.png')} style={styles.image} />;\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n paddingBottom: 64,\n alignItems: 'center',\n justifyContent: 'center',\n },\n image: {\n width: 270,\n height: 168,\n resizeMode: 'contain',\n marginBottom: 28,\n },\n title: {\n ...Platform.select({\n web: {\n fontSize: 64,\n lineHeight: 64,\n },\n default: {\n fontSize: 56,\n lineHeight: 56,\n },\n }),\n color: '#fff',\n fontWeight: '800',\n textAlign: 'center',\n },\n subtitle: {\n fontSize: 34,\n marginTop: 4,\n marginBottom: 12,\n fontWeight: '200',\n textAlign: 'center',\n },\n pageLink: {\n minHeight: 20,\n },\n secondaryText: {\n color: '#9ba1a6',\n },\n placeholder: {\n backgroundColor: '#9ba1a644',\n minWidth: 180,\n borderRadius: 5,\n },\n linkContainer: {\n marginTop: 28,\n flexDirection: 'row',\n gap: 12,\n },\n link: {\n fontSize: 20,\n textAlign: 'center',\n color: '#52a9ff',\n },\n linkSeparator: {\n fontSize: 20,\n },\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-router",
3
- "version": "5.1.3",
3
+ "version": "5.2.0-canary-20250612-338ef55",
4
4
  "description": "Expo Router is a file-based router for React Native and web applications.",
5
5
  "author": "650 Industries, Inc.",
6
6
  "license": "MIT",
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "homepage": "https://docs.expo.dev/routing/introduction/",
63
63
  "scripts": {
64
- "build": "bash -c 'if [ -z \"$1\" ]; then expo-module build -p tsconfig.build.json; else expo-module build \"$1\"; fi' --",
64
+ "build": "bash -c 'if [ -z \"$1\" ]; then expo-module build -p tsconfig.json; else expo-module build \"$1\"; fi' --",
65
65
  "clean": "expo-module clean",
66
66
  "lint": "expo-module lint",
67
67
  "test": "expo-module test",
@@ -76,9 +76,9 @@
76
76
  ],
77
77
  "peerDependencies": {
78
78
  "@react-navigation/drawer": "^7.3.9",
79
- "expo": "*",
80
- "expo-constants": "*",
81
- "expo-linking": "*",
79
+ "expo": "54.0.0-canary-20250612-338ef55",
80
+ "expo-constants": "17.1.7-canary-20250612-338ef55",
81
+ "expo-linking": "7.1.6-canary-20250612-338ef55",
82
82
  "react-native-reanimated": "*",
83
83
  "react-native-safe-area-context": "*",
84
84
  "react-native-screens": "*"
@@ -105,8 +105,8 @@
105
105
  "tsd": "^0.28.1"
106
106
  },
107
107
  "dependencies": {
108
- "@expo/metro-runtime": "5.0.4",
109
- "@expo/server": "^0.6.3",
108
+ "@expo/metro-runtime": "5.0.5-canary-20250612-338ef55",
109
+ "@expo/server": "0.6.3-canary-20250612-338ef55",
110
110
  "@radix-ui/react-slot": "1.2.0",
111
111
  "@react-navigation/bottom-tabs": "^7.3.10",
112
112
  "@react-navigation/native": "^7.1.6",
@@ -119,6 +119,5 @@
119
119
  "semver": "~7.6.3",
120
120
  "server-only": "^0.0.1",
121
121
  "shallowequal": "^1.1.0"
122
- },
123
- "gitHead": "1c4a89b0c0adebb53ef84b4a6ac25864e4652917"
122
+ }
124
123
  }
@@ -91,7 +91,7 @@
91
91
  "description": "The target file path that this route should redirect to",
92
92
  "type": "string"
93
93
  },
94
- "permanent": {
94
+ "temporary": {
95
95
  "description": "Whether the redirect is temporary or permanent. Defaults to `false`.",
96
96
  "type": "boolean",
97
97
  "default": false
@@ -107,34 +107,6 @@
107
107
  }
108
108
  }
109
109
  }
110
- },
111
- "rewrites": {
112
- "description": "Enable static rewrites",
113
- "type": "array",
114
- "uniqueItems": true,
115
- "items": {
116
- "type": "object",
117
- "required": ["source", "destination"],
118
- "properties": {
119
- "source": {
120
- "description": "The previous file path that should be rewritten",
121
- "type": "string"
122
- },
123
- "destination": {
124
- "description": "The target file path that this route should rewrite",
125
- "type": "string"
126
- },
127
- "methods": {
128
- "description": "HTTP methods that should be rewritten. Omit to rewrite all methods.",
129
- "type": "array",
130
- "uniqueItems": true,
131
- "items": {
132
- "type": "string",
133
- "enum": ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]
134
- }
135
- }
136
- }
137
- }
138
110
  }
139
111
  },
140
112
  "additionalProperties": false
@@ -1,59 +0,0 @@
1
- import type { Href } from '../types';
2
- export type RedirectProps = {
3
- /**
4
- * The path of the route to navigate to. It can either be:
5
- * - **string**: A full path like `/profile/settings` or a relative path like `../settings`.
6
- * - **object**: An object with a `pathname` and optional `params`. The `pathname` can be
7
- * a full path like `/profile/settings` or a relative path like `../settings`. The
8
- * params can be an object of key-value pairs.
9
- *
10
- * @example
11
- * ```tsx Dynamic
12
- * import { Redirect } from 'expo-router';
13
- *
14
- * export default function RedirectToAbout() {
15
- * return (
16
- * <Redirect href="/about" />
17
- * );
18
- *}
19
- * ```
20
- */
21
- href: Href;
22
- /**
23
- * Relative URL references are either relative to the directory or the document.
24
- * By default, relative paths are relative to the document.
25
- *
26
- * @see [Resolving relative references in Mozilla's documentation](https://developer.mozilla.org/en-US/docs/Web/API/URL_API/Resolving_relative_references).
27
- */
28
- relativeToDirectory?: boolean;
29
- /**
30
- * Replaces the initial screen with the current route.
31
- */
32
- withAnchor?: boolean;
33
- };
34
- /**
35
- * Redirects to the `href` as soon as the component is mounted.
36
- *
37
- * @example
38
- * ```tsx
39
- * import { View, Text } from 'react-native';
40
- * import { Redirect } from 'expo-router';
41
- *
42
- * export default function Page() {
43
- * const { user } = useAuth();
44
- *
45
- * if (!user) {
46
- * return <Redirect href="/login" />;
47
- * }
48
- *
49
- * return (
50
- * <View>
51
- * <Text>Welcome Back!</Text>
52
- * </View>
53
- * );
54
- * }
55
- * ```
56
- */
57
- export declare function Redirect({ href, relativeToDirectory, withAnchor }: RedirectProps): null;
58
- export default Redirect;
59
- //# sourceMappingURL=Redirect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Redirect.d.ts","sourceRoot":"","sources":["../../src/link/Redirect.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,EAAE,aAAa,QAUhF;AAED,eAAe,QAAQ,CAAC"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Redirect = Redirect;
5
- const hooks_1 = require("../hooks");
6
- const useFocusEffect_1 = require("../useFocusEffect");
7
- /**
8
- * Redirects to the `href` as soon as the component is mounted.
9
- *
10
- * @example
11
- * ```tsx
12
- * import { View, Text } from 'react-native';
13
- * import { Redirect } from 'expo-router';
14
- *
15
- * export default function Page() {
16
- * const { user } = useAuth();
17
- *
18
- * if (!user) {
19
- * return <Redirect href="/login" />;
20
- * }
21
- *
22
- * return (
23
- * <View>
24
- * <Text>Welcome Back!</Text>
25
- * </View>
26
- * );
27
- * }
28
- * ```
29
- */
30
- function Redirect({ href, relativeToDirectory, withAnchor }) {
31
- const router = (0, hooks_1.useRouter)();
32
- (0, useFocusEffect_1.useFocusEffect)(() => {
33
- try {
34
- router.replace(href, { relativeToDirectory, withAnchor });
35
- }
36
- catch (error) {
37
- console.error(error);
38
- }
39
- });
40
- return null;
41
- }
42
- exports.default = Redirect;
43
- //# sourceMappingURL=Redirect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Redirect.js","sourceRoot":"","sources":["../../src/link/Redirect.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA+Db,4BAUC;AAxED,oCAAqC;AAErC,sDAAmD;AAqCnD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,SAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAiB;IAC/E,MAAM,MAAM,GAAG,IAAA,iBAAS,GAAE,CAAC;IAC3B,IAAA,+BAAc,EAAC,GAAG,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kBAAe,QAAQ,CAAC","sourcesContent":["'use client';\nimport { useRouter } from '../hooks';\nimport type { Href } from '../types';\nimport { useFocusEffect } from '../useFocusEffect';\n\nexport type RedirectProps = {\n /**\n * The path of the route to navigate to. It can either be:\n * - **string**: A full path like `/profile/settings` or a relative path like `../settings`.\n * - **object**: An object with a `pathname` and optional `params`. The `pathname` can be\n * a full path like `/profile/settings` or a relative path like `../settings`. The\n * params can be an object of key-value pairs.\n *\n * @example\n * ```tsx Dynamic\n * import { Redirect } from 'expo-router';\n *\n * export default function RedirectToAbout() {\n * return (\n * <Redirect href=\"/about\" />\n * );\n *}\n * ```\n */\n href: Href;\n\n /**\n * Relative URL references are either relative to the directory or the document.\n * By default, relative paths are relative to the document.\n *\n * @see [Resolving relative references in Mozilla's documentation](https://developer.mozilla.org/en-US/docs/Web/API/URL_API/Resolving_relative_references).\n */\n relativeToDirectory?: boolean;\n\n /**\n * Replaces the initial screen with the current route.\n */\n withAnchor?: boolean;\n};\n\n/**\n * Redirects to the `href` as soon as the component is mounted.\n *\n * @example\n * ```tsx\n * import { View, Text } from 'react-native';\n * import { Redirect } from 'expo-router';\n *\n * export default function Page() {\n * const { user } = useAuth();\n *\n * if (!user) {\n * return <Redirect href=\"/login\" />;\n * }\n *\n * return (\n * <View>\n * <Text>Welcome Back!</Text>\n * </View>\n * );\n * }\n * ```\n */\nexport function Redirect({ href, relativeToDirectory, withAnchor }: RedirectProps) {\n const router = useRouter();\n useFocusEffect(() => {\n try {\n router.replace(href, { relativeToDirectory, withAnchor });\n } catch (error) {\n console.error(error);\n }\n });\n return null;\n}\n\nexport default Redirect;\n"]}
@@ -1,5 +0,0 @@
1
- import type { NavigationState } from '@react-navigation/native';
2
- export declare function isRoutePreloadedInStack(navigationState: NavigationState | undefined, route: {
3
- key: string;
4
- }): boolean;
5
- //# sourceMappingURL=stack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/utils/stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACrB,OAAO,CAOT"}
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isRoutePreloadedInStack = isRoutePreloadedInStack;
4
- function isRoutePreloadedInStack(navigationState, route) {
5
- if (!navigationState || navigationState.type !== 'stack') {
6
- return false;
7
- }
8
- return navigationState.preloadedRoutes.some((preloaded) => preloaded.key === route.key);
9
- }
10
- //# sourceMappingURL=stack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/utils/stack.ts"],"names":[],"mappings":";;AAMA,0DAUC;AAVD,SAAgB,uBAAuB,CACrC,eAA4C,EAC5C,KAAsB;IAEtB,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAQ,eAAuD,CAAC,eAAe,CAAC,IAAI,CAClF,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import type {\n NavigationState,\n ParamListBase,\n StackNavigationState,\n} from '@react-navigation/native';\n\nexport function isRoutePreloadedInStack(\n navigationState: NavigationState | undefined,\n route: { key: string }\n): boolean {\n if (!navigationState || navigationState.type !== 'stack') {\n return false;\n }\n return (navigationState as StackNavigationState<ParamListBase>).preloadedRoutes.some(\n (preloaded) => preloaded.key === route.key\n );\n}\n"]}
@@ -1,3 +0,0 @@
1
- import { useLayoutEffect } from 'react';
2
- export declare const useSafeLayoutEffect: typeof useLayoutEffect;
3
- //# sourceMappingURL=useSafeLayoutEffect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSafeLayoutEffect.d.ts","sourceRoot":"","sources":["../../src/views/useSafeLayoutEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAExC,eAAO,MAAM,mBAAmB,wBAAmE,CAAC"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useSafeLayoutEffect = void 0;
4
- const react_1 = require("react");
5
- exports.useSafeLayoutEffect = typeof window !== 'undefined' ? react_1.useLayoutEffect : function () { };
6
- //# sourceMappingURL=useSafeLayoutEffect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSafeLayoutEffect.js","sourceRoot":"","sources":["../../src/views/useSafeLayoutEffect.ts"],"names":[],"mappings":";;;AAAA,iCAAwC;AAE3B,QAAA,mBAAmB,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,uBAAe,CAAC,CAAC,CAAC,cAAa,CAAC,CAAC","sourcesContent":["import { useLayoutEffect } from 'react';\n\nexport const useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : function () {};\n"]}
@@ -1 +0,0 @@
1
- {"root":["./src/index.ts"],"version":"5.8.3"}