@croacroa/react-native-template 2.1.0 → 3.2.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 (172) hide show
  1. package/.env.example +5 -0
  2. package/.eslintrc.js +8 -0
  3. package/.github/workflows/ci.yml +187 -187
  4. package/.github/workflows/eas-build.yml +55 -55
  5. package/.github/workflows/eas-update.yml +50 -50
  6. package/.github/workflows/npm-publish.yml +57 -0
  7. package/CHANGELOG.md +195 -106
  8. package/CONTRIBUTING.md +377 -377
  9. package/LICENSE +21 -21
  10. package/README.md +446 -402
  11. package/__tests__/accessibility/components.test.tsx +285 -0
  12. package/__tests__/components/Button.test.tsx +2 -4
  13. package/__tests__/components/__snapshots__/snapshots.test.tsx.snap +512 -0
  14. package/__tests__/components/snapshots.test.tsx +131 -131
  15. package/__tests__/helpers/a11y.ts +54 -0
  16. package/__tests__/hooks/useAnalytics.test.ts +100 -0
  17. package/__tests__/hooks/useAnimations.test.ts +70 -0
  18. package/__tests__/hooks/useAuth.test.tsx +71 -28
  19. package/__tests__/hooks/useMedia.test.ts +318 -0
  20. package/__tests__/hooks/usePayments.test.tsx +307 -0
  21. package/__tests__/hooks/usePermission.test.ts +230 -0
  22. package/__tests__/hooks/useWebSocket.test.ts +329 -0
  23. package/__tests__/integration/auth-api.test.tsx +224 -227
  24. package/__tests__/performance/VirtualizedList.perf.test.tsx +385 -362
  25. package/__tests__/services/api.test.ts +24 -6
  26. package/app/(auth)/home.tsx +11 -9
  27. package/app/(auth)/profile.tsx +8 -6
  28. package/app/(auth)/settings.tsx +11 -9
  29. package/app/(public)/forgot-password.tsx +25 -15
  30. package/app/(public)/login.tsx +48 -12
  31. package/app/(public)/onboarding.tsx +5 -5
  32. package/app/(public)/register.tsx +24 -15
  33. package/app/_layout.tsx +6 -3
  34. package/app.config.ts +27 -2
  35. package/assets/images/.gitkeep +7 -7
  36. package/assets/images/adaptive-icon.png +0 -0
  37. package/assets/images/favicon.png +0 -0
  38. package/assets/images/icon.png +0 -0
  39. package/assets/images/notification-icon.png +0 -0
  40. package/assets/images/splash.png +0 -0
  41. package/components/ErrorBoundary.tsx +73 -28
  42. package/components/auth/SocialLoginButtons.tsx +168 -0
  43. package/components/forms/FormInput.tsx +5 -3
  44. package/components/onboarding/OnboardingScreen.tsx +370 -370
  45. package/components/onboarding/index.ts +2 -2
  46. package/components/providers/AnalyticsProvider.tsx +67 -0
  47. package/components/providers/SuspenseBoundary.tsx +359 -357
  48. package/components/providers/index.ts +24 -21
  49. package/components/ui/AnimatedButton.tsx +1 -9
  50. package/components/ui/AnimatedList.tsx +98 -0
  51. package/components/ui/AnimatedScreen.tsx +89 -0
  52. package/components/ui/Avatar.tsx +319 -316
  53. package/components/ui/Badge.tsx +416 -416
  54. package/components/ui/BottomSheet.tsx +307 -307
  55. package/components/ui/Button.tsx +11 -3
  56. package/components/ui/Checkbox.tsx +261 -261
  57. package/components/ui/FeatureGate.tsx +57 -0
  58. package/components/ui/ForceUpdateScreen.tsx +108 -0
  59. package/components/ui/ImagePickerButton.tsx +180 -0
  60. package/components/ui/Input.stories.tsx +2 -10
  61. package/components/ui/Input.tsx +2 -10
  62. package/components/ui/OptimizedImage.tsx +369 -369
  63. package/components/ui/Paywall.tsx +253 -0
  64. package/components/ui/PermissionGate.tsx +155 -0
  65. package/components/ui/PurchaseButton.tsx +84 -0
  66. package/components/ui/Select.tsx +240 -240
  67. package/components/ui/Skeleton.tsx +3 -1
  68. package/components/ui/Toast.tsx +427 -418
  69. package/components/ui/UploadProgress.tsx +189 -0
  70. package/components/ui/VirtualizedList.tsx +288 -285
  71. package/components/ui/index.ts +28 -30
  72. package/constants/config.ts +135 -97
  73. package/docs/adr/001-state-management.md +79 -79
  74. package/docs/adr/002-styling-approach.md +130 -130
  75. package/docs/adr/003-data-fetching.md +155 -155
  76. package/docs/adr/004-auth-adapter-pattern.md +144 -144
  77. package/docs/adr/README.md +78 -78
  78. package/docs/guides/analytics-posthog.md +121 -0
  79. package/docs/guides/auth-supabase.md +162 -0
  80. package/docs/guides/feature-flags-launchdarkly.md +150 -0
  81. package/docs/guides/payments-revenuecat.md +169 -0
  82. package/docs/plans/2026-02-22-phase6-implementation.md +3222 -0
  83. package/docs/plans/2026-02-22-phase6-template-completion-design.md +196 -0
  84. package/docs/plans/2026-02-23-npm-publish-design.md +31 -0
  85. package/docs/plans/2026-02-23-phase7-polish-documentation-design.md +79 -0
  86. package/docs/plans/2026-02-23-phase8-additional-features-design.md +136 -0
  87. package/eas.json +2 -1
  88. package/hooks/index.ts +70 -40
  89. package/hooks/useAnimatedEntry.ts +204 -0
  90. package/hooks/useApi.ts +5 -4
  91. package/hooks/useAuth.tsx +7 -3
  92. package/hooks/useBiometrics.ts +295 -295
  93. package/hooks/useChannel.ts +111 -0
  94. package/hooks/useDeepLinking.ts +256 -256
  95. package/hooks/useExperiment.ts +36 -0
  96. package/hooks/useFeatureFlag.ts +59 -0
  97. package/hooks/useForceUpdate.ts +91 -0
  98. package/hooks/useImagePicker.ts +281 -375
  99. package/hooks/useInAppReview.ts +64 -0
  100. package/hooks/useMFA.ts +509 -499
  101. package/hooks/useParallax.ts +142 -0
  102. package/hooks/usePerformance.ts +434 -434
  103. package/hooks/usePermission.ts +190 -0
  104. package/hooks/usePresence.ts +129 -0
  105. package/hooks/useProducts.ts +36 -0
  106. package/hooks/usePurchase.ts +103 -0
  107. package/hooks/useRateLimit.ts +70 -0
  108. package/hooks/useSubscription.ts +49 -0
  109. package/hooks/useTrackEvent.ts +52 -0
  110. package/hooks/useTrackScreen.ts +40 -0
  111. package/hooks/useUpdates.ts +358 -358
  112. package/hooks/useUpload.ts +165 -0
  113. package/hooks/useWebSocket.ts +111 -0
  114. package/i18n/index.ts +197 -194
  115. package/i18n/locales/ar.json +170 -101
  116. package/i18n/locales/de.json +170 -101
  117. package/i18n/locales/en.json +170 -101
  118. package/i18n/locales/es.json +170 -101
  119. package/i18n/locales/fr.json +170 -101
  120. package/jest.config.js +1 -1
  121. package/maestro/README.md +113 -113
  122. package/maestro/config.yaml +35 -35
  123. package/maestro/flows/login.yaml +62 -62
  124. package/maestro/flows/mfa-login.yaml +92 -92
  125. package/maestro/flows/mfa-setup.yaml +86 -86
  126. package/maestro/flows/navigation.yaml +68 -68
  127. package/maestro/flows/offline-conflict.yaml +101 -101
  128. package/maestro/flows/offline-sync.yaml +128 -128
  129. package/maestro/flows/offline.yaml +60 -60
  130. package/maestro/flows/register.yaml +94 -94
  131. package/package.json +188 -176
  132. package/scripts/generate-placeholders.js +38 -0
  133. package/services/analytics/adapters/console.ts +50 -0
  134. package/services/analytics/analytics-adapter.ts +94 -0
  135. package/services/analytics/types.ts +73 -0
  136. package/services/analytics.ts +428 -428
  137. package/services/api.ts +419 -340
  138. package/services/auth/social/apple.ts +110 -0
  139. package/services/auth/social/google.ts +159 -0
  140. package/services/auth/social/social-auth.ts +100 -0
  141. package/services/auth/social/types.ts +80 -0
  142. package/services/authAdapter.ts +333 -333
  143. package/services/backgroundSync.ts +652 -626
  144. package/services/feature-flags/adapters/mock.ts +108 -0
  145. package/services/feature-flags/feature-flag-adapter.ts +174 -0
  146. package/services/feature-flags/types.ts +79 -0
  147. package/services/force-update.ts +140 -0
  148. package/services/index.ts +116 -54
  149. package/services/media/compression.ts +91 -0
  150. package/services/media/media-picker.ts +151 -0
  151. package/services/media/media-upload.ts +160 -0
  152. package/services/payments/adapters/mock.ts +159 -0
  153. package/services/payments/payment-adapter.ts +118 -0
  154. package/services/payments/types.ts +131 -0
  155. package/services/permissions/permission-manager.ts +284 -0
  156. package/services/permissions/types.ts +104 -0
  157. package/services/realtime/types.ts +100 -0
  158. package/services/realtime/websocket-manager.ts +441 -0
  159. package/services/security.ts +289 -286
  160. package/services/sentry.ts +4 -4
  161. package/stores/appStore.ts +9 -0
  162. package/stores/notificationStore.ts +3 -1
  163. package/tailwind.config.js +47 -47
  164. package/tsconfig.json +37 -13
  165. package/types/user.ts +1 -1
  166. package/utils/accessibility.ts +446 -446
  167. package/utils/animations/presets.ts +182 -0
  168. package/utils/animations/transitions.ts +62 -0
  169. package/utils/index.ts +63 -52
  170. package/utils/toast.ts +9 -2
  171. package/utils/validation.ts +4 -1
  172. package/utils/withAccessibility.tsx +272 -272
package/.env.example CHANGED
@@ -16,3 +16,8 @@ EAS_PROJECT_ID=your-project-id
16
16
  # Sentry (optional - for crash reporting)
17
17
  # Get your DSN from: https://sentry.io -> Project Settings -> Client Keys
18
18
  EXPO_PUBLIC_SENTRY_DSN=
19
+
20
+ # Social Login
21
+ EXPO_PUBLIC_GOOGLE_CLIENT_ID=your-google-client-id
22
+ EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID=your-google-ios-client-id
23
+ EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID=your-google-android-client-id
package/.eslintrc.js CHANGED
@@ -37,6 +37,14 @@ module.exports = {
37
37
  "prefer-const": "error",
38
38
  "no-var": "error",
39
39
  },
40
+ overrides: [
41
+ {
42
+ files: ["__tests__/**/*", "jest.setup.js"],
43
+ rules: {
44
+ "@typescript-eslint/no-require-imports": "off",
45
+ },
46
+ },
47
+ ],
40
48
  ignorePatterns: [
41
49
  "node_modules/",
42
50
  ".expo/",
@@ -1,187 +1,187 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main, develop]
6
- pull_request:
7
- branches: [main, develop]
8
-
9
- concurrency:
10
- group: ${{ github.workflow }}-${{ github.ref }}
11
- cancel-in-progress: true
12
-
13
- env:
14
- NODE_VERSION: '18'
15
-
16
- jobs:
17
- # ============================================
18
- # Lint & Type Check
19
- # ============================================
20
- lint:
21
- name: Lint & Type Check
22
- runs-on: ubuntu-latest
23
- steps:
24
- - name: Checkout
25
- uses: actions/checkout@v4
26
-
27
- - name: Setup Node.js
28
- uses: actions/setup-node@v4
29
- with:
30
- node-version: ${{ env.NODE_VERSION }}
31
- cache: 'npm'
32
-
33
- - name: Install dependencies
34
- run: npm ci
35
-
36
- - name: Run ESLint
37
- run: npm run lint
38
-
39
- - name: Run TypeScript check
40
- run: npm run typecheck
41
-
42
- # ============================================
43
- # Unit Tests
44
- # ============================================
45
- test:
46
- name: Unit Tests
47
- runs-on: ubuntu-latest
48
- steps:
49
- - name: Checkout
50
- uses: actions/checkout@v4
51
-
52
- - name: Setup Node.js
53
- uses: actions/setup-node@v4
54
- with:
55
- node-version: ${{ env.NODE_VERSION }}
56
- cache: 'npm'
57
-
58
- - name: Install dependencies
59
- run: npm ci
60
-
61
- - name: Run tests with coverage
62
- run: npm run test:coverage
63
-
64
- - name: Upload coverage to Codecov
65
- uses: codecov/codecov-action@v4
66
- with:
67
- token: ${{ secrets.CODECOV_TOKEN }}
68
- files: ./coverage/lcov.info
69
- fail_ci_if_error: false
70
-
71
- # ============================================
72
- # Build Check (Expo)
73
- # ============================================
74
- build-check:
75
- name: Build Check
76
- runs-on: ubuntu-latest
77
- steps:
78
- - name: Checkout
79
- uses: actions/checkout@v4
80
-
81
- - name: Setup Node.js
82
- uses: actions/setup-node@v4
83
- with:
84
- node-version: ${{ env.NODE_VERSION }}
85
- cache: 'npm'
86
-
87
- - name: Setup Expo
88
- uses: expo/expo-github-action@v8
89
- with:
90
- expo-version: latest
91
- eas-version: latest
92
- token: ${{ secrets.EXPO_TOKEN }}
93
-
94
- - name: Install dependencies
95
- run: npm ci
96
-
97
- - name: Check Expo config
98
- run: npx expo config --type public
99
-
100
- - name: Export for web (validates build)
101
- run: npx expo export --platform web
102
-
103
- # ============================================
104
- # E2E Tests with Maestro Cloud
105
- # ============================================
106
- e2e:
107
- name: E2E Tests (Maestro)
108
- runs-on: ubuntu-latest
109
- needs: [lint, test]
110
- if: github.event_name == 'push' && github.ref == 'refs/heads/main'
111
- steps:
112
- - name: Checkout
113
- uses: actions/checkout@v4
114
-
115
- - name: Setup Node.js
116
- uses: actions/setup-node@v4
117
- with:
118
- node-version: ${{ env.NODE_VERSION }}
119
- cache: 'npm'
120
-
121
- - name: Install dependencies
122
- run: npm ci
123
-
124
- - name: Setup Expo
125
- uses: expo/expo-github-action@v8
126
- with:
127
- expo-version: latest
128
- eas-version: latest
129
- token: ${{ secrets.EXPO_TOKEN }}
130
-
131
- # Build for Android (or use existing build)
132
- - name: Build Android APK
133
- run: eas build --platform android --profile preview --non-interactive --local
134
- env:
135
- EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
136
- continue-on-error: true
137
-
138
- # Run Maestro Cloud tests
139
- - name: Run Maestro Cloud Tests
140
- uses: mobile-dev-inc/action-maestro-cloud@v1
141
- with:
142
- api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }}
143
- app-file: ./build/*.apk
144
- flows: ./maestro/flows/
145
- env: |
146
- APP_ID=com.croacroa.app
147
- continue-on-error: true
148
-
149
- # ============================================
150
- # Security Audit
151
- # ============================================
152
- security:
153
- name: Security Audit
154
- runs-on: ubuntu-latest
155
- steps:
156
- - name: Checkout
157
- uses: actions/checkout@v4
158
-
159
- - name: Setup Node.js
160
- uses: actions/setup-node@v4
161
- with:
162
- node-version: ${{ env.NODE_VERSION }}
163
- cache: 'npm'
164
-
165
- - name: Install dependencies
166
- run: npm ci
167
-
168
- - name: Run npm audit (production dependencies)
169
- run: npm audit --audit-level=high --omit=dev
170
-
171
- - name: Run npm audit (all dependencies - non-blocking)
172
- run: npm audit --audit-level=critical
173
- continue-on-error: true
174
-
175
- # ============================================
176
- # Notify on failure
177
- # ============================================
178
- notify:
179
- name: Notify
180
- runs-on: ubuntu-latest
181
- needs: [lint, test, build-check]
182
- if: failure()
183
- steps:
184
- - name: Send notification
185
- run: |
186
- echo "CI failed for ${{ github.repository }}"
187
- # Add Slack/Discord webhook notification here if needed
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ env:
14
+ NODE_VERSION: '18'
15
+
16
+ jobs:
17
+ # ============================================
18
+ # Lint & Type Check
19
+ # ============================================
20
+ lint:
21
+ name: Lint & Type Check
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@v4
26
+
27
+ - name: Setup Node.js
28
+ uses: actions/setup-node@v4
29
+ with:
30
+ node-version: ${{ env.NODE_VERSION }}
31
+ cache: 'npm'
32
+
33
+ - name: Install dependencies
34
+ run: npm ci
35
+
36
+ - name: Run ESLint
37
+ run: npm run lint
38
+
39
+ - name: Run TypeScript check
40
+ run: npm run typecheck
41
+
42
+ # ============================================
43
+ # Unit Tests
44
+ # ============================================
45
+ test:
46
+ name: Unit Tests
47
+ runs-on: ubuntu-latest
48
+ steps:
49
+ - name: Checkout
50
+ uses: actions/checkout@v4
51
+
52
+ - name: Setup Node.js
53
+ uses: actions/setup-node@v4
54
+ with:
55
+ node-version: ${{ env.NODE_VERSION }}
56
+ cache: 'npm'
57
+
58
+ - name: Install dependencies
59
+ run: npm ci
60
+
61
+ - name: Run tests with coverage
62
+ run: npm run test:coverage
63
+
64
+ - name: Upload coverage to Codecov
65
+ uses: codecov/codecov-action@v4
66
+ with:
67
+ token: ${{ secrets.CODECOV_TOKEN }}
68
+ files: ./coverage/lcov.info
69
+ fail_ci_if_error: false
70
+
71
+ # ============================================
72
+ # Build Check (Expo)
73
+ # ============================================
74
+ build-check:
75
+ name: Build Check
76
+ runs-on: ubuntu-latest
77
+ steps:
78
+ - name: Checkout
79
+ uses: actions/checkout@v4
80
+
81
+ - name: Setup Node.js
82
+ uses: actions/setup-node@v4
83
+ with:
84
+ node-version: ${{ env.NODE_VERSION }}
85
+ cache: 'npm'
86
+
87
+ - name: Setup Expo
88
+ uses: expo/expo-github-action@v8
89
+ with:
90
+ expo-version: latest
91
+ eas-version: latest
92
+ token: ${{ secrets.EXPO_TOKEN }}
93
+
94
+ - name: Install dependencies
95
+ run: npm ci
96
+
97
+ - name: Check Expo config
98
+ run: npx expo config --type public
99
+
100
+ - name: Export for web (validates build)
101
+ run: npx expo export --platform web
102
+
103
+ # ============================================
104
+ # E2E Tests with Maestro Cloud
105
+ # ============================================
106
+ e2e:
107
+ name: E2E Tests (Maestro)
108
+ runs-on: ubuntu-latest
109
+ needs: [lint, test]
110
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
111
+ steps:
112
+ - name: Checkout
113
+ uses: actions/checkout@v4
114
+
115
+ - name: Setup Node.js
116
+ uses: actions/setup-node@v4
117
+ with:
118
+ node-version: ${{ env.NODE_VERSION }}
119
+ cache: 'npm'
120
+
121
+ - name: Install dependencies
122
+ run: npm ci
123
+
124
+ - name: Setup Expo
125
+ uses: expo/expo-github-action@v8
126
+ with:
127
+ expo-version: latest
128
+ eas-version: latest
129
+ token: ${{ secrets.EXPO_TOKEN }}
130
+
131
+ # Build for Android (or use existing build)
132
+ - name: Build Android APK
133
+ run: eas build --platform android --profile preview --non-interactive --local
134
+ env:
135
+ EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
136
+ continue-on-error: true
137
+
138
+ # Run Maestro Cloud tests
139
+ - name: Run Maestro Cloud Tests
140
+ uses: mobile-dev-inc/action-maestro-cloud@v1
141
+ with:
142
+ api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }}
143
+ app-file: ./build/*.apk
144
+ flows: ./maestro/flows/
145
+ env: |
146
+ APP_ID=com.croacroa.app
147
+ continue-on-error: true
148
+
149
+ # ============================================
150
+ # Security Audit
151
+ # ============================================
152
+ security:
153
+ name: Security Audit
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - name: Checkout
157
+ uses: actions/checkout@v4
158
+
159
+ - name: Setup Node.js
160
+ uses: actions/setup-node@v4
161
+ with:
162
+ node-version: ${{ env.NODE_VERSION }}
163
+ cache: 'npm'
164
+
165
+ - name: Install dependencies
166
+ run: npm ci
167
+
168
+ - name: Run npm audit (production dependencies)
169
+ run: npm audit --audit-level=high --omit=dev
170
+
171
+ - name: Run npm audit (all dependencies - non-blocking)
172
+ run: npm audit --audit-level=critical
173
+ continue-on-error: true
174
+
175
+ # ============================================
176
+ # Notify on failure
177
+ # ============================================
178
+ notify:
179
+ name: Notify
180
+ runs-on: ubuntu-latest
181
+ needs: [lint, test, build-check]
182
+ if: failure()
183
+ steps:
184
+ - name: Send notification
185
+ run: |
186
+ echo "CI failed for ${{ github.repository }}"
187
+ # Add Slack/Discord webhook notification here if needed
@@ -1,55 +1,55 @@
1
- name: EAS Build
2
-
3
- on:
4
- workflow_dispatch:
5
- inputs:
6
- platform:
7
- description: 'Platform to build'
8
- required: true
9
- default: 'all'
10
- type: choice
11
- options:
12
- - all
13
- - ios
14
- - android
15
- profile:
16
- description: 'Build profile'
17
- required: true
18
- default: 'preview'
19
- type: choice
20
- options:
21
- - development
22
- - preview
23
- - production
24
-
25
- jobs:
26
- build:
27
- name: Build ${{ github.event.inputs.platform }} (${{ github.event.inputs.profile }})
28
- runs-on: ubuntu-latest
29
- steps:
30
- - name: Checkout
31
- uses: actions/checkout@v4
32
-
33
- - name: Setup Node.js
34
- uses: actions/setup-node@v4
35
- with:
36
- node-version: '18'
37
- cache: 'npm'
38
-
39
- - name: Setup Expo
40
- uses: expo/expo-github-action@v8
41
- with:
42
- expo-version: latest
43
- eas-version: latest
44
- token: ${{ secrets.EXPO_TOKEN }}
45
-
46
- - name: Install dependencies
47
- run: npm ci
48
-
49
- - name: Build iOS
50
- if: ${{ github.event.inputs.platform == 'ios' || github.event.inputs.platform == 'all' }}
51
- run: eas build --platform ios --profile ${{ github.event.inputs.profile }} --non-interactive
52
-
53
- - name: Build Android
54
- if: ${{ github.event.inputs.platform == 'android' || github.event.inputs.platform == 'all' }}
55
- run: eas build --platform android --profile ${{ github.event.inputs.profile }} --non-interactive
1
+ name: EAS Build
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ platform:
7
+ description: 'Platform to build'
8
+ required: true
9
+ default: 'all'
10
+ type: choice
11
+ options:
12
+ - all
13
+ - ios
14
+ - android
15
+ profile:
16
+ description: 'Build profile'
17
+ required: true
18
+ default: 'preview'
19
+ type: choice
20
+ options:
21
+ - development
22
+ - preview
23
+ - production
24
+
25
+ jobs:
26
+ build:
27
+ name: Build ${{ github.event.inputs.platform }} (${{ github.event.inputs.profile }})
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - name: Checkout
31
+ uses: actions/checkout@v4
32
+
33
+ - name: Setup Node.js
34
+ uses: actions/setup-node@v4
35
+ with:
36
+ node-version: '18'
37
+ cache: 'npm'
38
+
39
+ - name: Setup Expo
40
+ uses: expo/expo-github-action@v8
41
+ with:
42
+ expo-version: latest
43
+ eas-version: latest
44
+ token: ${{ secrets.EXPO_TOKEN }}
45
+
46
+ - name: Install dependencies
47
+ run: npm ci
48
+
49
+ - name: Build iOS
50
+ if: ${{ github.event.inputs.platform == 'ios' || github.event.inputs.platform == 'all' }}
51
+ run: eas build --platform ios --profile ${{ github.event.inputs.profile }} --non-interactive
52
+
53
+ - name: Build Android
54
+ if: ${{ github.event.inputs.platform == 'android' || github.event.inputs.platform == 'all' }}
55
+ run: eas build --platform android --profile ${{ github.event.inputs.profile }} --non-interactive
@@ -1,50 +1,50 @@
1
- name: EAS Update (OTA)
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- paths-ignore:
7
- - '**.md'
8
- - '.github/**'
9
- - 'maestro/**'
10
- - 'docs/**'
11
-
12
- jobs:
13
- update:
14
- name: Publish OTA Update
15
- runs-on: ubuntu-latest
16
- steps:
17
- - name: Checkout
18
- uses: actions/checkout@v4
19
-
20
- - name: Setup Node.js
21
- uses: actions/setup-node@v4
22
- with:
23
- node-version: '18'
24
- cache: 'npm'
25
-
26
- - name: Setup Expo
27
- uses: expo/expo-github-action@v8
28
- with:
29
- expo-version: latest
30
- eas-version: latest
31
- token: ${{ secrets.EXPO_TOKEN }}
32
-
33
- - name: Install dependencies
34
- run: npm ci
35
-
36
- - name: Publish update
37
- run: eas update --auto --non-interactive
38
- env:
39
- EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
40
-
41
- - name: Comment on commit
42
- uses: actions/github-script@v7
43
- with:
44
- script: |
45
- github.rest.repos.createCommitComment({
46
- owner: context.repo.owner,
47
- repo: context.repo.repo,
48
- commit_sha: context.sha,
49
- body: '🚀 OTA update published successfully!'
50
- })
1
+ name: EAS Update (OTA)
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths-ignore:
7
+ - '**.md'
8
+ - '.github/**'
9
+ - 'maestro/**'
10
+ - 'docs/**'
11
+
12
+ jobs:
13
+ update:
14
+ name: Publish OTA Update
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Setup Node.js
21
+ uses: actions/setup-node@v4
22
+ with:
23
+ node-version: '18'
24
+ cache: 'npm'
25
+
26
+ - name: Setup Expo
27
+ uses: expo/expo-github-action@v8
28
+ with:
29
+ expo-version: latest
30
+ eas-version: latest
31
+ token: ${{ secrets.EXPO_TOKEN }}
32
+
33
+ - name: Install dependencies
34
+ run: npm ci
35
+
36
+ - name: Publish update
37
+ run: eas update --auto --non-interactive
38
+ env:
39
+ EXPO_TOKEN: ${{ secrets.EXPO_TOKEN }}
40
+
41
+ - name: Comment on commit
42
+ uses: actions/github-script@v7
43
+ with:
44
+ script: |
45
+ github.rest.repos.createCommitComment({
46
+ owner: context.repo.owner,
47
+ repo: context.repo.repo,
48
+ commit_sha: context.sha,
49
+ body: '🚀 OTA update published successfully!'
50
+ })
@@ -0,0 +1,57 @@
1
+ name: Publish to npm
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ concurrency:
8
+ group: npm-publish
9
+ cancel-in-progress: false
10
+
11
+ env:
12
+ NODE_VERSION: '18'
13
+
14
+ jobs:
15
+ # ============================================
16
+ # Validate & Publish
17
+ # ============================================
18
+ publish:
19
+ name: Publish to npm
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: read
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@v4
26
+
27
+ - name: Setup Node.js
28
+ uses: actions/setup-node@v4
29
+ with:
30
+ node-version: ${{ env.NODE_VERSION }}
31
+ cache: 'npm'
32
+ registry-url: 'https://registry.npmjs.org'
33
+
34
+ - name: Validate tag matches package.json version
35
+ run: |
36
+ PACKAGE_VERSION=$(node -p "require('./package.json').version")
37
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
38
+ if [ "$PACKAGE_VERSION" != "$TAG_VERSION" ]; then
39
+ echo "::error::Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
40
+ exit 1
41
+ fi
42
+ echo "Publishing version $PACKAGE_VERSION"
43
+
44
+ - name: Install dependencies
45
+ run: npm ci
46
+
47
+ - name: Run linter
48
+ run: npm run lint
49
+
50
+ - name: Run tests
51
+ run: npm test -- --no-coverage --passWithNoTests
52
+ continue-on-error: true
53
+
54
+ - name: Publish to npm
55
+ run: npm publish --access public
56
+ env:
57
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}