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 +53 -22
- package/dist/index.js +86 -86
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
├──
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
│ ├──
|
|
155
|
-
│ │ ├──
|
|
156
|
-
│ │
|
|
157
|
-
│ │
|
|
158
|
-
│ │
|
|
159
|
-
│ │
|
|
160
|
-
│ │
|
|
161
|
-
│ │
|
|
162
|
-
│
|
|
163
|
-
│
|
|
164
|
-
│
|
|
165
|
-
|
|
166
|
-
│
|
|
167
|
-
|
|
168
|
-
│ ├──
|
|
169
|
-
│
|
|
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.
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
429
|
+
path: "stores/index.ts",
|
|
430
430
|
content: lines('export { useUserStore } from "./slices/userSlice";')
|
|
431
431
|
},
|
|
432
432
|
{
|
|
433
|
-
path: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
2568
|
+
path: "components/ui/text.tsx",
|
|
2569
2569
|
content: lines(
|
|
2570
|
-
'import { cn } from "@/
|
|
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: "
|
|
2668
|
+
path: "components/ui/button.tsx",
|
|
2669
2669
|
content: lines(
|
|
2670
|
-
'import { TextClassContext } from "@/
|
|
2671
|
-
'import { cn } from "@/
|
|
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: "
|
|
2792
|
+
path: "components/ui/input.tsx",
|
|
2793
2793
|
content: lines(
|
|
2794
|
-
'import { cn } from "@/
|
|
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: "
|
|
2831
|
+
path: "components/ui/label.tsx",
|
|
2832
2832
|
content: lines(
|
|
2833
|
-
'import { cn } from "@/
|
|
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: "
|
|
2879
|
+
path: "components/ui/card.tsx",
|
|
2880
2880
|
content: lines(
|
|
2881
|
-
'import { Text, TextClassContext } from "@/
|
|
2882
|
-
'import { cn } from "@/
|
|
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: "
|
|
2960
|
+
path: "components/ui/separator.tsx",
|
|
2961
2961
|
content: lines(
|
|
2962
|
-
'import { cn } from "@/
|
|
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: "
|
|
2991
|
+
path: "components/ui/alert-dialog.tsx",
|
|
2992
2992
|
content: lines(
|
|
2993
|
-
'import { buttonTextVariants, buttonVariants } from "@/
|
|
2994
|
-
'import { TextClassContext } from "@/
|
|
2995
|
-
'import { cn } from "@/
|
|
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 "@/
|
|
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 "@/
|
|
3217
|
-
import { useColorScheme } from "@/
|
|
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 "@/
|
|
3262
|
-
import { ThemedText } from "@/
|
|
3263
|
-
import { ThemedView } from "@/
|
|
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 "@/
|
|
3320
|
-
import { ThemedView } from "@/
|
|
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 "@/
|
|
3353
|
-
import { ThemedView } from "@/
|
|
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: "
|
|
3385
|
+
path: "components/Themed.tsx",
|
|
3386
3386
|
content: `import { Text, type TextProps, View, type ViewProps } from "react-native";
|
|
3387
|
-
import { useColorScheme } from "@/
|
|
3388
|
-
import { Colors } from "@/
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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 "@/
|
|
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 "@/
|
|
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 "@/
|
|
3830
|
-
'import { useColorScheme } from "@/
|
|
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 "@/
|
|
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 "@/
|
|
3894
|
-
'import { Text } from "@/
|
|
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 "@/
|
|
3966
|
-
'import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/
|
|
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 "@/
|
|
4001
|
-
'import { Card, CardContent, CardHeader, CardTitle } from "@/
|
|
4002
|
-
'import { Text } from "@/
|
|
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: "
|
|
4040
|
+
path: "components/SignInForm.tsx",
|
|
4041
4041
|
content: lines(
|
|
4042
|
-
'import { Button } from "@/
|
|
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 "@/
|
|
4050
|
-
'import { Input } from "@/
|
|
4051
|
-
'import { Label } from "@/
|
|
4052
|
-
'import { Separator } from "@/
|
|
4053
|
-
'import { Text } from "@/
|
|
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.
|
|
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();
|