Skip to content

Commit 6933db7

Browse files
authored
Merge pull request #316 from IamLRBA/Formulus-App
feat(formulus): use ODE tokens and components (fixes #291)
2 parents 1eff145 + 232b2ff commit 6933db7

45 files changed

Lines changed: 5317 additions & 1305 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,16 @@ jobs:
7777
with:
7878
node-version: ${{ env.NODE_VERSION }}
7979
cache: 'npm'
80-
cache-dependency-path: formulus/package-lock.json
80+
cache-dependency-path: |
81+
formulus/package-lock.json
82+
packages/tokens/package-lock.json
83+
84+
- name: Install and build @ode/tokens
85+
working-directory: .
86+
run: |
87+
cd packages/tokens
88+
npm install
89+
npm run build
8190
8291
- name: Install dependencies
8392
run: npm install
@@ -262,19 +271,19 @@ jobs:
262271
echo "| Synkronus | ${{ needs.synkronus.result }} |" >> $GITHUB_STEP_SUMMARY
263272
echo "| Synkronus CLI | ${{ needs.synkronus-cli.result }} |" >> $GITHUB_STEP_SUMMARY
264273
265-
if [ "${{ needs.formulus.result }}" != "success" ] && [ "${{ needs.formulus.result }}" != "skipped" ]; then
274+
if [ "${{ needs.formulus.result }}" == "failure" ]; then
266275
echo "❌ Formulus CI failed"
267276
exit 1
268277
fi
269-
if [ "${{ needs.formulus-formplayer.result }}" != "success" ] && [ "${{ needs.formulus-formplayer.result }}" != "skipped" ]; then
278+
if [ "${{ needs.formulus-formplayer.result }}" == "failure" ]; then
270279
echo "❌ Formulus Formplayer CI failed"
271280
exit 1
272281
fi
273-
if [ "${{ needs.synkronus.result }}" != "success" ] && [ "${{ needs.synkronus.result }}" != "skipped" ]; then
282+
if [ "${{ needs.synkronus.result }}" == "failure" ]; then
274283
echo "❌ Synkronus CI failed"
275284
exit 1
276285
fi
277-
if [ "${{ needs.synkronus-cli.result }}" != "success" ] && [ "${{ needs.synkronus-cli.result }}" != "skipped" ]; then
286+
if [ "${{ needs.synkronus-cli.result }}" == "failure" ]; then
278287
echo "❌ Synkronus CLI CI failed"
279288
exit 1
280289
fi

.github/workflows/formulus-android.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@ jobs:
9393
packages/tokens/package-lock.json
9494
packages/tokens/package.json
9595
96-
- name: Install npm dependencies (formulus)
97-
working-directory: formulus
98-
run: npm ci
99-
10096
- name: Install and build @ode/tokens
10197
working-directory: packages/tokens
10298
run: |
10399
npm install
104100
npm run build
105101
102+
- name: Install npm dependencies (formulus)
103+
working-directory: formulus
104+
run: npm ci
105+
106106
- name: Set up Java
107107
uses: actions/setup-java@v4
108108
with:

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ COPY packages/tokens/package*.json ./packages/tokens/
3131
COPY packages/tokens/package-lock.json ./packages/tokens/
3232
COPY packages/tokens/style-dictionary.config.js ./packages/tokens/
3333
COPY packages/tokens/config.json ./packages/tokens/
34+
COPY packages/tokens/scripts ./packages/tokens/scripts
3435
COPY packages/tokens/src ./packages/tokens/src
3536
COPY packages/components/package*.json ./packages/components/
3637
COPY synkronus-portal/package*.json ./synkronus-portal/

formulus/metro.config.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,58 @@
11
import { getDefaultConfig, mergeConfig } from '@react-native/metro-config';
22
import path from 'node:path';
33
import { fileURLToPath } from 'node:url';
4+
45
const __filename = fileURLToPath(import.meta.url);
56
const __dirname = path.dirname(__filename);
67

8+
/** Monorepo root (parent of formulus) so Metro can resolve @ode/tokens and @ode/components */
9+
const monorepoRoot = path.resolve(__dirname, '..');
10+
11+
/**
12+
* Force a single React/react-native instance so hooks work (avoids "Invalid hook call" / "useState of null").
13+
* Without this, @ode/components would use its own node_modules/react and we'd have two React copies.
14+
*/
15+
const projectRoot = __dirname;
16+
17+
/**
18+
* Force react and react-native to always resolve from the app's node_modules
19+
* (avoids incomplete copy in packages/components). react-native-svg only uses
20+
* extraNodeModules so Metro resolves its real entry (lib/commonjs/index.js).
21+
*/
22+
const forcedModules = {
23+
react: path.resolve(projectRoot, 'node_modules/react'),
24+
'react-native': path.resolve(projectRoot, 'node_modules/react-native'),
25+
};
26+
const extraModules = {
27+
...forcedModules,
28+
'react-native-svg': path.resolve(
29+
projectRoot,
30+
'node_modules/react-native-svg',
31+
),
32+
};
33+
734
/**
835
* Metro configuration
936
* https://reactnative.dev/docs/metro
1037
*
1138
* @type {import('@react-native/metro-config').MetroConfig}
1239
*/
13-
const config = {};
40+
const config = {
41+
watchFolders: [monorepoRoot],
42+
resolver: {
43+
unstable_enableSymlinks: true,
44+
unstable_enablePackageExports: true,
45+
extraNodeModules: extraModules,
46+
resolveRequest(context, moduleName, platform) {
47+
if (forcedModules[moduleName]) {
48+
return {
49+
type: 'sourceFile',
50+
filePath: path.join(forcedModules[moduleName], 'index.js'),
51+
};
52+
}
53+
return context.resolveRequest(context, moduleName, platform);
54+
},
55+
},
56+
};
1457

1558
export default mergeConfig(getDefaultConfig(__dirname), config);

0 commit comments

Comments
 (0)