@scenemesh/entity-engine
Version:
一个“元数据驱动 + 组件适配 + 动态关系 + 视图管线”式的实体引擎。以 **Model + View + FieldType + SuiteAdapter + DataSource** 为五大支点,统一 CRUD / 查询 / 引用管理 / 视图渲染 / 扩展注册,支持在运行期无侵入拼装出 **表单、网格、主从、看板、仪表盘、流程/树形视图** 等多形态界面。
1 lines • 8.81 kB
Source Map (JSON)
{"version":3,"sources":["../src/scripts/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { promisify } from 'util';\nimport { exec } from 'child_process';\n\nconst execPromise = promisify(exec);\n\nconst log = {\n info: (msg: string) => console.log(`\\x1b[34m[info]\\x1b[0m ${msg}`),\n success: (msg: string) => console.log(`\\x1b[32m[success]\\x1b[0m ${msg}`),\n error: (msg: string) => console.error(`\\x1b[31m[error]\\x1b[0m ${msg}`),\n warn: (msg: string) => console.warn(`\\x1b[33m[warn]\\x1b[0m ${msg}`),\n};\n\nasync function runCommand(command: string) {\n try {\n const { stdout, stderr } = await execPromise(command);\n if (stdout) console.log(stdout);\n if (stderr) console.error(stderr);\n } catch (error) {\n log.error(`Failed to execute command: ${command}`);\n throw error;\n }\n}\n\nasync function main() {\n log.info('Setting up @scenemesh/entity-engine...');\n\n const userSchemaPath = path.join(process.cwd(), 'prisma', 'schema.prisma');\n const packageSchemaPath = path.join(__dirname, '..', 'prisma', 'schema.prisma');\n\n let generateCommand = 'npx prisma generate';\n\n // 检查用户的 schema 文件是否存在\n if (fs.existsSync(userSchemaPath)) {\n // --- 场景 1: 用户有 schema 文件,执行合并 ---\n log.info('Existing prisma/schema.prisma found. Merging models...');\n const existingSchema = fs.readFileSync(userSchemaPath, 'utf-8');\n if (existingSchema.includes('model EntityObject')) {\n log.info(\n 'Entity Engine models already exist in your schema. Skipping schema modification.'\n );\n } else {\n let modelsToAdd = fs.readFileSync(packageSchemaPath, 'utf-8');\n const modelStartIndex = modelsToAdd.indexOf('model EntityObject');\n if (modelStartIndex !== -1) {\n modelsToAdd = '\\n\\n' + modelsToAdd.substring(modelStartIndex);\n fs.appendFileSync(userSchemaPath, modelsToAdd);\n log.success('Entity Engine models have been added to your prisma/schema.prisma.');\n }\n }\n } else {\n // --- 场景 2: 用户没有 schema 文件,直接使用包内 schema ---\n log.warn('No prisma/schema.prisma found in your project.');\n log.info('Generating a temporary Prisma Client based on the Entity Engine schema.');\n\n // 修改 generate 命令,指向包内的 schema\n generateCommand = `npx prisma generate --schema=${packageSchemaPath}`;\n }\n\n // --- 执行 prisma generate ---\n try {\n log.info(`Running command: ${generateCommand}`);\n await runCommand(generateCommand);\n log.success('Prisma Client has been successfully generated.');\n } catch {\n log.error('Prisma Client generation failed. Please run it manually.');\n process.exit(1);\n }\n\n // --- 指导用户进行下一步 ---\n if (fs.existsSync(userSchemaPath)) {\n log.info(\"Next step: Run 'npx prisma migrate dev' to update your database.\");\n // 交互式询问是否现在执行 migrate\n await maybeRunInteractive(async () => {\n const doMigrate = await promptYesNo('是否现在执行数据库迁移以创建/更新表结构? (y/N): ');\n if (doMigrate) {\n try {\n log.info('Running: npx prisma migrate dev');\n await runCommand('npx prisma migrate dev');\n log.success('数据库迁移已完成。');\n } catch (err) {\n log.error('执行 prisma migrate dev 失败,请手动检查。');\n if (err instanceof Error) log.error(err.message);\n }\n } else {\n log.info('已跳过数据库迁移。');\n }\n });\n } else {\n log.warn(\n 'Important: The generated client is temporary and only contains Entity Engine models.'\n );\n log.warn(\n \"Once you create your own 'prisma/schema.prisma' and run 'npx prisma generate', this client will be overwritten.\"\n );\n log.warn(\n \"To integrate properly, run 'npx prisma init' and then run this setup script again.\"\n );\n // 交互式询问是否基于临时 schema 推送数据库结构\n await maybeRunInteractive(async () => {\n const doPush = await promptYesNo(\n '当前没有本地 schema,是否基于包内临时 schema 立即创建数据库结构 (prisma db push)? (y/N): '\n );\n if (doPush) {\n try {\n const cmd = `npx prisma db push --schema=${packageSchemaPath}`;\n log.info(`Running: ${cmd}`);\n await runCommand(cmd);\n log.success('已根据临时 schema 创建/同步数据库结构。');\n } catch (err) {\n log.error('执行 prisma db push 失败,请手动检查。');\n if (err instanceof Error) log.error(err.message);\n }\n } else {\n log.info('已跳过临时 schema 的数据库结构创建。');\n }\n });\n }\n}\n\nmain();\n\n// ========== 辅助函数:交互式提问 ==========\nfunction promptYesNo(question: string): Promise<boolean> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n rl.question(question, (answer) => {\n rl.close();\n const normalized = (answer || '').trim().toLowerCase();\n resolve(normalized === 'y' || normalized === 'yes');\n });\n });\n}\n\nasync function maybeRunInteractive(fn: () => Promise<void>) {\n // 在非交互环境(例如 CI)下跳过\n if (!process.stdout.isTTY) {\n log.info('检测到非交互式环境,自动跳过可选的数据库结构创建步骤。');\n return;\n }\n await fn();\n}\n"],"mappings":"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","names":[]}