expo-bbase 1.3.3 → 1.3.4

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.
package/README.md CHANGED
@@ -45,7 +45,7 @@ npx expo-bbase my-app
45
45
  | 图片 | expo-image 封装 |
46
46
  | 视频 | expo-av 封装 |
47
47
  | Google 登录 | @react-native-google-signin/google-signin |
48
- | Facebook 登录 | expo-facebook |
48
+ | Facebook 登录 | expo-auth-session 封装(SDK 54 不再支持 expo-facebook |
49
49
  | Apple 登录 | expo-apple-authentication |
50
50
  | WebView 容器 | react-native-webview + JS Bridge |
51
51
  | 多语言 | i18next + react-i18next |
@@ -147,26 +147,39 @@ my-app/
147
147
  │ │ ├── list.tsx # Card 列表
148
148
  │ │ └── mine.tsx # 个人中心 + 退出
149
149
  │ └── +not-found.tsx
150
- ├── src/
151
- ├── api/ # 网络请求 (可选)
152
- ├── stores/ # 状态管理 (可选)
153
- ├── storage/ # 本地存储 (可选)
154
- │ ├── components/
155
- │ │ ├── ui/ # rnr UI 组件
156
- │ │ ├── button.tsx
157
- │ │ ├── text.tsx
158
- │ │ ├── input.tsx
159
- │ │ ├── label.tsx
160
- │ │ ├── card.tsx
161
- │ │ │ ├── separator.tsx
162
- │ │ └── alert-dialog.tsx
163
- │ └── SignInForm.tsx # 登录表单
164
- ├── lib/
165
- │ │ └── utils.ts # cn() 工具函数
166
- ├── modules/ # 功能模块 (可选)
167
- ├── hooks/ # 自定义 Hooks
168
- │ ├── constants/ # 常量
169
- └── types/ # 类型定义
150
+ ├── api/ # 网络请求 (可选)
151
+ ├── stores/ # 状态管理 (可选)
152
+ ├── storage/ # 本地存储 (可选)
153
+ ├── components/
154
+ │ ├── ui/ # rnr UI 组件
155
+ │ │ ├── button.tsx
156
+ │ │ ├── text.tsx
157
+ │ │ ├── input.tsx
158
+ │ │ ├── label.tsx
159
+ │ │ ├── card.tsx
160
+ │ │ ├── separator.tsx
161
+ │ │ └── alert-dialog.tsx
162
+ ├── SignInForm.tsx # 登录表单
163
+ ├── Themed.tsx # 主题组件
164
+ └── HelloWave.tsx # 示例组件
165
+ ├── lib/
166
+ └── utils.ts # cn() 工具函数
167
+ ├── modules/ # 功能模块 (可选)
168
+ │ ├── animation/
169
+ ├── form/
170
+ │ ├── i18n/
171
+ │ ├── media/
172
+ │ ├── notification/
173
+ │ ├── payment/
174
+ │ ├── permission/
175
+ │ ├── webview/
176
+ │ └── auth/
177
+ │ ├── apple.ts
178
+ │ ├── facebook.ts
179
+ │ └── google.ts
180
+ ├── hooks/ # 自定义 Hooks
181
+ ├── constants/ # 常量
182
+ ├── types/ # 类型定义
170
183
  ├── global.css # NativeWind CSS 变量 (light/dark)
171
184
  ├── assets/ # 静态资源
172
185
  ├── app.json # Expo 配置
@@ -188,7 +201,7 @@ my-app/
188
201
  {
189
202
  "projectName": "my-app",
190
203
  "selectedModules": ["network", "state", "ui-reusables"],
191
- "cliVersion": "1.3.0",
204
+ "cliVersion": "1.3.4",
192
205
  "uiTemplate": "login-tabs"
193
206
  }
194
207
  ```
@@ -215,3 +228,21 @@ npm run build
215
228
  ## License
216
229
 
217
230
  MIT
231
+
232
+ ## 更新日志
233
+
234
+ ### v1.3.4
235
+ - 🔧 **目录结构修复**:去除 `src/` 层,模块文件(`modules/`、`api/`、`stores/` 等)与 `app/` 平级
236
+ - 📝 修正 Facebook 登录模块描述(SDK 54 不再支持 `expo-facebook`,改用 `expo-auth-session`)
237
+
238
+ ### v1.3.3
239
+ - 🔧 修复 `react-native-worklets` 版本前缀(`0.5.1` → `~0.5.1`)
240
+
241
+ ### v1.3.2
242
+ - 🔧 修复 babel-preset-expo 自动检测 worklets/reanimated plugin 的问题
243
+ - 未选 animation 模块时显式禁用 `reanimated: false, worklets: false`
244
+
245
+ ### v1.3.0
246
+ - ✨ 新增 UI 模板选择(Login + Tabs / Default)
247
+ - ✨ 集成 reactnative.reusables 官方组件
248
+ - ✨ 新增 `upgrade` 和 `add` 命令
package/dist/index.js CHANGED
@@ -77,7 +77,7 @@ var networkModule = {
77
77
  devDependencies: {},
78
78
  files: [
79
79
  {
80
- path: "src/api/client.ts",
80
+ path: "api/client.ts",
81
81
  content: lines(
82
82
  'import { Alert } from "react-native";',
83
83
  "",
@@ -249,7 +249,7 @@ var networkModule = {
249
249
  )
250
250
  },
251
251
  {
252
- path: "src/api/interceptors.ts",
252
+ path: "api/interceptors.ts",
253
253
  content: lines(
254
254
  'import type { RequestConfig } from "./client";',
255
255
  'import { apiClient } from "./client";',
@@ -297,7 +297,7 @@ var networkModule = {
297
297
  )
298
298
  },
299
299
  {
300
- path: "src/api/types.ts",
300
+ path: "api/types.ts",
301
301
  content: lines(
302
302
  "/** Common API response types */",
303
303
  "",
@@ -343,7 +343,7 @@ var networkModule = {
343
343
  )
344
344
  },
345
345
  {
346
- path: "src/api/queries.ts",
346
+ path: "api/queries.ts",
347
347
  content: lines(
348
348
  'import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";',
349
349
  'import { apiClient, handleApiError } from "./client";',
@@ -426,11 +426,11 @@ var stateModule = {
426
426
  devDependencies: {},
427
427
  files: [
428
428
  {
429
- path: "src/stores/index.ts",
429
+ path: "stores/index.ts",
430
430
  content: lines('export { useUserStore } from "./slices/userSlice";')
431
431
  },
432
432
  {
433
- path: "src/stores/slices/userSlice.ts",
433
+ path: "stores/slices/userSlice.ts",
434
434
  content: lines(
435
435
  'import { create } from "zustand";',
436
436
  'import { persist, createJSONStorage } from "zustand/middleware";',
@@ -536,7 +536,7 @@ var storageModule = {
536
536
  devDependencies: {},
537
537
  files: [
538
538
  {
539
- path: "src/storage/index.ts",
539
+ path: "storage/index.ts",
540
540
  content: lines(
541
541
  'import { MMKV } from "react-native-mmkv";',
542
542
  "",
@@ -637,14 +637,14 @@ var paymentModule = {
637
637
  devDependencies: {},
638
638
  files: [
639
639
  {
640
- path: "src/modules/payment/index.ts",
640
+ path: "modules/payment/index.ts",
641
641
  content: lines(
642
642
  'export { usePayment } from "./usePayment";',
643
643
  'export type { ProductInfo, PurchaseResult, PaymentError } from "./types";'
644
644
  )
645
645
  },
646
646
  {
647
- path: "src/modules/payment/types.ts",
647
+ path: "modules/payment/types.ts",
648
648
  content: lines(
649
649
  'import type { Product, Purchase } from "react-native-iap";',
650
650
  "",
@@ -675,7 +675,7 @@ var paymentModule = {
675
675
  )
676
676
  },
677
677
  {
678
- path: "src/modules/payment/usePayment.ts",
678
+ path: "modules/payment/usePayment.ts",
679
679
  content: lines(
680
680
  'import { useCallback, useEffect, useRef, useState } from "react";',
681
681
  "import {",
@@ -841,7 +841,7 @@ var formModule = {
841
841
  devDependencies: {},
842
842
  files: [
843
843
  {
844
- path: "src/modules/form/index.ts",
844
+ path: "modules/form/index.ts",
845
845
  content: lines(
846
846
  'export { useForm } from "react-hook-form";',
847
847
  'export { z } from "zod";',
@@ -850,7 +850,7 @@ var formModule = {
850
850
  )
851
851
  },
852
852
  {
853
- path: "src/modules/form/schemas/auth.ts",
853
+ path: "modules/form/schemas/auth.ts",
854
854
  content: lines(
855
855
  'import { z } from "zod";',
856
856
  "",
@@ -929,7 +929,7 @@ var imageModule = {
929
929
  devDependencies: {},
930
930
  files: [
931
931
  {
932
- path: "src/modules/media/CachedImage.tsx",
932
+ path: "modules/media/CachedImage.tsx",
933
933
  content: lines(
934
934
  'import React, { useMemo } from "react";',
935
935
  'import { Image, type ImageProps } from "expo-image";',
@@ -1011,7 +1011,7 @@ var videoModule = {
1011
1011
  devDependencies: {},
1012
1012
  files: [
1013
1013
  {
1014
- path: "src/modules/media/VideoPlayer.tsx",
1014
+ path: "modules/media/VideoPlayer.tsx",
1015
1015
  content: lines(
1016
1016
  'import React, { useCallback, useRef, useState } from "react";',
1017
1017
  "import {",
@@ -1127,7 +1127,7 @@ var authGoogleModule = {
1127
1127
  devDependencies: {},
1128
1128
  files: [
1129
1129
  {
1130
- path: "src/modules/auth/google.ts",
1130
+ path: "modules/auth/google.ts",
1131
1131
  content: lines(
1132
1132
  "import {",
1133
1133
  " GoogleSignin,",
@@ -1227,7 +1227,7 @@ var authFacebookModule = {
1227
1227
  devDependencies: {},
1228
1228
  files: [
1229
1229
  {
1230
- path: "src/modules/auth/facebook.ts",
1230
+ path: "modules/auth/facebook.ts",
1231
1231
  content: lines(
1232
1232
  'import * as Facebook from "expo-facebook";',
1233
1233
  "",
@@ -1320,7 +1320,7 @@ var authAppleModule = {
1320
1320
  devDependencies: {},
1321
1321
  files: [
1322
1322
  {
1323
- path: "src/modules/auth/apple.ts",
1323
+ path: "modules/auth/apple.ts",
1324
1324
  content: lines(
1325
1325
  'import * as AppleAuthentication from "expo-apple-authentication";',
1326
1326
  'import { Platform } from "react-native";',
@@ -1415,7 +1415,7 @@ var webviewModule = {
1415
1415
  devDependencies: {},
1416
1416
  files: [
1417
1417
  {
1418
- path: "src/modules/webview/WebViewContainer.tsx",
1418
+ path: "modules/webview/WebViewContainer.tsx",
1419
1419
  content: lines(
1420
1420
  'import React, { useCallback, useRef } from "react";',
1421
1421
  'import { View, StyleSheet, ActivityIndicator } from "react-native";',
@@ -1523,7 +1523,7 @@ var webviewModule = {
1523
1523
  )
1524
1524
  },
1525
1525
  {
1526
- path: "src/modules/webview/bridge.ts",
1526
+ path: "modules/webview/bridge.ts",
1527
1527
  content: lines(
1528
1528
  "export interface BridgeMessage {",
1529
1529
  " type: string;",
@@ -1593,7 +1593,7 @@ var i18nModule = {
1593
1593
  devDependencies: {},
1594
1594
  files: [
1595
1595
  {
1596
- path: "src/modules/i18n/index.ts",
1596
+ path: "modules/i18n/index.ts",
1597
1597
  content: lines(
1598
1598
  'import i18n from "i18next";',
1599
1599
  'import { initReactI18next } from "react-i18next";',
@@ -1628,7 +1628,7 @@ var i18nModule = {
1628
1628
  )
1629
1629
  },
1630
1630
  {
1631
- path: "src/modules/i18n/locales/en.json",
1631
+ path: "modules/i18n/locales/en.json",
1632
1632
  content: [
1633
1633
  "{",
1634
1634
  ' "common": {',
@@ -1672,7 +1672,7 @@ var i18nModule = {
1672
1672
  ].join("\n")
1673
1673
  },
1674
1674
  {
1675
- path: "src/modules/i18n/locales/zh.json",
1675
+ path: "modules/i18n/locales/zh.json",
1676
1676
  content: [
1677
1677
  "{",
1678
1678
  ' "common": {',
@@ -1747,13 +1747,13 @@ var animationModule = {
1747
1747
  `
1748
1748
  },
1749
1749
  {
1750
- path: "src/modules/animation/index.ts",
1750
+ path: "modules/animation/index.ts",
1751
1751
  content: lines(
1752
1752
  'export { FadeIn, FadeOut, SlideIn, SlideOut, ScaleIn, ScaleOut } from "./transitions";'
1753
1753
  )
1754
1754
  },
1755
1755
  {
1756
- path: "src/modules/animation/transitions.ts",
1756
+ path: "modules/animation/transitions.ts",
1757
1757
  content: lines(
1758
1758
  "import Animated, {",
1759
1759
  " FadeIn as ReanimatedFadeIn,",
@@ -1821,7 +1821,7 @@ var otaModule = {
1821
1821
  devDependencies: {},
1822
1822
  files: [
1823
1823
  {
1824
- path: "src/modules/ota/useOTAUpdate.ts",
1824
+ path: "modules/ota/useOTAUpdate.ts",
1825
1825
  content: lines(
1826
1826
  'import { useCallback, useEffect, useState } from "react";',
1827
1827
  'import * as Updates from "expo-updates";',
@@ -1940,14 +1940,14 @@ var notificationModule = {
1940
1940
  devDependencies: {},
1941
1941
  files: [
1942
1942
  {
1943
- path: "src/modules/notification/index.ts",
1943
+ path: "modules/notification/index.ts",
1944
1944
  content: lines(
1945
1945
  'export { InAppNotification, useInAppNotification } from "./InAppNotification";',
1946
1946
  'export { setupNotificationHandlers } from "./InAppNotification";'
1947
1947
  )
1948
1948
  },
1949
1949
  {
1950
- path: "src/modules/notification/InAppNotification.tsx",
1950
+ path: "modules/notification/InAppNotification.tsx",
1951
1951
  content: lines(
1952
1952
  "import React, {",
1953
1953
  " createContext,",
@@ -2169,7 +2169,7 @@ var permissionModule = {
2169
2169
  devDependencies: {},
2170
2170
  files: [
2171
2171
  {
2172
- path: "src/modules/permission/index.ts",
2172
+ path: "modules/permission/index.ts",
2173
2173
  content: lines(
2174
2174
  'import * as ImagePicker from "expo-image-picker";',
2175
2175
  'import * as Camera from "expo-camera";',
@@ -2326,7 +2326,7 @@ var bottomSheetModule = {
2326
2326
  devDependencies: {},
2327
2327
  files: [
2328
2328
  {
2329
- path: "src/components/AppBottomSheet.tsx",
2329
+ path: "components/AppBottomSheet.tsx",
2330
2330
  content: lines(
2331
2331
  'import React, { useCallback, useRef } from "react";',
2332
2332
  'import { View, Text, StyleSheet } from "react-native";',
@@ -2435,7 +2435,7 @@ var flashlistModule = {
2435
2435
  devDependencies: {},
2436
2436
  files: [
2437
2437
  {
2438
- path: "src/components/AppFlashList.tsx",
2438
+ path: "components/AppFlashList.tsx",
2439
2439
  content: lines(
2440
2440
  'import React, { useCallback } from "react";',
2441
2441
  'import { View, Text, StyleSheet, type ListRenderItemInfo } from "react-native";',
@@ -2552,7 +2552,7 @@ var uiReusablesModule = {
2552
2552
  files: [
2553
2553
  // ─── lib/utils.ts ────────────────────────────────────────────────────
2554
2554
  {
2555
- path: "src/lib/utils.ts",
2555
+ path: "lib/utils.ts",
2556
2556
  content: lines(
2557
2557
  'import { type ClassValue, clsx } from "clsx";',
2558
2558
  'import { twMerge } from "tailwind-merge";',
@@ -2565,9 +2565,9 @@ var uiReusablesModule = {
2565
2565
  },
2566
2566
  // ─── components/ui/text.tsx ──────────────────────────────────────────
2567
2567
  {
2568
- path: "src/components/ui/text.tsx",
2568
+ path: "components/ui/text.tsx",
2569
2569
  content: lines(
2570
- 'import { cn } from "@/src/lib/utils";',
2570
+ 'import { cn } from "@/lib/utils";',
2571
2571
  'import { Slot } from "@rn-primitives/slot";',
2572
2572
  'import { cva, type VariantProps } from "class-variance-authority";',
2573
2573
  'import * as React from "react";',
@@ -2665,10 +2665,10 @@ var uiReusablesModule = {
2665
2665
  },
2666
2666
  // ─── components/ui/button.tsx ────────────────────────────────────────
2667
2667
  {
2668
- path: "src/components/ui/button.tsx",
2668
+ path: "components/ui/button.tsx",
2669
2669
  content: lines(
2670
- 'import { TextClassContext } from "@/src/components/ui/text";',
2671
- 'import { cn } from "@/src/lib/utils";',
2670
+ 'import { TextClassContext } from "@/components/ui/text";',
2671
+ 'import { cn } from "@/lib/utils";',
2672
2672
  'import { cva, type VariantProps } from "class-variance-authority";',
2673
2673
  'import { Platform, Pressable } from "react-native";',
2674
2674
  "",
@@ -2789,9 +2789,9 @@ var uiReusablesModule = {
2789
2789
  },
2790
2790
  // ─── components/ui/input.tsx ──────────────────────────────────────────
2791
2791
  {
2792
- path: "src/components/ui/input.tsx",
2792
+ path: "components/ui/input.tsx",
2793
2793
  content: lines(
2794
- 'import { cn } from "@/src/lib/utils";',
2794
+ 'import { cn } from "@/lib/utils";',
2795
2795
  'import { Platform, TextInput } from "react-native";',
2796
2796
  "",
2797
2797
  "function Input({",
@@ -2828,9 +2828,9 @@ var uiReusablesModule = {
2828
2828
  },
2829
2829
  // ─── components/ui/label.tsx ─────────────────────────────────────────
2830
2830
  {
2831
- path: "src/components/ui/label.tsx",
2831
+ path: "components/ui/label.tsx",
2832
2832
  content: lines(
2833
- 'import { cn } from "@/src/lib/utils";',
2833
+ 'import { cn } from "@/lib/utils";',
2834
2834
  'import * as LabelPrimitive from "@rn-primitives/label";',
2835
2835
  'import { Platform } from "react-native";',
2836
2836
  "",
@@ -2876,10 +2876,10 @@ var uiReusablesModule = {
2876
2876
  },
2877
2877
  // ─── components/ui/card.tsx ──────────────────────────────────────────
2878
2878
  {
2879
- path: "src/components/ui/card.tsx",
2879
+ path: "components/ui/card.tsx",
2880
2880
  content: lines(
2881
- 'import { Text, TextClassContext } from "@/src/components/ui/text";',
2882
- 'import { cn } from "@/src/lib/utils";',
2881
+ 'import { Text, TextClassContext } from "@/components/ui/text";',
2882
+ 'import { cn } from "@/lib/utils";',
2883
2883
  'import { View } from "react-native";',
2884
2884
  "",
2885
2885
  "function Card({",
@@ -2957,9 +2957,9 @@ var uiReusablesModule = {
2957
2957
  },
2958
2958
  // ─── components/ui/separator.tsx ──────────────────────────────────────
2959
2959
  {
2960
- path: "src/components/ui/separator.tsx",
2960
+ path: "components/ui/separator.tsx",
2961
2961
  content: lines(
2962
- 'import { cn } from "@/src/lib/utils";',
2962
+ 'import { cn } from "@/lib/utils";',
2963
2963
  'import * as SeparatorPrimitive from "@rn-primitives/separator";',
2964
2964
  "",
2965
2965
  "function Separator({",
@@ -2988,11 +2988,11 @@ var uiReusablesModule = {
2988
2988
  },
2989
2989
  // ─── components/ui/alert-dialog.tsx ──────────────────────────────────
2990
2990
  {
2991
- path: "src/components/ui/alert-dialog.tsx",
2991
+ path: "components/ui/alert-dialog.tsx",
2992
2992
  content: lines(
2993
- 'import { buttonTextVariants, buttonVariants } from "@/src/components/ui/button";',
2994
- 'import { TextClassContext } from "@/src/components/ui/text";',
2995
- 'import { cn } from "@/src/lib/utils";',
2993
+ 'import { buttonTextVariants, buttonVariants } from "@/components/ui/button";',
2994
+ 'import { TextClassContext } from "@/components/ui/text";',
2995
+ 'import { cn } from "@/lib/utils";',
2996
2996
  'import * as AlertDialogPrimitive from "@rn-primitives/alert-dialog";',
2997
2997
  'import * as React from "react";',
2998
2998
  'import { Platform, View, type ViewProps } from "react-native";',
@@ -3176,7 +3176,7 @@ import * as SplashScreen from "expo-splash-screen";
3176
3176
  import { useEffect } from "react";
3177
3177
  import { useColorScheme } from "react-native";
3178
3178
 
3179
- import { Colors } from "@/src/constants/Colors";
3179
+ import { Colors } from "@/constants/Colors";
3180
3180
 
3181
3181
  SplashScreen.preventAutoHideAsync();
3182
3182
 
@@ -3213,8 +3213,8 @@ export default function RootLayout() {
3213
3213
  content: `import { Tabs } from "expo-router";
3214
3214
  import { Platform } from "react-native";
3215
3215
 
3216
- import { Colors } from "@/src/constants/Colors";
3217
- import { useColorScheme } from "@/src/hooks/useColorScheme";
3216
+ import { Colors } from "@/constants/Colors";
3217
+ import { useColorScheme } from "@/hooks/useColorScheme";
3218
3218
 
3219
3219
  export default function TabLayout() {
3220
3220
  const colorScheme = useColorScheme();
@@ -3258,9 +3258,9 @@ export default function TabLayout() {
3258
3258
  {
3259
3259
  path: "app/(tabs)/index.tsx",
3260
3260
  content: `import { Image, StyleSheet, Platform } from "react-native";
3261
- import { HelloWave } from "@/src/components/HelloWave";
3262
- import { ThemedText } from "@/src/components/Themed";
3263
- import { ThemedView } from "@/src/components/Themed";
3261
+ import { HelloWave } from "@/components/HelloWave";
3262
+ import { ThemedText } from "@/components/Themed";
3263
+ import { ThemedView } from "@/components/Themed";
3264
3264
  import { Link } from "expo-router";
3265
3265
 
3266
3266
  export default function HomeScreen() {
@@ -3316,8 +3316,8 @@ const styles = StyleSheet.create({
3316
3316
  {
3317
3317
  path: "app/(tabs)/explore.tsx",
3318
3318
  content: `import { StyleSheet, Image, Platform } from "react-native";
3319
- import { ThemedText } from "@/src/components/Themed";
3320
- import { ThemedView } from "@/src/components/Themed";
3319
+ import { ThemedText } from "@/components/Themed";
3320
+ import { ThemedView } from "@/components/Themed";
3321
3321
 
3322
3322
  export default function ExploreScreen() {
3323
3323
  return (
@@ -3349,8 +3349,8 @@ const styles = StyleSheet.create({
3349
3349
  path: "app/+not-found.tsx",
3350
3350
  content: `import { Link, Stack } from "expo-router";
3351
3351
  import { StyleSheet } from "react-native";
3352
- import { ThemedText } from "@/src/components/Themed";
3353
- import { ThemedView } from "@/src/components/Themed";
3352
+ import { ThemedText } from "@/components/Themed";
3353
+ import { ThemedView } from "@/components/Themed";
3354
3354
 
3355
3355
  export default function NotFoundScreen() {
3356
3356
  return (
@@ -3382,10 +3382,10 @@ const styles = StyleSheet.create({
3382
3382
  },
3383
3383
  // ─── src/components/Themed.tsx ───────────────────────────────────────
3384
3384
  {
3385
- path: "src/components/Themed.tsx",
3385
+ path: "components/Themed.tsx",
3386
3386
  content: `import { Text, type TextProps, View, type ViewProps } from "react-native";
3387
- import { useColorScheme } from "@/src/hooks/useColorScheme";
3388
- import { Colors } from "@/src/constants/Colors";
3387
+ import { useColorScheme } from "@/hooks/useColorScheme";
3388
+ import { Colors } from "@/constants/Colors";
3389
3389
 
3390
3390
  /** Themed text component that adapts to light/dark mode */
3391
3391
  export function ThemedText({
@@ -3423,7 +3423,7 @@ export function ThemedView({ style, ...rest }: ViewProps) {
3423
3423
  },
3424
3424
  // ─── src/components/HelloWave.tsx ────────────────────────────────────
3425
3425
  {
3426
- path: "src/components/HelloWave.tsx",
3426
+ path: "components/HelloWave.tsx",
3427
3427
  content: `import { useEffect } from "react";
3428
3428
  import { Animated, Easing } from "react-native";
3429
3429
  import { ThemedText } from "./Themed";
@@ -3471,7 +3471,7 @@ export function HelloWave() {
3471
3471
  },
3472
3472
  // ─── src/hooks/useColorScheme.ts ─────────────────────────────────────
3473
3473
  {
3474
- path: "src/hooks/useColorScheme.ts",
3474
+ path: "hooks/useColorScheme.ts",
3475
3475
  content: `import { useColorScheme as useRNColorScheme } from "react-native";
3476
3476
 
3477
3477
  /**
@@ -3485,7 +3485,7 @@ export function useColorScheme(): "light" | "dark" {
3485
3485
  },
3486
3486
  // ─── src/constants/Colors.ts ─────────────────────────────────────────
3487
3487
  {
3488
- path: "src/constants/Colors.ts",
3488
+ path: "constants/Colors.ts",
3489
3489
  content: `/**
3490
3490
  * Color tokens for light and dark themes.
3491
3491
  * Used by Themed components and navigation theming.
@@ -3510,7 +3510,7 @@ export const Colors = {
3510
3510
  },
3511
3511
  // ─── src/types/index.ts ─────────────────────────────────────────────
3512
3512
  {
3513
- path: "src/types/index.ts",
3513
+ path: "types/index.ts",
3514
3514
  content: `/** Global type definitions */
3515
3515
 
3516
3516
  /** Extend this to declare module-specific types */
@@ -3769,7 +3769,7 @@ function generateLoginTabsTemplates(projectName) {
3769
3769
  'import { useEffect } from "react";',
3770
3770
  'import { useColorScheme } from "react-native";',
3771
3771
  "",
3772
- 'import { Colors } from "@/src/constants/Colors";',
3772
+ 'import { Colors } from "@/constants/Colors";',
3773
3773
  "",
3774
3774
  "SplashScreen.preventAutoHideAsync();",
3775
3775
  "",
@@ -3806,7 +3806,7 @@ function generateLoginTabsTemplates(projectName) {
3806
3806
  {
3807
3807
  path: "app/login.tsx",
3808
3808
  content: lines(
3809
- 'import { SignInForm } from "@/src/components/SignInForm";',
3809
+ 'import { SignInForm } from "@/components/SignInForm";',
3810
3810
  'import { View } from "react-native";',
3811
3811
  "",
3812
3812
  "export default function LoginScreen() {",
@@ -3826,8 +3826,8 @@ function generateLoginTabsTemplates(projectName) {
3826
3826
  'import { Tabs } from "expo-router";',
3827
3827
  'import { Platform } from "react-native";',
3828
3828
  "",
3829
- 'import { Colors } from "@/src/constants/Colors";',
3830
- 'import { useColorScheme } from "@/src/hooks/useColorScheme";',
3829
+ 'import { Colors } from "@/constants/Colors";',
3830
+ 'import { useColorScheme } from "@/hooks/useColorScheme";',
3831
3831
  "",
3832
3832
  "export default function TabLayout() {",
3833
3833
  " const colorScheme = useColorScheme();",
@@ -3879,7 +3879,7 @@ function generateLoginTabsTemplates(projectName) {
3879
3879
  {
3880
3880
  path: "app/(tabs)/home.tsx",
3881
3881
  content: lines(
3882
- 'import { Button } from "@/src/components/ui/button";',
3882
+ 'import { Button } from "@/components/ui/button";',
3883
3883
  "import {",
3884
3884
  " AlertDialog,",
3885
3885
  " AlertDialogAction,",
@@ -3890,8 +3890,8 @@ function generateLoginTabsTemplates(projectName) {
3890
3890
  " AlertDialogHeader,",
3891
3891
  " AlertDialogTitle,",
3892
3892
  " AlertDialogTrigger,",
3893
- '} from "@/src/components/ui/alert-dialog";',
3894
- 'import { Text } from "@/src/components/ui/text";',
3893
+ '} from "@/components/ui/alert-dialog";',
3894
+ 'import { Text } from "@/components/ui/text";',
3895
3895
  'import { View } from "react-native";',
3896
3896
  "",
3897
3897
  "export default function HomeScreen() {",
@@ -3962,8 +3962,8 @@ function generateLoginTabsTemplates(projectName) {
3962
3962
  {
3963
3963
  path: "app/(tabs)/list.tsx",
3964
3964
  content: lines(
3965
- 'import { Text } from "@/src/components/ui/text";',
3966
- 'import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/src/components/ui/card";',
3965
+ 'import { Text } from "@/components/ui/text";',
3966
+ 'import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";',
3967
3967
  'import { View, ScrollView } from "react-native";',
3968
3968
  "",
3969
3969
  "const ITEMS = Array.from({ length: 20 }, (_, i) => ({",
@@ -3997,9 +3997,9 @@ function generateLoginTabsTemplates(projectName) {
3997
3997
  {
3998
3998
  path: "app/(tabs)/mine.tsx",
3999
3999
  content: lines(
4000
- 'import { Button } from "@/src/components/ui/button";',
4001
- 'import { Card, CardContent, CardHeader, CardTitle } from "@/src/components/ui/card";',
4002
- 'import { Text } from "@/src/components/ui/text";',
4000
+ 'import { Button } from "@/components/ui/button";',
4001
+ 'import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";',
4002
+ 'import { Text } from "@/components/ui/text";',
4003
4003
  'import { View } from "react-native";',
4004
4004
  'import { router } from "expo-router";',
4005
4005
  "",
@@ -4037,20 +4037,20 @@ function generateLoginTabsTemplates(projectName) {
4037
4037
  },
4038
4038
  // ─── src/components/SignInForm.tsx ───────────────────────────────────
4039
4039
  {
4040
- path: "src/components/SignInForm.tsx",
4040
+ path: "components/SignInForm.tsx",
4041
4041
  content: lines(
4042
- 'import { Button } from "@/src/components/ui/button";',
4042
+ 'import { Button } from "@/components/ui/button";',
4043
4043
  "import {",
4044
4044
  " Card,",
4045
4045
  " CardContent,",
4046
4046
  " CardDescription,",
4047
4047
  " CardHeader,",
4048
4048
  " CardTitle,",
4049
- '} from "@/src/components/ui/card";',
4050
- 'import { Input } from "@/src/components/ui/input";',
4051
- 'import { Label } from "@/src/components/ui/label";',
4052
- 'import { Separator } from "@/src/components/ui/separator";',
4053
- 'import { Text } from "@/src/components/ui/text";',
4049
+ '} from "@/components/ui/card";',
4050
+ 'import { Input } from "@/components/ui/input";',
4051
+ 'import { Label } from "@/components/ui/label";',
4052
+ 'import { Separator } from "@/components/ui/separator";',
4053
+ 'import { Text } from "@/components/ui/text";',
4054
4054
  'import * as React from "react";',
4055
4055
  'import { Pressable, type TextInput, View } from "react-native";',
4056
4056
  'import { router } from "expo-router";',
@@ -4215,7 +4215,7 @@ function generateBasePackageJson(projectName) {
4215
4215
 
4216
4216
  // src/index.ts
4217
4217
  var import_execa = require("execa");
4218
- var CLI_VERSION = "1.3.3";
4218
+ var CLI_VERSION = "1.3.4";
4219
4219
  var CONFIG_FILE = ".expo-bbase.json";
4220
4220
  async function run() {
4221
4221
  const program = new import_commander.Command();