diff --git a/package/example/ios/Podfile.lock b/package/example/ios/Podfile.lock index 5bcabf95e4..c31ef61265 100644 --- a/package/example/ios/Podfile.lock +++ b/package/example/ios/Podfile.lock @@ -467,7 +467,7 @@ PODS: - RCT-Folly (= 2021.07.22.00) - React-Core - SocketRocket (0.6.1) - - VisionCamera (4.0.0-beta.14): + - VisionCamera (4.0.0-beta.15): - React - React-callinvoker - React-Core @@ -701,7 +701,7 @@ SPEC CHECKSUMS: RNStaticSafeAreaInsets: 055ddbf5e476321720457cdaeec0ff2ba40ec1b8 RNVectorIcons: 23b6e11af4aaf104d169b1b0afa7e5cf96c676ce SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 - VisionCamera: 4d01ac25d09288d3aa670b1e0eb092c47e7d4211 + VisionCamera: 6f2f2b7e9df333899e640e3617bc02cac86f4774 Yoga: 4c3aa327e4a6a23eeacd71f61c81df1bcdf677d5 PODFILE CHECKSUM: 299b350392623e1b01615935e236438d90fd2cff diff --git a/package/src/dependencies/ModuleProxy.ts b/package/src/dependencies/ModuleProxy.ts index 808d6dacc3..81210c9810 100644 --- a/package/src/dependencies/ModuleProxy.ts +++ b/package/src/dependencies/ModuleProxy.ts @@ -4,20 +4,24 @@ type ImportType = ReturnType * Create a lazily-imported module proxy. * This is useful for lazily requiring optional dependencies. */ -export const createModuleProxy = (name: string, getModule: () => ImportType): TModule => { +export const createModuleProxy = (getModule: () => ImportType): TModule => { const holder: { module: TModule | undefined } = { module: undefined } const proxy = new Proxy(holder, { get: (target, property) => { if (target.module == null) { - try { - target.module = getModule() as TModule - } catch (e) { - throw new Error(`${name} is not installed!`) - } + // lazy initialize module via require() + // caller needs to make sure the require() call is wrapped in a try/catch + target.module = getModule() as TModule } return target.module[property as keyof typeof holder.module] }, }) return proxy as unknown as TModule } + +export class OptionalDependencyNotInstalledError extends Error { + constructor(name: string) { + super(`${name} is not installed!`) + } +} diff --git a/package/src/dependencies/ReanimatedProxy.ts b/package/src/dependencies/ReanimatedProxy.ts index 4549da69d7..808386880b 100644 --- a/package/src/dependencies/ReanimatedProxy.ts +++ b/package/src/dependencies/ReanimatedProxy.ts @@ -1,5 +1,6 @@ import type * as Reanimated from 'react-native-reanimated' -import { createModuleProxy } from './ModuleProxy' +import { createModuleProxy, OptionalDependencyNotInstalledError } from './ModuleProxy' + type TReanimated = typeof Reanimated /** @@ -9,4 +10,10 @@ type TReanimated = typeof Reanimated * If react-native-reanimated is not installed, accessing anything on * {@linkcode ReanimatedProxy} will throw. */ -export const ReanimatedProxy = createModuleProxy('react-native-reanimated', () => require('react-native-reanimated')) +export const ReanimatedProxy = createModuleProxy(() => { + try { + return require('react-native-reanimated') + } catch (e) { + throw new OptionalDependencyNotInstalledError('react-native-reanimated') + } +}) diff --git a/package/src/dependencies/SkiaProxy.ts b/package/src/dependencies/SkiaProxy.ts index abd148969c..d7d3df014c 100644 --- a/package/src/dependencies/SkiaProxy.ts +++ b/package/src/dependencies/SkiaProxy.ts @@ -1,5 +1,6 @@ import type * as Skia from '@shopify/react-native-skia' -import { createModuleProxy } from './ModuleProxy' +import { createModuleProxy, OptionalDependencyNotInstalledError } from './ModuleProxy' + type TSkia = typeof Skia /** @@ -9,4 +10,10 @@ type TSkia = typeof Skia * If @shopify/react-native-skia is not installed, accessing anything on * {@linkcode SkiaProxy} will throw. */ -export const SkiaProxy = createModuleProxy('@shopify/react-native-skia', () => require('@shopify/react-native-skia')) +export const SkiaProxy = createModuleProxy(() => { + try { + return require('@shopify/react-native-skia') + } catch (e) { + throw new OptionalDependencyNotInstalledError('@shopify/react-native-skia') + } +}) diff --git a/package/src/dependencies/WorkletsProxy.ts b/package/src/dependencies/WorkletsProxy.ts index 15d67995c8..1e57075715 100644 --- a/package/src/dependencies/WorkletsProxy.ts +++ b/package/src/dependencies/WorkletsProxy.ts @@ -1,5 +1,6 @@ import type * as Worklets from 'react-native-worklets-core' -import { createModuleProxy } from './ModuleProxy' +import { createModuleProxy, OptionalDependencyNotInstalledError } from './ModuleProxy' + type TWorklets = typeof Worklets /** @@ -9,4 +10,10 @@ type TWorklets = typeof Worklets * If react-native-worklets-core is not installed, accessing anything on * {@linkcode WorkletsProxy} will throw. */ -export const WorkletsProxy = createModuleProxy('react-native-worklets-core', () => require('react-native-worklets-core')) +export const WorkletsProxy = createModuleProxy(() => { + try { + return require('react-native-worklets-core') + } catch (e) { + throw new OptionalDependencyNotInstalledError('react-native-worklets-core') + } +})