expo-bbase 1.3.3 → 1.3.5

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/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,",
@@ -1219,92 +1219,88 @@ var auth_google_default = authGoogleModule;
1219
1219
  var authFacebookModule = {
1220
1220
  id: "auth-facebook",
1221
1221
  name: "Facebook \u767B\u5F55",
1222
- description: "expo-facebook",
1222
+ description: "expo-auth-session + expo-web-browser\uFF08SDK 54 \u4E0D\u518D\u652F\u6301 expo-facebook\uFF09",
1223
1223
  defaultChecked: false,
1224
1224
  dependencies: {
1225
- "expo-facebook": "~13.0.0"
1225
+ "expo-auth-session": "~7.0.11",
1226
+ "expo-web-browser": "~15.0.11",
1227
+ "expo-crypto": "~15.0.9"
1226
1228
  },
1227
1229
  devDependencies: {},
1228
1230
  files: [
1229
1231
  {
1230
- path: "src/modules/auth/facebook.ts",
1232
+ path: "modules/auth/facebook.ts",
1231
1233
  content: lines(
1232
- 'import * as Facebook from "expo-facebook";',
1234
+ 'import { responseTypes } from "expo-auth-session";',
1235
+ 'import { makeRedirectUri, useAuthRequest, useAutoDiscovery } from "expo-auth-session";',
1236
+ 'import * as WebBrowser from "expo-web-browser";',
1233
1237
  "",
1238
+ "// Facebook OAuth \u914D\u7F6E",
1234
1239
  "export interface FacebookAuthConfig {",
1235
- " appId: string;",
1236
- " appName: string;",
1240
+ " clientId: string; // Facebook App ID",
1237
1241
  "}",
1238
1242
  "",
1239
- "export async function setupFacebookAuth(config: FacebookAuthConfig): Promise<void> {",
1240
- " await Facebook.initializeAsync({",
1241
- " appId: config.appId,",
1242
- " appName: config.appName,",
1243
- " });",
1244
- "}",
1243
+ "// Facebook OAuth \u7AEF\u70B9",
1244
+ 'const FACEBOOK_AUTH_ENDPOINT = "https://www.facebook.com/v18.0/dialog/oauth";',
1245
+ 'const FACEBOOK_TOKEN_ENDPOINT = "https://graph.facebook.com/v18.0/oauth/access_token";',
1245
1246
  "",
1246
- "export async function signInWithFacebook(): Promise<{",
1247
- " token: string | null;",
1248
- " userId: string | null;",
1249
- " userName: string | null;",
1250
- " error: string | null;",
1251
- "}> {",
1252
- " try {",
1253
- " const result = await Facebook.logInWithReadPermissionsAsync({",
1254
- ' permissions: ["public_profile", "email"],',
1255
- " });",
1247
+ "// \u786E\u4FDD WebBrowser \u56DE\u8C03\u5B8C\u6210\u65F6\u5173\u95ED",
1248
+ "WebBrowser.maybeCompleteAuthSession();",
1256
1249
  "",
1257
- ' if (result.type === "success") {',
1258
- " const response = await fetch(",
1259
- " `https://graph.facebook.com/me?access_token=${result.token}&fields=id,name,email`",
1260
- " );",
1261
- " const userData = await response.json();",
1250
+ "/**",
1251
+ " * \u4F7F\u7528 expo-auth-session \u5B9E\u73B0 Facebook \u767B\u5F55",
1252
+ " *",
1253
+ " * \u7528\u6CD5\uFF1A",
1254
+ " * 1. \u5728 Facebook Developer Console \u521B\u5EFA\u5E94\u7528\uFF0C\u83B7\u53D6 App ID",
1255
+ " * 2. \u914D\u7F6E OAuth \u91CD\u5B9A\u5411 URI",
1256
+ " * 3. \u5728\u7EC4\u4EF6\u4E2D\u4F7F\u7528 useFacebookAuth hook",
1257
+ " *",
1258
+ " * \u6CE8\u610F\uFF1ASDK 54 \u4E0D\u518D\u652F\u6301 expo-facebook\uFF0C\u6539\u7528 expo-auth-session",
1259
+ " */",
1262
1260
  "",
1263
- " return {",
1264
- " token: result.token,",
1265
- " userId: userData.id,",
1266
- " userName: userData.name,",
1267
- " error: null,",
1268
- " };",
1269
- " } else {",
1270
- " return {",
1271
- " token: null,",
1272
- " userId: null,",
1273
- " userName: null,",
1274
- ' error: "\u7528\u6237\u53D6\u6D88\u4E86 Facebook \u767B\u5F55",',
1275
- " };",
1261
+ "export function useFacebookAuth(config: FacebookAuthConfig) {",
1262
+ " const redirectUri = makeRedirectUri({",
1263
+ " scheme: 'your-app-scheme', // \u66FF\u6362\u4E3A\u4F60\u7684 app scheme",
1264
+ " });",
1265
+ "",
1266
+ " const [request, response, promptAsync] = useAuthRequest(",
1267
+ " {",
1268
+ " clientId: config.clientId,",
1269
+ " scopes: ['public_profile', 'email'],",
1270
+ " redirectUri,",
1271
+ " },",
1272
+ " {",
1273
+ " authorizationEndpoint: FACEBOOK_AUTH_ENDPOINT,",
1274
+ " tokenEndpoint: FACEBOOK_TOKEN_ENDPOINT,",
1276
1275
  " }",
1277
- " } catch (error) {",
1278
- ' console.error("[FacebookAuth] Error:", error);',
1279
- " return {",
1280
- " token: null,",
1281
- " userId: null,",
1282
- " userName: null,",
1283
- ' error: "Facebook \u767B\u5F55\u5931\u8D25",',
1284
- " };",
1285
- " }",
1276
+ " );",
1277
+ "",
1278
+ " return { request, response, promptAsync };",
1286
1279
  "}",
1287
1280
  "",
1288
- "export async function signOutFacebook(): Promise<void> {",
1289
- " try {",
1290
- " await Facebook.logOutAsync();",
1291
- " } catch (error) {",
1292
- ' console.error("[FacebookAuth] Sign out error:", error);',
1293
- " }",
1281
+ "/**",
1282
+ " * \u4ECE Facebook OAuth \u54CD\u5E94\u4E2D\u63D0\u53D6\u7528\u6237\u4FE1\u606F",
1283
+ " */",
1284
+ "export async function getFacebookUserInfo(accessToken: string): Promise<{",
1285
+ " userId: string;",
1286
+ " userName: string;",
1287
+ " email: string | null;",
1288
+ "}> {",
1289
+ " const response = await fetch(",
1290
+ " `https://graph.facebook.com/me?access_token=${accessToken}&fields=id,name,email`",
1291
+ " );",
1292
+ " const userData = await response.json();",
1293
+ "",
1294
+ " return {",
1295
+ " userId: userData.id,",
1296
+ " userName: userData.name,",
1297
+ " email: userData.email ?? null,",
1298
+ " };",
1294
1299
  "}"
1295
1300
  )
1296
1301
  }
1297
1302
  ],
1298
- appConfig: {
1299
- plugins: [
1300
- [
1301
- "expo-facebook",
1302
- {
1303
- appId: "YOUR_FACEBOOK_APP_ID"
1304
- }
1305
- ]
1306
- ]
1307
- }
1303
+ appConfig: {}
1308
1304
  };
1309
1305
  var auth_facebook_default = authFacebookModule;
1310
1306
 
@@ -1320,7 +1316,7 @@ var authAppleModule = {
1320
1316
  devDependencies: {},
1321
1317
  files: [
1322
1318
  {
1323
- path: "src/modules/auth/apple.ts",
1319
+ path: "modules/auth/apple.ts",
1324
1320
  content: lines(
1325
1321
  'import * as AppleAuthentication from "expo-apple-authentication";',
1326
1322
  'import { Platform } from "react-native";',
@@ -1415,7 +1411,7 @@ var webviewModule = {
1415
1411
  devDependencies: {},
1416
1412
  files: [
1417
1413
  {
1418
- path: "src/modules/webview/WebViewContainer.tsx",
1414
+ path: "modules/webview/WebViewContainer.tsx",
1419
1415
  content: lines(
1420
1416
  'import React, { useCallback, useRef } from "react";',
1421
1417
  'import { View, StyleSheet, ActivityIndicator } from "react-native";',
@@ -1523,7 +1519,7 @@ var webviewModule = {
1523
1519
  )
1524
1520
  },
1525
1521
  {
1526
- path: "src/modules/webview/bridge.ts",
1522
+ path: "modules/webview/bridge.ts",
1527
1523
  content: lines(
1528
1524
  "export interface BridgeMessage {",
1529
1525
  " type: string;",
@@ -1593,7 +1589,7 @@ var i18nModule = {
1593
1589
  devDependencies: {},
1594
1590
  files: [
1595
1591
  {
1596
- path: "src/modules/i18n/index.ts",
1592
+ path: "modules/i18n/index.ts",
1597
1593
  content: lines(
1598
1594
  'import i18n from "i18next";',
1599
1595
  'import { initReactI18next } from "react-i18next";',
@@ -1628,7 +1624,7 @@ var i18nModule = {
1628
1624
  )
1629
1625
  },
1630
1626
  {
1631
- path: "src/modules/i18n/locales/en.json",
1627
+ path: "modules/i18n/locales/en.json",
1632
1628
  content: [
1633
1629
  "{",
1634
1630
  ' "common": {',
@@ -1672,7 +1668,7 @@ var i18nModule = {
1672
1668
  ].join("\n")
1673
1669
  },
1674
1670
  {
1675
- path: "src/modules/i18n/locales/zh.json",
1671
+ path: "modules/i18n/locales/zh.json",
1676
1672
  content: [
1677
1673
  "{",
1678
1674
  ' "common": {',
@@ -1747,13 +1743,13 @@ var animationModule = {
1747
1743
  `
1748
1744
  },
1749
1745
  {
1750
- path: "src/modules/animation/index.ts",
1746
+ path: "modules/animation/index.ts",
1751
1747
  content: lines(
1752
1748
  'export { FadeIn, FadeOut, SlideIn, SlideOut, ScaleIn, ScaleOut } from "./transitions";'
1753
1749
  )
1754
1750
  },
1755
1751
  {
1756
- path: "src/modules/animation/transitions.ts",
1752
+ path: "modules/animation/transitions.ts",
1757
1753
  content: lines(
1758
1754
  "import Animated, {",
1759
1755
  " FadeIn as ReanimatedFadeIn,",
@@ -1821,7 +1817,7 @@ var otaModule = {
1821
1817
  devDependencies: {},
1822
1818
  files: [
1823
1819
  {
1824
- path: "src/modules/ota/useOTAUpdate.ts",
1820
+ path: "modules/ota/useOTAUpdate.ts",
1825
1821
  content: lines(
1826
1822
  'import { useCallback, useEffect, useState } from "react";',
1827
1823
  'import * as Updates from "expo-updates";',
@@ -1940,14 +1936,14 @@ var notificationModule = {
1940
1936
  devDependencies: {},
1941
1937
  files: [
1942
1938
  {
1943
- path: "src/modules/notification/index.ts",
1939
+ path: "modules/notification/index.ts",
1944
1940
  content: lines(
1945
1941
  'export { InAppNotification, useInAppNotification } from "./InAppNotification";',
1946
1942
  'export { setupNotificationHandlers } from "./InAppNotification";'
1947
1943
  )
1948
1944
  },
1949
1945
  {
1950
- path: "src/modules/notification/InAppNotification.tsx",
1946
+ path: "modules/notification/InAppNotification.tsx",
1951
1947
  content: lines(
1952
1948
  "import React, {",
1953
1949
  " createContext,",
@@ -2169,7 +2165,7 @@ var permissionModule = {
2169
2165
  devDependencies: {},
2170
2166
  files: [
2171
2167
  {
2172
- path: "src/modules/permission/index.ts",
2168
+ path: "modules/permission/index.ts",
2173
2169
  content: lines(
2174
2170
  'import * as ImagePicker from "expo-image-picker";',
2175
2171
  'import * as Camera from "expo-camera";',
@@ -2326,7 +2322,7 @@ var bottomSheetModule = {
2326
2322
  devDependencies: {},
2327
2323
  files: [
2328
2324
  {
2329
- path: "src/components/AppBottomSheet.tsx",
2325
+ path: "components/AppBottomSheet.tsx",
2330
2326
  content: lines(
2331
2327
  'import React, { useCallback, useRef } from "react";',
2332
2328
  'import { View, Text, StyleSheet } from "react-native";',
@@ -2435,7 +2431,7 @@ var flashlistModule = {
2435
2431
  devDependencies: {},
2436
2432
  files: [
2437
2433
  {
2438
- path: "src/components/AppFlashList.tsx",
2434
+ path: "components/AppFlashList.tsx",
2439
2435
  content: lines(
2440
2436
  'import React, { useCallback } from "react";',
2441
2437
  'import { View, Text, StyleSheet, type ListRenderItemInfo } from "react-native";',
@@ -2552,7 +2548,7 @@ var uiReusablesModule = {
2552
2548
  files: [
2553
2549
  // ─── lib/utils.ts ────────────────────────────────────────────────────
2554
2550
  {
2555
- path: "src/lib/utils.ts",
2551
+ path: "lib/utils.ts",
2556
2552
  content: lines(
2557
2553
  'import { type ClassValue, clsx } from "clsx";',
2558
2554
  'import { twMerge } from "tailwind-merge";',
@@ -2565,9 +2561,9 @@ var uiReusablesModule = {
2565
2561
  },
2566
2562
  // ─── components/ui/text.tsx ──────────────────────────────────────────
2567
2563
  {
2568
- path: "src/components/ui/text.tsx",
2564
+ path: "components/ui/text.tsx",
2569
2565
  content: lines(
2570
- 'import { cn } from "@/src/lib/utils";',
2566
+ 'import { cn } from "@/lib/utils";',
2571
2567
  'import { Slot } from "@rn-primitives/slot";',
2572
2568
  'import { cva, type VariantProps } from "class-variance-authority";',
2573
2569
  'import * as React from "react";',
@@ -2665,10 +2661,10 @@ var uiReusablesModule = {
2665
2661
  },
2666
2662
  // ─── components/ui/button.tsx ────────────────────────────────────────
2667
2663
  {
2668
- path: "src/components/ui/button.tsx",
2664
+ path: "components/ui/button.tsx",
2669
2665
  content: lines(
2670
- 'import { TextClassContext } from "@/src/components/ui/text";',
2671
- 'import { cn } from "@/src/lib/utils";',
2666
+ 'import { TextClassContext } from "@/components/ui/text";',
2667
+ 'import { cn } from "@/lib/utils";',
2672
2668
  'import { cva, type VariantProps } from "class-variance-authority";',
2673
2669
  'import { Platform, Pressable } from "react-native";',
2674
2670
  "",
@@ -2789,9 +2785,9 @@ var uiReusablesModule = {
2789
2785
  },
2790
2786
  // ─── components/ui/input.tsx ──────────────────────────────────────────
2791
2787
  {
2792
- path: "src/components/ui/input.tsx",
2788
+ path: "components/ui/input.tsx",
2793
2789
  content: lines(
2794
- 'import { cn } from "@/src/lib/utils";',
2790
+ 'import { cn } from "@/lib/utils";',
2795
2791
  'import { Platform, TextInput } from "react-native";',
2796
2792
  "",
2797
2793
  "function Input({",
@@ -2828,9 +2824,9 @@ var uiReusablesModule = {
2828
2824
  },
2829
2825
  // ─── components/ui/label.tsx ─────────────────────────────────────────
2830
2826
  {
2831
- path: "src/components/ui/label.tsx",
2827
+ path: "components/ui/label.tsx",
2832
2828
  content: lines(
2833
- 'import { cn } from "@/src/lib/utils";',
2829
+ 'import { cn } from "@/lib/utils";',
2834
2830
  'import * as LabelPrimitive from "@rn-primitives/label";',
2835
2831
  'import { Platform } from "react-native";',
2836
2832
  "",
@@ -2876,10 +2872,10 @@ var uiReusablesModule = {
2876
2872
  },
2877
2873
  // ─── components/ui/card.tsx ──────────────────────────────────────────
2878
2874
  {
2879
- path: "src/components/ui/card.tsx",
2875
+ path: "components/ui/card.tsx",
2880
2876
  content: lines(
2881
- 'import { Text, TextClassContext } from "@/src/components/ui/text";',
2882
- 'import { cn } from "@/src/lib/utils";',
2877
+ 'import { Text, TextClassContext } from "@/components/ui/text";',
2878
+ 'import { cn } from "@/lib/utils";',
2883
2879
  'import { View } from "react-native";',
2884
2880
  "",
2885
2881
  "function Card({",
@@ -2957,9 +2953,9 @@ var uiReusablesModule = {
2957
2953
  },
2958
2954
  // ─── components/ui/separator.tsx ──────────────────────────────────────
2959
2955
  {
2960
- path: "src/components/ui/separator.tsx",
2956
+ path: "components/ui/separator.tsx",
2961
2957
  content: lines(
2962
- 'import { cn } from "@/src/lib/utils";',
2958
+ 'import { cn } from "@/lib/utils";',
2963
2959
  'import * as SeparatorPrimitive from "@rn-primitives/separator";',
2964
2960
  "",
2965
2961
  "function Separator({",
@@ -2988,11 +2984,11 @@ var uiReusablesModule = {
2988
2984
  },
2989
2985
  // ─── components/ui/alert-dialog.tsx ──────────────────────────────────
2990
2986
  {
2991
- path: "src/components/ui/alert-dialog.tsx",
2987
+ path: "components/ui/alert-dialog.tsx",
2992
2988
  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";',
2989
+ 'import { buttonTextVariants, buttonVariants } from "@/components/ui/button";',
2990
+ 'import { TextClassContext } from "@/components/ui/text";',
2991
+ 'import { cn } from "@/lib/utils";',
2996
2992
  'import * as AlertDialogPrimitive from "@rn-primitives/alert-dialog";',
2997
2993
  'import * as React from "react";',
2998
2994
  'import { Platform, View, type ViewProps } from "react-native";',
@@ -3176,7 +3172,7 @@ import * as SplashScreen from "expo-splash-screen";
3176
3172
  import { useEffect } from "react";
3177
3173
  import { useColorScheme } from "react-native";
3178
3174
 
3179
- import { Colors } from "@/src/constants/Colors";
3175
+ import { Colors } from "@/constants/Colors";
3180
3176
 
3181
3177
  SplashScreen.preventAutoHideAsync();
3182
3178
 
@@ -3213,8 +3209,8 @@ export default function RootLayout() {
3213
3209
  content: `import { Tabs } from "expo-router";
3214
3210
  import { Platform } from "react-native";
3215
3211
 
3216
- import { Colors } from "@/src/constants/Colors";
3217
- import { useColorScheme } from "@/src/hooks/useColorScheme";
3212
+ import { Colors } from "@/constants/Colors";
3213
+ import { useColorScheme } from "@/hooks/useColorScheme";
3218
3214
 
3219
3215
  export default function TabLayout() {
3220
3216
  const colorScheme = useColorScheme();
@@ -3258,9 +3254,9 @@ export default function TabLayout() {
3258
3254
  {
3259
3255
  path: "app/(tabs)/index.tsx",
3260
3256
  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";
3257
+ import { HelloWave } from "@/components/HelloWave";
3258
+ import { ThemedText } from "@/components/Themed";
3259
+ import { ThemedView } from "@/components/Themed";
3264
3260
  import { Link } from "expo-router";
3265
3261
 
3266
3262
  export default function HomeScreen() {
@@ -3316,8 +3312,8 @@ const styles = StyleSheet.create({
3316
3312
  {
3317
3313
  path: "app/(tabs)/explore.tsx",
3318
3314
  content: `import { StyleSheet, Image, Platform } from "react-native";
3319
- import { ThemedText } from "@/src/components/Themed";
3320
- import { ThemedView } from "@/src/components/Themed";
3315
+ import { ThemedText } from "@/components/Themed";
3316
+ import { ThemedView } from "@/components/Themed";
3321
3317
 
3322
3318
  export default function ExploreScreen() {
3323
3319
  return (
@@ -3349,8 +3345,8 @@ const styles = StyleSheet.create({
3349
3345
  path: "app/+not-found.tsx",
3350
3346
  content: `import { Link, Stack } from "expo-router";
3351
3347
  import { StyleSheet } from "react-native";
3352
- import { ThemedText } from "@/src/components/Themed";
3353
- import { ThemedView } from "@/src/components/Themed";
3348
+ import { ThemedText } from "@/components/Themed";
3349
+ import { ThemedView } from "@/components/Themed";
3354
3350
 
3355
3351
  export default function NotFoundScreen() {
3356
3352
  return (
@@ -3382,10 +3378,10 @@ const styles = StyleSheet.create({
3382
3378
  },
3383
3379
  // ─── src/components/Themed.tsx ───────────────────────────────────────
3384
3380
  {
3385
- path: "src/components/Themed.tsx",
3381
+ path: "components/Themed.tsx",
3386
3382
  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";
3383
+ import { useColorScheme } from "@/hooks/useColorScheme";
3384
+ import { Colors } from "@/constants/Colors";
3389
3385
 
3390
3386
  /** Themed text component that adapts to light/dark mode */
3391
3387
  export function ThemedText({
@@ -3423,7 +3419,7 @@ export function ThemedView({ style, ...rest }: ViewProps) {
3423
3419
  },
3424
3420
  // ─── src/components/HelloWave.tsx ────────────────────────────────────
3425
3421
  {
3426
- path: "src/components/HelloWave.tsx",
3422
+ path: "components/HelloWave.tsx",
3427
3423
  content: `import { useEffect } from "react";
3428
3424
  import { Animated, Easing } from "react-native";
3429
3425
  import { ThemedText } from "./Themed";
@@ -3471,7 +3467,7 @@ export function HelloWave() {
3471
3467
  },
3472
3468
  // ─── src/hooks/useColorScheme.ts ─────────────────────────────────────
3473
3469
  {
3474
- path: "src/hooks/useColorScheme.ts",
3470
+ path: "hooks/useColorScheme.ts",
3475
3471
  content: `import { useColorScheme as useRNColorScheme } from "react-native";
3476
3472
 
3477
3473
  /**
@@ -3485,7 +3481,7 @@ export function useColorScheme(): "light" | "dark" {
3485
3481
  },
3486
3482
  // ─── src/constants/Colors.ts ─────────────────────────────────────────
3487
3483
  {
3488
- path: "src/constants/Colors.ts",
3484
+ path: "constants/Colors.ts",
3489
3485
  content: `/**
3490
3486
  * Color tokens for light and dark themes.
3491
3487
  * Used by Themed components and navigation theming.
@@ -3510,7 +3506,7 @@ export const Colors = {
3510
3506
  },
3511
3507
  // ─── src/types/index.ts ─────────────────────────────────────────────
3512
3508
  {
3513
- path: "src/types/index.ts",
3509
+ path: "types/index.ts",
3514
3510
  content: `/** Global type definitions */
3515
3511
 
3516
3512
  /** Extend this to declare module-specific types */
@@ -3769,7 +3765,7 @@ function generateLoginTabsTemplates(projectName) {
3769
3765
  'import { useEffect } from "react";',
3770
3766
  'import { useColorScheme } from "react-native";',
3771
3767
  "",
3772
- 'import { Colors } from "@/src/constants/Colors";',
3768
+ 'import { Colors } from "@/constants/Colors";',
3773
3769
  "",
3774
3770
  "SplashScreen.preventAutoHideAsync();",
3775
3771
  "",
@@ -3806,7 +3802,7 @@ function generateLoginTabsTemplates(projectName) {
3806
3802
  {
3807
3803
  path: "app/login.tsx",
3808
3804
  content: lines(
3809
- 'import { SignInForm } from "@/src/components/SignInForm";',
3805
+ 'import { SignInForm } from "@/components/SignInForm";',
3810
3806
  'import { View } from "react-native";',
3811
3807
  "",
3812
3808
  "export default function LoginScreen() {",
@@ -3826,8 +3822,8 @@ function generateLoginTabsTemplates(projectName) {
3826
3822
  'import { Tabs } from "expo-router";',
3827
3823
  'import { Platform } from "react-native";',
3828
3824
  "",
3829
- 'import { Colors } from "@/src/constants/Colors";',
3830
- 'import { useColorScheme } from "@/src/hooks/useColorScheme";',
3825
+ 'import { Colors } from "@/constants/Colors";',
3826
+ 'import { useColorScheme } from "@/hooks/useColorScheme";',
3831
3827
  "",
3832
3828
  "export default function TabLayout() {",
3833
3829
  " const colorScheme = useColorScheme();",
@@ -3879,7 +3875,7 @@ function generateLoginTabsTemplates(projectName) {
3879
3875
  {
3880
3876
  path: "app/(tabs)/home.tsx",
3881
3877
  content: lines(
3882
- 'import { Button } from "@/src/components/ui/button";',
3878
+ 'import { Button } from "@/components/ui/button";',
3883
3879
  "import {",
3884
3880
  " AlertDialog,",
3885
3881
  " AlertDialogAction,",
@@ -3890,8 +3886,8 @@ function generateLoginTabsTemplates(projectName) {
3890
3886
  " AlertDialogHeader,",
3891
3887
  " AlertDialogTitle,",
3892
3888
  " AlertDialogTrigger,",
3893
- '} from "@/src/components/ui/alert-dialog";',
3894
- 'import { Text } from "@/src/components/ui/text";',
3889
+ '} from "@/components/ui/alert-dialog";',
3890
+ 'import { Text } from "@/components/ui/text";',
3895
3891
  'import { View } from "react-native";',
3896
3892
  "",
3897
3893
  "export default function HomeScreen() {",
@@ -3962,8 +3958,8 @@ function generateLoginTabsTemplates(projectName) {
3962
3958
  {
3963
3959
  path: "app/(tabs)/list.tsx",
3964
3960
  content: lines(
3965
- 'import { Text } from "@/src/components/ui/text";',
3966
- 'import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/src/components/ui/card";',
3961
+ 'import { Text } from "@/components/ui/text";',
3962
+ 'import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";',
3967
3963
  'import { View, ScrollView } from "react-native";',
3968
3964
  "",
3969
3965
  "const ITEMS = Array.from({ length: 20 }, (_, i) => ({",
@@ -3997,9 +3993,9 @@ function generateLoginTabsTemplates(projectName) {
3997
3993
  {
3998
3994
  path: "app/(tabs)/mine.tsx",
3999
3995
  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";',
3996
+ 'import { Button } from "@/components/ui/button";',
3997
+ 'import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";',
3998
+ 'import { Text } from "@/components/ui/text";',
4003
3999
  'import { View } from "react-native";',
4004
4000
  'import { router } from "expo-router";',
4005
4001
  "",
@@ -4037,20 +4033,20 @@ function generateLoginTabsTemplates(projectName) {
4037
4033
  },
4038
4034
  // ─── src/components/SignInForm.tsx ───────────────────────────────────
4039
4035
  {
4040
- path: "src/components/SignInForm.tsx",
4036
+ path: "components/SignInForm.tsx",
4041
4037
  content: lines(
4042
- 'import { Button } from "@/src/components/ui/button";',
4038
+ 'import { Button } from "@/components/ui/button";',
4043
4039
  "import {",
4044
4040
  " Card,",
4045
4041
  " CardContent,",
4046
4042
  " CardDescription,",
4047
4043
  " CardHeader,",
4048
4044
  " 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";',
4045
+ '} from "@/components/ui/card";',
4046
+ 'import { Input } from "@/components/ui/input";',
4047
+ 'import { Label } from "@/components/ui/label";',
4048
+ 'import { Separator } from "@/components/ui/separator";',
4049
+ 'import { Text } from "@/components/ui/text";',
4054
4050
  'import * as React from "react";',
4055
4051
  'import { Pressable, type TextInput, View } from "react-native";',
4056
4052
  'import { router } from "expo-router";',
@@ -4215,7 +4211,7 @@ function generateBasePackageJson(projectName) {
4215
4211
 
4216
4212
  // src/index.ts
4217
4213
  var import_execa = require("execa");
4218
- var CLI_VERSION = "1.3.3";
4214
+ var CLI_VERSION = "1.3.5";
4219
4215
  var CONFIG_FILE = ".expo-bbase.json";
4220
4216
  async function run() {
4221
4217
  const program = new import_commander.Command();