create-whale-env 1.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/init.ts","../src/constants.ts","../src/generate/corp.ts","../src/utils/paths.ts","../src/generate/envFiles.ts","../src/generate/manifest.ts","../src/utils/noticeBox.ts","../src/utils/readExistingProject.ts","../src/index.ts"],"sourcesContent":["import { cac } from 'cac'\nimport { consola } from 'consola'\nimport { runInit } from './commands/init'\nimport { name, version } from './index'\n\n/**\n * 发包后:\n * npm create whale-env [corp-code]\n * pnpm create whale-env [corp-code]\n * yarn create whale-env [corp-code]\n * → 解析包 create-whale-env;未传编码时交互输入\n *\n * 本地 monorepo:\n * pnpm create:whale-env [corp-code]\n * pnpm exec create-whale-env [corp-code]\n */\nconst cli = cac('pnpm create whale-env')\n\nasync function handle(\n corpCode: string | undefined,\n options: { root?: string; force?: boolean },\n) {\n try {\n await runInit(corpCode, options)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (message.includes('User force closed') || message.includes('ExitPromptError')) {\n consola.warn('已取消')\n process.exitCode = 1\n return\n }\n consola.error(message)\n process.exitCode = 1\n }\n}\n\ncli\n .command('[corp-code]', '快速创建 corp 公司环境目录(可省略,交互输入编码)')\n .option('--root <path>', 'app-env 根目录(默认从当前目录向上查找)')\n .option('--force', '目录已存在时直接覆盖', { default: false })\n .action(async (corpCode: string | undefined, options: { root?: string; force?: boolean }) => {\n await handle(corpCode, options)\n })\n\ncli.help()\ncli.version(version)\ncli.parse()\n","import { checkbox, input, select } from '@inquirer/prompts'\nimport { consola } from 'consola'\nimport { colors } from 'consola/utils'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {\n GROUP_DOMAIN_PLACEHOLDER,\n PROJECTS,\n getProjectMeta,\n} from '../constants'\nimport { generateCorp } from '../generate/corp'\nimport type { CorpInitInput, ProjectInitInput } from '../types'\nimport {\n assertValidCorpCode,\n getCorpDir,\n resolveAppEnvRoot,\n validateCorpCode,\n} from '../utils/paths'\nimport { printNoticeBox, printSectionBox } from '../utils/noticeBox'\nimport { readExistingProjectConfig } from '../utils/readExistingProject'\n\nexport interface InitOptions {\n root?: string\n force?: boolean\n}\n\ntype WriteMode = 'create' | 'append' | 'overwrite'\n\nfunction listExistingProjects(corpDir: string): string[] {\n if (!fs.existsSync(corpDir)) return []\n return fs\n .readdirSync(corpDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => d.name)\n .filter((name) => PROJECTS.some((p) => p.value === name))\n}\n\nfunction formatProjectLabels(projectValues: string[]): string {\n return projectValues\n .map((value) => getProjectMeta(value)?.name.replace(/[【】]/g, '') || value)\n .join('、')\n}\n\nfunction getProjectLabel(value: string): string {\n return getProjectMeta(value)?.name.replace(/[【】]/g, '') || value\n}\n\nfunction printExistingCorpNotice(corpCode: string, existing: string[]) {\n const body: string[] = [\n `${colors.bold('公司编码')} ${colors.cyan(corpCode)}`,\n ]\n\n if (existing.length) {\n body.push(\n `${colors.bold('已有端')} ${colors.dim(`${existing.length} 个`)}`,\n '',\n ...existing.map(\n (value) =>\n `${colors.green('✔')} ${colors.white(getProjectLabel(value))}`,\n ),\n )\n }\n\n printNoticeBox('公司已存在', body)\n}\n\nfunction readCorpName(corpDir: string, fallback = ''): string {\n const buildJsonPath = path.join(corpDir, 'build.json')\n if (!fs.existsSync(buildJsonPath)) return fallback\n try {\n const data = JSON.parse(fs.readFileSync(buildJsonPath, 'utf8')) as {\n name?: string\n }\n return data.name?.trim() || fallback\n } catch {\n return fallback\n }\n}\n\nfunction optionalHint(current?: string) {\n const value = current?.trim()\n return value ? `(回车保留: ${value})` : '(回车跳过)'\n}\n\nasync function promptProjectConfig(\n corpName: string,\n projectValue: string,\n defaults: Partial<ProjectInitInput> = {},\n): Promise<ProjectInitInput> {\n const meta = getProjectMeta(projectValue)\n if (!meta) {\n throw new Error(`未知业务端: ${projectValue}`)\n }\n\n const editing = Boolean(defaults.domain || defaults.appName)\n printSectionBox(\n editing ? `编辑业务端:${meta.name}` : `配置业务端:${meta.name}`,\n )\n\n const domainDefault = defaults.domain?.trim() || ''\n const domain = await input({\n message: domainDefault\n ? `API 域名 DOMAIN${optionalHint(domainDefault)}`\n : 'API 域名 DOMAIN',\n default: domainDefault || undefined,\n validate: (v) => (v.trim() ? true : '域名必填'),\n })\n\n const appNameDefault =\n defaults.appName?.trim() ||\n `${corpName}${meta.name.replace(/[【】]/g, '')}`\n const appName = await input({\n message: `App 显示名(manifest.name)${optionalHint(appNameDefault)}`,\n default: appNameDefault,\n })\n\n const wechatAppId = await input({\n message: `微信小程序 WECHAT_APPID${optionalHint(defaults.wechatAppId)}`,\n default: defaults.wechatAppId ?? '',\n })\n\n const workWechatAppId = await input({\n message: `企业微信 WORK_WECHAT_APPID${optionalHint(defaults.workWechatAppId)}`,\n default: defaults.workWechatAppId ?? '',\n })\n\n const wechatServiceAppId = await input({\n message: `服务号 WECHAT_SERVICE_APPID${optionalHint(defaults.wechatServiceAppId)}`,\n default: defaults.wechatServiceAppId ?? '',\n })\n\n const uniAppId = await input({\n message: `uni-app appid${optionalHint(defaults.uniAppId)}`,\n default: defaults.uniAppId ?? '',\n })\n\n const dcloudAppKey = await input({\n message: `DCloud AppKey${optionalHint(defaults.dcloudAppKey)}`,\n default: defaults.dcloudAppKey ?? '',\n })\n\n const groupDefault =\n defaults.groupDomain?.trim() || GROUP_DOMAIN_PLACEHOLDER\n const groupDomain = await input({\n message: `集团域名 group DOMAIN${optionalHint(groupDefault)}`,\n default: groupDefault,\n })\n\n return {\n project: meta.value,\n client: meta.client,\n domain: domain.trim(),\n appName: appName.trim(),\n wechatAppId: wechatAppId.trim(),\n workWechatAppId: workWechatAppId.trim(),\n wechatServiceAppId: wechatServiceAppId.trim(),\n uniAppId: uniAppId.trim(),\n dcloudAppKey: dcloudAppKey.trim(),\n groupDomain: groupDomain.trim() || GROUP_DOMAIN_PLACEHOLDER,\n }\n}\n\nexport async function runInit(corpCodeArg?: string, options: InitOptions = {}) {\n let corpCode = corpCodeArg?.trim() || ''\n if (!corpCode) {\n corpCode = (\n await input({\n message: '公司编码(目录名 / build.json.value)',\n validate: validateCorpCode,\n })\n ).trim()\n } else {\n assertValidCorpCode(corpCode)\n }\n\n const appEnvRoot = resolveAppEnvRoot(options.root ?? process.cwd())\n const corpDir = getCorpDir(appEnvRoot, corpCode)\n\n consola.info(`app-env 根目录: ${appEnvRoot}`)\n consola.info(`目标公司目录: ${path.relative(appEnvRoot, corpDir)}`)\n\n const exists = fs.existsSync(corpDir)\n let mode: WriteMode = 'create'\n const existingProjects = listExistingProjects(corpDir)\n\n if (exists && !options.force) {\n printExistingCorpNotice(corpCode, existingProjects)\n }\n\n const currentName = readCorpName(corpDir)\n let corpName = currentName\n\n if (exists && currentName) {\n const renameAction = await select({\n message: `公司中文名(当前: ${currentName})`,\n choices: [\n { name: '保持原名', value: 'keep' },\n { name: '重命名', value: 'rename' },\n ],\n })\n if (renameAction === 'rename') {\n corpName = (\n await input({\n message: '请输入新的公司中文名',\n default: currentName,\n validate: (v) => (v.trim() ? true : '公司名必填'),\n })\n ).trim()\n }\n } else {\n corpName = (\n await input({\n message: '公司中文名(build.json.name)',\n default: currentName || undefined,\n validate: (v) => (v.trim() ? true : '公司名必填'),\n })\n ).trim()\n }\n\n if (exists) {\n if (options.force) {\n mode = 'overwrite'\n } else {\n const canAppend = PROJECTS.some((p) => !existingProjects.includes(p.value))\n const choices = [\n ...(canAppend\n ? [\n {\n name: '追加新端(保留已有,只生成尚未开通的端)',\n value: 'append' as const,\n },\n ]\n : []),\n {\n name: '编辑已有的端',\n value: 'overwrite' as const,\n },\n { name: '取消', value: 'cancel' as const },\n ]\n\n if (!canAppend) {\n consola.info('全部业务端均已开通,仅可编辑已有端或取消')\n }\n\n const picked = await select({\n message: '请选择写入方式',\n choices,\n })\n if (picked === 'cancel') {\n consola.warn('已取消')\n return\n }\n mode = picked\n }\n }\n\n const projectChoices = PROJECTS.map((p) => {\n const already = existingProjects.includes(p.value)\n if (mode === 'append') {\n return {\n name: p.name,\n value: p.value,\n checked: false,\n disabled: already ? '已存在' : false,\n }\n }\n return {\n name: p.name,\n value: p.value,\n checked: !exists && p.value === 'officeAutomatic',\n }\n })\n\n if (mode === 'append' && projectChoices.every((c) => c.disabled)) {\n consola.warn('所有业务端都已存在,无需追加。如需修改请选「编辑已有的端」。')\n return\n }\n\n const selected = await checkbox({\n message: '选择业务端(空格多选,回车确认;可一次勾 N 个)',\n required: true,\n choices: projectChoices,\n })\n\n if (!selected.length) {\n throw new Error('至少选择一个业务端')\n }\n\n if (mode === 'overwrite') {\n const willEdit = selected.filter((p) => existingProjects.includes(p))\n if (willEdit.length) {\n const editAction = await select({\n message: `将编辑这些已有端: ${formatProjectLabels(willEdit)}`,\n choices: [\n { name: '确认编辑', value: 'yes' },\n { name: '取消', value: 'no' },\n ],\n })\n if (editAction === 'no') {\n consola.warn('已取消')\n return\n }\n }\n }\n\n const projects: ProjectInitInput[] = []\n for (const projectValue of selected) {\n const defaults =\n mode === 'overwrite' || existingProjects.includes(projectValue)\n ? readExistingProjectConfig(corpDir, projectValue)\n : {}\n projects.push(\n await promptProjectConfig(corpName.trim(), projectValue, defaults),\n )\n }\n\n const payload: CorpInitInput = {\n corpCode,\n corpName: corpName.trim(),\n projects,\n }\n\n const created = await generateCorp(appEnvRoot, payload)\n const action =\n mode === 'append' ? '追加' : mode === 'overwrite' ? '编辑' : '创建'\n consola.success(`公司环境已${action}: ${created}`)\n consola.info(\n `本次处理 ${projects.length} 个端: ${formatProjectLabels(projects.map((p) => p.project))}`,\n )\n if (mode === 'append' || mode === 'overwrite') {\n const selectedSet = new Set<string>(selected)\n const remain = listExistingProjects(corpDir).filter((p) => !selectedSet.has(p))\n if (remain.length) {\n consola.info(`未改动的已有端: ${formatProjectLabels(remain)}`)\n }\n }\n}\n","export const PROJECTS = [\n { name: '【移动OA】', value: 'officeAutomatic', client: 'EMPLOYEE' },\n { name: '【司机端】', value: 'driver', client: 'DRIVER' },\n { name: '【冶金仓储】', value: 'steelWare', client: 'EMPLOYEE' },\n { name: '【供应商端】', value: 'vendor', client: 'VENDOR' },\n { name: '【客户端】', value: 'customer', client: 'CUSTOMER' },\n { name: '【生产商端】', value: 'manufactUser', client: 'MANUFACTURER' },\n { name: '【自定义端】', value: 'portal', client: '' },\n] as const\n\nexport type ProjectValue = (typeof PROJECTS)[number]['value']\n\nexport const CLIENT_PLATFORMS = ['wechat', 'android', 'ios'] as const\nexport type ClientPlatform = (typeof CLIENT_PLATFORMS)[number]\n\nexport const ENV_NAMES = ['dev', 'test', 'pro'] as const\nexport const GROUP_ENV_NAMES = ['groupDev', 'groupTest', 'groupPro'] as const\n\nexport const GROUP_DOMAIN_PLACEHOLDER = 'https://xxxxxx.com'\n\nexport function getProjectMeta(value: string) {\n return PROJECTS.find((p) => p.value === value)\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { consola } from 'consola'\nimport type { CorpInitInput } from '../types'\nimport { getCorpDir } from '../utils/paths'\nimport { buildEnvFileMap } from './envFiles'\nimport { buildManifestFileMap } from './manifest'\n\nasync function writeFile(filePath: string, content: string) {\n await fs.mkdir(path.dirname(filePath), { recursive: true })\n await fs.writeFile(filePath, content, 'utf8')\n}\n\nexport async function generateCorp(appEnvRoot: string, input: CorpInitInput) {\n const corpDir = getCorpDir(appEnvRoot, input.corpCode)\n await fs.mkdir(corpDir, { recursive: true })\n\n const buildJson = JSON.stringify(\n {\n name: input.corpName,\n value: input.corpCode,\n },\n null,\n 2,\n )\n await writeFile(path.join(corpDir, 'build.json'), `${buildJson}\\n`)\n consola.success(`写入 ${path.relative(appEnvRoot, path.join(corpDir, 'build.json'))}`)\n\n for (const project of input.projects) {\n const projectDir = path.join(corpDir, project.project)\n const envDir = path.join(projectDir, 'env')\n const manifestDir = path.join(projectDir, 'manifest')\n\n const envFiles = buildEnvFileMap(project)\n for (const [rel, content] of Object.entries(envFiles)) {\n await writeFile(path.join(envDir, rel), content)\n }\n\n const manifestFiles = buildManifestFileMap(project)\n for (const [rel, content] of Object.entries(manifestFiles)) {\n await writeFile(path.join(manifestDir, rel), content)\n }\n\n consola.success(\n `生成业务端 ${project.project}(env ${Object.keys(envFiles).length} + manifest ${Object.keys(manifestFiles).length})`,\n )\n }\n\n return corpDir\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\n/** 向上查找含 src/corp 的 app-env 根目录 */\nexport function resolveAppEnvRoot(cwd = process.cwd()): string {\n let dir = path.resolve(cwd)\n while (true) {\n const corpDir = path.join(dir, 'src', 'corp')\n if (fs.existsSync(corpDir) && fs.statSync(corpDir).isDirectory()) {\n return dir\n }\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n throw new Error(\n `未找到 app-env 根目录(需包含 src/corp)。请在 app-env 下执行,或传 --root <path>`,\n )\n}\n\nexport function getCorpDir(appEnvRoot: string, corpCode: string) {\n return path.join(appEnvRoot, 'src', 'corp', corpCode)\n}\n\nexport function assertValidCorpCode(corpCode: string) {\n if (!/^[a-z][a-z0-9_-]*$/i.test(corpCode)) {\n throw new Error(\n `公司编码无效: \"${corpCode}\"。请使用字母开头,仅含字母/数字/_/-`,\n )\n }\n if (corpCode.startsWith('_')) {\n throw new Error(`公司编码不能以下划线开头: \"${corpCode}\"`)\n }\n}\n\n/** inquirer validate:合法返回 true,否则返回错误文案 */\nexport function validateCorpCode(corpCode: string): true | string {\n try {\n assertValidCorpCode(corpCode.trim())\n return true\n } catch (error) {\n return error instanceof Error ? error.message : String(error)\n }\n}\n","import type { ProjectInitInput } from '../types'\nimport {\n CLIENT_PLATFORMS,\n ENV_NAMES,\n GROUP_ENV_NAMES,\n type ClientPlatform,\n} from '../constants'\n\nfunction platformFactoryName(platform: ClientPlatform) {\n if (platform === 'wechat') return 'WechatBaseEnv'\n if (platform === 'android') return 'AndroidBaseEnv'\n return 'IOSBaseEnv'\n}\n\nfunction envImportName(env: string) {\n const map: Record<string, string> = {\n dev: 'BaseDevEnv',\n test: 'BaseTestEnv',\n pro: 'BaseProEnv',\n groupDev: 'BaseGroupDevEnv',\n groupTest: 'BaseGroupTestEnv',\n groupPro: 'BaseGroupProEnv',\n }\n return map[env] ?? `Base${env}Env`\n}\n\nexport function renderTypesTs() {\n return `export type EnvOptions = {\n [key:string]:any\n}\n`\n}\n\nexport function renderBaseTs(input: ProjectInitInput) {\n const lines = [\n `import { getAppConfEnv } from '../../../../app/config/${input.project}'`,\n '',\n 'export default{',\n ' ...getAppConfEnv(),',\n ` CLIENT: '${input.client}', // 客户端类型`,\n ` DOMAIN:'${input.domain}',//域名`,\n ` WECHAT_APPID:'${input.wechatAppId}',//微信`,\n ` WORK_WECHAT_APPID:'${input.workWechatAppId}',//企业微信应用ID`,\n ]\n\n if (input.wechatServiceAppId) {\n lines.push(` WECHAT_SERVICE_APPID:'${input.wechatServiceAppId}',//公众号/服务号appid`)\n }\n\n lines.push('}')\n lines.push('')\n return lines.join('\\n')\n}\n\nexport function renderRootEnvTs(env: string, domainOverride?: string) {\n const comment =\n env.startsWith('group') ? '集团环境配置' : `${env} 环境配置`\n const domainLine = domainOverride\n ? ` DOMAIN:'${domainOverride}',//域名\\n`\n : ''\n\n return `import BaseEnv from './base'\n\n/**\n * ${comment}\n */\nexport default{\n ...BaseEnv,\n${domainLine}}\n`\n}\n\nexport function renderPlatformBaseTs(\n platform: ClientPlatform,\n input: ProjectInitInput,\n) {\n const factory = platformFactoryName(platform)\n\n if (platform === 'wechat') {\n const body = [\n ' ...options,',\n ` WECHAT_APPID:'${input.wechatAppId}',//微信`,\n ` WORK_WECHAT_APPID:'${input.workWechatAppId}',//企业微信应用ID`,\n ]\n if (input.wechatServiceAppId) {\n body.push(\n ` WECHAT_SERVICE_APPID:'${input.wechatServiceAppId}',//公众号/服务号appid`,\n )\n }\n\n return `import type { EnvOptions } from '../types'\n\nexport const ${factory} = (options:EnvOptions)=>{\n return {\n${body.join('\\n')}\n }\n}\nexport default ${factory}\n`\n }\n\n return `import type { EnvOptions } from '../types'\n\nexport const ${factory} = (options:EnvOptions)=>{\n return { \n DCLOUD_APP_KEY_IOS:'${input.dcloudAppKey}', \n ...options,\n }\n}\nexport default ${factory}\n`\n}\n\nexport function renderPlatformEnvTs(platform: ClientPlatform, env: string) {\n const factory = platformFactoryName(platform)\n const importName = envImportName(env)\n return `import ${factory} from './base'\nimport ${importName} from '../${env}'\nexport default ${factory}({\n ...${importName}, \n})\n`\n}\n\nexport function buildEnvFileMap(input: ProjectInitInput): Record<string, string> {\n const files: Record<string, string> = {\n 'types.ts': renderTypesTs(),\n 'base.ts': renderBaseTs(input),\n }\n\n for (const env of ENV_NAMES) {\n files[`${env}.ts`] = renderRootEnvTs(env)\n }\n for (const env of GROUP_ENV_NAMES) {\n files[`${env}.ts`] = renderRootEnvTs(env, input.groupDomain)\n }\n\n for (const platform of CLIENT_PLATFORMS) {\n files[`${platform}/base.ts`] = renderPlatformBaseTs(platform, input)\n for (const env of [...ENV_NAMES, ...GROUP_ENV_NAMES]) {\n files[`${platform}/${env}.ts`] = renderPlatformEnvTs(platform, env)\n }\n }\n\n return files\n}\n","import type { ProjectInitInput } from '../types'\nimport { CLIENT_PLATFORMS } from '../constants'\n\nfunction fallbackUniAppId(project: string) {\n const seed = project\n .replace(/[^a-zA-Z0-9]/g, '')\n .toUpperCase()\n .slice(0, 7)\n .padEnd(7, '0')\n return `__UNI__${seed}`\n}\n\nexport function renderManifest(input: ProjectInitInput) {\n const uniAppId = input.uniAppId || fallbackUniAppId(input.project)\n const wechatAppId = input.wechatAppId || ''\n\n return `{\n \"name\" : ${JSON.stringify(input.appName)},\n \"appid\" : ${JSON.stringify(uniAppId)},\n \"description\" : \"\",\n \"versionName\" : \"1.0.0\",\n \"versionCode\" : \"100\",\n \"transformPx\" : false,\n /* 5+App特有相关 */\n \"app-plus\" : {\n \"usingComponents\" : true,\n \"nvueStyleCompiler\" : \"uni-app\",\n \"compilerVersion\" : 3,\n \"splashscreen\" : {\n \"alwaysShowBeforeRender\" : true,\n \"waiting\" : true,\n \"autoclose\" : true,\n \"delay\" : 0\n },\n /* 模块配置 */\n \"modules\" : {\n \"Barcode\" : {},\n \"Camera\" : {},\n \"VideoPlayer\" : {}\n },\n /* 应用发布信息 */\n \"distribute\" : {\n /* android打包配置 */\n \"android\" : {\n \"permissions\" : [\n \"<uses-permission android:name=\\\\\"android.permission.CHANGE_NETWORK_STATE\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.VIBRATE\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.READ_LOGS\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.ACCESS_WIFI_STATE\\\\\"/>\",\n \"<uses-feature android:name=\\\\\"android.hardware.camera.autofocus\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.ACCESS_NETWORK_STATE\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.CAMERA\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.GET_ACCOUNTS\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.READ_PHONE_STATE\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.CHANGE_WIFI_STATE\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.WAKE_LOCK\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.FLASHLIGHT\\\\\"/>\",\n \"<uses-feature android:name=\\\\\"android.hardware.camera\\\\\"/>\",\n \"<uses-permission android:name=\\\\\"android.permission.WRITE_SETTINGS\\\\\"/>\"\n ]\n },\n /* ios打包配置 */\n \"ios\" : {},\n /* SDK配置 */\n \"sdkConfigs\" : {}\n }\n },\n /* 快应用特有相关 */\n \"quickapp\" : {},\n /* 小程序特有相关 */\n \"mp-weixin\" : {\n \"appid\" : ${JSON.stringify(wechatAppId)},\n \"setting\" : {\n \"urlCheck\" : false\n },\n \"usingComponents\" : true\n },\n \"mp-alipay\" : {\n \"usingComponents\" : true\n },\n \"mp-baidu\" : {\n \"usingComponents\" : true\n },\n \"mp-toutiao\" : {\n \"usingComponents\" : true\n },\n \"uniStatistics\": { \n \"enable\": false\n },\n \"vueVersion\" : \"3\"\n}\n`\n}\n\nexport function buildManifestFileMap(input: ProjectInitInput): Record<string, string> {\n const content = renderManifest(input)\n const files: Record<string, string> = {}\n for (const platform of CLIENT_PLATFORMS) {\n files[`${platform}.manifest.json`] = content\n }\n return files\n}\n","import stringWidth from 'string-width'\nimport { colors } from 'consola/utils'\n\nfunction padVisible(text: string, width: number) {\n const visible = stringWidth(text)\n return visible >= width ? text : `${text}${' '.repeat(width - visible)}`\n}\n\n/** 按可视宽度画完整圆角框(兼容中文双宽 + ANSI 色) */\nexport function printNoticeBox(\n title: string,\n bodyLines: string[],\n options: { minWidth?: number; borderColor?: 'yellow' | 'cyan' | 'green' } = {},\n) {\n const padX = 2\n const minWidth = options.minWidth ?? 16\n const paint = colors[options.borderColor ?? 'yellow']\n const contentWidth = Math.max(\n stringWidth(title) + 2,\n ...bodyLines.map((line) => stringWidth(line)),\n minWidth,\n )\n const innerWidth = contentWidth + padX * 2\n\n const top =\n paint('╭') +\n paint('─'.repeat(padX)) +\n paint(colors.bold(` ${title} `)) +\n paint(\n '─'.repeat(Math.max(1, innerWidth - padX - stringWidth(` ${title} `))),\n ) +\n paint('╮')\n\n const empty = paint('│') + ' '.repeat(innerWidth) + paint('│')\n const bottom = paint('╰') + paint('─'.repeat(innerWidth)) + paint('╯')\n\n console.log()\n console.log(top)\n if (bodyLines.length === 0) {\n console.log(empty)\n } else {\n console.log(empty)\n for (const line of bodyLines) {\n const padded = padVisible(line, contentWidth)\n console.log(\n `${paint('│')}${' '.repeat(padX)}${padded}${' '.repeat(padX)}${paint('│')}`,\n )\n }\n console.log(empty)\n }\n console.log(bottom)\n console.log()\n}\n\n/** 业务端配置标题框(加宽,避免短标题显得过小) */\nexport function printSectionBox(message: string) {\n printNoticeBox(message, [], { minWidth: 36, borderColor: 'cyan' })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { GROUP_DOMAIN_PLACEHOLDER } from '../constants'\nimport type { ProjectInitInput } from '../types'\n\nfunction readText(filePath: string): string {\n if (!fs.existsSync(filePath)) return ''\n return fs.readFileSync(filePath, 'utf8')\n}\n\nfunction pickString(source: string, key: string): string {\n const re = new RegExp(\n `${key}\\\\s*:\\\\s*['\"]([^'\"]*)['\"]`,\n 'm',\n )\n const matched = source.match(re)\n return matched?.[1] ?? ''\n}\n\nfunction pickJsonString(source: string, key: string): string {\n try {\n const data = JSON.parse(source) as Record<string, unknown>\n const value = data[key]\n return typeof value === 'string' ? value : ''\n } catch {\n // manifest 可能含注释,退回正则\n const re = new RegExp(`\"${key}\"\\\\s*:\\\\s*\"([^\"]*)\"`, 'm')\n return source.match(re)?.[1] ?? ''\n }\n}\n\n/** 从已有端目录读取可编辑字段,供表单回填 */\nexport function readExistingProjectConfig(\n corpDir: string,\n project: string,\n): Partial<ProjectInitInput> {\n const projectDir = path.join(corpDir, project)\n if (!fs.existsSync(projectDir)) return {}\n\n const baseTs = readText(path.join(projectDir, 'env/base.ts'))\n const wechatBaseTs = readText(path.join(projectDir, 'env/wechat/base.ts'))\n const androidBaseTs = readText(path.join(projectDir, 'env/android/base.ts'))\n const groupDevTs = readText(path.join(projectDir, 'env/groupDev.ts'))\n const manifestRaw = readText(\n path.join(projectDir, 'manifest/wechat.manifest.json'),\n )\n\n return {\n domain: pickString(baseTs, 'DOMAIN'),\n wechatAppId:\n pickString(baseTs, 'WECHAT_APPID') ||\n pickString(wechatBaseTs, 'WECHAT_APPID'),\n workWechatAppId:\n pickString(baseTs, 'WORK_WECHAT_APPID') ||\n pickString(wechatBaseTs, 'WORK_WECHAT_APPID'),\n wechatServiceAppId:\n pickString(baseTs, 'WECHAT_SERVICE_APPID') ||\n pickString(wechatBaseTs, 'WECHAT_SERVICE_APPID'),\n dcloudAppKey: pickString(androidBaseTs, 'DCLOUD_APP_KEY_IOS'),\n groupDomain: pickString(groupDevTs, 'DOMAIN') || GROUP_DOMAIN_PLACEHOLDER,\n appName: pickJsonString(manifestRaw, 'name'),\n uniAppId: pickJsonString(manifestRaw, 'appid'),\n }\n}\n","export const name = 'create-whale-env'\nexport const version = '1.0.0'\n\nexport { generateCorp } from './generate/corp'\nexport { runInit } from './commands/init'\nexport { PROJECTS } from './constants'\n"],"mappings":"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","names":["consola","consola","colors","fs","path","fs","path","input","input","fs","path","input","fs","path","fs","path","fs","name","colors","path","consola","consola"]}
@@ -0,0 +1,60 @@
1
+ interface ProjectInitInput {
2
+ project: string;
3
+ client: string;
4
+ domain: string;
5
+ appName: string;
6
+ wechatAppId: string;
7
+ workWechatAppId: string;
8
+ wechatServiceAppId: string;
9
+ uniAppId: string;
10
+ dcloudAppKey: string;
11
+ groupDomain: string;
12
+ }
13
+ interface CorpInitInput {
14
+ corpCode: string;
15
+ corpName: string;
16
+ projects: ProjectInitInput[];
17
+ }
18
+
19
+ declare function generateCorp(appEnvRoot: string, input: CorpInitInput): Promise<string>;
20
+
21
+ interface InitOptions {
22
+ root?: string;
23
+ force?: boolean;
24
+ }
25
+ declare function runInit(corpCodeArg?: string, options?: InitOptions): Promise<void>;
26
+
27
+ declare const PROJECTS: readonly [{
28
+ readonly name: "【移动OA】";
29
+ readonly value: "officeAutomatic";
30
+ readonly client: "EMPLOYEE";
31
+ }, {
32
+ readonly name: "【司机端】";
33
+ readonly value: "driver";
34
+ readonly client: "DRIVER";
35
+ }, {
36
+ readonly name: "【冶金仓储】";
37
+ readonly value: "steelWare";
38
+ readonly client: "EMPLOYEE";
39
+ }, {
40
+ readonly name: "【供应商端】";
41
+ readonly value: "vendor";
42
+ readonly client: "VENDOR";
43
+ }, {
44
+ readonly name: "【客户端】";
45
+ readonly value: "customer";
46
+ readonly client: "CUSTOMER";
47
+ }, {
48
+ readonly name: "【生产商端】";
49
+ readonly value: "manufactUser";
50
+ readonly client: "MANUFACTURER";
51
+ }, {
52
+ readonly name: "【自定义端】";
53
+ readonly value: "portal";
54
+ readonly client: "";
55
+ }];
56
+
57
+ declare const name = "create-whale-env";
58
+ declare const version = "1.0.0";
59
+
60
+ export { PROJECTS, generateCorp, name, runInit, version };