prime-dev-cli 1.0.13 → 1.0.14
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/server/.next/BUILD_ID +1 -1
- package/dist/server/.next/app-build-manifest.json +5 -5
- package/dist/server/.next/app-path-routes-manifest.json +1 -0
- package/dist/server/.next/build-manifest.json +6 -6
- package/dist/server/.next/cache/.rscinfo +1 -1
- package/dist/server/.next/cache/.tsbuildinfo +1 -1
- package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
- package/dist/server/.next/fallback-build-manifest.json +6 -6
- package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
- package/dist/server/.next/next-server.js.nft.json +1 -1
- package/dist/server/.next/prerender-manifest.json +12 -12
- package/dist/server/.next/server/app/_not-found/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/_not-found/page.js +1 -1
- package/dist/server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/_not-found.html +1 -1
- package/dist/server/.next/server/app/_not-found.rsc +2 -2
- package/dist/server/.next/server/app/api/all-projects-envs/route.js +1 -1
- package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js +1 -1
- package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/check-workspace/route.js +1 -1
- package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route.js +1 -1
- package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/delete-mock-api/route.js +1 -1
- package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/get-mock-data/route.js +1 -1
- package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route.js +1 -1
- package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +1 -1
- package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-file-content/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-open-status/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/mock-setting/route.js +1 -1
- package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/open-all-mock/route.js +1 -1
- package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/start/route.js +1 -1
- package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/process/status/route.js +1 -1
- package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/project-config/route.js +1 -1
- package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/retry-project/route.js +1 -1
- package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
- package/dist/server/.next/server/app/api/workspace/create/route/app-build-manifest.json +11 -0
- package/dist/server/.next/server/app/api/workspace/create/route/app-paths-manifest.json +3 -0
- package/dist/server/.next/server/app/api/workspace/create/route/build-manifest.json +17 -0
- package/dist/server/.next/server/app/api/workspace/create/route/next-font-manifest.json +6 -0
- package/dist/server/.next/server/app/api/workspace/create/route/react-loadable-manifest.json +1 -0
- package/dist/server/.next/server/app/api/workspace/create/route/server-reference-manifest.json +4 -0
- package/dist/server/.next/server/app/api/workspace/create/route.js +7 -0
- package/dist/server/.next/server/app/api/workspace/create/route.js.map +5 -0
- package/dist/server/.next/server/app/api/workspace/create/route.js.nft.json +1 -0
- package/dist/server/.next/server/app/api/workspace/create/route_client-reference-manifest.js +2 -0
- package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +2 -2
- package/dist/server/.next/server/app/configuration/page.js +1 -1
- package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/configuration.html +1 -1
- package/dist/server/.next/server/app/configuration.rsc +3 -3
- package/dist/server/.next/server/app/index.html +1 -1
- package/dist/server/.next/server/app/index.rsc +2 -2
- package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/initialization/page.js +1 -1
- package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app/initialization.html +1 -1
- package/dist/server/.next/server/app/initialization.rsc +2 -2
- package/dist/server/.next/server/app/page/app-build-manifest.json +1 -1
- package/dist/server/.next/server/app/page.js +1 -1
- package/dist/server/.next/server/app/page.js.nft.json +1 -1
- package/dist/server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/server/.next/server/app-paths-manifest.json +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__be3de126._.js → [root-of-the-server]__07bd4a2b._.js} +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__07bd4a2b._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0aaf11fd._.js +8 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__0aaf11fd._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__a6211ee0._.js → [root-of-the-server]__442ae257._.js} +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__442ae257._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__4498bb74._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__4498bb74._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__6cc174c2._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__6cc174c2._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__e07d75ff._.js → [root-of-the-server]__6f17de68._.js} +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__6f17de68._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__933f7077._.js → [root-of-the-server]__6f66caff._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__933f7077._.js.map → [root-of-the-server]__6f66caff._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__e301c560._.js → [root-of-the-server]__70a56518._.js} +2 -2
- package/dist/server/.next/server/chunks/[root-of-the-server]__70a56518._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__7c3ad3a9._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__7c3ad3a9._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__5cddc64c._.js → [root-of-the-server]__9370ea2b._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__5cddc64c._.js.map → [root-of-the-server]__9370ea2b._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__802aba2d._.js → [root-of-the-server]__9f32f8a7._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__802aba2d._.js.map → [root-of-the-server]__9f32f8a7._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__aba5bddd._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__aba5bddd._.js.map +1 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__837d58ae._.js → [root-of-the-server]__c15317cb._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__837d58ae._.js.map → [root-of-the-server]__c15317cb._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__ef09a48e._.js → [root-of-the-server]__c8cd1231._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__ef09a48e._.js.map → [root-of-the-server]__c8cd1231._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__582946e6._.js → [root-of-the-server]__e54d7eff._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__582946e6._.js.map → [root-of-the-server]__e54d7eff._.js.map} +1 -1
- package/dist/server/.next/server/chunks/{[root-of-the-server]__09914a79._.js → [root-of-the-server]__e68f3764._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__09914a79._.js.map → [root-of-the-server]__e68f3764._.js.map} +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__f76d331f._.js +3 -0
- package/dist/server/.next/server/chunks/[root-of-the-server]__f76d331f._.js.map +1 -0
- package/dist/server/.next/server/chunks/{[root-of-the-server]__52d487d8._.js → [root-of-the-server]__fefd40ba._.js} +2 -2
- package/dist/server/.next/server/chunks/{[root-of-the-server]__52d487d8._.js.map → [root-of-the-server]__fefd40ba._.js.map} +1 -1
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__e3a2aebd._.js +3 -0
- package/dist/server/.next/server/chunks/ssr/{_bb352729._.js → _5d353cf8._.js} +3 -3
- package/dist/server/.next/server/chunks/ssr/_5d353cf8._.js.map +1 -0
- package/dist/server/.next/server/middleware-build-manifest.js +4 -4
- package/dist/server/.next/server/pages/404.html +1 -1
- package/dist/server/.next/server/pages/500.html +1 -1
- package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
- package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
- package/dist/server/.next/server/server-reference-manifest.js +1 -1
- package/dist/server/.next/server/server-reference-manifest.json +1 -1
- package/dist/server/.next/static/chunks/{2befba13bed43c5f.js → 0089092a8fff7e00.js} +2 -2
- package/dist/server/.next/static/chunks/{d74cc70dd8ef74c9.js → 0d1500d118ef892c.js} +2 -2
- package/dist/server/.next/static/chunks/1ad898191df92f90.css +3 -0
- package/dist/server/.next/static/chunks/2c0e57fbc9520adc.js +61 -0
- package/dist/server/.next/static/chunks/765c1fd313250591.js.map +1 -0
- package/dist/server/.next/static/chunks/b0840b8d648f6401.css.map +1 -0
- package/dist/server/.next/static/chunks/{4cbec079b6e3e189.js → bf41727b544d17b4.js} +2 -2
- package/dist/server/.next/static/chunks/{a898634af0862944.js.map → fc5c3c838ec48e75.js.map} +1 -1
- package/dist/server/.next/static/chunks/pages/_app.js +2 -2
- package/dist/server/.next/static/chunks/pages/_error.js +2 -2
- package/dist/server/.next/trace +1 -1
- package/package.json +1 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__07de450e._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__07de450e._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__09808308._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__09808308._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__42bc7b42._.js +0 -8
- package/dist/server/.next/server/chunks/[root-of-the-server]__42bc7b42._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__4dc677cb._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__4dc677cb._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__a6211ee0._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__aca25fcf._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__aca25fcf._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__be3de126._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__da89e112._.js +0 -3
- package/dist/server/.next/server/chunks/[root-of-the-server]__da89e112._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__e07d75ff._.js.map +0 -1
- package/dist/server/.next/server/chunks/[root-of-the-server]__e301c560._.js.map +0 -1
- package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__6d393273._.js +0 -3
- package/dist/server/.next/server/chunks/ssr/_bb352729._.js.map +0 -1
- package/dist/server/.next/static/chunks/344b0062191ace22.css.map +0 -1
- package/dist/server/.next/static/chunks/6c91d5f280e79a14.css +0 -3
- package/dist/server/.next/static/chunks/700389bfed628512.js +0 -61
- package/dist/server/.next/static/chunks/8d4c1c4e33fc41f3.js.map +0 -1
- /package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__6d393273._.js.map → [root-of-the-server]__e3a2aebd._.js.map} +0 -0
- /package/dist/server/.next/static/{cNaVG6i0DQd1B_k41f9v_ → e1tjd_meooMxESv5gSLAU}/_buildManifest.js +0 -0
- /package/dist/server/.next/static/{cNaVG6i0DQd1B_k41f9v_ → e1tjd_meooMxESv5gSLAU}/_clientMiddlewareManifest.json +0 -0
- /package/dist/server/.next/static/{cNaVG6i0DQd1B_k41f9v_ → e1tjd_meooMxESv5gSLAU}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/env-file-operations.ts","turbopack:///[project]/packages/server/src/app/api/project-config/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { ProjectConfig } from './workspace-types';\n\n/**\n * 为指定项目创建环境文件,如果文件已存在则跳过。\n * @param projectName - 项目名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 一个包含已创建和已跳过文件列表的对象\n */\nexport async function createProjectEnvFiles(\n projectName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdFiles: string[];\n skippedFiles: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n try {\n const envs = projectConfig.envs || {};\n for (const envName in envs) {\n const envConfig = envs[envName];\n if (envConfig.envFileName && envConfig.proxyKey) {\n const filePath = join(projectPath, envConfig.envFileName);\n \n try {\n await fs.access(filePath);\n // 文件已存在,跳过\n skippedFiles.push(envConfig.envFileName);\n } catch {\n // 文件不存在,创建它\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || '';\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n await fs.writeFile(filePath, content, 'utf-8');\n createdFiles.push(envConfig.envFileName);\n }\n }\n }\n return { success: true, createdFiles, skippedFiles };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建环境文件时出错:`, error);\n return { success: false, createdFiles, skippedFiles, error: errorMessage };\n }\n}\n\n/**\n * 为指定项目创建.mock文件夹\n * @param projectName - 项目名称\n * @param workspacePath - 工作空间根路径\n * @returns 创建结果\n */\nexport async function createProjectMockDirectories(\n projectName: string,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdDirectories: string[];\n skippedDirectories: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const mockPath = join(projectPath, '.mock');\n const createdDirectories: string[] = [];\n const skippedDirectories: string[] = [];\n\n try {\n // 创建 .mock 文件夹\n try {\n await fs.access(mockPath);\n skippedDirectories.push('.mock');\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n createdDirectories.push('.mock');\n }\n\n return { success: true, createdDirectories, skippedDirectories };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建Mock目录时出错:`, error);\n return { success: false, createdDirectories, skippedDirectories, error: errorMessage };\n }\n}\n\n/**\n * 更新指定项目环境的环境文件内容\n * @param projectName - 项目名称\n * @param envName - 环境名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 更新结果\n */\nexport async function updateProjectEnvFile(\n projectName: string,\n envName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n updatedFile?: string;\n error?: string;\n}> {\n try {\n const envConfig = projectConfig.envs[envName];\n \n if (!envConfig) {\n return {\n success: false,\n error: `环境 ${envName} 不存在于项目 ${projectName} 配置中`,\n };\n }\n\n if (!envConfig.envFileName || !envConfig.proxyKey) {\n return {\n success: false,\n error: `环境 ${envName} 缺少 envFileName 或 proxyKey 配置`,\n };\n }\n\n const projectPath = join(workspacePath, projectName);\n const filePath = join(projectPath, envConfig.envFileName);\n \n // 获取当前代理URL\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || envConfig.currentProxy;\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n \n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n \n console.log(`已更新环境文件: ${filePath}, 内容: ${content}`);\n \n return {\n success: true,\n updatedFile: envConfig.envFileName,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`更新项目 ${projectName} 环境 ${envName} 的环境文件时出错:`, error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport {\n getProjectsConfig,\n saveProjectsConfig,\n} from '@/lib/workspace-config';\nimport { updateProjectEnvFile } from '@/lib/env-file-operations';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 读取项目配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n const projectConfig = projectsConfig[projectName];\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n repo: projectConfig.repo,\n mockingIntercept: projectConfig.mockingIntercept,\n mockOpen: projectConfig.mockOpen,\n envs: projectConfig.envs,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '获取项目配置失败';\n console.error('获取项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, envName, newProxy, customProxyUrl, projectConfig } =\n await request.json();\n\n // 参数验证\n if (!projectName) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName',\n },\n { status: 400 },\n );\n }\n\n // 如果是项目级配置更新\n if (projectConfig) {\n // 读取当前配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 更新项目级配置\n if (projectConfig.mockingIntercept !== undefined) {\n projectsConfig[projectName].mockingIntercept = projectConfig.mockingIntercept;\n }\n if (projectConfig.mockOpen !== undefined) {\n projectsConfig[projectName].mockOpen = projectConfig.mockOpen;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n return NextResponse.json({\n success: true,\n message: '项目配置更新成功',\n data: {\n projectName,\n mockingIntercept: projectsConfig[projectName].mockingIntercept,\n mockOpen: projectsConfig[projectName].mockOpen,\n },\n });\n }\n\n // 环境级配置更新的参数验证\n if (!envName || !newProxy) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:envName, newProxy',\n },\n { status: 400 },\n );\n }\n\n // 读取当前配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 检查环境是否存在\n if (!projectsConfig[projectName].envs[envName]) {\n return NextResponse.json(\n {\n success: false,\n error: `项目 ${projectName} 中不存在环境 ${envName}`,\n },\n { status: 404 },\n );\n }\n\n const envConfig = projectsConfig[projectName].envs[envName];\n\n // 验证新的代理地址是否在可选范围内\n if (newProxy === 'custom') {\n // 对于 custom 选项,只有在自定义代理 URL 为空时才报错\n // 如果自定义地址与现有预设值相同,这是允许的\n if (!customProxyUrl || customProxyUrl.trim() === '') {\n return NextResponse.json(\n { success: false, error: '选择 custom 时必须提供自定义代理地址' },\n { status: 400 },\n );\n }\n } else {\n // 对于其他选项,检查是否存在于 proxyEnv 中\n if (!envConfig.proxyEnv[newProxy]) {\n return NextResponse.json(\n { success: false, error: `代理环境 ${newProxy} 不在可选范围内` },\n { status: 400 },\n );\n }\n }\n\n // 更新 currentProxy 字段\n projectsConfig[projectName].envs[envName].currentProxy = newProxy;\n\n // 如果选择的是 custom,需要更新 custom 字段的值\n if (newProxy === 'custom' && customProxyUrl !== undefined) {\n projectsConfig[projectName].envs[envName].proxyEnv.custom =\n customProxyUrl;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n // 更新项目的环境文件\n const envFileResult = await updateProjectEnvFile(\n projectName,\n envName,\n projectsConfig[projectName],\n WORKSPACE_CONFIG.WORKSPACE_ROOT,\n );\n\n // 准备响应数据\n const responseData = {\n projectName,\n envName,\n currentProxy: projectsConfig[projectName].envs[envName].currentProxy,\n currentProxyUrl: newProxy === 'custom' ? customProxyUrl : envConfig.proxyEnv[newProxy],\n };\n\n // 如果环境文件更新失败,在响应中包含警告信息\n if (!envFileResult.success) {\n console.warn(`环境文件更新失败: ${envFileResult.error}`);\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功,但环境文件更新失败',\n warning: `环境文件更新失败: ${envFileResult.error}`,\n data: responseData,\n });\n }\n\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功',\n data: {\n ...responseData,\n updatedEnvFile: envFileResult.updatedFile,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '更新项目配置失败';\n console.error('更新项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[4]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/env-file-operations.ts","turbopack:///[project]/packages/server/src/app/api/project-config/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { ProjectConfig } from './workspace-types';\n\n/**\n * 为指定项目创建环境文件,如果文件已存在则跳过。\n * @param projectName - 项目名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 一个包含已创建和已跳过文件列表的对象\n */\nexport async function createProjectEnvFiles(\n projectName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdFiles: string[];\n skippedFiles: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n try {\n const envs = projectConfig.envs || {};\n for (const envName in envs) {\n const envConfig = envs[envName];\n if (envConfig.envFileName && envConfig.proxyKey) {\n const filePath = join(projectPath, envConfig.envFileName);\n \n try {\n await fs.access(filePath);\n // 文件已存在,跳过\n skippedFiles.push(envConfig.envFileName);\n } catch {\n // 文件不存在,创建它\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || '';\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n await fs.writeFile(filePath, content, 'utf-8');\n createdFiles.push(envConfig.envFileName);\n }\n }\n }\n return { success: true, createdFiles, skippedFiles };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建环境文件时出错:`, error);\n return { success: false, createdFiles, skippedFiles, error: errorMessage };\n }\n}\n\n/**\n * 为指定项目创建.mock文件夹\n * @param projectName - 项目名称\n * @param workspacePath - 工作空间根路径\n * @returns 创建结果\n */\nexport async function createProjectMockDirectories(\n projectName: string,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdDirectories: string[];\n skippedDirectories: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const mockPath = join(projectPath, '.mock');\n const createdDirectories: string[] = [];\n const skippedDirectories: string[] = [];\n\n try {\n // 创建 .mock 文件夹\n try {\n await fs.access(mockPath);\n skippedDirectories.push('.mock');\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n createdDirectories.push('.mock');\n }\n\n return { success: true, createdDirectories, skippedDirectories };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建Mock目录时出错:`, error);\n return { success: false, createdDirectories, skippedDirectories, error: errorMessage };\n }\n}\n\n/**\n * 更新指定项目环境的环境文件内容\n * @param projectName - 项目名称\n * @param envName - 环境名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 更新结果\n */\nexport async function updateProjectEnvFile(\n projectName: string,\n envName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n updatedFile?: string;\n error?: string;\n}> {\n try {\n const envConfig = projectConfig.envs[envName];\n \n if (!envConfig) {\n return {\n success: false,\n error: `环境 ${envName} 不存在于项目 ${projectName} 配置中`,\n };\n }\n\n if (!envConfig.envFileName || !envConfig.proxyKey) {\n return {\n success: false,\n error: `环境 ${envName} 缺少 envFileName 或 proxyKey 配置`,\n };\n }\n\n const projectPath = join(workspacePath, projectName);\n const filePath = join(projectPath, envConfig.envFileName);\n \n // 获取当前代理URL\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || envConfig.currentProxy;\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n \n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n \n console.log(`已更新环境文件: ${filePath}, 内容: ${content}`);\n \n return {\n success: true,\n updatedFile: envConfig.envFileName,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`更新项目 ${projectName} 环境 ${envName} 的环境文件时出错:`, error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport {\n getProjectsConfig,\n saveProjectsConfig,\n} from '@/lib/workspace-config';\nimport { updateProjectEnvFile } from '@/lib/env-file-operations';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 读取项目配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n const projectConfig = projectsConfig[projectName];\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n repo: projectConfig.repo,\n mockingIntercept: projectConfig.mockingIntercept,\n mockOpen: projectConfig.mockOpen,\n envs: projectConfig.envs,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '获取项目配置失败';\n console.error('获取项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, envName, newProxy, customProxyUrl, projectConfig } =\n await request.json();\n\n // 参数验证\n if (!projectName) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName',\n },\n { status: 400 },\n );\n }\n\n // 如果是项目级配置更新\n if (projectConfig) {\n // 读取当前配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 更新项目级配置\n if (projectConfig.mockingIntercept !== undefined) {\n projectsConfig[projectName].mockingIntercept = projectConfig.mockingIntercept;\n }\n if (projectConfig.mockOpen !== undefined) {\n projectsConfig[projectName].mockOpen = projectConfig.mockOpen;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n return NextResponse.json({\n success: true,\n message: '项目配置更新成功',\n data: {\n projectName,\n mockingIntercept: projectsConfig[projectName].mockingIntercept,\n mockOpen: projectsConfig[projectName].mockOpen,\n },\n });\n }\n\n // 环境级配置更新的参数验证\n if (!envName || !newProxy) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:envName, newProxy',\n },\n { status: 400 },\n );\n }\n\n // 读取当前配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 检查环境是否存在\n if (!projectsConfig[projectName].envs[envName]) {\n return NextResponse.json(\n {\n success: false,\n error: `项目 ${projectName} 中不存在环境 ${envName}`,\n },\n { status: 404 },\n );\n }\n\n const envConfig = projectsConfig[projectName].envs[envName];\n\n // 验证新的代理地址是否在可选范围内\n if (newProxy === 'custom') {\n // 对于 custom 选项,只有在自定义代理 URL 为空时才报错\n // 如果自定义地址与现有预设值相同,这是允许的\n if (!customProxyUrl || customProxyUrl.trim() === '') {\n return NextResponse.json(\n { success: false, error: '选择 custom 时必须提供自定义代理地址' },\n { status: 400 },\n );\n }\n } else {\n // 对于其他选项,检查是否存在于 proxyEnv 中\n if (!envConfig.proxyEnv[newProxy]) {\n return NextResponse.json(\n { success: false, error: `代理环境 ${newProxy} 不在可选范围内` },\n { status: 400 },\n );\n }\n }\n\n // 更新 currentProxy 字段\n projectsConfig[projectName].envs[envName].currentProxy = newProxy;\n\n // 如果选择的是 custom,需要更新 custom 字段的值\n if (newProxy === 'custom' && customProxyUrl !== undefined) {\n projectsConfig[projectName].envs[envName].proxyEnv.custom =\n customProxyUrl;\n }\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n // 更新项目的环境文件\n const envFileResult = await updateProjectEnvFile(\n projectName,\n envName,\n projectsConfig[projectName],\n WORKSPACE_CONFIG.WORKSPACE_ROOT,\n );\n\n // 准备响应数据\n const responseData = {\n projectName,\n envName,\n currentProxy: projectsConfig[projectName].envs[envName].currentProxy,\n currentProxyUrl: newProxy === 'custom' ? customProxyUrl : envConfig.proxyEnv[newProxy],\n };\n\n // 如果环境文件更新失败,在响应中包含警告信息\n if (!envFileResult.success) {\n console.warn(`环境文件更新失败: ${envFileResult.error}`);\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功,但环境文件更新失败',\n warning: `环境文件更新失败: ${envFileResult.error}`,\n data: responseData,\n });\n }\n\n return NextResponse.json({\n success: true,\n message: '代理环境更新成功',\n data: {\n ...responseData,\n updatedEnvFile: envFileResult.updatedFile,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '更新项目配置失败';\n console.error('更新项目配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"ikDAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKO,IAAM,EAAmB,CAE9B,eAAgB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAA,AAAM,IAAK,YAAa,EAA7B,WAAK,MAGrB,YAAa,IAGb,sBAAuB,KAAK,GAAG,CAAC,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAA,IAAA,AAAG,IAAI,MAAM,CAAE,IAG3D,iBAH4C,EAGxB,CACtB,EAEa,EAAsB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAA,AAAM,IAAK,cAAhB,UA2B5B,CA3BiC,GA2B5B,EAAA,SAAA,CAAA,6JAAA,4OC/CZ,IAAA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAMO,eAAe,IACpB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAA,mBAAmB,CAAE,EAAA,GAA5B,MAAqC,CAAC,IAA/B,AAAmC,CAClD,CAAE,KAAM,CAGN,OADA,MAAM,AAH4B,EAGT,CAAC,GACnB,CAAC,CACV,CAEA,GAAI,CACF,IAAM,EAAgB,MAAM,CAAA,EAAA,EAAA,QAAA,AAAO,EAAE,EAAA,mBAAmB,CAAE,GAA9B,MAE5B,GAAI,CAAC,EACH,CAHmC,KAG5B,CAAC,EAEV,IAHoB,GAGb,KAAK,KAAK,CAAC,EACpB,CAAE,MAAO,EAAO,CAGd,MAFA,QAAQ,KAAK,CAAC,iBAAkB,GAE1B,AAAI,MAAM,WAClB,CACF,CAMO,eAAe,EAAmB,CAAsB,EAC7D,IAAM,EAAiB,EAAA,mBAAmB,CAAG,OAC7C,GAAI,CACF,KAFqB,CAEf,CAAA,EAAA,EAAA,SAAQ,AAAR,EAAU,EAAgB,KAAK,SAAS,CAAC,EAAQ,KAAM,AAAvD,GAA2D,SACjE,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAgB,EAAA,mBAAmB,CAClD,CAAE,EADM,IACC,EAAO,CAEd,MAH6B,AAE7B,QAAQ,KAAK,CAAC,cAAe,GACnB,AAAJ,MAAU,WAClB,CACF,CAKO,IAAK,EAAA,SAAA,CAAA,mIAAA,uJCjDZ,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAUO,eAAe,EACpB,CAAmB,CACnB,CAA4B,CAC5B,CAAqB,EAOrB,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAe,GAClC,EAAyB,EAAE,CAC3B,EAAyB,EAAE,CAEjC,GAAI,CACF,IAAM,EAAO,EAAc,GALT,CAKa,EAAI,CAAC,EACpC,IAAK,IAAM,KAAW,EAAM,CAC1B,IAAM,EAAY,CAAI,CAAC,EAAQ,CAC/B,GAAI,EAAU,WAAW,EAAI,EAAU,QAAQ,CAAE,CAC/C,IAAM,EAAW,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,EAAU,WAAW,EAExD,GAAI,CACF,MAAM,EAAA,CAHS,OAGP,CAAC,MAAM,CAAC,GAEhB,EAAa,IAAI,CAAC,EAAU,QAFtB,GAEiC,CACzC,CAAE,KAAM,CAEN,IAAM,EAAkB,EAAU,QAAQ,CAAC,EAAU,YAAY,CAAC,EAAI,GAChE,EAAU,CAAA,EAAG,EAAU,QAAQ,CAAC,CAAC,EAAE,EAAA,CAAiB,AAC1D,OAAM,EAAA,QAAE,CAAC,SAAS,CAAC,EAAU,EAAS,SACtC,EAAa,EADP,EACW,CAAC,EAAU,WAAW,CACzC,CACF,CACF,CACA,MAAO,CAAE,SAAS,eAAM,eAAc,CAAa,CACrD,CAAE,MAAO,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,GAErE,OADA,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,EAAY,WAAW,CAAC,CAAE,GACzC,CAAE,SAAS,eAAO,eAAc,EAAc,MAAO,CAAa,CAC3E,CACF,CAQO,eAAe,EACpB,CAAmB,CACnB,CAAqB,EAOrB,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAe,GAClC,EAAW,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,SAC7B,CAFc,CAEiB,EAAE,CACjC,EAA+B,EAAE,CAEvC,GAAI,CAEF,GAAI,CACF,CAPa,KAOP,EAAA,QAAE,CAAC,MAAM,CAAC,GAChB,EAAmB,IAAI,CAAC,QAC1B,CAAE,CAFM,IAEA,CACN,MAAM,EAAA,QAAE,CAAC,KAAK,CAAC,EAAU,CAAE,WAAW,CAAK,GAC3C,EAAmB,CADb,GACiB,CAAC,QAC1B,CAEA,MAAO,CAAE,SAAS,qBAAM,EAAoB,oBAAmB,CACjE,CAAE,MAAO,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,GAErE,OADA,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,EAAY,aAAa,CAAC,CAAE,GAC3C,CAAE,SAAS,qBAAO,qBAAoB,EAAoB,MAAO,CAAa,CACvF,CACF,CAUO,eAAe,EACpB,CAAmB,CACnB,CAAe,CACf,CAA4B,CAC5B,CAAqB,EAMrB,GAAI,CACF,IAAM,EAAY,EAAc,IAAI,CAAC,EAAQ,CAE7C,GAAI,CAAC,EACH,MAAO,CACL,EAFY,OAEH,EACT,MAAO,CAAC,GAAG,EAAE,EAAQ,QAAQ,EAAE,EAAY,IAAI,CAAC,AAClD,EAGF,GAAI,CAAC,EAAU,WAAW,EAAI,CAAC,EAAU,QAAQ,CAC/C,CADiD,KAC1C,CACL,SAAS,EACT,MAAO,CAAC,GAAG,EAAE,EAAQ,6BAA6B,CAAC,AACrD,EAGF,IAAM,EAAc,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAe,GAClC,EAAW,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,EAAa,EAAU,QADzB,GACoC,EAGlD,EAAkB,EAAU,QAAQ,CAHzB,AAG0B,EAAU,YAAY,CAAC,EAAI,EAAU,YAAY,CACtF,EAAU,CAAA,EAAG,EAAU,QAAQ,CAAC,CAAC,EAAE,EAAA,CAAiB,CAO1D,OAJA,MAAM,EAAA,QAAE,CAAC,SAAS,CAAC,EAAU,EAAS,SAEtC,IAFM,IAEE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAS,MAAM,EAAE,EAAA,CAAS,EAE3C,CACL,SAAS,EACT,YAAa,EAAU,WAAW,AACpC,CACF,CAAE,MAAO,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAM,OAAO,CAAG,OAAO,GAErE,OADA,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,EAAY,IAAI,EAAE,EAAQ,UAAU,CAAC,CAAE,GACtD,CACL,SAAS,EACT,MAAO,CACT,CACF,CACF,8HCtJA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAIA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEO,eAAe,EAAI,CAAoB,EAC5C,GAAI,CACF,GAAM,CAAE,cAAY,CAAE,CAAG,IAAI,IAAI,EAAQ,GAAG,EACtC,EAAc,EAAa,GAAG,CAAC,WAErC,GAAI,CAAC,EACH,OAAO,EAAA,EADS,UACG,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MAAO,AADpB,UAC+B,EACpC,CAAE,OAAQ,GAAI,GAKlB,IAAM,EAAiB,MAAM,CAAA,EAAA,EAAA,iBAAgB,AAAhB,IAG7B,GAAI,CAAC,CAAc,CAAC,EAAY,CAC9B,CADgC,KAHL,CAIpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAIlB,IAAM,EAAgB,CAAc,CAAC,EAAY,CAEjD,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,KAAM,CAFD,YAGH,EACA,KAAM,EAAc,IAAI,CACxB,iBAAkB,EAAc,gBAAgB,CAChD,SAAU,EAAc,QAAQ,CAChC,KAAM,EAAc,IAAI,AAC1B,CACF,EACF,CAAE,MAAO,EAAO,CACd,IAAM,EACJ,aAAiB,MAAQ,EAAM,OAAO,CAAG,WAE3C,OADA,QAAQ,KAAK,CAAC,YAAa,GACpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAa,EACtC,CAAE,OAAQ,GAAI,EAElB,CACF,CAEO,eAAe,EAAI,CAAoB,EAC5C,GAAI,CAEF,GAAM,aAAE,CAAW,SAAE,CAAO,UAAE,CAAQ,gBAAE,CAAc,eAAE,CAAa,CAAE,CACrE,MAAM,EAAQ,IAAI,GAGpB,GAAI,CAAC,EACH,OAAO,EAAA,EADS,UACG,CAAC,IAAI,CACtB,CACE,QAAS,GACT,MAAO,AAHJ,oBAIL,EACA,CAAE,OAAQ,GAAI,GAKlB,GAAI,EAAe,CAEjB,IAAM,EAAiB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAgB,IAG7C,GAAI,CAAC,CAAc,CAAC,EAAY,CAC9B,CADgC,KAHL,CAIpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAelB,YAVuC,IAAnC,EAAc,KAAgC,WAAhB,GAChC,CAAc,CAAC,EAAY,CAAC,gBAAgB,CAAG,EAAc,gBAAA,AAAgB,EAE3E,AAA2B,WAAb,AAAwB,QAAhB,GACxB,CAAc,CAAC,EAAY,CAAC,QAAQ,CAAG,EAAc,QAAA,AAAQ,EAI/D,MAAM,CAAA,EAAA,EAAA,kBAAA,AAAiB,EAAE,GAElB,EAAA,WAFD,CAEa,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,WACT,KAAM,aACJ,EACA,iBAAkB,CAAc,CAAC,EAAY,CAAC,gBAAgB,CAC9D,SAAU,CAAc,CAAC,EAAY,CAAC,QAAQ,AAChD,CACF,EACF,CAGA,GAAI,CAAC,GAAW,CAAC,EACf,OAAO,CADkB,CAClB,YAAY,CAAC,IAAI,CACtB,CACE,SAAS,EACT,MAAO,AAHJ,0BAIL,EACA,CAAE,OAAQ,GAAI,GAKlB,IAAM,EAAiB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAgB,IAG7C,GAAI,CAAC,CAAc,CAAC,EAAY,CAC9B,CADgC,KAHL,CAIpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAKlB,GAAI,CAAC,CAAc,CAAC,EAAY,CAAC,IAAI,CAAC,EAAQ,CAC5C,CAD8C,MACvC,EAAA,YAAY,CAAC,IAAI,CACtB,CACE,SAAS,EACT,MAAO,AAHJ,CAGK,GAAG,EAAE,EAAY,QAAQ,EAAE,EAAA,CAAS,AAC9C,EACA,CAAE,OAAQ,GAAI,GAIlB,IAAM,EAAY,CAAc,CAAC,EAAY,CAAC,IAAI,CAAC,EAAQ,CAG3D,GAAiB,UAAU,CAAvB,GAGF,GAAI,CAAC,GAA4C,IAAI,CAA9B,EAAe,IAAI,GACxC,OAAO,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,wBAAyB,EAClD,CAAE,OAAQ,GAAI,EAElB,MAGA,GAAI,CAAC,EAAU,QAAQ,CAAC,EAAS,CAC/B,CADiC,MAC1B,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,KAAK,EAAE,EAAS,QAAQ,CAAC,AAAC,EACpD,CAAE,OAAQ,GAAI,GAMpB,CAAc,CAAC,EAAY,CAAC,IAAI,CAAC,EAAQ,CAAC,YAAY,CAAG,EAGxC,WAAb,QAA4C,IAAnB,GAC3B,EAAc,CAAC,CAD0C,CAC9B,CAAC,IAAI,CAAC,EAAQ,CAAC,QAAQ,CAAC,MAAM,CACvD,CAAA,EAIJ,MAAM,CAAA,EAAA,EAAA,kBAAA,AAAiB,EAAE,GAGzB,IAAM,EAAgB,MAAM,CAHtB,EAGsB,EAAA,oBAAmB,AAAnB,EAC1B,EACA,EACA,CAAc,CAAC,EAAY,CAC3B,EAAA,GAJ0B,aAIV,CAAC,cAAc,EAI3B,EAAe,CAJnB,YAKA,UACA,EACA,aAAc,CAAc,CAAC,EAAY,CAAC,IAAI,CAAC,EAAQ,CAAC,YAAY,CACpE,gBAA8B,WAAb,EAAwB,EAAiB,EAAU,QAAQ,CAAC,EAC/E,AADwF,EAIxF,GAAI,CAAC,EAAc,OAAO,CAExB,CAF0B,MAC1B,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,EAAc,KAAK,CAAA,CAAE,EACxC,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,qBACT,QAAS,CAAC,UAAU,EAAE,EAAc,KAAK,CAAA,CAAE,CAC3C,KAAM,CACR,GAGF,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,WACT,KAAM,CACJ,GAAG,CAAY,CACf,eAAgB,EAAc,WAAW,AAC3C,CACF,EACF,CAAE,MAAO,EAAO,CACd,IAAM,EACJ,aAAiB,MAAQ,EAAM,OAAO,CAAG,WAE3C,OADA,QAAQ,KAAK,CAAC,YAAa,GACpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAa,EACtC,CAAE,OAAQ,GAAI,EAElB,CACF,gKCzNA,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAjCC,AAAiC,CAFnC,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAFjBC,AAEiB,EAA5BC,KAWZ,IAbkC,AAa5BC,EAAc,GAXM,CAWN,EAAIL,AAbkB,YAEF,OAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,4BACNC,SAAU,sBACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,gEAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,sBAAEC,CAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[4]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},
|
|
1
|
+
module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),n=e.i(30331);let r={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,n.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15650:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("module",()=>require("module"))},94995:function(e){var{g:r,__dirname:t,m:s,e:n}=e},45640:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({POST:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);let r=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/open-all-mock/route.ts")}`}}.url);async function c(e){try{let{projectName:t}=await e.json();if(!t)return s.NextResponse.json({success:!1,error:"项目名称参数缺失"},{status:400});if(!(await (0,i.getProjectsConfig)())[t])return s.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let c=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),p=(0,o.join)(c,".mock");try{await n.promises.access(p)}catch{return s.NextResponse.json({success:!0,message:"Mock目录不存在,无需处理",data:{projectName:t,timestamp:new Date().toISOString()}})}let u=async e=>{for(let t of(await n.promises.readdir(e,{withFileTypes:!0}))){let s=(0,o.join)(e,t.name);if(t.isDirectory())await u(s);else if(t.name.endsWith(".cjs")&&"setting.cjs"!==t.name){let s=(0,o.join)(e),i=(0,o.join)(s,"setting.cjs"),a=t.name.replace(".cjs","");try{await n.promises.access(i)}catch{let e=`module.exports = {
|
|
2
2
|
// 当前场景名称
|
|
3
3
|
currentSite: '${a}',
|
|
4
4
|
// 开启Mock的场景列表
|
|
@@ -10,4 +10,4 @@ module.exports={83886:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("
|
|
|
10
10
|
open: ${JSON.stringify(t.open)}
|
|
11
11
|
};`;await n.promises.writeFile(i,s,"utf-8")}catch(e){console.warn(`解析setting.cjs失败: ${i}`,e)}}}};return await u(p),s.NextResponse.json({success:!0,message:"所有Mock场景已开启",data:{projectName:t,timestamp:new Date().toISOString()}})}catch(r){let e=r instanceof Error?r.message:"开启Mock场景失败";return console.error("开启Mock场景失败:",r),s.NextResponse.json({success:!1,error:e},{status:500})}}}},40988:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(45640);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/open-all-mock/route",pathname:"/api/open-all-mock",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/open-all-mock/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
|
|
12
12
|
|
|
13
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
13
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__70a56518._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/open-all-mock/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nexport async function POST(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName } = await request.json();\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建 .mock 目录路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n\n // 检查 .mock 目录是否存在\n try {\n await fs.access(mockPath);\n } catch {\n return NextResponse.json({\n success: true,\n message: 'Mock目录不存在,无需处理',\n data: {\n projectName,\n timestamp: new Date().toISOString(),\n },\n });\n }\n\n // 递归处理所有目录\n const processDirectory = async (dirPath: string) => {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // 递归处理子目录\n await processDirectory(fullPath);\n } else if (entry.name.endsWith('.cjs') && entry.name !== 'setting.cjs') {\n // 找到 mock 文件,确保对应的 setting.cjs 存在\n const methodDir = join(dirPath);\n const settingPath = join(methodDir, 'setting.cjs');\n const siteName = entry.name.replace('.cjs', '');\n\n try {\n // 检查 setting.cjs 是否存在\n await fs.access(settingPath);\n } catch {\n // setting.cjs 不存在,创建默认的 setting.cjs\n const settingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${siteName}',\n // 开启Mock的场景列表\n open: ['${siteName}']\n};`;\n await fs.writeFile(settingPath, settingContent, 'utf-8');\n }\n\n // 使用require直接导入并更新 setting.cjs\n try {\n const resolvedPath = resolve(settingPath);\n delete require.cache[resolvedPath];\n \n const currentConfig = require(resolvedPath);\n\n // 确保当前场景在 open 数组中\n if (!Array.isArray(currentConfig.open)) {\n currentConfig.open = [];\n }\n if (!currentConfig.open.includes(siteName)) {\n currentConfig.open.push(siteName);\n }\n\n // 更新 setting.cjs 当前开启场景是单项的\n const newContent = `module.exports = {\n // 当前场景名称\n currentSite: '${currentConfig.currentSite || siteName}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(currentConfig.open)}\n};`;\n await fs.writeFile(settingPath, newContent, 'utf-8');\n } catch (parseError) {\n console.warn(`解析setting.cjs失败: ${settingPath}`, parseError);\n }\n }\n }\n };\n\n // 开始处理\n await processDirectory(mockPath);\n\n return NextResponse.json({\n success: true,\n message: '所有Mock场景已开启',\n data: {\n projectName,\n timestamp: new Date().toISOString(),\n },\n });\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '开启Mock场景失败';\n console.error('开启Mock场景失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports={45935:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var n=e.i(13442),s=e.i(30331);let r={WORKSPACE_ROOT:(0,s.join)((0,n.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,n.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,s.join)((0,n.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:r,__dirname:t,m:n,e:s}=e;n.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>o,saveProjectsConfig:()=>i});var n=e.i(9892),s=e.i(88941);async function o(){try{await (0,n.access)(s.PROJECT_CONFIG_PATH,n.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,n.readFile)(s.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let r=s.PROJECT_CONFIG_PATH+".tmp";try{await (0,n.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,n.rename)(r,s.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},76687:function(e){var{g:r,__dirname:t,m:n,e:s}=e},84038:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>o});var n=e.i(15494),s=e.i(35692);async function o(e){try{let{searchParams:r}=new URL(e.url),t=r.get("project");if(!t)return n.NextResponse.json({success:!1,error:"项目名称参数缺失"},{status:400});let o=await (0,s.getProjectsConfig)();if(!o[t])return n.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let i=o[t];return n.NextResponse.json({success:!0,data:{mockingIntercept:i.mockingIntercept||!1,mockOpen:i.mockOpen||!1}})}catch(r){let e=r instanceof Error?r.message:"获取Mock拦截状态失败";return console.error("获取Mock拦截状态失败:",r),n.NextResponse.json({success:!1,error:e},{status:500})}}},30449:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var n=e.i(45746),s=e.i(93828),o=e.i(18250),i=e.i(84038);let r=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/check-mock-intercept/route",pathname:"/api/check-mock-intercept",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/check-mock-intercept/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__7c3ad3a9._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/check-mock-intercept/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { getProjectsConfig } from '@/lib/workspace-config';\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 读取项目配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n const projectConfig = projectsConfig[projectName];\n\n return NextResponse.json({\n success: true,\n data: {\n mockingIntercept: projectConfig.mockingIntercept || false,\n mockOpen: projectConfig.mockOpen || false,\n },\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : '获取Mock拦截状态失败';\n console.error('获取Mock拦截状态失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"y+CAAA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAKO,IAAM,EAAmB,CAE9B,eAAgB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAM,AAAN,IAAW,YAAa,EAA7B,WAAK,MAGrB,YAAa,IAGb,sBAAuB,KAAK,GAAG,CAAC,EAAG,KAAK,GAAG,CAAC,CAAA,EAAA,EAAA,IAAG,AAAH,IAAO,MAAM,CAAE,IAG3D,iBAH4C,EAGxB,CACtB,EAEa,EAAsB,CAAA,EAAA,EAAA,IAAA,AAAG,EAAE,CAAA,EAAA,EAAA,OAAA,AAAM,IAAK,cAAhB,UA2B5B,CA3BiC,GA2B5B,EAAA,SAAA,CAAA,6JAAA,4OC/CZ,IAAA,EAAA,EAAA,CAAA,CAAA,MAEA,EAAA,EAAA,CAAA,CAAA,OAMO,eAAe,IACpB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAA,mBAAmB,CAAE,EAAA,GAA5B,MAAqC,CAAC,IAA/B,AAAmC,CAClD,CAAE,KAAM,CAGN,OADA,MAAM,AAH4B,EAGT,CAAC,GACnB,CAAC,CACV,CAEA,GAAI,CACF,IAAM,EAAgB,MAAM,CAAA,EAAA,EAAA,QAAA,AAAO,EAAE,EAAA,mBAAmB,CAAE,GAA9B,MAE5B,GAAI,CAAC,EACH,CAHmC,KAG5B,CAAC,EAEV,IAHoB,GAGb,KAAK,KAAK,CAAC,EACpB,CAAE,MAAO,EAAO,CAGd,MAFA,QAAQ,KAAK,CAAC,iBAAkB,GAE1B,AAAI,MAAM,WAClB,CACF,CAMO,eAAe,EAAmB,CAAsB,EAC7D,IAAM,EAAiB,EAAA,mBAAmB,CAAG,OAC7C,GAAI,CACF,KAFqB,CAEf,CAAA,EAAA,EAAA,SAAQ,AAAR,EAAU,EAAgB,KAAK,SAAS,CAAC,EAAQ,KAAM,AAAvD,GAA2D,SACjE,MAAM,CAAA,EAAA,EAAA,MAAA,AAAK,EAAE,EAAgB,EAAA,mBAAmB,CAClD,CAAE,EADM,IACC,EAAO,CAEd,MADA,AAF6B,QAErB,KAAK,CAAC,cAAe,GACvB,AAAI,MAAM,WAClB,CACF,CAKO,IAAK,EAAA,SAAA,CAAA,mIAAA,yHCjDZ,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEO,eAAe,EAAI,CAAoB,EAC5C,GAAI,CACF,GAAM,cAAE,CAAY,CAAE,CAAG,IAAI,IAAI,EAAQ,GAAG,EACtC,EAAc,EAAa,GAAG,CAAC,WAErC,GAAI,CAAC,EACH,OAAO,EAAA,EADS,UACG,CAAC,IAAI,CACtB,CAAE,QAAS,GAAO,MAAO,AADpB,UAC+B,EACpC,CAAE,OAAQ,GAAI,GAKlB,IAAM,EAAiB,MAAM,CAAA,EAAA,EAAA,iBAAA,AAAgB,IAG7C,GAAI,CAAC,CAAc,CAAC,EAAY,CAC9B,CADgC,KAHL,CAIpB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,SAAS,EAAO,MADb,AACoB,CAAC,GAAG,EAAE,EAAY,IAAI,CAAC,AAAC,EACjD,CAAE,OAAQ,GAAI,GAIlB,IAAM,EAAgB,CAAc,CAAC,EAAY,CAEjD,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,KAAM,CAFD,AAGH,iBAAkB,EAAc,gBAAgB,GAAI,EACpD,SAAU,EAAc,QAAQ,EAAI,EACtC,CACF,EACF,CAAE,MAAO,EAAO,CACd,IAAM,EACJ,aAAiB,MAAQ,EAAM,OAAO,CAAG,eAE3C,OADA,QAAQ,KAAK,CAAC,gBAAiB,GACxB,EAAA,YAAY,CAAC,IAAI,CACtB,CAAE,QAAS,GAAO,MADb,AACoB,CAAa,EACtC,CAAE,OAAQ,GAAI,EAElB,CACF,gKC5CA,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAjCC,AAAiC,CAFnC,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAAA,AAFjBC,EAEXC,KAWZ,IAbkC,AAa5BC,EAAc,GAXM,CAWN,EAbsB,AAalBL,YAXgB,OAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,kCACNC,SAAU,4BACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,sEAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,sBAAEC,CAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[3]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports={83886:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},
|
|
1
|
+
module.exports={83886:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),o=e.i(30331);let t={WORKSPACE_ROOT:(0,o.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,o.join)((0,r.homedir)(),".prime-projects.json");var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>n});var r=e.i(9892),o=e.i(88941);async function i(){try{await (0,r.access)(o.PROJECT_CONFIG_PATH,r.constants.F_OK)}catch{return await n({}),{}}try{let e=await (0,r.readFile)(o.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function n(e){let t=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,r.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,r.rename)(t,o.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15650:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("module",()=>require("module"))},99577:function(e){var{g:t,__dirname:s,m:r,e:o}=e},99664:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({DELETE:()=>p,GET:()=>u,POST:()=>c});var r=e.i(15494),o=e.i(83886),i=e.i(30331),n=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-file/route.ts")}`}}.url);async function c(e){try{let{projectName:t,apiName:s,method:c,siteName:u,content:p}=await e.json();if(!t||!s||!c||!u||void 0===p)return r.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, siteName, content"},{status:400});if(!(await (0,n.getProjectsConfig)())[t])return r.NextResponse.json({success:!1,error:`项目 ${t} 不存在`},{status:404});let l=(0,i.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,t),m=(0,i.join)(l,".mock"),d=(0,i.join)(m,s),g=(0,i.join)(d,c.toLowerCase()),j=(0,i.join)(g,`${u}.cjs`);try{await o.promises.access(l)}catch{return r.NextResponse.json({success:!1,error:`项目目录 ${t} 不存在`},{status:404})}try{await o.promises.access(m)}catch{await o.promises.mkdir(m,{recursive:!0})}try{await o.promises.access(d)}catch{await o.promises.mkdir(d,{recursive:!0})}try{await o.promises.access(g)}catch{await o.promises.mkdir(g,{recursive:!0})}let f=(0,i.join)(g,"setting.cjs"),x=!1;try{await o.promises.access(f),console.log(`setting.cjs文件已存在: ${f}`)}catch{let e=`module.exports = {
|
|
2
2
|
// 当前场景名称
|
|
3
3
|
currentSite: '${u}',
|
|
4
4
|
// 开启Mock的场景列表
|
|
@@ -15,4 +15,4 @@ module.exports={83886:function(e){var{g:t,__dirname:s,m:r,e:o}=e;r.exports=e.x("
|
|
|
15
15
|
open: ${JSON.stringify(e)}
|
|
16
16
|
};`;await o.promises.writeFile(j,t,"utf-8")}}catch(e){console.warn("更新setting.cjs失败:",e)}return r.NextResponse.json({success:!0,message:"Mock场景删除成功",data:{projectName:c,apiName:u,method:p.toLowerCase(),siteName:l,deletedFile:(0,i.join)(".mock",u,p.toLowerCase(),`${l}.cjs`)}})}catch(t){let e=t instanceof Error?t.message:"删除Mock文件失败";return console.error("删除Mock文件失败:",t),r.NextResponse.json({success:!1,error:e},{status:500})}}}},35699:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>s,workUnitAsyncStorage:()=>c});var r=e.i(45746),o=e.i(93828),i=e.i(18250),n=e.i(99664);let t=new r.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/mock-file/route",pathname:"/api/mock-file",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-file/route.ts",nextConfigOutput:"",userland:n}),{workAsyncStorage:s,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:s,workUnitAsyncStorage:c})}}}};
|
|
17
17
|
|
|
18
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
18
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__9370ea2b._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/mock-file/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nexport async function POST(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, content } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || content === undefined) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, content',\n },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n const apiPath = join(mockPath, apiName);\n const methodPath = join(apiPath, method.toLowerCase());\n const filePath = join(methodPath, `${siteName}.cjs`);\n\n // 检查项目目录是否存在\n try {\n await fs.access(projectPath);\n } catch {\n return NextResponse.json(\n { success: false, error: `项目目录 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 确保 .mock 目录存在\n try {\n await fs.access(mockPath);\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n }\n\n // 确保 API 目录存在\n try {\n await fs.access(apiPath);\n } catch {\n await fs.mkdir(apiPath, { recursive: true });\n }\n\n // 确保 Method 目录存在\n try {\n await fs.access(methodPath);\n } catch {\n await fs.mkdir(methodPath, { recursive: true });\n }\n\n // 如果setting.cjs不存在,则创建setting.cjs\n const settingFilePath = join(methodPath, 'setting.cjs');\n let settingCreated = false;\n try {\n await fs.access(settingFilePath);\n console.log(`setting.cjs文件已存在: ${settingFilePath}`);\n } catch {\n // setting.cjs不存在,创建它\n const settingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${siteName}',\n // 开启Mock的场景列表\n open: ['${siteName}']\n};`;\n await fs.writeFile(settingFilePath, settingContent, 'utf-8');\n settingCreated = true;\n console.log(`setting.cjs文件创建成功: ${settingFilePath}`);\n }\n\n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock文件创建成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n settingCreated,\n createdAt: new Date().toISOString(),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '创建Mock文件失败';\n console.error('创建Mock文件失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n\n // 检查 .mock 目录是否存在\n try {\n await fs.access(mockPath);\n } catch {\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n mockFiles: [],\n },\n message: 'Mock目录不存在,返回空列表',\n });\n }\n\n // 读取 .mock 目录结构\n const mockFiles: Array<{\n apiName: string;\n methods: Array<{\n method: string;\n setting?: {\n currentSite?: string;\n [key: string]: unknown;\n };\n files: Array<{\n siteName: string;\n fileName: string;\n filePath: string;\n }>;\n }>;\n }> = [];\n\n const apiDirs = await fs.readdir(mockPath, { withFileTypes: true });\n \n for (const apiDir of apiDirs) {\n if (apiDir.isDirectory()) {\n const apiPath = join(mockPath, apiDir.name);\n const methodDirs = await fs.readdir(apiPath, { withFileTypes: true });\n \n const apiMethods: Array<{\n method: string;\n setting?: {\n currentSite?: string;\n [key: string]: unknown;\n };\n files: Array<{\n siteName: string;\n fileName: string;\n filePath: string;\n }>;\n }> = [];\n\n for (const methodDir of methodDirs) {\n if (methodDir.isDirectory()) {\n const methodPath = join(apiPath, methodDir.name);\n const files = await fs.readdir(methodPath, { withFileTypes: true });\n \n // 读取setting.cjs文件内容\n let setting: { currentSite?: string; [key: string]: unknown } | undefined;\n const settingFilePath = join(methodPath, 'setting.cjs');\n try {\n await fs.access(settingFilePath);\n // 使用require直接导入setting.cjs\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n setting = require(resolvedPath);\n } catch (error) {\n // setting.cjs文件不存在或读取失败,忽略\n console.warn(`读取setting.cjs失败: ${settingFilePath}`, error);\n }\n \n const methodFiles = files\n .filter(file => file.isFile() && file.name.endsWith('.cjs') && file.name !== 'setting.cjs')\n .map(file => ({\n siteName: file.name.replace('.cjs', ''),\n fileName: file.name,\n filePath: join('.mock', apiDir.name, methodDir.name, file.name),\n }));\n\n if (methodFiles.length > 0) {\n apiMethods.push({\n method: methodDir.name,\n setting,\n files: methodFiles,\n });\n }\n }\n }\n\n if (apiMethods.length > 0) {\n mockFiles.push({\n apiName: apiDir.name,\n methods: apiMethods,\n });\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n mockFiles,\n },\n message: '获取Mock文件列表成功',\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '获取Mock文件列表失败';\n console.error('获取Mock文件列表失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n const method = searchParams.get('method');\n const siteName = searchParams.get('siteName');\n\n if (!projectName || !apiName || !method || !siteName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName, method, siteName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const methodPath = join(projectPath, '.mock', apiName, method.toLowerCase());\n const filePath = join(methodPath, `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 检查是否为该接口的最后一个场景,如果是则不允许删除\n try {\n const methodFiles = await fs.readdir(methodPath);\n // 过滤出.cjs文件(排除setting.cjs)\n const scenarioFiles = methodFiles.filter(file => file.endsWith('.cjs') && file !== 'setting.cjs');\n \n if (scenarioFiles.length <= 1) {\n return NextResponse.json(\n { success: false, error: '不能删除最后一个场景,每个接口至少需要保留一个场景' },\n { status: 400 },\n );\n }\n } catch (error) {\n console.error('检查场景文件失败:', error);\n return NextResponse.json(\n { success: false, error: '检查场景文件失败' },\n { status: 500 },\n );\n }\n\n // 删除文件\n await fs.unlink(filePath);\n\n // 检查是否需要更新setting.cjs中的currentSite\n const settingFilePath = join(methodPath, 'setting.cjs');\n try {\n await fs.access(settingFilePath);\n // 读取当前设置\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n const currentSetting = require(resolvedPath);\n \n // 如果删除的是当前选中的场景,需要切换到其他场景\n if (currentSetting.currentSite === siteName) {\n const remainingFiles = await fs.readdir(methodPath);\n const remainingScenarios = remainingFiles.filter(file => file.endsWith('.cjs') && file !== 'setting.cjs');\n \n if (remainingScenarios.length > 0) {\n // 选择第一个剩余的场景作为新的当前场景\n const newCurrentSite = remainingScenarios[0].replace('.cjs', '');\n const newOpen = currentSetting.open.filter((site: string) => site !== siteName);\n \n const newSettingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${newCurrentSite}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(newOpen)}\n};`;\n \n await fs.writeFile(settingFilePath, newSettingContent, 'utf-8');\n }\n } else {\n // 如果删除的不是当前场景,只需要从open列表中移除\n const newOpen = currentSetting.open.filter((site: string) => site !== siteName);\n \n const newSettingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${currentSetting.currentSite}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(newOpen)}\n};`;\n \n await fs.writeFile(settingFilePath, newSettingContent, 'utf-8');\n }\n } catch (error) {\n console.warn('更新setting.cjs失败:', error);\n // 不阻止删除操作,只是警告\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock场景删除成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n deletedFile: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock文件失败';\n console.error('删除Mock文件失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
1
|
+
{"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/app/api/mock-file/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { promises as fs } from 'fs';\nimport { join, resolve } from 'path';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { createRequire } from \"module\";\nconst require = createRequire(import.meta.url);\n\nexport async function POST(request: NextRequest) {\n try {\n // 解析请求体\n const { projectName, apiName, method, siteName, content } = await request.json();\n\n // 参数验证\n if (!projectName || !apiName || !method || !siteName || content === undefined) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:projectName, apiName, method, siteName, content',\n },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n const apiPath = join(mockPath, apiName);\n const methodPath = join(apiPath, method.toLowerCase());\n const filePath = join(methodPath, `${siteName}.cjs`);\n\n // 检查项目目录是否存在\n try {\n await fs.access(projectPath);\n } catch {\n return NextResponse.json(\n { success: false, error: `项目目录 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 确保 .mock 目录存在\n try {\n await fs.access(mockPath);\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n }\n\n // 确保 API 目录存在\n try {\n await fs.access(apiPath);\n } catch {\n await fs.mkdir(apiPath, { recursive: true });\n }\n\n // 确保 Method 目录存在\n try {\n await fs.access(methodPath);\n } catch {\n await fs.mkdir(methodPath, { recursive: true });\n }\n\n // 如果setting.cjs不存在,则创建setting.cjs\n const settingFilePath = join(methodPath, 'setting.cjs');\n let settingCreated = false;\n try {\n await fs.access(settingFilePath);\n console.log(`setting.cjs文件已存在: ${settingFilePath}`);\n } catch {\n // setting.cjs不存在,创建它\n const settingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${siteName}',\n // 开启Mock的场景列表\n open: ['${siteName}']\n};`;\n await fs.writeFile(settingFilePath, settingContent, 'utf-8');\n settingCreated = true;\n console.log(`setting.cjs文件创建成功: ${settingFilePath}`);\n }\n\n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n\n return NextResponse.json({\n success: true,\n message: 'Mock文件创建成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n filePath: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n settingCreated,\n createdAt: new Date().toISOString(),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '创建Mock文件失败';\n console.error('创建Mock文件失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n\n if (!projectName) {\n return NextResponse.json(\n { success: false, error: '项目名称参数缺失' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const mockPath = join(projectPath, '.mock');\n\n // 检查 .mock 目录是否存在\n try {\n await fs.access(mockPath);\n } catch {\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n mockFiles: [],\n },\n message: 'Mock目录不存在,返回空列表',\n });\n }\n\n // 读取 .mock 目录结构\n const mockFiles: Array<{\n apiName: string;\n methods: Array<{\n method: string;\n setting?: {\n currentSite?: string;\n [key: string]: unknown;\n };\n files: Array<{\n siteName: string;\n fileName: string;\n filePath: string;\n }>;\n }>;\n }> = [];\n\n const apiDirs = await fs.readdir(mockPath, { withFileTypes: true });\n \n for (const apiDir of apiDirs) {\n if (apiDir.isDirectory()) {\n const apiPath = join(mockPath, apiDir.name);\n const methodDirs = await fs.readdir(apiPath, { withFileTypes: true });\n \n const apiMethods: Array<{\n method: string;\n setting?: {\n currentSite?: string;\n [key: string]: unknown;\n };\n files: Array<{\n siteName: string;\n fileName: string;\n filePath: string;\n }>;\n }> = [];\n\n for (const methodDir of methodDirs) {\n if (methodDir.isDirectory()) {\n const methodPath = join(apiPath, methodDir.name);\n const files = await fs.readdir(methodPath, { withFileTypes: true });\n \n // 读取setting.cjs文件内容\n let setting: { currentSite?: string; [key: string]: unknown } | undefined;\n const settingFilePath = join(methodPath, 'setting.cjs');\n try {\n await fs.access(settingFilePath);\n // 使用require直接导入setting.cjs\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n setting = require(resolvedPath);\n } catch (error) {\n // setting.cjs文件不存在或读取失败,忽略\n console.warn(`读取setting.cjs失败: ${settingFilePath}`, error);\n }\n \n const methodFiles = files\n .filter(file => file.isFile() && file.name.endsWith('.cjs') && file.name !== 'setting.cjs')\n .map(file => ({\n siteName: file.name.replace('.cjs', ''),\n fileName: file.name,\n filePath: join('.mock', apiDir.name, methodDir.name, file.name),\n }));\n\n if (methodFiles.length > 0) {\n apiMethods.push({\n method: methodDir.name,\n setting,\n files: methodFiles,\n });\n }\n }\n }\n\n if (apiMethods.length > 0) {\n mockFiles.push({\n apiName: apiDir.name,\n methods: apiMethods,\n });\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: {\n projectName,\n mockFiles,\n },\n message: '获取Mock文件列表成功',\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '获取Mock文件列表失败';\n console.error('获取Mock文件列表失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n}\n\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('project');\n const apiName = searchParams.get('apiName');\n const method = searchParams.get('method');\n const siteName = searchParams.get('siteName');\n\n if (!projectName || !apiName || !method || !siteName) {\n return NextResponse.json(\n { success: false, error: '缺少必要参数:project, apiName, method, siteName' },\n { status: 400 },\n );\n }\n\n // 验证项目是否存在\n const projectsConfig = await getProjectsConfig();\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 构建文件路径\n const projectPath = join(WORKSPACE_CONFIG.WORKSPACE_ROOT, projectName);\n const methodPath = join(projectPath, '.mock', apiName, method.toLowerCase());\n const filePath = join(methodPath, `${siteName}.cjs`);\n\n // 检查文件是否存在\n try {\n await fs.access(filePath);\n } catch {\n return NextResponse.json(\n { success: false, error: 'Mock文件不存在' },\n { status: 404 },\n );\n }\n\n // 检查是否为该接口的最后一个场景,如果是则不允许删除\n try {\n const methodFiles = await fs.readdir(methodPath);\n // 过滤出.cjs文件(排除setting.cjs)\n const scenarioFiles = methodFiles.filter(file => file.endsWith('.cjs') && file !== 'setting.cjs');\n \n if (scenarioFiles.length <= 1) {\n return NextResponse.json(\n { success: false, error: '不能删除最后一个场景,每个接口至少需要保留一个场景' },\n { status: 400 },\n );\n }\n } catch (error) {\n console.error('检查场景文件失败:', error);\n return NextResponse.json(\n { success: false, error: '检查场景文件失败' },\n { status: 500 },\n );\n }\n\n // 删除文件\n await fs.unlink(filePath);\n\n // 检查是否需要更新setting.cjs中的currentSite\n const settingFilePath = join(methodPath, 'setting.cjs');\n try {\n await fs.access(settingFilePath);\n // 读取当前设置\n const resolvedPath = resolve(settingFilePath);\n delete require.cache[resolvedPath];\n const currentSetting = require(resolvedPath);\n \n // 如果删除的是当前选中的场景,需要切换到其他场景\n if (currentSetting.currentSite === siteName) {\n const remainingFiles = await fs.readdir(methodPath);\n const remainingScenarios = remainingFiles.filter(file => file.endsWith('.cjs') && file !== 'setting.cjs');\n \n if (remainingScenarios.length > 0) {\n // 选择第一个剩余的场景作为新的当前场景\n const newCurrentSite = remainingScenarios[0].replace('.cjs', '');\n const newOpen = currentSetting.open.filter((site: string) => site !== siteName);\n \n const newSettingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${newCurrentSite}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(newOpen)}\n};`;\n \n await fs.writeFile(settingFilePath, newSettingContent, 'utf-8');\n }\n } else {\n // 如果删除的不是当前场景,只需要从open列表中移除\n const newOpen = currentSetting.open.filter((site: string) => site !== siteName);\n \n const newSettingContent = `module.exports = {\n // 当前场景名称\n currentSite: '${currentSetting.currentSite}',\n // 开启Mock的场景列表\n open: ${JSON.stringify(newOpen)}\n};`;\n \n await fs.writeFile(settingFilePath, newSettingContent, 'utf-8');\n }\n } catch (error) {\n console.warn('更新setting.cjs失败:', error);\n // 不阻止删除操作,只是警告\n }\n\n return NextResponse.json({\n success: true,\n message: 'Mock场景删除成功',\n data: {\n projectName,\n apiName,\n method: method.toLowerCase(),\n siteName,\n deletedFile: join('.mock', apiName, method.toLowerCase(), `${siteName}.cjs`),\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '删除Mock文件失败';\n console.error('删除Mock文件失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[3]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module.exports={
|
|
1
|
+
module.exports={29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,n.join)((0,r.homedir)(),".prime-projects.json");var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var r=e.i(9892),n=e.i(88941);async function i(){try{await (0,r.access)(n.PROJECT_CONFIG_PATH,r.constants.F_OK)}catch{return await o({}),{}}try{let e=await (0,r.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function o(e){let t=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,r.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,r.rename)(t,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},83886:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,openProjectInCursor:()=>x,sanitizeProjectName:()=>l});var r=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:s,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let p=Date.now(),d={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:p};a?.(0,"开始克隆项目...");let g=(0,i.join)(s,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
|
|
2
2
|
`),u?.(l,"stdout",`[目标目录] ${g}
|
|
3
3
|
`),u?.(l,"stdout",`[仓库地址] ${t}
|
|
4
4
|
`);let f=(0,r.spawn)("git",m,{cwd:s,stdio:["pipe","pipe","pipe"]}),x="",E=0;u?.(l,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
|
|
@@ -13,4 +13,4 @@ ${x}
|
|
|
13
13
|
`),u?.(l,"stderr",`[错误详情] ${t.stack||"No stack trace"}
|
|
14
14
|
`);let s={...d,status:o.ProjectStatus.FAILED,progress:E,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${l}: ${t.message}`),e(s)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function p(e,t){try{let s=(0,i.join)(e,t);if(!(0,n.existsSync)(s))return{exists:!1,status:"not_exists",needsCleanup:!1};let r=(0,i.join)(s,".git");if(!(0,n.existsSync)(r))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(s))return console.log(`检测到不完整的Git仓库: ${s}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function d(e,t){return"complete"===(await p(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let s=(0,i.join)(t,e);if(!(0,n.existsSync)(s))return!1}let s=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===s.length)return!1;let r=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(r,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let s={},r=t.map(async t=>{let r=await d(e,t);s[t]=r});return await Promise.all(r),s}async function x(e){return new Promise(t=>{if(!(0,n.existsSync)(e))return void t({success:!1,error:`项目路径不存在: ${e}`});let s=(0,r.spawn)("cursor",[e],{stdio:["ignore","pipe","pipe"],detached:!0,env:{...process.env,NODE_ENV:"development"}}),i="",o=setTimeout(()=>{s.kill("SIGTERM"),t({success:!1,error:"Cursor 命令执行超时"})},1e4);s.stderr?.on("data",e=>{i+=e.toString()}),s.on("exit",e=>{clearTimeout(o),0===e?t({success:!0}):t({success:!1,error:`Cursor 退出代码: ${e}${i?`, 错误: ${i}`:""}`})}),s.on("error",e=>{clearTimeout(o),e.message.includes("ENOENT")?t({success:!1,error:"Cursor 命令未找到,请确保 Cursor CLI 已正确安装并在 PATH 中"}):t({success:!1,error:`启动 Cursor 失败: ${e.message}`})}),s.unref()})}},30533:function(e){var{g:t,__dirname:s,m:r,e:n}=e},54635:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({GET:()=>a});var r=e.i(9892),n=e.i(88941),i=e.i(35692),o=e.i(77159);async function a(){try{let e=await (0,i.getProjectsConfig)(),t=Object.keys(e);if(0===t.length)return new Response(JSON.stringify({success:!0,workspaceExists:!1,projects:[],message:"没有找到配置的项目"}),{status:200,headers:{"Content-Type":"application/json"}});let s=n.WORKSPACE_CONFIG.WORKSPACE_ROOT,a=!1;try{await r.default.access(s),a=!0}catch{a=!1}let c=[],u=(c=a?await Promise.all(t.map(async e=>{let t,r,i=await (0,o.checkProjectStatus)(s,e);switch(i.status){case"complete":t=n.ProjectStatus.EXISTING,r="项目已存在";break;case"incomplete":t=n.ProjectStatus.INCOMPLETE,r="项目不完整,需要清理";break;default:t=n.ProjectStatus.PENDING,r="待克隆"}return{name:e,status:t,message:r,needsCleanup:i.needsCleanup}})):t.map(e=>({name:e,status:n.ProjectStatus.PENDING,message:"待克隆"}))).filter(e=>e.status===n.ProjectStatus.EXISTING).length,l=c.filter(e=>e.status===n.ProjectStatus.PENDING).length,p=c.filter(e=>e.status===n.ProjectStatus.INCOMPLETE).length;return new Response(JSON.stringify({success:!0,workspaceExists:a,workspacePath:s,projects:c,summary:{total:t.length,existing:u,pending:l,incomplete:p},message:a?`工作空间已存在,发现 ${u} 个已存在项目,${l} 个待克隆项目${p>0?`,${p} 个不完整项目需要清理`:""}`:`工作空间不存在,${t.length} 个项目待克隆`}),{status:200,headers:{"Content-Type":"application/json"}})}catch(t){let e=t instanceof Error?t.message:String(t);return console.error("检查工作空间状态失败:",t),new Response(JSON.stringify({success:!1,error:`检查工作空间状态失败: ${e}`,workspaceExists:!1,projects:[]}),{status:500,headers:{"Content-Type":"application/json"}})}}},81743:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>s,workUnitAsyncStorage:()=>c});var r=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(54635);let t=new r.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/check-workspace/route",pathname:"/api/check-workspace",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/check-workspace/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:s,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:s,workUnitAsyncStorage:c})}}}};
|
|
15
15
|
|
|
16
|
-
//# sourceMappingURL=%5Broot-of-the-server%
|
|
16
|
+
//# sourceMappingURL=%5Broot-of-the-server%5D__9f32f8a7._.js.map
|