@granite-js/react-native 0.1.21 → 0.1.23-next.0

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 (34) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/app/Granite.d.ts +2 -2
  3. package/dist/async-bridges.d.mts +1 -1
  4. package/dist/async-bridges.js +5 -2
  5. package/dist/async-bridges.mjs +2 -2
  6. package/dist/chunk-2PYPIQMA.mjs +10 -0
  7. package/dist/constant-bridges.js +5 -2
  8. package/dist/constant-bridges.mjs +2 -2
  9. package/dist/intersection-observer/IOFlatList.d.ts +2 -2
  10. package/dist/native-event-emitter/nativeEventEmitter.d.ts +5 -1
  11. package/dist/native-modules/core/GraniteCoreModule.d.ts +1 -1
  12. package/dist/native-modules/natives/GraniteModule.d.ts +1 -1
  13. package/dist/native-modules/natives/closeView.d.ts +1 -1
  14. package/dist/router/Router.d.ts +1 -0
  15. package/dist/router/components/StackNavigator.d.ts +36 -42
  16. package/dist/router/components/useRouterBackHandler.d.ts +2 -2
  17. package/dist/router/hooks/useInitialRouteName.d.ts +1 -1
  18. package/dist/video/Video.d.ts +2 -2
  19. package/dist/video/instance.d.ts +2 -2
  20. package/package.json +14 -16
  21. package/src/app/Granite.tsx +4 -3
  22. package/src/intersection-observer/IOFlatList.ts +2 -2
  23. package/src/native-event-emitter/nativeEventEmitter.ts +12 -1
  24. package/src/native-modules/core/GraniteCoreModule.ts +1 -1
  25. package/src/native-modules/natives/GraniteModule.ts +4 -1
  26. package/src/native-modules/natives/closeView.ts +1 -1
  27. package/src/native-modules/natives/getSchemeUri.ts +1 -1
  28. package/src/router/Router.tsx +5 -5
  29. package/src/router/components/useRouterBackHandler.tsx +2 -2
  30. package/src/router/hooks/useInitialRouteName.tsx +6 -2
  31. package/src/video/Video.tsx +1 -1
  32. package/src/video/instance.tsx +2 -2
  33. package/src/visibility/utils/usePrevious.tsx +1 -1
  34. package/dist/chunk-A3JGM5OI.mjs +0 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # @granite-js/react-native
2
2
 
3
+ ## 0.1.23-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - d9b7d7c: avoid multiple app registrations without throwing errors
8
+ - @granite-js/cli@0.1.23-next.0
9
+ - @granite-js/image@0.1.23-next.0
10
+ - @granite-js/jest@0.1.23-next.0
11
+ - @granite-js/lottie@0.1.23-next.0
12
+ - @granite-js/mpack@0.1.23-next.0
13
+ - @granite-js/native@0.1.23-next.0
14
+ - @granite-js/plugin-core@0.1.23-next.0
15
+ - @granite-js/style-utils@0.1.23-next.0
16
+
17
+ ## 0.1.22
18
+
19
+ ### Patch Changes
20
+
21
+ - @granite-js/cli@0.1.22
22
+ - @granite-js/image@0.1.22
23
+ - @granite-js/jest@0.1.22
24
+ - @granite-js/lottie@0.1.22
25
+ - @granite-js/mpack@0.1.22
26
+ - @granite-js/native@0.1.22
27
+ - @granite-js/plugin-core@0.1.22
28
+ - @granite-js/style-utils@0.1.22
29
+
3
30
  ## 0.1.21
4
31
 
5
32
  ### Patch Changes
@@ -1,4 +1,4 @@
1
- import { ComponentType, PropsWithChildren } from 'react';
1
+ import { ComponentType, type JSX, PropsWithChildren } from 'react';
2
2
  import type { InitialProps } from '../initial-props';
3
3
  import type { RouterProps, RequireContext } from '../router';
4
4
  export interface GraniteProps {
@@ -68,6 +68,6 @@ export interface GraniteProps {
68
68
  */
69
69
  export declare const Granite: {
70
70
  registerApp(AppContainer: ComponentType<PropsWithChildren<InitialProps>>, { appName, context, router, initialScheme, setIosSwipeGestureEnabled }: GraniteProps): (initialProps: InitialProps) => JSX.Element;
71
- registerHostApp(AppContainer: ComponentType<PropsWithChildren<InitialProps>>, { appName }: Pick<GraniteProps, "appName">): (initialProps: InitialProps) => JSX.Element;
71
+ registerHostApp(AppContainer: ComponentType<PropsWithChildren<InitialProps>>, { appName }: Pick<GraniteProps, "appName">): (initialProps: InitialProps) => React.JSX.Element;
72
72
  readonly appName: string;
73
73
  };
@@ -18,7 +18,7 @@
18
18
  * }
19
19
  * ```
20
20
  */
21
- declare function closeView(): Promise<void>;
21
+ declare function closeView(): Promise<void | undefined>;
22
22
 
23
23
  /**
24
24
  * @public
@@ -27,11 +27,14 @@ module.exports = __toCommonJS(async_bridges_exports);
27
27
 
28
28
  // src/native-modules/natives/GraniteModule.ts
29
29
  var import_react_native = require("react-native");
30
- var GraniteModule = import_react_native.TurboModuleRegistry.getEnforcing("GraniteModule");
30
+ var GraniteModule = import_react_native.TurboModuleRegistry.get("GraniteModule");
31
+ if (!GraniteModule) {
32
+ console.warn("[GraniteModule] is not registered");
33
+ }
31
34
 
32
35
  // src/native-modules/natives/closeView.ts
33
36
  async function closeView() {
34
- return GraniteModule.closeView();
37
+ return GraniteModule?.closeView();
35
38
  }
36
39
 
37
40
  // src/native-modules/natives/openURL.ts
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  GraniteModule
3
- } from "./chunk-A3JGM5OI.mjs";
3
+ } from "./chunk-2PYPIQMA.mjs";
4
4
 
5
5
  // src/native-modules/natives/closeView.ts
6
6
  async function closeView() {
7
- return GraniteModule.closeView();
7
+ return GraniteModule?.closeView();
8
8
  }
9
9
 
10
10
  // src/native-modules/natives/openURL.ts
@@ -0,0 +1,10 @@
1
+ // src/native-modules/natives/GraniteModule.ts
2
+ import { TurboModuleRegistry } from "react-native";
3
+ var GraniteModule = TurboModuleRegistry.get("GraniteModule");
4
+ if (!GraniteModule) {
5
+ console.warn("[GraniteModule] is not registered");
6
+ }
7
+
8
+ export {
9
+ GraniteModule
10
+ };
@@ -26,11 +26,14 @@ module.exports = __toCommonJS(constant_bridges_exports);
26
26
 
27
27
  // src/native-modules/natives/GraniteModule.ts
28
28
  var import_react_native = require("react-native");
29
- var GraniteModule = import_react_native.TurboModuleRegistry.getEnforcing("GraniteModule");
29
+ var GraniteModule = import_react_native.TurboModuleRegistry.get("GraniteModule");
30
+ if (!GraniteModule) {
31
+ console.warn("[GraniteModule] is not registered");
32
+ }
30
33
 
31
34
  // src/native-modules/natives/getSchemeUri.ts
32
35
  function getSchemeUri() {
33
- return GraniteModule.schemeUri;
36
+ return GraniteModule?.schemeUri ?? "unknown";
34
37
  }
35
38
  // Annotate the CommonJS export names for ESM import in node:
36
39
  0 && (module.exports = {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  GraniteModule
3
- } from "./chunk-A3JGM5OI.mjs";
3
+ } from "./chunk-2PYPIQMA.mjs";
4
4
 
5
5
  // src/native-modules/natives/getSchemeUri.ts
6
6
  function getSchemeUri() {
7
- return GraniteModule.schemeUri;
7
+ return GraniteModule?.schemeUri ?? "unknown";
8
8
  }
9
9
  export {
10
10
  getSchemeUri
@@ -1,4 +1,4 @@
1
- import { RefAttributes } from 'react';
1
+ import React, { RefAttributes } from 'react';
2
2
  import { FlatList, FlatListProps } from 'react-native';
3
3
  import { IOComponentProps } from './withIO';
4
4
  export type IOFlatListController = FlatList;
@@ -51,5 +51,5 @@ export type IOFlatListProps<ItemT = any> = IOComponentProps & FlatListProps<Item
51
51
  * ```
52
52
  */
53
53
  declare const IOFlatList: typeof IOFlatListFunction;
54
- declare function IOFlatListFunction<ItemT = any>(props: IOFlatListProps<ItemT> & RefAttributes<IOFlatListController>): JSX.Element;
54
+ declare function IOFlatListFunction<ItemT = any>(props: IOFlatListProps<ItemT> & RefAttributes<IOFlatListController>): React.JSX.Element;
55
55
  export default IOFlatList;
@@ -11,5 +11,9 @@ type ParamOf<K extends EventKeys> = EventEmittersMap[K]['params'];
11
11
  interface EventEmitter {
12
12
  addListener<Event extends EventKeys>(event: Event, callback: (...params: ParamOf<Event>) => void): EmitterSubscription;
13
13
  }
14
- export declare const nativeEventEmitter: EventEmitter;
14
+ export declare const nativeEventEmitter: EventEmitter | {
15
+ addListener: () => {
16
+ remove: () => void;
17
+ };
18
+ };
15
19
  export {};
@@ -4,5 +4,5 @@ interface GraniteCoreModule extends TurboModule {
4
4
  removeListeners: (count: number) => void;
5
5
  importLazy: () => Promise<void>;
6
6
  }
7
- export declare const GraniteCoreModule: GraniteCoreModule;
7
+ export declare const GraniteCoreModule: GraniteCoreModule | null;
8
8
  export {};
@@ -3,5 +3,5 @@ interface GraniteModuleSpec extends TurboModule {
3
3
  closeView: () => void;
4
4
  schemeUri: string;
5
5
  }
6
- export declare const GraniteModule: GraniteModuleSpec;
6
+ export declare const GraniteModule: GraniteModuleSpec | null;
7
7
  export {};
@@ -18,4 +18,4 @@
18
18
  * }
19
19
  * ```
20
20
  */
21
- export declare function closeView(): Promise<void>;
21
+ export declare function closeView(): Promise<void | undefined>;
@@ -26,6 +26,7 @@ interface StackNavigatorProps {
26
26
  screenContainer?: ComponentType<PropsWithChildren<any>>;
27
27
  }
28
28
  type NavigationContainerProps = Pick<ComponentProps<typeof NavigationContainer>, 'ref' | 'documentTitle' | 'fallback' | 'onReady' | 'onUnhandledAction' | 'onStateChange'>;
29
+ export declare const navigationRef: NavigationContainerRefWithCurrent<never>;
29
30
  /**
30
31
  * @category Components
31
32
  * @kind function
@@ -1,54 +1,48 @@
1
1
  export declare const StackNavigator: {
2
- Navigator: import("react").ComponentType<Omit<import("@react-navigation/routers").DefaultRouterOptions<string> & {
3
- id?: string;
2
+ Navigator: import("react").ComponentType<Omit<import("@react-navigation/native-stack").NativeStackNavigatorProps, "children" | "id" | "initialRouteName" | "layout" | "screenListeners" | "screenOptions" | "screenLayout" | "UNSTABLE_router"> & import("@react-navigation/routers").DefaultRouterOptions<string> & {
4
3
  children: React.ReactNode;
4
+ layout?: ((props: {
5
+ state: import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>;
6
+ navigation: import("@react-navigation/core").NavigationHelpers<import("@react-navigation/routers").ParamListBase, {}>;
7
+ descriptors: Record<string, import("@react-navigation/core").Descriptor<import("@react-navigation/native-stack").NativeStackNavigationOptions, import("@react-navigation/core").NavigationProp<import("@react-navigation/routers").ParamListBase, string, string | undefined, import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>, import("@react-navigation/native-stack").NativeStackNavigationOptions, import("@react-navigation/native-stack").NativeStackNavigationEventMap>, import("@react-navigation/core").RouteProp<import("@react-navigation/routers").ParamListBase, string>>>;
8
+ children: React.ReactNode;
9
+ }) => React.ReactElement) | undefined;
5
10
  screenListeners?: Partial<{
6
- transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart">;
7
- transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd">;
8
- focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus">;
9
- blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur">;
10
- state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state">;
11
- beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove">;
11
+ transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart", unknown>;
12
+ transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd", unknown>;
13
+ gestureCancel: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "gestureCancel", unknown>;
14
+ sheetDetentChange: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "sheetDetentChange", unknown>;
15
+ focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus", unknown>;
16
+ blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur", unknown>;
17
+ state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state", unknown>;
18
+ beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove", true>;
12
19
  }> | ((props: {
13
20
  route: import("@react-navigation/core").RouteProp<import("@react-navigation/routers").ParamListBase, string>;
14
- navigation: any;
21
+ navigation: import("@react-navigation/native-stack").NativeStackNavigationProp<import("@react-navigation/routers").ParamListBase, string, undefined>;
15
22
  }) => Partial<{
16
- transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart">;
17
- transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd">;
18
- focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus">;
19
- blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur">;
20
- state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state">;
21
- beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove">;
23
+ transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart", unknown>;
24
+ transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd", unknown>;
25
+ gestureCancel: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "gestureCancel", unknown>;
26
+ sheetDetentChange: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "sheetDetentChange", unknown>;
27
+ focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus", unknown>;
28
+ blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur", unknown>;
29
+ state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state", unknown>;
30
+ beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove", true>;
22
31
  }>) | undefined;
23
32
  screenOptions?: import("@react-navigation/native-stack").NativeStackNavigationOptions | ((props: {
24
33
  route: import("@react-navigation/core").RouteProp<import("@react-navigation/routers").ParamListBase, string>;
25
- navigation: any;
26
- }) => import("@react-navigation/native-stack").NativeStackNavigationOptions) | undefined;
27
- } & import("@react-navigation/routers").StackRouterOptions, "children" | "id" | "initialRouteName" | "screenListeners" | "screenOptions"> & import("@react-navigation/routers").DefaultRouterOptions<string> & {
28
- id?: string;
29
- children: React.ReactNode;
30
- screenListeners?: Partial<{
31
- transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart">;
32
- transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd">;
33
- focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus">;
34
- blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur">;
35
- state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state">;
36
- beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove">;
37
- }> | ((props: {
38
- route: import("@react-navigation/core").RouteProp<import("@react-navigation/routers").ParamListBase, string>;
39
- navigation: any;
40
- }) => Partial<{
41
- transitionStart: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionStart">;
42
- transitionEnd: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "transitionEnd">;
43
- focus: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "focus">;
44
- blur: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "blur">;
45
- state: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "state">;
46
- beforeRemove: import("@react-navigation/core").EventListenerCallback<import("@react-navigation/native-stack").NativeStackNavigationEventMap & import("@react-navigation/core").EventMapCore<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>>, "beforeRemove">;
47
- }>) | undefined;
48
- screenOptions?: import("@react-navigation/native-stack").NativeStackNavigationOptions | ((props: {
49
- route: import("@react-navigation/core").RouteProp<import("@react-navigation/routers").ParamListBase, string>;
50
- navigation: any;
34
+ navigation: import("@react-navigation/native-stack").NativeStackNavigationProp<import("@react-navigation/routers").ParamListBase, string, undefined>;
35
+ theme: ReactNavigation.Theme;
51
36
  }) => import("@react-navigation/native-stack").NativeStackNavigationOptions) | undefined;
37
+ screenLayout?: ((props: import("@react-navigation/core").ScreenLayoutArgs<import("@react-navigation/routers").ParamListBase, string, import("@react-navigation/native-stack").NativeStackNavigationOptions, import("@react-navigation/native-stack").NativeStackNavigationProp<import("@react-navigation/routers").ParamListBase, string, undefined>>) => React.ReactElement) | undefined;
38
+ UNSTABLE_router?: (<Action extends Readonly<{
39
+ type: string;
40
+ payload?: object;
41
+ source?: string;
42
+ target?: string;
43
+ }>>(original: import("@react-navigation/routers").Router<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>, Action>) => Partial<import("@react-navigation/routers").Router<import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>, Action>>) | undefined;
44
+ } & {
45
+ id?: undefined;
52
46
  }>;
53
- Screen: <RouteName extends string>(_: import("@react-navigation/core").RouteConfig<import("@react-navigation/routers").ParamListBase, RouteName, import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>, import("@react-navigation/native-stack").NativeStackNavigationOptions, import("@react-navigation/native-stack").NativeStackNavigationEventMap>) => null;
47
+ Screen: <RouteName extends string>(_: import("@react-navigation/core").RouteConfig<import("@react-navigation/routers").ParamListBase, RouteName, import("@react-navigation/routers").StackNavigationState<import("@react-navigation/routers").ParamListBase>, import("@react-navigation/native-stack").NativeStackNavigationOptions, import("@react-navigation/native-stack").NativeStackNavigationEventMap, import("@react-navigation/native-stack").NativeStackNavigationProp<import("@react-navigation/routers").ParamListBase, string, undefined>>) => null;
54
48
  };
@@ -42,13 +42,13 @@ import { NavigationContainerRefWithCurrent } from '@granite-js/native/@react-nav
42
42
  * }
43
43
  */
44
44
  export declare function useRouterBackHandler({ navigationContainerRef, onClose, }: {
45
- navigationContainerRef: NavigationContainerRefWithCurrent<any>;
45
+ navigationContainerRef: NavigationContainerRefWithCurrent<never>;
46
46
  onClose?: () => void;
47
47
  }): {
48
48
  handler: () => void;
49
49
  };
50
50
  export declare function useInternalRouterBackHandler({ navigationContainerRef, onClose, }: {
51
- navigationContainerRef: NavigationContainerRefWithCurrent<any>;
51
+ navigationContainerRef: NavigationContainerRefWithCurrent<never>;
52
52
  onClose?: () => void;
53
53
  }): {
54
54
  handler: () => void;
@@ -1,4 +1,4 @@
1
1
  export declare function useInitialRouteName({ prefix, initialScheme }: {
2
2
  prefix: string;
3
- initialScheme: string;
3
+ initialScheme?: string;
4
4
  }): string | undefined;
@@ -58,11 +58,11 @@ type VideoProps = ComponentProps<typeof AnimatedRNVideo>;
58
58
  * }
59
59
  * ```
60
60
  */
61
- declare const VideoImpl: import("react").ForwardRefExoticComponent<Omit<import("react-native-video").VideoProperties, "onAudioFocusChanged"> & {
61
+ declare const VideoImpl: import("react").ForwardRefExoticComponent<Omit<import("react-native-video").ReactVideoProps, "onAudioFocusChanged"> & {
62
62
  onAudioFocusChanged?: (event: {
63
63
  hasAudioFocus: boolean;
64
64
  }) => void;
65
- } & import("react").RefAttributes<VideoRef>>;
65
+ } & import("react").RefAttributes<import("react").ForwardRefExoticComponent<import("react-native-video").ReactVideoProps & import("react").RefAttributes<import("react-native-video").VideoRef>>>>;
66
66
  export declare const Video: typeof VideoImpl & {
67
67
  isAvailable: boolean;
68
68
  };
@@ -1,6 +1,6 @@
1
- import type { VideoProperties } from '@granite-js/native/react-native-video';
1
+ import type { ReactVideoProps } from '@granite-js/native/react-native-video';
2
2
  import { type ComponentType } from 'react';
3
- export type VideoNativeProps = Omit<VideoProperties, 'onAudioFocusChanged'> & {
3
+ export type VideoNativeProps = Omit<ReactVideoProps, 'onAudioFocusChanged'> & {
4
4
  onAudioFocusChanged?: (event: {
5
5
  hasAudioFocus: boolean;
6
6
  }) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@granite-js/react-native",
3
- "version": "0.1.21",
3
+ "version": "0.1.23-next.0",
4
4
  "description": "The Granite Framework",
5
5
  "bin": {
6
6
  "granite": "./bin/cli.js"
@@ -86,39 +86,37 @@
86
86
  "@babel/core": "^7.24.9",
87
87
  "@babel/preset-env": "^7.24.8",
88
88
  "@babel/preset-typescript": "^7.24.7",
89
- "@granite-js/native": "0.1.21",
89
+ "@granite-js/native": "0.1.23-next.0",
90
90
  "@testing-library/dom": "^10.4.0",
91
91
  "@testing-library/react": "^16.1.0",
92
92
  "@types/babel__core": "^7",
93
93
  "@types/babel__preset-env": "^7",
94
94
  "@types/node": "^22.10.2",
95
- "@types/react": "18.3.3",
96
- "@types/react-dom": "^18",
95
+ "@types/react": "npm:19.1.0",
97
96
  "@vitest/coverage-v8": "^2.1.8",
98
- "esbuild": "0.25.8",
97
+ "esbuild": "0.25.9",
99
98
  "eslint": "^9.7.0",
100
99
  "jsdom": "^25.0.1",
101
- "react": "18.2.0",
102
- "react-dom": "18.2.0",
103
- "react-native": "0.72.6",
100
+ "react": "npm:19.1.0",
101
+ "react-native": "npm:0.81.0",
104
102
  "tsup": "^8.5.0",
105
103
  "typescript": "5.8.3",
106
104
  "vitest": "^2.1.8"
107
105
  },
108
106
  "peerDependencies": {
109
- "@granite-js/native": "*",
107
+ "@granite-js/native": "0.1.23-next.0",
110
108
  "@types/react": "*",
111
109
  "react": "*",
112
110
  "react-native": "*"
113
111
  },
114
112
  "dependencies": {
115
- "@granite-js/cli": "0.1.21",
116
- "@granite-js/image": "0.1.21",
117
- "@granite-js/jest": "0.1.21",
118
- "@granite-js/lottie": "0.1.21",
119
- "@granite-js/mpack": "0.1.21",
120
- "@granite-js/plugin-core": "0.1.21",
121
- "@granite-js/style-utils": "0.1.21",
113
+ "@granite-js/cli": "0.1.23-next.0",
114
+ "@granite-js/image": "0.1.23-next.0",
115
+ "@granite-js/jest": "0.1.23-next.0",
116
+ "@granite-js/lottie": "0.1.23-next.0",
117
+ "@granite-js/mpack": "0.1.23-next.0",
118
+ "@granite-js/plugin-core": "0.1.23-next.0",
119
+ "@granite-js/style-utils": "0.1.23-next.0",
122
120
  "es-toolkit": "^1.39.8",
123
121
  "react-native-url-polyfill": "1.3.0"
124
122
  }
@@ -1,4 +1,4 @@
1
- import { ComponentType, PropsWithChildren } from 'react';
1
+ import { ComponentType, type JSX, PropsWithChildren } from 'react';
2
2
  import { AppRegistry } from 'react-native';
3
3
  import { ENTRY_BUNDLE_NAME } from '../constants';
4
4
  import type { InitialProps } from '../initial-props';
@@ -44,7 +44,8 @@ const createApp = () => {
44
44
 
45
45
  function registerComponent(appKey: string, component: React.ComponentType<any>): string {
46
46
  if (AppRegistry.getAppKeys().includes(appKey)) {
47
- throw new Error(`App with key '${appKey}' already registered`);
47
+ // `AppRegistry.registerComponent` returns the app key.
48
+ return appKey;
48
49
  }
49
50
 
50
51
  return AppRegistry.registerComponent(appKey, () => component);
@@ -82,7 +83,7 @@ const createApp = () => {
82
83
  registerHostApp(
83
84
  AppContainer: ComponentType<PropsWithChildren<InitialProps>>,
84
85
  { appName }: Pick<GraniteProps, 'appName'>
85
- ): (initialProps: InitialProps) => JSX.Element {
86
+ ): (initialProps: InitialProps) => React.JSX.Element {
86
87
  if (appName !== ENTRY_BUNDLE_NAME) {
87
88
  throw new Error(`Host appName must be 'shared'`);
88
89
  }
@@ -1,4 +1,4 @@
1
- import { RefAttributes } from 'react';
1
+ import React, { RefAttributes } from 'react';
2
2
  import { FlatList, FlatListProps } from 'react-native';
3
3
  import withIO, { IOComponentProps } from './withIO';
4
4
 
@@ -67,6 +67,6 @@ const IOFlatList = withIO(FlatList, [
67
67
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
68
68
  declare function IOFlatListFunction<ItemT = any>(
69
69
  props: IOFlatListProps<ItemT> & RefAttributes<IOFlatListController>
70
- ): JSX.Element;
70
+ ): React.JSX.Element;
71
71
 
72
72
  export default IOFlatList;
@@ -15,4 +15,15 @@ interface EventEmitter {
15
15
  ): EmitterSubscription;
16
16
  }
17
17
 
18
- export const nativeEventEmitter = new NativeEventEmitter(GraniteCoreModule) as unknown as EventEmitter;
18
+ export const nativeEventEmitter = GraniteCoreModule
19
+ ? (new NativeEventEmitter(GraniteCoreModule) as unknown as EventEmitter)
20
+ : {
21
+ addListener: () => {
22
+ console.warn('[GraniteCoreModule] is not registered');
23
+ return {
24
+ remove: () => {
25
+ console.warn('[GraniteCoreModule] is not registered');
26
+ },
27
+ };
28
+ },
29
+ };
@@ -6,4 +6,4 @@ interface GraniteCoreModule extends TurboModule {
6
6
  importLazy: () => Promise<void>;
7
7
  }
8
8
 
9
- export const GraniteCoreModule = TurboModuleRegistry.getEnforcing<GraniteCoreModule>('GraniteCoreModule');
9
+ export const GraniteCoreModule = TurboModuleRegistry.get<GraniteCoreModule>('GraniteCoreModule');
@@ -5,4 +5,7 @@ interface GraniteModuleSpec extends TurboModule {
5
5
  schemeUri: string;
6
6
  }
7
7
 
8
- export const GraniteModule = TurboModuleRegistry.getEnforcing<GraniteModuleSpec>('GraniteModule');
8
+ export const GraniteModule = TurboModuleRegistry.get<GraniteModuleSpec>('GraniteModule');
9
+ if (!GraniteModule) {
10
+ console.warn('[GraniteModule] is not registered');
11
+ }
@@ -21,5 +21,5 @@ import { GraniteModule } from './GraniteModule';
21
21
  * ```
22
22
  */
23
23
  export async function closeView() {
24
- return GraniteModule.closeView();
24
+ return GraniteModule?.closeView();
25
25
  }
@@ -23,5 +23,5 @@ import { GraniteModule } from './GraniteModule';
23
23
  * ```
24
24
  */
25
25
  export function getSchemeUri() {
26
- return GraniteModule.schemeUri;
26
+ return GraniteModule?.schemeUri ?? 'unknown';
27
27
  }
@@ -7,7 +7,7 @@ import {
7
7
  RouteProp,
8
8
  } from '@granite-js/native/@react-navigation/native';
9
9
  import { NativeStackNavigationOptions } from '@granite-js/native/@react-navigation/native-stack';
10
- import { ComponentProps, ComponentType, Fragment, PropsWithChildren, ReactElement, useCallback, useMemo } from 'react';
10
+ import { ComponentProps, ComponentType, Fragment, PropsWithChildren, ReactElement, useCallback } from 'react';
11
11
  import { InitialProps } from '..';
12
12
  import { closeView } from '../native-modules';
13
13
  import { BackButton } from './components/BackButton';
@@ -89,6 +89,8 @@ type NavigationContainerProps = Pick<
89
89
  'ref' | 'documentTitle' | 'fallback' | 'onReady' | 'onUnhandledAction' | 'onStateChange'
90
90
  >;
91
91
 
92
+ export const navigationRef = createNavigationContainerRef<never>();
93
+
92
94
  /**
93
95
  * @category Components
94
96
  * @kind function
@@ -141,10 +143,8 @@ export function Router({
141
143
  initialScheme,
142
144
  });
143
145
 
144
- const ref = useMemo(() => navigationContainerRef ?? createNavigationContainerRef<any>(), [navigationContainerRef]);
145
-
146
146
  const { handler, canGoBack, onBack } = useInternalRouterBackHandler({
147
- navigationContainerRef: ref,
147
+ navigationContainerRef: navigationRef,
148
148
  onClose: closeView,
149
149
  });
150
150
 
@@ -164,7 +164,7 @@ export function Router({
164
164
  );
165
165
 
166
166
  return (
167
- <NavigationContainer ref={ref} {...navigationContainerProps} linking={linkingOptions}>
167
+ <NavigationContainer ref={navigationRef} {...navigationContainerProps} linking={linkingOptions}>
168
168
  <CanGoBackGuard canGoBack={canGoBack} onBack={onBack} setIosSwipeGestureEnabled={setIosSwipeGestureEnabled}>
169
169
  <Container {...initialProps}>
170
170
  <StackNavigator.Navigator initialRouteName={initialRouteName} screenOptions={screenOptions}>
@@ -48,7 +48,7 @@ export function useRouterBackHandler({
48
48
  navigationContainerRef,
49
49
  onClose,
50
50
  }: {
51
- navigationContainerRef: NavigationContainerRefWithCurrent<any>;
51
+ navigationContainerRef: NavigationContainerRefWithCurrent<never>;
52
52
  onClose?: () => void;
53
53
  }) {
54
54
  const { handler } = useInternalRouterBackHandler({ navigationContainerRef, onClose });
@@ -60,7 +60,7 @@ export function useInternalRouterBackHandler({
60
60
  navigationContainerRef,
61
61
  onClose,
62
62
  }: {
63
- navigationContainerRef: NavigationContainerRefWithCurrent<any>;
63
+ navigationContainerRef: NavigationContainerRefWithCurrent<never>;
64
64
  onClose?: () => void;
65
65
  }) {
66
66
  const { hasBackEvent, onBack } = useBackEventContext();
@@ -1,8 +1,12 @@
1
1
  import { Platform } from 'react-native';
2
2
 
3
- export function useInitialRouteName({ prefix, initialScheme }: { prefix: string; initialScheme: string }) {
3
+ export function useInitialRouteName({ prefix, initialScheme }: { prefix: string; initialScheme?: string }) {
4
+ if (!initialScheme) {
5
+ return '/';
6
+ }
7
+
4
8
  const pathname = removeTrailingSlash(initialScheme).slice(prefix.length).split('?')[0];
5
- const shouldUseIndex = initialScheme == null || pathname?.length === 0;
9
+ const shouldUseIndex = pathname?.length === 0;
6
10
 
7
11
  return shouldUseIndex ? '/' : pathname;
8
12
  }
@@ -62,7 +62,7 @@ type VideoProps = ComponentProps<typeof AnimatedRNVideo>;
62
62
  * }
63
63
  * ```
64
64
  */
65
- const VideoImpl = forwardRef<VideoRef, instance.VideoNativeProps>((props, ref) => {
65
+ const VideoImpl = forwardRef<typeof VideoRef, instance.VideoNativeProps>((props, ref) => {
66
66
  const [isFocused, setIsFocused] = useState(props.muted || props.paused);
67
67
  const visible = useVisibility();
68
68
 
@@ -1,8 +1,8 @@
1
- import type { VideoProperties } from '@granite-js/native/react-native-video';
1
+ import type { ReactVideoProps } from '@granite-js/native/react-native-video';
2
2
  import { Component as ReactComponent, forwardRef, type ComponentType, type ForwardedRef } from 'react';
3
3
  import { View } from 'react-native';
4
4
 
5
- export type VideoNativeProps = Omit<VideoProperties, 'onAudioFocusChanged'> & {
5
+ export type VideoNativeProps = Omit<ReactVideoProps, 'onAudioFocusChanged'> & {
6
6
  onAudioFocusChanged?: (event: { hasAudioFocus: boolean }) => void;
7
7
  };
8
8
 
@@ -15,7 +15,7 @@ import { useEffect, useRef } from 'react';
15
15
  * ```
16
16
  */
17
17
  export function usePrevious<T>(value: T): T {
18
- const ref: any = useRef<T>();
18
+ const ref: any = useRef<T>(null);
19
19
  useEffect(() => {
20
20
  ref.current = value;
21
21
  }, [value]);
@@ -1,7 +0,0 @@
1
- // src/native-modules/natives/GraniteModule.ts
2
- import { TurboModuleRegistry } from "react-native";
3
- var GraniteModule = TurboModuleRegistry.getEnforcing("GraniteModule");
4
-
5
- export {
6
- GraniteModule
7
- };