create-aiko 0.1.4 → 0.1.6
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/create.js
CHANGED
|
@@ -100,9 +100,6 @@ export function createCommand() {
|
|
|
100
100
|
: getTemplateDir(cwd);
|
|
101
101
|
if (!projectName || !targetDirArg) {
|
|
102
102
|
console.log('\n create-aiko\n');
|
|
103
|
-
const defaultDir = targetDirArg
|
|
104
|
-
? path.resolve(cwd, targetDirArg)
|
|
105
|
-
: path.join(cwd, projectName ? toScope(projectName) : 'my-app');
|
|
106
103
|
if (!projectName) {
|
|
107
104
|
const defaultName = targetDirArg ? path.basename(path.resolve(cwd, targetDirArg)) : 'my-app';
|
|
108
105
|
projectName = await prompt('Project name (e.g. my-app)', defaultName);
|
|
@@ -111,6 +108,9 @@ export function createCommand() {
|
|
|
111
108
|
process.exit(1);
|
|
112
109
|
}
|
|
113
110
|
}
|
|
111
|
+
const defaultDir = targetDirArg
|
|
112
|
+
? path.resolve(cwd, targetDirArg)
|
|
113
|
+
: path.join(cwd, toScope(projectName));
|
|
114
114
|
if (!targetDirArg) {
|
|
115
115
|
const dirPromptDefault = defaultDirDisplay(cwd, defaultDir);
|
|
116
116
|
const dirAnswer = await prompt('Destination (folder path for the project)', dirPromptDefault);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-aiko",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "CLI to create aiko-boot scaffold project (monorepo with api, admin, mobile, shared)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"template"
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
|
+
"prepack": "npm run build",
|
|
22
23
|
"build": "tsc && node ./scripts/build-template.mjs",
|
|
23
24
|
"dev": "tsc --watch"
|
|
24
25
|
},
|
package/template/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
12
|
"postinstall": "node ./scripts/postinstall.cjs",
|
|
13
|
-
"dev": "pnpm --parallel
|
|
13
|
+
"dev": "pnpm --parallel --filter @scaffold/api --filter @scaffold/admin --filter @scaffold/mobile dev",
|
|
14
14
|
"dev:api": "pnpm --filter @scaffold/api dev",
|
|
15
15
|
"dev:admin": "pnpm --filter @scaffold/admin dev",
|
|
16
16
|
"dev:mobile": "pnpm --filter @scaffold/mobile dev",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import 'reflect-metadata';
|
|
6
6
|
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import { createRequire } from 'node:module';
|
|
7
8
|
import { fileURLToPath } from 'url';
|
|
8
9
|
import { pathToFileURL } from 'url';
|
|
9
10
|
import { dirname, join } from 'path';
|
|
@@ -12,6 +13,7 @@ import { createKyselyDatabase, getKyselyDatabase } from '@ai-partner-x/aiko-boot
|
|
|
12
13
|
import bcrypt from 'bcryptjs';
|
|
13
14
|
|
|
14
15
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const require = createRequire(import.meta.url);
|
|
15
17
|
const dbPath = join(__dirname, '../../data/app.db');
|
|
16
18
|
const dir = dirname(dbPath);
|
|
17
19
|
if (!existsSync(dir)) {
|
|
@@ -153,7 +155,9 @@ async function tryRepairBetterSqlite(error: unknown): Promise<boolean> {
|
|
|
153
155
|
|
|
154
156
|
console.warn('\n[init-db] 检测到 better-sqlite3 原生绑定缺失,正在尝试自动重建...');
|
|
155
157
|
|
|
158
|
+
const packageRoot = join(__dirname, '../..');
|
|
156
159
|
const projectRoot = join(__dirname, '../../../..');
|
|
160
|
+
const betterSqliteDir = resolveBetterSqliteDir();
|
|
157
161
|
const rebuild = spawnSync(
|
|
158
162
|
'pnpm',
|
|
159
163
|
['rebuild', 'better-sqlite3'],
|
|
@@ -172,13 +176,35 @@ async function tryRepairBetterSqlite(error: unknown): Promise<boolean> {
|
|
|
172
176
|
return false;
|
|
173
177
|
}
|
|
174
178
|
|
|
179
|
+
if (!hasBetterSqliteBinding(betterSqliteDir)) {
|
|
180
|
+
console.warn('\n[init-db] pnpm rebuild 未生成原生绑定,正在执行 build-release 兜底...');
|
|
181
|
+
|
|
182
|
+
const fallback = spawnSync(
|
|
183
|
+
'npm',
|
|
184
|
+
['run', 'build-release'],
|
|
185
|
+
{
|
|
186
|
+
cwd: betterSqliteDir,
|
|
187
|
+
stdio: 'inherit',
|
|
188
|
+
shell: process.platform === 'win32',
|
|
189
|
+
}
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
if (fallback.error) {
|
|
193
|
+
throw fallback.error;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if ((fallback.status ?? 1) !== 0 || !hasBetterSqliteBinding(betterSqliteDir)) {
|
|
197
|
+
throw new Error('[init-db] better-sqlite3 build-release 兜底失败,请手动执行 npm run build-release');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
175
201
|
console.log('\n[init-db] better-sqlite3 重建成功,正在重试数据库初始化...');
|
|
176
202
|
|
|
177
203
|
const retry = spawnSync(
|
|
178
204
|
process.execPath,
|
|
179
205
|
['--import', '@swc-node/register/esm-register', process.argv[1]!],
|
|
180
206
|
{
|
|
181
|
-
cwd:
|
|
207
|
+
cwd: packageRoot,
|
|
182
208
|
stdio: 'inherit',
|
|
183
209
|
env: {
|
|
184
210
|
...process.env,
|
|
@@ -198,6 +224,15 @@ async function tryRepairBetterSqlite(error: unknown): Promise<boolean> {
|
|
|
198
224
|
return true;
|
|
199
225
|
}
|
|
200
226
|
|
|
227
|
+
function resolveBetterSqliteDir(): string {
|
|
228
|
+
const pkgJsonPath = require.resolve('better-sqlite3/package.json');
|
|
229
|
+
return dirname(pkgJsonPath);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function hasBetterSqliteBinding(betterSqliteDir: string): boolean {
|
|
233
|
+
return existsSync(join(betterSqliteDir, 'build/Release/better_sqlite3.node'));
|
|
234
|
+
}
|
|
235
|
+
|
|
201
236
|
async function runGeneratedModuleInitializers(dbInstance: any) {
|
|
202
237
|
const generatedDir = join(__dirname, 'generated');
|
|
203
238
|
if (!existsSync(generatedDir)) {
|