Skip to content

Commit baecedd

Browse files
msluszniakclaude
andcommitted
fix: align deps and fix metro configs across all example apps
- Revert react/react-native to 19.1.0/0.81.5 in example apps and library devDeps - Restore wildcard peerDependencies in library packages - Bump react-native-reanimated to ~4.2.2 and react-native-worklets to 0.7.4 across all apps (required for reanimated 4.2.x compatibility) - Add monorepo metro config fix to computer-vision, text-embeddings, and speech: watchFolders, nodeModulesPaths, and resolveRequest to pin react/react-native to the monorepo root and prevent duplicate React instances - Add eslint-plugin-ft-flow to root devDependencies so ESLint can resolve it Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent ec1cedd commit baecedd

13 files changed

Lines changed: 152 additions & 267 deletions

File tree

apps/computer-vision/metro.config.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
// Learn more https://docs.expo.io/guides/customizing-metro
22
const { getDefaultConfig } = require('expo/metro-config');
3+
const path = require('path');
4+
5+
const monorepoRoot = path.resolve(__dirname, '../..');
36

47
/** @type {import('expo/metro-config').MetroConfig} */
58
const config = getDefaultConfig(__dirname);
69

710
const { transformer, resolver } = config;
811

12+
config.watchFolders = [monorepoRoot];
13+
914
config.transformer = {
1015
...transformer,
1116
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
@@ -14,6 +19,23 @@ config.resolver = {
1419
...resolver,
1520
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
1621
sourceExts: [...resolver.sourceExts, 'svg'],
22+
nodeModulesPaths: [
23+
path.resolve(__dirname, 'node_modules'),
24+
path.resolve(monorepoRoot, 'node_modules'),
25+
],
26+
// Always resolve react and react-native from the monorepo root so that
27+
// workspace packages with their own nested node_modules (e.g.
28+
// packages/react-native-executorch/node_modules/react) don't create a
29+
// second React instance and trigger "Invalid hook call".
30+
resolveRequest: (context, moduleName, platform) => {
31+
if (moduleName === 'react' || moduleName === 'react-native') {
32+
return {
33+
filePath: require.resolve(moduleName, { paths: [monorepoRoot] }),
34+
type: 'sourceFile',
35+
};
36+
}
37+
return context.resolveRequest(context, moduleName, platform);
38+
},
1739
};
1840

1941
config.resolver.assetExts.push('pte');

apps/computer-vision/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"expo-router": "~6.0.17",
2424
"expo-status-bar": "~3.0.9",
2525
"metro-config": "^0.81.5",
26-
"react": "19.2.4",
26+
"react": "19.1.0",
2727
"react-native": "0.81.5",
2828
"react-native-device-info": "^15.0.2",
2929
"react-native-executorch": "workspace:*",
@@ -35,7 +35,7 @@
3535
"react-native-screens": "~4.16.0",
3636
"react-native-svg": "15.15.3",
3737
"react-native-svg-transformer": "^1.5.3",
38-
"react-native-worklets": "0.5.1"
38+
"react-native-worklets": "0.7.4"
3939
},
4040
"devDependencies": {
4141
"@babel/core": "^7.29.0",

apps/llm/metro.config.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ const { getDefaultConfig } = require('expo/metro-config');
22
const {
33
wrapWithAudioAPIMetroConfig,
44
} = require('react-native-audio-api/metro-config');
5+
const path = require('path');
56

7+
const monorepoRoot = path.resolve(__dirname, '../..');
68
const config = getDefaultConfig(__dirname);
79

810
const { transformer, resolver } = config;
911

12+
config.watchFolders = [monorepoRoot];
13+
1014
config.transformer = {
1115
...transformer,
1216
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
@@ -15,6 +19,23 @@ config.resolver = {
1519
...resolver,
1620
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
1721
sourceExts: [...resolver.sourceExts, 'svg'],
22+
nodeModulesPaths: [
23+
path.resolve(__dirname, 'node_modules'),
24+
path.resolve(monorepoRoot, 'node_modules'),
25+
],
26+
// Always resolve react and react-native from the monorepo root so that
27+
// workspace packages with their own nested node_modules (e.g.
28+
// packages/react-native-executorch/node_modules/react) don't create a
29+
// second React instance and trigger "Invalid hook call".
30+
resolveRequest: (context, moduleName, platform) => {
31+
if (moduleName === 'react' || moduleName === 'react-native') {
32+
return {
33+
filePath: require.resolve(moduleName, { paths: [monorepoRoot] }),
34+
type: 'sourceFile',
35+
};
36+
}
37+
return context.resolveRequest(context, moduleName, platform);
38+
},
1839
};
1940

2041
config.resolver.assetExts.push('pte');

apps/llm/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"expo-router": "~6.0.17",
2525
"expo-status-bar": "~3.0.9",
2626
"metro-config": "^0.81.5",
27-
"react": "19.2.4",
27+
"react": "19.1.0",
2828
"react-native": "0.81.5",
2929
"react-native-audio-api": "^0.8.2",
3030
"react-native-device-info": "^15.0.2",

apps/speech/metro.config.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@ const { getDefaultConfig } = require('expo/metro-config');
22
const {
33
wrapWithAudioAPIMetroConfig,
44
} = require('react-native-audio-api/metro-config');
5+
const path = require('path');
56

7+
const monorepoRoot = path.resolve(__dirname, '../..');
68
const config = getDefaultConfig(__dirname);
79

810
const { transformer, resolver } = config;
911

12+
config.watchFolders = [monorepoRoot];
13+
1014
config.transformer = {
1115
...transformer,
1216
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
@@ -15,6 +19,23 @@ config.resolver = {
1519
...resolver,
1620
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
1721
sourceExts: [...resolver.sourceExts, 'svg'],
22+
nodeModulesPaths: [
23+
path.resolve(__dirname, 'node_modules'),
24+
path.resolve(monorepoRoot, 'node_modules'),
25+
],
26+
// Always resolve react and react-native from the monorepo root so that
27+
// workspace packages with their own nested node_modules (e.g.
28+
// packages/react-native-executorch/node_modules/react) don't create a
29+
// second React instance and trigger "Invalid hook call".
30+
resolveRequest: (context, moduleName, platform) => {
31+
if (moduleName === 'react' || moduleName === 'react-native') {
32+
return {
33+
filePath: require.resolve(moduleName, { paths: [monorepoRoot] }),
34+
type: 'sourceFile',
35+
};
36+
}
37+
return context.resolveRequest(context, moduleName, platform);
38+
},
1839
};
1940

2041
config.resolver.assetExts.push('pte');

apps/speech/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
"react-native-audio-api": "0.11.5",
2424
"react-native-device-info": "^15.0.2",
2525
"react-native-executorch": "workspace:*",
26-
"react-native-reanimated": "~4.1.1",
26+
"react-native-reanimated": "~4.2.2",
2727
"react-native-safe-area-context": "~5.7.0",
2828
"react-native-svg": "15.15.3",
2929
"react-native-svg-transformer": "^1.5.3",
30-
"react-native-worklets": "0.5.1"
30+
"react-native-worklets": "0.7.4"
3131
},
3232
"devDependencies": {
3333
"@babel/core": "^7.29.0",

apps/text-embeddings/metro.config.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
// Learn more https://docs.expo.io/guides/customizing-metro
22
const { getDefaultConfig } = require('expo/metro-config');
3+
const path = require('path');
4+
5+
const monorepoRoot = path.resolve(__dirname, '../..');
36

47
/** @type {import('expo/metro-config').MetroConfig} */
58
const config = getDefaultConfig(__dirname);
69

710
const { transformer, resolver } = config;
811

12+
config.watchFolders = [monorepoRoot];
13+
914
config.transformer = {
1015
...transformer,
1116
babelTransformerPath: require.resolve('react-native-svg-transformer/expo'),
@@ -14,6 +19,23 @@ config.resolver = {
1419
...resolver,
1520
assetExts: resolver.assetExts.filter((ext) => ext !== 'svg'),
1621
sourceExts: [...resolver.sourceExts, 'svg'],
22+
nodeModulesPaths: [
23+
path.resolve(__dirname, 'node_modules'),
24+
path.resolve(monorepoRoot, 'node_modules'),
25+
],
26+
// Always resolve react and react-native from the monorepo root so that
27+
// workspace packages with their own nested node_modules (e.g.
28+
// packages/react-native-executorch/node_modules/react) don't create a
29+
// second React instance and trigger "Invalid hook call".
30+
resolveRequest: (context, moduleName, platform) => {
31+
if (moduleName === 'react' || moduleName === 'react-native') {
32+
return {
33+
filePath: require.resolve(moduleName, { paths: [monorepoRoot] }),
34+
type: 'sourceFile',
35+
};
36+
}
37+
return context.resolveRequest(context, moduleName, platform);
38+
},
1739
};
1840

1941
config.resolver.assetExts.push('pte');

apps/text-embeddings/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
"expo-linking": "~8.0.10",
2020
"expo-router": "~6.0.17",
2121
"expo-status-bar": "~3.0.9",
22-
"react": "19.2.4",
22+
"react": "19.1.0",
2323
"react-native": "0.81.5",
2424
"react-native-executorch": "workspace:*",
2525
"react-native-gesture-handler": "~2.30.0",
2626
"react-native-image-picker": "^7.2.2",
27-
"react-native-reanimated": "~4.1.1",
27+
"react-native-reanimated": "~4.2.2",
2828
"react-native-safe-area-context": "~5.7.0",
2929
"react-native-screens": "~4.16.0",
3030
"react-native-svg": "15.15.3",
31-
"react-native-worklets": "0.5.1"
31+
"react-native-worklets": "0.7.4"
3232
},
3333
"devDependencies": {
3434
"@babel/core": "^7.29.0",

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"@react-native/eslint-config": "^0.79.0",
2121
"cspell": "^8.19.0",
2222
"eslint": "^8.57.0",
23+
"eslint-plugin-ft-flow": "^2.0.3",
2324
"eslint-plugin-markdown": "^5.1.0",
2425
"eslint-plugin-prettier": "^5.0.1",
2526
"prettier": "^3.3.3",

packages/bare-resource-fetcher/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@
2828
"peerDependencies": {
2929
"@dr.pogodin/react-native-fs": "^2.0.0",
3030
"@kesha-antonov/react-native-background-downloader": "^4.0.0",
31-
"react-native": "0.84.0",
31+
"react-native": "*",
3232
"react-native-executorch": "*"
3333
},
3434
"devDependencies": {
3535
"@dr.pogodin/react-native-fs": "^2.36.2",
3636
"@kesha-antonov/react-native-background-downloader": "^4.4.5",
3737
"@types/react": "~19.1.10",
38-
"react": "19.2.4",
39-
"react-native": "0.84.0",
38+
"react": "19.1.0",
39+
"react-native": "0.81.5",
4040
"react-native-executorch": "workspace:*",
4141
"typescript": "~5.9.2"
4242
}

0 commit comments

Comments
 (0)