@coze-arch/cli 0.0.1-alpha.a37c60 → 0.0.1-alpha.a8e799

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 (32) hide show
  1. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +10 -6
  2. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +2 -2
  3. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +3 -4
  4. package/lib/__templates__/expo/README.md +58 -8
  5. package/lib/__templates__/expo/_gitignore +1 -1
  6. package/lib/__templates__/expo/_npmrc +2 -4
  7. package/lib/__templates__/expo/client/app/_layout.tsx +1 -1
  8. package/lib/__templates__/expo/client/app/index.ts +1 -0
  9. package/lib/__templates__/expo/client/app.config.ts +71 -0
  10. package/lib/__templates__/expo/client/package.json +92 -0
  11. package/lib/__templates__/expo/client/screens/home/index.tsx +0 -1
  12. package/lib/__templates__/expo/client/tsconfig.json +24 -0
  13. package/lib/__templates__/expo/package.json +7 -106
  14. package/lib/__templates__/expo/pnpm-lock.yaml +111 -2130
  15. package/lib/__templates__/expo/pnpm-workspace.yaml +3 -0
  16. package/lib/__templates__/expo/server/package.json +17 -0
  17. package/lib/__templates__/expo/tsconfig.json +1 -24
  18. package/lib/__templates__/nextjs/next.config.ts +0 -1
  19. package/lib/__templates__/templates.json +0 -27
  20. package/lib/cli.js +31 -144
  21. package/package.json +3 -5
  22. package/lib/__templates__/expo/app.json +0 -63
  23. package/lib/__templates__/expo/babel.config.js +0 -19
  24. package/lib/__templates__/expo/client/app/(tabs)/_layout.tsx +0 -43
  25. package/lib/__templates__/expo/client/app/(tabs)/home.tsx +0 -1
  26. package/lib/__templates__/expo/client/app/(tabs)/index.tsx +0 -7
  27. package/lib/__templates__/expo/client/app/+not-found.tsx +0 -79
  28. package/lib/__templates__/expo/client/index.js +0 -12
  29. /package/lib/__templates__/expo/{eslint-formatter-simple.mjs → client/eslint-formatter-simple.mjs} +0 -0
  30. /package/lib/__templates__/expo/{eslint.config.mjs → client/eslint.config.mjs} +0 -0
  31. /package/lib/__templates__/expo/{metro.config.js → client/metro.config.js} +0 -0
  32. /package/lib/__templates__/expo/{src → server/src}/index.ts +0 -0
@@ -130,13 +130,18 @@ wait_port_connectable() {
130
130
 
131
131
  start_expo() {
132
132
  local offline="${1:-0}"
133
+
134
+ pushd ./client
135
+
133
136
  if [ "$offline" = "1" ]; then
134
- EXPO_OFFLINE=1 EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --port "$EXPO_PORT" > logs/expo.log 2>&1 &
137
+ EXPO_OFFLINE=1 EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --clear --port "$EXPO_PORT" > ../logs/expo.log 2>&1 &
135
138
  else
136
- EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --port "$EXPO_PORT" > logs/expo.log 2>&1 &
139
+ EXPO_NO_DOCTOR=1 EXPO_PUBLIC_BACKEND_BASE_URL="$EXPO_PUBLIC_BACKEND_BASE_URL" EXPO_PACKAGER_PROXY_URL="$EXPO_PACKAGER_PROXY_URL" nohup npx expo start --clear --port "$EXPO_PORT" > ../logs/expo.log 2>&1 &
137
140
  fi
138
141
  EXPO_PID=$!
139
142
  echo "$EXPO_PID"
143
+
144
+ popd
140
145
  }
141
146
 
142
147
  detect_expo_fetch_failed() {
@@ -181,8 +186,8 @@ ensure_port EXPO_PORT "$EXPO_PORT"
181
186
 
182
187
  # ==================== 启动 Server 服务 ====================
183
188
  write_log "INFO" "==================== 启动 server 服务 ===================="
184
- write_log "INFO" "正在执行:npm run server"
185
- PORT="$SERVER_PORT" nohup npm run server > logs/app.log 2>&1 &
189
+ write_log "INFO" "正在执行:npm run dev"
190
+ PORT="$SERVER_PORT" nohup npm run dev --prefix ./server > logs/app.log 2>&1 &
186
191
  SERVER_PID=$!
187
192
  if [ -z "${SERVER_PID}" ]; then
188
193
  write_log "ERROR" "无法获取 server 后台进程 PID"
@@ -190,8 +195,7 @@ fi
190
195
  write_log "INFO" "server 服务已启动,进程 ID:${SERVER_PID:-unknown}"
191
196
 
192
197
  write_log "INFO" "==================== 启动 Expo 项目 ===================="
193
- write_log "INFO" "正在执行:npx expo start --port ${EXPO_PORT}"
194
- write_log "INFO" "开始启动 Expo 服务"
198
+ write_log "INFO" "开始启动 Expo 服务,端口 ${EXPO_PORT}"
195
199
  EXPO_PID=$(start_expo 0)
196
200
  if detect_expo_fetch_failed 8; then
197
201
  write_log "WARN" "Expo 启动检测到网络错误:TypeError: fetch failed,启用离线模式重试"
@@ -40,8 +40,8 @@ fi
40
40
  info "==================== 依赖安装完成!====================\n"
41
41
 
42
42
  info "==================== dist打包 ===================="
43
- info "开始执行:pnpm run server:build"
44
- (cd "$ROOT_DIR" && pnpm run server:build) || error "dist打包失败"
43
+ info "开始执行:npm run build --prefix server"
44
+ (cd "$ROOT_DIR" && npm run build --prefix ./server) || error "dist打包失败"
45
45
  info "==================== dist打包完成!====================\n"
46
46
 
47
47
  info "下一步:执行 ./prod_run.sh 启动服务"
@@ -2,8 +2,7 @@
2
2
  # 产物部署使用
3
3
  set -euo pipefail
4
4
 
5
- ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
6
-
5
+ ROOT_DIR="$(pwd)"
7
6
 
8
7
  HOST="${HOST:-0.0.0.0}"
9
8
  PORT="${PORT:-5000}"
@@ -30,6 +29,6 @@ check_command() {
30
29
  check_command "pnpm"
31
30
  check_command "npm"
32
31
 
33
- info "开始执行:pnpm run server:prod"
34
- (cd "$ROOT_DIR" && PORT="$PORT" pnpm run server:prod) || error "服务启动失败"
32
+ info "开始执行:npm run start"
33
+ (cd "$ROOT_DIR" && PORT="$PORT" npm run start --prefix ./server) || error "服务启动失败"
35
34
  info "服务启动完成!\n"
@@ -1,13 +1,63 @@
1
- # Expo App Template
2
- ## 安装依赖
3
- ```bash
4
- pnpm install
1
+ # Expo App + Express.js
2
+
3
+ ## 目录结构规范(严格遵循)
4
+
5
+ 当前仓库是一个 monorepo(基于 pnpm 的 workspace)
6
+ 其中 Expo 代码在 client 目录,Express.js 代码在 server 目录
7
+
8
+ 目录结构说明
9
+
10
+ ├── server/ # 服务端代码 (Express.js)
11
+ │ ├── index.ts # Express 入口文件
12
+ | └── package.json # 服务端 package.json
13
+ ├── client/ # React Native 前端代码
14
+ │ ├── app/ # Expo Router 路由目录(仅路由配置)
15
+ │ │ ├── _layout.tsx # 根布局文件(必需)
16
+ │ │ └── index.ts # 首页
17
+ │ ├── screens/ # 页面实现目录(与 app/ 路由对应)
18
+ │ │ └── home/
19
+ │ │ ├── index.tsx # 页面组件实现
20
+ │ │ └── styles.ts # 页面样式
21
+ │ ├── components/ # 可复用组件
22
+ │ │ └── Screen.tsx # 页面容器组件(必用)
23
+ │ ├── hooks/ # 自定义 Hooks
24
+ │ ├── contexts/ # React Context 代码
25
+ │ ├── assets/ # 静态资源
26
+ | └── package.json # Expo 应用 package.json
27
+ ├── package.json
28
+ ├── .cozeproj # 预置脚手架脚本(禁止修改)
29
+ └── .coze # 配置文件(禁止修改)
30
+
31
+ ## Expo 路径别名
32
+ Expo 配置了 `@/` 路径别名指向 `client/` 目录:
33
+
34
+ ```tsx
35
+ // 正确
36
+ import { Screen } from '@/components/Screen';
37
+
38
+ // 避免相对路径
39
+ import { Screen } from '../../../components/Screen';
5
40
  ```
6
- ## 启动 Metro 服务
41
+
42
+ ## 安装依赖
43
+
44
+ ### 命令
45
+
7
46
  ```bash
8
- npx expo start
47
+ pnpm i
9
48
  ```
10
- ## 启动 Node 服务器
49
+
50
+ ### 新增依赖约束
51
+
52
+ 如果需要新增依赖,需在 client 和 server 各自的目录添加(原因:隔离前后端的依赖),禁止在根目录直接安装依赖
53
+
54
+ ### 新增依赖标准流程
55
+
56
+ - 编辑 `client/package.json` 或 `server/package.json`
57
+ - 在根目录执行 `pnpm i`
58
+
59
+ ## 启动前后端服务(开发环境)
60
+
11
61
  ```bash
12
- npm run server
62
+ coze dev
13
63
  ```
@@ -8,4 +8,4 @@ expo/expo-env.d.ts
8
8
  expo-env.d.ts
9
9
  .DS_Store
10
10
  logs/
11
- tsconfig.tsbuildinfo
11
+ *.tsbuildinfo
@@ -8,15 +8,13 @@ network-concurrency=16
8
8
  fetch-retries=3
9
9
  fetch-timeout=60000
10
10
 
11
- # 严格使用 peer dependencies
11
+ # peerDependencies
12
12
  strict-peer-dependencies=false
13
-
14
- # 自动生成 lockfile
15
13
  auto-install-peers=true
16
14
 
17
15
  # lockfile 配置
18
16
  lockfile=true
19
17
  prefer-frozen-lockfile=true
20
18
 
21
- # 如果 lockfile 存在但过期,更新而不是失败
19
+ # semver 选择最高版本
22
20
  resolution-mode=highest
@@ -24,7 +24,7 @@ export default function RootLayout() {
24
24
  // 隐藏自带的头部
25
25
  headerShown: false
26
26
  }}>
27
- <Stack.Screen name="(tabs)" options={{ title: "" }} />
27
+ <Stack.Screen name="index" options={{ title: "" }} />
28
28
  </Stack>
29
29
  <Toast />
30
30
  </GestureHandlerRootView>
@@ -0,0 +1 @@
1
+ export { default } from '@/screens/home'
@@ -0,0 +1,71 @@
1
+ import { ExpoConfig, ConfigContext } from 'expo/config';
2
+
3
+ export default ({ config }: ConfigContext): ExpoConfig => {
4
+ return {
5
+ ...config,
6
+ "name": "${app_name}",
7
+ "slug": "${slug}",
8
+ "version": "1.0.0",
9
+ "orientation": "portrait",
10
+ "icon": "./assets/images/icon.png",
11
+ "scheme": "myapp",
12
+ "userInterfaceStyle": "automatic",
13
+ "newArchEnabled": true,
14
+ "ios": {
15
+ "supportsTablet": true
16
+ },
17
+ "android": {
18
+ "adaptiveIcon": {
19
+ "foregroundImage": "./assets/images/adaptive-icon.png",
20
+ "backgroundColor": "#ffffff"
21
+ }
22
+ },
23
+ "web": {
24
+ "bundler": "metro",
25
+ "output": "single",
26
+ "favicon": "./assets/images/favicon.png"
27
+ },
28
+ "plugins": [
29
+ process.env.EXPO_PUBLIC_BACKEND_BASE_URL ? [
30
+ "expo-router",
31
+ {
32
+ "origin": process.env.EXPO_PUBLIC_BACKEND_BASE_URL
33
+ }
34
+ ] : 'expo-router',
35
+ [
36
+ "expo-splash-screen",
37
+ {
38
+ "image": "./assets/images/splash-icon.png",
39
+ "imageWidth": 200,
40
+ "resizeMode": "contain",
41
+ "backgroundColor": "#ffffff"
42
+ }
43
+ ],
44
+ [
45
+ "expo-image-picker",
46
+ {
47
+ "photosPermission": "允许${app_name}访问您的相册,以便您上传或保存图片。",
48
+ "cameraPermission": "允许${app_name}使用您的相机,以便您直接拍摄照片上传。",
49
+ "microphonePermission": "允许${app_name}访问您的麦克风,以便您拍摄带有声音的视频。"
50
+ }
51
+ ],
52
+ [
53
+ "expo-location",
54
+ {
55
+ "locationWhenInUsePermission": "${app_name}需要访问您的位置以提供周边服务及导航功能。"
56
+ }
57
+ ],
58
+ [
59
+ "expo-camera",
60
+ {
61
+ "cameraPermission": "${app_name}需要访问相机以拍摄照片和视频。",
62
+ "microphonePermission": "${app_name}需要访问麦克风以录制视频声音。",
63
+ "recordAudioAndroid": true
64
+ }
65
+ ]
66
+ ],
67
+ "experiments": {
68
+ "typedRoutes": true
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "expo-app",
3
+ "description": "<%= appName %>",
4
+ "main": "expo-router/entry",
5
+ "private": true,
6
+ "scripts": {
7
+ "check-deps": "npx depcheck",
8
+ "postinstall": "npm run install-missing",
9
+ "install-missing": "node ./scripts/install-missing-deps.js",
10
+ "lint": "expo lint",
11
+ "start": "expo start --web --clear",
12
+ "test": "jest --watchAll"
13
+ },
14
+ "jest": {
15
+ "preset": "jest-expo"
16
+ },
17
+ "dependencies": {
18
+ "@expo/metro-runtime": "^6.1.2",
19
+ "@expo/vector-icons": "^15.0.0",
20
+ "@react-native-async-storage/async-storage": "^2.2.0",
21
+ "@react-native-community/datetimepicker": "^8.5.0",
22
+ "@react-native-community/slider": "^5.0.1",
23
+ "@react-native-masked-view/masked-view": "^0.3.2",
24
+ "@react-native-picker/picker": "^2.11.0",
25
+ "@react-navigation/bottom-tabs": "^7.2.0",
26
+ "@react-navigation/native": "^7.0.14",
27
+ "babel-plugin-module-resolver": "^5.0.2",
28
+ "babel-preset-expo": "^54.0.9",
29
+ "dayjs": "^1.11.19",
30
+ "expo": "^54.0.7",
31
+ "expo-auth-session": "^7.0.9",
32
+ "expo-av": "~16.0.6",
33
+ "expo-blur": "~15.0.6",
34
+ "expo-camera": "~17.0.10",
35
+ "expo-constants": "~18.0.8",
36
+ "expo-crypto": "^15.0.7",
37
+ "expo-font": "~14.0.7",
38
+ "expo-haptics": "~15.0.6",
39
+ "expo-image-picker": "~17.0.7",
40
+ "expo-linear-gradient": "~15.0.6",
41
+ "expo-linking": "~8.0.7",
42
+ "expo-location": "~19.0.7",
43
+ "expo-router": "~6.0.0",
44
+ "expo-splash-screen": "~31.0.8",
45
+ "expo-status-bar": "~3.0.7",
46
+ "expo-symbols": "~1.0.6",
47
+ "expo-system-ui": "~6.0.9",
48
+ "expo-web-browser": "~15.0.10",
49
+ "react": "19.1.0",
50
+ "react-dom": "19.1.0",
51
+ "react-native": "0.81.5",
52
+ "react-native-chart-kit": "^6.12.0",
53
+ "react-native-gesture-handler": "~2.28.0",
54
+ "react-native-keyboard-aware-scroll-view": "^0.9.5",
55
+ "react-native-modal-datetime-picker": "18.0.0",
56
+ "react-native-reanimated": "~4.1.0",
57
+ "react-native-safe-area-context": "~5.6.0",
58
+ "react-native-screens": "~4.16.0",
59
+ "react-native-svg": "15.15.0",
60
+ "react-native-toast-message": "^2.3.3",
61
+ "react-native-web": "^0.21.2",
62
+ "react-native-webview": "~13.15.0",
63
+ "react-native-worklets": "0.5.1",
64
+ "zod": "^4.2.1"
65
+ },
66
+ "devDependencies": {
67
+ "@babel/core": "^7.25.2",
68
+ "@eslint/js": "^9.27.0",
69
+ "@types/jest": "^29.5.12",
70
+ "@types/react": "~19.1.0",
71
+ "@types/react-test-renderer": "19.1.0",
72
+ "chalk": "^4.1.2",
73
+ "depcheck": "^1.4.7",
74
+ "esbuild": "0.27.2",
75
+ "eslint": "^9.39.2",
76
+ "eslint-formatter-compact": "^9.0.1",
77
+ "eslint-import-resolver-typescript": "^4.4.4",
78
+ "eslint-plugin-import": "^2.32.0",
79
+ "eslint-plugin-react": "^7.37.5",
80
+ "eslint-plugin-react-hooks": "^7.0.1",
81
+ "eslint-plugin-regexp": "^2.10.0",
82
+ "globals": "^16.1.0",
83
+ "jest": "^29.2.1",
84
+ "jest-expo": "~54.0.10",
85
+ "react-test-renderer": "19.1.0",
86
+ "tsx": "^4.21.0",
87
+ "typescript": "^5.8.3",
88
+ "typescript-eslint": "^8.32.1",
89
+ "connect": "^3.7.0",
90
+ "http-proxy-middleware": "^3.0.5"
91
+ }
92
+ }
@@ -14,7 +14,6 @@ import { Screen } from '@/components/Screen';
14
14
 
15
15
  import { styles } from './styles';
16
16
 
17
-
18
17
  export default function HomeScreen() {
19
18
  const insets = useSafeAreaInsets();
20
19
  const { theme, isDark } = useTheme();
@@ -0,0 +1,24 @@
1
+ {
2
+ "extends": "expo/tsconfig.base",
3
+ "compilerOptions": {
4
+ "skipLibCheck": true,
5
+ "jsx": "react-jsx",
6
+ "baseUrl": ".",
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "paths": {
10
+ "@/*": ["./*"]
11
+ }
12
+ },
13
+ "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts"],
14
+ "exclude": [
15
+ "node_modules",
16
+ "**/*.spec.ts",
17
+ "**/*.test.ts",
18
+ "**/*.spec.tsx",
19
+ "**/*.test.tsx",
20
+ "dist",
21
+ "build",
22
+ ".expo"
23
+ ]
24
+ }
@@ -1,114 +1,15 @@
1
1
  {
2
- "name": "<%= appName %>",
3
- "version": "1.0.0",
2
+ "name": "expo-express-monorepo",
4
3
  "private": true,
5
- "main": "client/index.js",
4
+ "version": "0.0.0",
6
5
  "scripts": {
7
- "build": "bash .cozeproj/scripts/dev_build.sh",
8
- "check-deps": "npx depcheck",
9
6
  "dev": "bash .cozeproj/scripts/dev_run.sh",
10
- "preinstall": "npx only-allow pnpm",
11
- "postinstall": "node ./client/scripts/install-missing-deps.js",
12
- "install-missing": "node ./client/scripts/install-missing-deps.js",
13
- "lint": "expo lint",
14
- "server": "NODE_ENV=development tsx ./src/index.ts",
15
- "server:build": "pnpm exec esbuild src/index.ts --platform=node --packages=external --bundle --format=esm --outdir=src_dist",
16
- "server:prod": "NODE_ENV=production PORT=${PORT:-5000} node src_dist/index.js",
17
- "start": "expo start --web",
18
- "test": "jest --watchAll"
19
- },
20
- "jest": {
21
- "preset": "jest-expo"
22
- },
23
- "dependencies": {
24
- "@aws-sdk/client-s3": "^3.958.0",
25
- "@aws-sdk/lib-storage": "^3.958.0",
26
- "@expo/metro-runtime": "^6.1.2",
27
- "@expo/vector-icons": "^15.0.0",
28
- "@react-native-async-storage/async-storage": "^2.2.0",
29
- "@react-native-community/datetimepicker": "^8.5.0",
30
- "@react-native-community/slider": "^5.0.1",
31
- "@react-native-masked-view/masked-view": "^0.3.2",
32
- "@react-native-picker/picker": "^2.11.0",
33
- "@react-navigation/bottom-tabs": "^7.2.0",
34
- "@react-navigation/native": "^7.0.14",
35
- "ajv": "^8.17.1",
36
- "ajv-formats": "^3.0.1",
37
- "babel-plugin-module-resolver": "^5.0.2",
38
- "babel-preset-expo": "^54.0.9",
39
- "connect": "^3.7.0",
40
- "coze-coding-dev-sdk": "^0.5.5",
41
- "dayjs": "^1.11.19",
42
- "drizzle-kit": "^0.31.8",
43
- "drizzle-orm": "^0.45.1",
44
- "drizzle-zod": "^0.8.3",
45
- "expo": "^54.0.7",
46
- "expo-auth-session": "^7.0.9",
47
- "expo-av": "~16.0.6",
48
- "expo-blur": "~15.0.6",
49
- "expo-camera": "~17.0.10",
50
- "expo-constants": "~18.0.8",
51
- "expo-crypto": "^15.0.7",
52
- "expo-font": "~14.0.7",
53
- "expo-haptics": "~15.0.6",
54
- "expo-image-picker": "~17.0.7",
55
- "expo-linear-gradient": "~15.0.6",
56
- "expo-linking": "~8.0.7",
57
- "expo-location": "~19.0.7",
58
- "expo-router": "~6.0.0",
59
- "expo-splash-screen": "~31.0.8",
60
- "expo-status-bar": "~3.0.7",
61
- "expo-symbols": "~1.0.6",
62
- "expo-system-ui": "~6.0.9",
63
- "expo-web-browser": "~15.0.10",
64
- "express": "^4.22.1",
65
- "http-proxy-middleware": "^3.0.5",
66
- "multer": "^2.0.2",
67
- "pg": "^8.16.3",
68
- "react": "19.1.0",
69
- "react-dom": "19.1.0",
70
- "react-native": "0.81.5",
71
- "react-native-chart-kit": "^6.12.0",
72
- "react-native-gesture-handler": "~2.28.0",
73
- "react-native-keyboard-aware-scroll-view": "^0.9.5",
74
- "react-native-modal-datetime-picker": "18.0.0",
75
- "react-native-reanimated": "~4.1.0",
76
- "react-native-safe-area-context": "~5.6.0",
77
- "react-native-screens": "~4.16.0",
78
- "react-native-svg": "15.15.0",
79
- "react-native-toast-message": "^2.3.3",
80
- "react-native-web": "^0.21.2",
81
- "react-native-webview": "~13.15.0",
82
- "react-native-worklets": "0.5.1",
83
- "zod": "^4.2.1"
84
- },
85
- "devDependencies": {
86
- "@babel/core": "^7.25.2",
87
- "@eslint/js": "^9.27.0",
88
- "@types/express": "^5.0.6",
89
- "@types/jest": "^29.5.12",
90
- "@types/multer": "^2.0.0",
91
- "@types/pg": "^8.16.0",
92
- "@types/react": "~19.1.0",
93
- "@types/react-test-renderer": "19.1.0",
94
- "chalk": "^4.1.2",
95
- "depcheck": "^1.4.7",
96
- "esbuild": "0.27.2",
97
- "eslint": "^9.39.2",
98
- "eslint-formatter-compact": "^9.0.1",
99
- "eslint-import-resolver-typescript": "^4.4.4",
100
- "eslint-plugin-import": "^2.32.0",
101
- "eslint-plugin-react": "^7.37.5",
102
- "eslint-plugin-react-hooks": "^7.0.1",
103
- "eslint-plugin-regexp": "^2.10.0",
104
- "globals": "^16.1.0",
105
- "jest": "^29.2.1",
106
- "jest-expo": "~54.0.10",
107
- "react-test-renderer": "19.1.0",
108
- "tsx": "^4.21.0",
109
- "typescript": "^5.8.3",
110
- "typescript-eslint": "^8.32.1"
7
+ "build": "bash .cozeproj/scripts/prod_build.sh",
8
+ "start": "bash .cozeproj/scripts/prod_run.sh",
9
+ "preinstall": "npx only-allow pnpm"
111
10
  },
11
+ "dependencies": {},
12
+ "devDependencies": {},
112
13
  "packageManager": "pnpm@9.0.0",
113
14
  "engines": {
114
15
  "pnpm": ">=9.0.0"