@coze-arch/cli 0.0.1-alpha.7d92f8 → 0.0.1-alpha.9f719c
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/lib/__templates__/expo/.coze +5 -0
- package/lib/__templates__/expo/.cozeproj/scripts/deploy_build.sh +0 -7
- package/lib/__templates__/expo/.cozeproj/scripts/deploy_run.sh +8 -15
- package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +47 -0
- package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +35 -0
- package/lib/__templates__/expo/babel.config.js +10 -0
- package/lib/__templates__/expo/client/constants/theme.ts +10 -0
- package/lib/__templates__/expo/client/hooks/useTheme.ts +1 -1
- package/lib/__templates__/expo/metro.config.js +3 -5
- package/lib/__templates__/expo/package.json +6 -2
- package/lib/__templates__/vite/vite.config.ts +0 -3
- package/lib/cli.js +1 -1
- package/package.json +1 -1
|
@@ -5,3 +5,8 @@ requires = ["nodejs-24"]
|
|
|
5
5
|
[dev]
|
|
6
6
|
build = ["bash", ".cozeproj/scripts/deploy_build.sh"]
|
|
7
7
|
run = ["bash", ".cozeproj/scripts/deploy_run.sh"]
|
|
8
|
+
|
|
9
|
+
[deploy]
|
|
10
|
+
build = ["bash", ".cozeproj/scripts/prod_build.sh"]
|
|
11
|
+
run = ["bash", ".cozeproj/scripts/prod_run.sh"]
|
|
12
|
+
build_app_dir = "."
|
|
@@ -49,13 +49,6 @@ fs.writeSync(fd, record+"\n", null, "utf8");
|
|
|
49
49
|
fs.fsyncSync(fd);
|
|
50
50
|
fs.closeSync(fd);
|
|
51
51
|
' "$LOG_FILE" "$level" "$msg"
|
|
52
|
-
|
|
53
|
-
case "$level" in
|
|
54
|
-
INFO) info "$msg" ;;
|
|
55
|
-
WARN) warn "$msg" ;;
|
|
56
|
-
ERROR) echo -e "\033[31m[ERROR] $msg\033[0m" ;;
|
|
57
|
-
*) info "$msg" ;;
|
|
58
|
-
esac
|
|
59
52
|
}
|
|
60
53
|
|
|
61
54
|
# ==================== 前置检查 ====================
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
2
|
+
PREVIEW_DIR="${COZE_PREVIEW_DIR:-$ROOT_DIR}"
|
|
2
3
|
LOG_DIR="${COZE_LOG_DIR:-$ROOT_DIR/logs}"
|
|
3
4
|
LOG_FILE="$LOG_DIR/app.log"
|
|
4
5
|
mkdir -p "$LOG_DIR"
|
|
@@ -10,7 +11,7 @@ SERVER_PORT="9091"
|
|
|
10
11
|
# Expo 项目配置
|
|
11
12
|
EXPO_HOST="0.0.0.0"
|
|
12
13
|
EXPO_DIR="expo"
|
|
13
|
-
EXPO_PORT="
|
|
14
|
+
EXPO_PORT="5000"
|
|
14
15
|
WEB_URL="${COZE_PROJECT_DOMAIN_DEFAULT:-http://127.0.0.1:${SERVER_PORT}}"
|
|
15
16
|
ASSUME_YES="1"
|
|
16
17
|
EXPO_PUBLIC_BACKEND_BASE_URL="${EXPO_PUBLIC_BACKEND_BASE_URL:-$WEB_URL}"
|
|
@@ -116,12 +117,6 @@ fs.writeSync(fd, record+"\n", null, "utf8");
|
|
|
116
117
|
fs.fsyncSync(fd);
|
|
117
118
|
fs.closeSync(fd);
|
|
118
119
|
' "$LOG_FILE" "$level" "$msg"
|
|
119
|
-
case "$level" in
|
|
120
|
-
INFO) echo -e "\033[32m[INFO] $msg\033[0m" ;;
|
|
121
|
-
WARN) echo -e "\033[33m[WARN] $msg\033[0m" ;;
|
|
122
|
-
ERROR) echo -e "\033[31m[ERROR] $msg\033[0m" ;;
|
|
123
|
-
*) echo -e "\033[32m[INFO] $msg\033[0m" ;;
|
|
124
|
-
esac
|
|
125
120
|
}
|
|
126
121
|
|
|
127
122
|
wait_port_connectable() {
|
|
@@ -159,6 +154,12 @@ detect_expo_fetch_failed() {
|
|
|
159
154
|
}
|
|
160
155
|
|
|
161
156
|
# ==================== 前置检查 ====================
|
|
157
|
+
write_log "INFO" "检查根目录 pre_install.py"
|
|
158
|
+
if [ -f "$PREVIEW_DIR/pre_install.py" ]; then
|
|
159
|
+
write_log "INFO" "执行:python $PREVIEW_DIR/pre_install.py"
|
|
160
|
+
python "$PREVIEW_DIR/pre_install.py" || write_log "ERROR" "pre_install.py 执行失败"
|
|
161
|
+
fi
|
|
162
|
+
|
|
162
163
|
write_log "INFO" "==================== 开始启动 ===================="
|
|
163
164
|
write_log "INFO" "开始执行服务启动脚本(start_dev.sh)..."
|
|
164
165
|
write_log "INFO" "正在检查依赖命令和目录是否存在..."
|
|
@@ -176,14 +177,6 @@ ensure_port SERVER_PORT "$SERVER_PORT"
|
|
|
176
177
|
ensure_port EXPO_PORT "$EXPO_PORT"
|
|
177
178
|
|
|
178
179
|
# ==================== 启动 Server 服务 ====================
|
|
179
|
-
write_log "INFO" "检查 Nginx 端口 (5000)..."
|
|
180
|
-
if is_port_free 5000; then
|
|
181
|
-
write_log "INFO" "端口 5000 未被占用,正在启动 Nginx..."
|
|
182
|
-
service nginx start
|
|
183
|
-
else
|
|
184
|
-
write_log "INFO" "端口 5000 已被占用,跳过 Nginx 启动"
|
|
185
|
-
fi
|
|
186
|
-
|
|
187
180
|
write_log "INFO" "==================== 启动 server 服务 ===================="
|
|
188
181
|
write_log "INFO" "正在执行:npm run server"
|
|
189
182
|
PORT="$SERVER_PORT" nohup npm run server > logs/app.log 2>&1 &
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
if [ -z "${BASH_VERSION:-}" ]; then exec /usr/bin/env bash "$0" "$@"; fi
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
ROOT_DIR="$(pwd)"
|
|
5
|
+
|
|
6
|
+
# ==================== 工具函数 ====================
|
|
7
|
+
info() {
|
|
8
|
+
echo "[INFO] $1"
|
|
9
|
+
}
|
|
10
|
+
warn() {
|
|
11
|
+
echo "[WARN] $1"
|
|
12
|
+
}
|
|
13
|
+
error() {
|
|
14
|
+
echo "[ERROR] $1"
|
|
15
|
+
exit 1
|
|
16
|
+
}
|
|
17
|
+
check_command() {
|
|
18
|
+
if ! command -v "$1" &> /dev/null; then
|
|
19
|
+
error "命令 $1 未找到,请先安装"
|
|
20
|
+
fi
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
info "==================== 开始构建 ===================="
|
|
24
|
+
info "开始执行构建脚本(build_prod.sh)..."
|
|
25
|
+
info "正在检查依赖命令是否存在..."
|
|
26
|
+
# 检查核心命令
|
|
27
|
+
check_command "pnpm"
|
|
28
|
+
check_command "npm"
|
|
29
|
+
|
|
30
|
+
# ==================== 安装 Node 依赖 ====================
|
|
31
|
+
info "==================== 安装 Node 依赖 ===================="
|
|
32
|
+
info "开始安装 Node 依赖"
|
|
33
|
+
if [ -f "$ROOT_DIR/package.json" ]; then
|
|
34
|
+
info "进入目录:$ROOT_DIR"
|
|
35
|
+
info "正在执行:pnpm install"
|
|
36
|
+
(cd "$ROOT_DIR" && pnpm install --registry=https://registry.npmmirror.com) || error "Node 依赖安装失败"
|
|
37
|
+
else
|
|
38
|
+
warn "未找到 $ROOT_DIR/package.json 文件,请检查路径是否正确"
|
|
39
|
+
fi
|
|
40
|
+
info "==================== 依赖安装完成!====================\n"
|
|
41
|
+
|
|
42
|
+
info "==================== dist打包 ===================="
|
|
43
|
+
info "开始执行:pnpm run server:build"
|
|
44
|
+
(cd "$ROOT_DIR" && pnpm run server:build) || error "dist打包失败"
|
|
45
|
+
info "==================== dist打包完成!====================\n"
|
|
46
|
+
|
|
47
|
+
info "下一步:执行 ./prod_run.sh 启动服务"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 产物部署使用
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
HOST="${HOST:-0.0.0.0}"
|
|
9
|
+
PORT="${PORT:-5000}"
|
|
10
|
+
|
|
11
|
+
# ==================== 工具函数 ====================
|
|
12
|
+
info() {
|
|
13
|
+
echo "[INFO] $1"
|
|
14
|
+
}
|
|
15
|
+
warn() {
|
|
16
|
+
echo "[WARN] $1"
|
|
17
|
+
}
|
|
18
|
+
error() {
|
|
19
|
+
echo "[ERROR] $1"
|
|
20
|
+
exit 1
|
|
21
|
+
}
|
|
22
|
+
check_command() {
|
|
23
|
+
if ! command -v "$1" &> /dev/null; then
|
|
24
|
+
error "命令 $1 未找到,请先安装"
|
|
25
|
+
fi
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# ============== 启动服务 ======================
|
|
29
|
+
# 检查核心命令
|
|
30
|
+
check_command "pnpm"
|
|
31
|
+
check_command "npm"
|
|
32
|
+
|
|
33
|
+
info "开始执行:pnpm run server:prod"
|
|
34
|
+
(cd "$ROOT_DIR" && PORT="$PORT" pnpm run server:prod) || error "服务启动失败"
|
|
35
|
+
info "服务启动完成!\n"
|
|
@@ -3,6 +3,16 @@ module.exports = function (api) {
|
|
|
3
3
|
return {
|
|
4
4
|
presets: ["babel-preset-expo"],
|
|
5
5
|
plugins: [
|
|
6
|
+
[
|
|
7
|
+
"module-resolver",
|
|
8
|
+
{
|
|
9
|
+
root: ["./"],
|
|
10
|
+
alias: {
|
|
11
|
+
"@": "./client",
|
|
12
|
+
},
|
|
13
|
+
extensions: [".ios.js", ".android.js", ".js", ".ts", ".tsx", ".json"],
|
|
14
|
+
},
|
|
15
|
+
],
|
|
6
16
|
"react-native-reanimated/plugin",
|
|
7
17
|
],
|
|
8
18
|
};
|
|
@@ -6,25 +6,35 @@ const tintColorDark = "#0A84FF";
|
|
|
6
6
|
export const Colors = {
|
|
7
7
|
light: {
|
|
8
8
|
text: "#11181C",
|
|
9
|
+
textPrimary: "#11181C",
|
|
10
|
+
textSecondary: "#687076",
|
|
11
|
+
textMuted: "#9BA1A6",
|
|
9
12
|
buttonText: "#FFFFFF",
|
|
10
13
|
tabIconDefault: "#687076",
|
|
11
14
|
tabIconSelected: tintColorLight,
|
|
15
|
+
primary: tintColorLight,
|
|
12
16
|
link: "#007AFF",
|
|
13
17
|
backgroundRoot: "#FFFFFF", // Elevation 0
|
|
14
18
|
backgroundDefault: "#F2F2F2", // Elevation 1
|
|
15
19
|
backgroundSecondary: "#E6E6E6", // Elevation 2
|
|
16
20
|
backgroundTertiary: "#D9D9D9", // Elevation 3
|
|
21
|
+
border: "#E6E6E6",
|
|
17
22
|
},
|
|
18
23
|
dark: {
|
|
19
24
|
text: "#ECEDEE",
|
|
25
|
+
textPrimary: "#ECEDEE",
|
|
26
|
+
textSecondary: "#9BA1A6",
|
|
27
|
+
textMuted: "#6F767E",
|
|
20
28
|
buttonText: "#FFFFFF",
|
|
21
29
|
tabIconDefault: "#9BA1A6",
|
|
22
30
|
tabIconSelected: tintColorDark,
|
|
31
|
+
primary: tintColorDark,
|
|
23
32
|
link: "#0A84FF",
|
|
24
33
|
backgroundRoot: "#1F2123", // Elevation 0
|
|
25
34
|
backgroundDefault: "#2A2C2E", // Elevation 1
|
|
26
35
|
backgroundSecondary: "#353739", // Elevation 2
|
|
27
36
|
backgroundTertiary: "#404244", // Elevation 3
|
|
37
|
+
border: "#353739",
|
|
28
38
|
},
|
|
29
39
|
};
|
|
30
40
|
|
|
@@ -4,7 +4,7 @@ import { useColorScheme } from "@/hooks/useColorScheme";
|
|
|
4
4
|
export function useTheme() {
|
|
5
5
|
const colorScheme = useColorScheme();
|
|
6
6
|
const isDark = colorScheme === "dark";
|
|
7
|
-
const theme = Colors[colorScheme ?? "light"];
|
|
7
|
+
const theme = Colors[(colorScheme as "light" | "dark") ?? "light"];
|
|
8
8
|
|
|
9
9
|
return {
|
|
10
10
|
theme,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const { getDefaultConfig } = require('expo/metro-config');
|
|
2
|
-
|
|
2
|
+
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
3
3
|
const connect = require('connect');
|
|
4
4
|
|
|
5
5
|
const config = getDefaultConfig(__dirname);
|
|
@@ -28,9 +28,8 @@ config.resolver.blockList = [
|
|
|
28
28
|
/.*\.git\/.*/, // 排除 Git 目录
|
|
29
29
|
];
|
|
30
30
|
|
|
31
|
-
/*
|
|
32
31
|
const apiProxy = createProxyMiddleware({
|
|
33
|
-
target: 'http://localhost:
|
|
32
|
+
target: 'http://localhost:9091',
|
|
34
33
|
logLevel: 'debug',
|
|
35
34
|
});
|
|
36
35
|
|
|
@@ -39,7 +38,7 @@ config.server = {
|
|
|
39
38
|
enhanceMiddleware: (metroMiddleware, metroServer) => {
|
|
40
39
|
return connect()
|
|
41
40
|
.use((req, res, next) => {
|
|
42
|
-
if (req.url && req.url.startsWith('/api')) {
|
|
41
|
+
if (req.url && req.url.startsWith('/api/v')) {
|
|
43
42
|
console.log(`[Metro Proxy] Forwarding ${req.method} ${req.url}`);
|
|
44
43
|
return apiProxy(req, res, next);
|
|
45
44
|
}
|
|
@@ -48,6 +47,5 @@ config.server = {
|
|
|
48
47
|
.use(metroMiddleware);
|
|
49
48
|
},
|
|
50
49
|
}
|
|
51
|
-
*/
|
|
52
50
|
|
|
53
51
|
module.exports = config;
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
"install-missing": "node ./client/scripts/install-missing-deps.js",
|
|
13
13
|
"lint": "expo lint",
|
|
14
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",
|
|
15
17
|
"start": "expo start --web",
|
|
16
18
|
"test": "jest --watchAll"
|
|
17
19
|
},
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
"ajv": "^8.17.1",
|
|
34
36
|
"ajv-formats": "^3.0.1",
|
|
35
37
|
"connect": "^3.7.0",
|
|
36
|
-
"coze-coding-dev-sdk": "^0.5.
|
|
38
|
+
"coze-coding-dev-sdk": "^0.5.5",
|
|
37
39
|
"dayjs": "^1.11.19",
|
|
38
40
|
"drizzle-kit": "^0.31.8",
|
|
39
41
|
"drizzle-orm": "^0.45.1",
|
|
@@ -58,6 +60,7 @@
|
|
|
58
60
|
"expo-system-ui": "~6.0.9",
|
|
59
61
|
"expo-web-browser": "~15.0.10",
|
|
60
62
|
"express": "^4.22.1",
|
|
63
|
+
"http-proxy-middleware": "^3.0.5",
|
|
61
64
|
"multer": "^2.0.2",
|
|
62
65
|
"pg": "^8.16.3",
|
|
63
66
|
"react": "19.1.0",
|
|
@@ -90,7 +93,8 @@
|
|
|
90
93
|
"babel-preset-expo": "^54.0.9",
|
|
91
94
|
"chalk": "^4.1.2",
|
|
92
95
|
"depcheck": "^1.4.7",
|
|
93
|
-
"
|
|
96
|
+
"esbuild": "^0.27.2",
|
|
97
|
+
"eslint": "^9.39.2",
|
|
94
98
|
"eslint-formatter-compact": "^9.0.1",
|
|
95
99
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
96
100
|
"eslint-plugin-import": "^2.32.0",
|
package/lib/cli.js
CHANGED