@lark-apaas/fullstack-cli 0.1.0-alpha.1 → 0.1.0-alpha.10

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
@@ -1,10 +1,12 @@
1
1
  # @lark-apaas/fullstack-cli
2
2
 
3
- > Fullstack 模板文件自动派生工具
3
+ > Fullstack 开发工具集 - 文件派生、数据库 Schema 生成、OpenAPI 生成
4
4
 
5
5
  ## 功能
6
6
 
7
- 自动派生和管理 fullstack 模板项目的文件和目录。
7
+ 1. **自动派生** - 自动管理项目脚本和配置文件
8
+ 2. **数据库 Schema 生成** - 从现有数据库生成 Drizzle ORM schema
9
+ 3. **OpenAPI 生成** - 自动生成 API 文档和客户端 SDK
8
10
 
9
11
  ## 安装
10
12
 
@@ -14,75 +16,168 @@ npm install --save-dev @lark-apaas/fullstack-cli
14
16
 
15
17
  ## 使用
16
18
 
17
- ### 自动派生
19
+ ### 1. 自动派生
18
20
 
19
- 每次运行 `npm install` 时,会根据配置自动派生文件到项目:
21
+ 每次运行 `npm install` 时,会自动派生文件到项目:
20
22
 
21
23
  **派生内容:**
22
- - `scripts/` - 脚本目录(总是覆盖)
24
+ - `scripts/` - Shell 脚本目录(总是覆盖)
23
25
  - `.gitignore` - 追加 fullstack-cli 相关忽略规则
24
26
 
25
- ### 重要提示
27
+ ⚠️ **`scripts/` 目录由 CLI 自动管理,请勿手动修改!**
26
28
 
27
- ⚠️ **`scripts/` 目录由 `@lark-apaas/fullstack-cli` 自动管理,请勿手动修改!**
29
+ ### 2. 生成数据库 Schema
28
30
 
29
- 每次安装依赖时,所有脚本文件会被自动覆盖为最新版本。
31
+ 从现有数据库生成 Drizzle ORM schema:
30
32
 
31
- ## 配置
33
+ ```bash
34
+ npm run gen:db-schema
35
+ ```
36
+
37
+ **环境变量配置:**
38
+ ```bash
39
+ # 必需
40
+ SUDA_DATABASE_URL=postgresql://user:pass@host:port/dbname?schema=public
41
+
42
+ # 可选
43
+ DB_SCHEMA_OUTPUT=server/database/schema.ts # 输出路径
44
+ DRIZZLE_SCHEMA_FILTER=public,custom # Schema 过滤器
45
+ DRIZZLE_TABLES_FILTER=users,orders # 表过滤器
46
+ ```
47
+
48
+ **工作流程:**
49
+ 1. 从 `SUDA_DATABASE_URL` 读取数据库连接
50
+ 2. 使用 CLI 内置的 `drizzle.config.ts`(用户无需维护)
51
+ 3. 执行 `drizzle-kit introspect`
52
+ 4. 后处理 schema(通过 devtool-kits)
53
+ 5. 输出到 `server/database/schema.ts`
54
+
55
+ ### 3. 生成 OpenAPI 文档
56
+
57
+ 自动生成 OpenAPI 文档和客户端 SDK:
58
+
59
+ ```bash
60
+ npm run gen:openapi
61
+ ```
62
+
63
+ **环境变量配置:**
64
+ ```bash
65
+ # 可选
66
+ APP_MODULE_PATH=server/app.module # AppModule 路径(不含扩展名)
67
+ CLIENT_BASE_PATH=/ # 客户端基础路径
68
+ ```
69
+
70
+ **工作流程:**
71
+ 1. 动态导入用户项目的 `AppModule`
72
+ 2. 挂载 DevToolsModule
73
+ 3. 生成 OpenAPI 文档和客户端 SDK
74
+
75
+ ### 4. CLI 命令
76
+
77
+ ```bash
78
+ # 查看帮助
79
+ fullstack-cli --help
80
+
81
+ # 生成数据库 schema
82
+ fullstack-cli gen-db-schema
83
+
84
+ # 生成 OpenAPI
85
+ fullstack-cli gen-openapi
86
+
87
+ # 查看版本
88
+ fullstack-cli --version
89
+ ```
90
+
91
+ ## package.json 配置
92
+
93
+ 在用户项目的 `package.json` 中添加:
94
+
95
+ ```json
96
+ {
97
+ "scripts": {
98
+ "gen:db-schema": "fullstack-cli gen-db-schema",
99
+ "gen:openapi": "NODE_ENV=development DEPRECATED_SKIP_INIT_DB_CONNECTION=true fullstack-cli gen-openapi"
100
+ },
101
+ "devDependencies": {
102
+ "@lark-apaas/fullstack-cli": "^0.1.0",
103
+ "drizzle-kit": "^0.20.0" // 如果使用数据库功能
104
+ }
105
+ }
106
+ ```
107
+
108
+ ## 技术细节
109
+
110
+ ### 派生配置
32
111
 
33
- 派生规则通过 `src/postinstall.config.ts` 配置:
112
+ 派生规则在 `src/postinstall.config.ts` 中定义:
34
113
 
35
114
  ```typescript
36
115
  export default {
37
- // 派生规则
38
116
  sync: [
39
- // 派生整个目录
40
117
  {
41
118
  from: 'templates/scripts',
42
119
  to: 'scripts',
43
120
  type: 'directory',
44
121
  overwrite: true,
45
122
  },
46
-
47
- // 追加内容到文件
48
123
  {
49
124
  from: 'templates/.gitignore.append',
50
125
  to: '.gitignore',
51
126
  type: 'append',
52
127
  },
53
128
  ],
54
-
55
- // 文件权限设置
56
129
  permissions: {
57
130
  '**/*.sh': 0o755,
58
131
  },
59
132
  };
60
133
  ```
61
134
 
62
- ### 支持的 sync type
135
+ ### Drizzle 配置
63
136
 
64
- - **directory** - 派生整个目录
65
- - `overwrite: true` - 总是覆盖
66
- - `overwrite: false` - 只复制不存在的文件
137
+ CLI 内置 `templates/drizzle.config.ts`,通过环境变量动态配置:
138
+ - 用户**无需**维护 `drizzle.config.ts`
139
+ - 所有配置通过环境变量传递
140
+ - 使用绝对路径指向用户项目
67
141
 
68
- - **file** - 派生单个文件
69
- - `overwrite: true` - 总是覆盖
70
- - `overwrite: false` - 仅当文件不存在时复制
142
+ ### OpenAPI 生成
71
143
 
72
- - **append** - 追加内容到文件末尾
73
- - 自动去重,不会重复追加
144
+ - 动态导入用户的 `AppModule`
145
+ - 使用 `@lark-apaas/fullstack-nestjs-core` 的 DevToolsModule
146
+ - 自动生成客户端 SDK
74
147
 
75
- ## 工作原理
148
+ ## 依赖关系
76
149
 
77
- 1. 在 `postinstall` 钩子中自动运行
78
- 2. 检测是否在用户项目中(通过 `INIT_CWD`)
79
- 3. 读取 `dist/postinstall.config.js` 配置(由 `src/postinstall.config.ts` 编译而来)
80
- 4. 根据配置规则派生文件/目录
81
- 5. 设置文件权限
82
-
83
- ## 自定义需求
150
+ ```
151
+ fullstack-cli
152
+ 依赖
153
+ @lark-apaas/devtool-kits (核心逻辑)
154
+
155
+ 用户项目 peerDependencies:
156
+ - @nestjs/core (用于 gen-openapi)
157
+ - @lark-apaas/fullstack-nestjs-core (用于 gen-openapi)
158
+ - drizzle-kit (用于 gen-db-schema,可选)
159
+ ```
84
160
 
85
- 如需自定义脚本或配置,请联系框架团队。
161
+ ## 升级说明
162
+
163
+ ### 从旧版本迁移
164
+
165
+ **可以删除的文件:**
166
+ - ❌ `scripts/gen-db-schema.ts` - 已内置到 CLI
167
+ - ❌ `scripts/gen-openapi.ts` - 已内置到 CLI
168
+ - ❌ `drizzle.config.ts` - 已由 CLI 管理
169
+
170
+ **更新 package.json:**
171
+ ```diff
172
+ {
173
+ "scripts": {
174
+ - "gen:db-schema": "ts-node scripts/gen-db-schema.ts",
175
+ + "gen:db-schema": "fullstack-cli gen-db-schema",
176
+ - "gen:openapi": "nest start --entryFile ../scripts/gen-openapi",
177
+ + "gen:openapi": "fullstack-cli gen-openapi"
178
+ }
179
+ }
180
+ ```
86
181
 
87
182
  ## License
88
183
 
package/bin/cli.mjs ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { fileURLToPath } from 'node:url';
4
+ import path from 'node:path';
5
+ import { createRequire } from 'node:module';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const require = createRequire(import.meta.url);
10
+
11
+ const command = process.argv[2];
12
+ const distPath = path.join(__dirname, '..', 'dist');
13
+
14
+ async function main() {
15
+ try {
16
+ switch (command) {
17
+ case 'gen-db-schema': {
18
+ const modulePath = path.join(distPath, 'commands', 'gen-db-schema.js');
19
+ const { run } = await import(modulePath);
20
+ await run();
21
+ break;
22
+ }
23
+ case 'sync':
24
+ case 'postinstall': {
25
+ // 调用原有的 sync-scripts.js (CommonJS)
26
+ require('./sync-scripts.js');
27
+ break;
28
+ }
29
+ case '--version':
30
+ case '-v': {
31
+ const pkg = require('../package.json');
32
+ console.log(pkg.version);
33
+ break;
34
+ }
35
+ case '--help':
36
+ case '-h':
37
+ case undefined: {
38
+ showHelp();
39
+ break;
40
+ }
41
+ default: {
42
+ console.error(`Unknown command: ${command}`);
43
+ console.error('');
44
+ showHelp();
45
+ process.exit(1);
46
+ }
47
+ }
48
+ } catch (error) {
49
+ console.error(`Failed to execute command "${command}":`, error.message);
50
+ console.error(error.stack);
51
+ process.exit(1);
52
+ }
53
+ }
54
+
55
+ function showHelp() {
56
+ console.log(`
57
+ Usage: fullstack-cli <command> [options]
58
+
59
+ Commands:
60
+ gen-db-schema Generate database schema from existing database
61
+ sync Sync template files to user project (internal use)
62
+
63
+ Options:
64
+ --version, -v Show version number
65
+ --help, -h Show help
66
+
67
+ Environment Variables:
68
+ # gen-db-schema
69
+ SUDA_DATABASE_URL Database connection URL (required)
70
+ DB_SCHEMA_OUTPUT Output path for schema (default: server/database/schema.ts)
71
+ DRIZZLE_SCHEMA_FILTER Schema filter, comma-separated (optional)
72
+ DRIZZLE_TABLES_FILTER Tables filter (default: *)
73
+
74
+ Examples:
75
+ $ fullstack-cli gen-db-schema
76
+ $ DB_SCHEMA_OUTPUT=custom/schema.ts fullstack-cli gen-db-schema
77
+
78
+ Scripts (auto-generated):
79
+ scripts/gen-openapi.ts - Generate OpenAPI documentation (use: npm run gen:openapi)
80
+ scripts/gen-db-schema.ts - Generate database schema (deprecated, use CLI command)
81
+ `);
82
+ }
83
+
84
+ main();
@@ -9,9 +9,8 @@ async function main() {
9
9
  const userProjectRoot = process.env.INIT_CWD || process.cwd();
10
10
  const pluginRoot = path.resolve(__dirname, '..');
11
11
 
12
- // 如果在插件自己的目录,跳过
13
- const isInstallingPlugin = __dirname.includes('/node_modules/@lark-apaas/fullstack-cli/');
14
- if (isInstallingPlugin || userProjectRoot === pluginRoot) {
12
+ // 只有在插件自己的开发目录中才跳过(避免在开发插件时触发 sync)
13
+ if (userProjectRoot === pluginRoot) {
15
14
  console.log('[fullstack-cli] Skip syncing (installing plugin itself)');
16
15
  process.exit(0);
17
16
  }
@@ -27,8 +26,7 @@ async function main() {
27
26
  console.log('[fullstack-cli] Starting sync...');
28
27
 
29
28
  // 加载配置文件(从 dist 目录加载编译后的配置)
30
- const configPath = path.join(pluginRoot, 'dist', 'postinstall.config.js');
31
- const { default: config } = await import(`file://${configPath}`);
29
+ const { default: config } = await import('../dist/postinstall.config.js');
32
30
 
33
31
  if (!config || !config.sync) {
34
32
  console.warn('[fullstack-cli] No sync configuration found');
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 生成数据库 schema
3
+ *
4
+ * 环境变量配置:
5
+ * - SUDA_DATABASE_URL: 数据库连接 URL(必需)
6
+ * - DB_SCHEMA_OUTPUT: schema 输出路径,默认 'server/database/schema.ts'
7
+ * - DRIZZLE_SCHEMA_FILTER: schema 过滤器,逗号分隔
8
+ * - DRIZZLE_TABLES_FILTER: 表过滤器,逗号分隔,默认 '*'
9
+ */
10
+ export declare function run(): Promise<void>;
@@ -0,0 +1,90 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { createRequire } from 'node:module';
6
+ // 加载 .env 配置
7
+ import { config as loadEnv } from 'dotenv';
8
+ // 创建 require 函数来加载 CommonJS 模块
9
+ const require = createRequire(import.meta.url);
10
+ /**
11
+ * 生成数据库 schema
12
+ *
13
+ * 环境变量配置:
14
+ * - SUDA_DATABASE_URL: 数据库连接 URL(必需)
15
+ * - DB_SCHEMA_OUTPUT: schema 输出路径,默认 'server/database/schema.ts'
16
+ * - DRIZZLE_SCHEMA_FILTER: schema 过滤器,逗号分隔
17
+ * - DRIZZLE_TABLES_FILTER: 表过滤器,逗号分隔,默认 '*'
18
+ */
19
+ export async function run() {
20
+ // 加载用户项目的 .env 文件
21
+ const envPath = path.resolve(process.cwd(), '.env');
22
+ if (fs.existsSync(envPath)) {
23
+ loadEnv({ path: envPath });
24
+ console.log('[gen-db-schema] ✓ Loaded .env file');
25
+ }
26
+ const databaseUrl = process.env.SUDA_DATABASE_URL;
27
+ if (!databaseUrl) {
28
+ console.error('[gen-db-schema] Error: SUDA_DATABASE_URL environment variable is required');
29
+ console.error('[gen-db-schema] Please set it in .env file or pass it as environment variable');
30
+ process.exit(1);
31
+ }
32
+ const outputPath = process.env.DB_SCHEMA_OUTPUT || 'server/database/schema.ts';
33
+ const OUT_DIR = path.resolve(process.cwd(), 'server/database/.introspect');
34
+ const SCHEMA_FILE = path.resolve(process.cwd(), outputPath);
35
+ console.log('[gen-db-schema] Starting...');
36
+ console.log(`[gen-db-schema] Output: ${outputPath}`);
37
+ // 获取当前文件所在目录(ESM 方式)
38
+ const __filename = fileURLToPath(import.meta.url);
39
+ const __dirname = path.dirname(__filename);
40
+ // 使用 CLI 内部的 drizzle 配置
41
+ const cliRoot = path.resolve(__dirname, '../..');
42
+ const configPath = path.join(cliRoot, 'templates', 'drizzle.config.ts');
43
+ if (!fs.existsSync(configPath)) {
44
+ console.error('[gen-db-schema] Error: drizzle config not found in CLI package');
45
+ process.exit(1);
46
+ }
47
+ // 通过环境变量传递绝对路径给配置文件
48
+ const env = {
49
+ ...process.env,
50
+ __DRIZZLE_OUT_DIR__: OUT_DIR,
51
+ __DRIZZLE_SCHEMA_PATH__: SCHEMA_FILE,
52
+ };
53
+ // 执行 drizzle-kit introspect
54
+ const args = process.argv.slice(3);
55
+ const spawnArgs = ['--yes', 'drizzle-kit', 'introspect', '--config', configPath, ...args];
56
+ const result = spawnSync('npx', spawnArgs, { stdio: 'inherit', env });
57
+ if (result.error) {
58
+ console.error('[gen-db-schema] Execution failed:', result.error);
59
+ process.exit(result.status ?? 1);
60
+ }
61
+ if ((result.status ?? 0) !== 0) {
62
+ process.exit(result.status ?? 1);
63
+ }
64
+ // 复制生成的 schema
65
+ const generatedSchema = path.join(OUT_DIR, 'schema.ts');
66
+ if (!fs.existsSync(generatedSchema)) {
67
+ console.error('[gen-db-schema] schema.ts not generated');
68
+ process.exit(1);
69
+ }
70
+ fs.mkdirSync(path.dirname(SCHEMA_FILE), { recursive: true });
71
+ fs.copyFileSync(generatedSchema, SCHEMA_FILE);
72
+ console.log(`[gen-db-schema] ✓ Copied to ${outputPath}`);
73
+ // 后处理 schema(使用 CommonJS require 方式加载)
74
+ try {
75
+ const { postprocessDrizzleSchema } = require('@lark-apaas/devtool-kits');
76
+ const stats = postprocessDrizzleSchema(SCHEMA_FILE);
77
+ if (stats?.unmatchedUnknown?.length) {
78
+ console.warn('[gen-db-schema] Unmatched custom types detected:', stats.unmatchedUnknown);
79
+ }
80
+ console.log('[gen-db-schema] ✓ Postprocessed schema');
81
+ }
82
+ catch (error) {
83
+ console.warn('[gen-db-schema] Postprocess failed:', error instanceof Error ? error.message : String(error));
84
+ }
85
+ // 清理临时文件
86
+ if (fs.existsSync(OUT_DIR)) {
87
+ fs.rmSync(OUT_DIR, { recursive: true, force: true });
88
+ }
89
+ console.log('[gen-db-schema] ✓ Complete');
90
+ }
@@ -12,23 +12,23 @@ const config = {
12
12
  type: 'directory',
13
13
  overwrite: true,
14
14
  },
15
- // 2. 追加内容到 .gitignore
16
- {
17
- from: 'templates/.gitignore.append',
18
- to: '.gitignore',
19
- type: 'append',
20
- },
21
- // 3. 派生 server/type.ts 文件(总是覆盖)
22
- {
23
- from: 'templates/server/type.ts',
24
- to: 'server/type.ts',
25
- type: 'file',
26
- },
15
+ // // 2. 追加内容到 .gitignore
16
+ // {
17
+ // from: 'templates/.gitignore.append',
18
+ // to: '.gitignore',
19
+ // type: 'append',
20
+ // },
21
+ // // 3. 派生 server/type.ts 文件(总是覆盖)
22
+ // {
23
+ // from: 'templates/server/type.ts',
24
+ // to: 'server/type.ts',
25
+ // type: 'file',
26
+ // },
27
27
  ],
28
28
  // 文件权限设置
29
29
  permissions: {
30
- // 所有 .sh 文件设置为可执行
31
- '**/*.sh': 0o755,
30
+ // 所有 .sh 文件设置为可执行
31
+ // '**/*.sh': 0o755,
32
32
  },
33
33
  };
34
34
  export default config;
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-cli",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.10",
4
4
  "description": "CLI tool for fullstack template management",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "bin": "./bin/cli.mjs",
7
8
  "files": [
8
9
  "dist",
9
10
  "templates",
@@ -27,6 +28,11 @@
27
28
  "publishConfig": {
28
29
  "access": "public"
29
30
  },
31
+ "dependencies": {
32
+ "@lark-apaas/devtool-kits": "^1.0.0",
33
+ "dotenv": "^16.0.0",
34
+ "drizzle-kit": "0.31.5"
35
+ },
30
36
  "devDependencies": {
31
37
  "@types/node": "^22.0.0",
32
38
  "typescript": "^5.9.2"
@@ -1 +1,8 @@
1
- # ===
1
+
2
+ # ==========================================
3
+ # fullstack-cli managed files
4
+ # ==========================================
5
+ # scripts/ directory is auto-generated
6
+ # DO NOT modify manually
7
+ scripts/
8
+
@@ -0,0 +1,25 @@
1
+ import { defineConfig } from 'drizzle-kit';
2
+
3
+ // 这个配置会被 fullstack-cli 在运行时动态处理
4
+ // 通过环境变量传递具体参数
5
+ const outputDir = process.env.__DRIZZLE_OUT_DIR__ || './server/database/.introspect';
6
+ const schemaPath = process.env.__DRIZZLE_SCHEMA_PATH__ || './server/database/schema.ts';
7
+
8
+ const parsedUrl = new URL(process.env.SUDA_DATABASE_URL || '');
9
+ const schemaFilter = parsedUrl.searchParams.get('schema')?.split(',') ?? [];
10
+
11
+ const config = {
12
+ schema: schemaPath,
13
+ out: outputDir,
14
+ tablesFilter: ['*'],
15
+ schemaFilter,
16
+ dialect: 'postgresql',
17
+ dbCredentials: {
18
+ host: parsedUrl.hostname,
19
+ port: Number(parsedUrl.port) || 5432,
20
+ user: decodeURIComponent(parsedUrl.username),
21
+ password: decodeURIComponent(parsedUrl.password),
22
+ database: parsedUrl.pathname.split('/')[1],
23
+ },
24
+ }
25
+ export default defineConfig(config);
@@ -3,11 +3,20 @@ import { DevToolsModule } from '@lark-apaas/fullstack-nestjs-core';
3
3
 
4
4
  import { AppModule } from '../server/app.module';
5
5
 
6
+ /**
7
+ * 生成 OpenAPI 文档和客户端 SDK
8
+ *
9
+ * 此文件由 @lark-apaas/fullstack-cli 自动派生,请勿手动修改
10
+ * 每次运行 npm install 时会自动更新
11
+ */
6
12
  async function generateOpenApi() {
7
- const app = await NestFactory.create(AppModule, {logger: false});
13
+ const app = await NestFactory.create(AppModule, { logger: false });
8
14
  const basePath = process.env.CLIENT_BASE_PATH;
9
- app.setGlobalPrefix(basePath);
10
-
15
+
16
+ if (basePath) {
17
+ app.setGlobalPrefix(basePath);
18
+ }
19
+
11
20
  await DevToolsModule.mount(app, {
12
21
  basePath,
13
22
  docsPath: '/api_docs',
@@ -1,22 +0,0 @@
1
- /**
2
- * fullstack-cli 派生配置
3
- * 定义哪些文件/目录需要同步到用户项目
4
- */
5
- export interface SyncRule {
6
- /** 源文件/目录路径(相对于插件根目录) */
7
- from: string;
8
- /** 目标文件/目录路径(相对于用户项目根目录) */
9
- to: string;
10
- /** 同步类型 */
11
- type: 'directory' | 'file' | 'append';
12
- /** 是否覆盖已存在的文件(仅 directory 和 file 类型有效) */
13
- overwrite?: boolean;
14
- }
15
- export interface PostinstallConfig {
16
- /** 派生规则 */
17
- sync: SyncRule[];
18
- /** 文件权限设置 */
19
- permissions?: Record<string, number>;
20
- }
21
- declare const config: PostinstallConfig;
22
- export default config;
@@ -1,28 +0,0 @@
1
- /**
2
- * fullstack-cli 派生配置
3
- * 定义哪些文件/目录需要同步到用户项目
4
- */
5
- const config = {
6
- // 派生规则
7
- sync: [
8
- // 1. 派生 scripts 目录(总是覆盖)
9
- {
10
- from: 'templates/scripts',
11
- to: 'scripts',
12
- type: 'directory',
13
- overwrite: true,
14
- },
15
- // 2. 追加内容到 .gitignore
16
- {
17
- from: 'templates/.gitignore.append',
18
- to: '.gitignore',
19
- type: 'append',
20
- },
21
- ],
22
- // 文件权限设置
23
- permissions: {
24
- // 所有 .sh 文件设置为可执行
25
- '**/*.sh': 0o755,
26
- },
27
- };
28
- export default config;
@@ -1,48 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { spawnSync } from 'node:child_process';
4
- import { postprocessDrizzleSchema } from '@lark-apaas/devtool-kits';
5
-
6
- const OUT_DIR = path.resolve(process.cwd(), 'server/database/.introspect');
7
- const SCHEMA_FILE = path.resolve(process.cwd(), 'server/database/schema.ts');
8
-
9
- function run(): void {
10
- const args = process.argv.slice(2);
11
- const spawnArgs = ['--yes', 'drizzle-kit', 'introspect', '--config', 'drizzle.config.ts', ...args];
12
-
13
- const result = spawnSync('npx', spawnArgs, { stdio: 'inherit' });
14
- if (result.error) {
15
- console.error('[gen-db-schema] Execution failed:', result.error);
16
- process.exit(result.status ?? 1);
17
- }
18
-
19
- if ((result.status ?? 0) !== 0) {
20
- process.exit(result.status ?? 1);
21
- }
22
-
23
- const generatedSchema = path.join(OUT_DIR, 'schema.ts');
24
- if (!fs.existsSync(generatedSchema)) {
25
- console.warn('[gen-db-schema] schema.ts not generated');
26
- process.exit(1);
27
- }
28
-
29
- fs.mkdirSync(path.dirname(SCHEMA_FILE), { recursive: true });
30
- fs.copyFileSync(generatedSchema, SCHEMA_FILE);
31
-
32
- try {
33
- const stats = postprocessDrizzleSchema(SCHEMA_FILE);
34
- if (stats?.unmatchedUnknown?.length) {
35
- console.warn('[gen-db-schema] Unmatched custom types detected');
36
- }
37
- } catch (error) {
38
- console.warn('[gen-db-schema] postprocess failed:', error);
39
- }
40
-
41
- if (fs.existsSync(OUT_DIR)) {
42
- fs.rmSync(OUT_DIR, { recursive: true, force: true });
43
- }
44
- }
45
-
46
- if (require.main === module) {
47
- run();
48
- }
File without changes