vite-plugin-ai-mock-generator 1.0.1 → 1.0.2

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/index.d.mts CHANGED
@@ -269,4 +269,4 @@ declare class MockServer {
269
269
 
270
270
  declare function vitePluginAIMockGenerator(options?: MockGeneratorOptions): Plugin;
271
271
 
272
- export { type EndpointConfig, MockDataGenerator, type MockGeneratorOptions, MockServer, MockStorage, vitePluginAIMockGenerator };
272
+ export { type EndpointConfig, MockDataGenerator, type MockGeneratorOptions, MockServer, MockStorage, vitePluginAIMockGenerator as default, vitePluginAIMockGenerator };
package/dist/index.d.ts CHANGED
@@ -269,4 +269,4 @@ declare class MockServer {
269
269
 
270
270
  declare function vitePluginAIMockGenerator(options?: MockGeneratorOptions): Plugin;
271
271
 
272
- export { type EndpointConfig, MockDataGenerator, type MockGeneratorOptions, MockServer, MockStorage, vitePluginAIMockGenerator };
272
+ export { type EndpointConfig, MockDataGenerator, type MockGeneratorOptions, MockServer, MockStorage, vitePluginAIMockGenerator as default, vitePluginAIMockGenerator };
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
3
5
  var fs = require('fs');
4
6
  var path = require('path');
5
7
 
@@ -580,9 +582,7 @@ function vitePluginAIMockGenerator(options = {}) {
580
582
  console.log(`\u{1F30D} \u6570\u636E\u8BED\u8A00: ${generation.locale}`);
581
583
  console.log(`\u{1F4CA} \u9ED8\u8BA4\u6570\u91CF: ${generation.count}`);
582
584
  console.log(`\u{1F511} API Key: ${apiKey ? "\u5DF2\u914D\u7F6E" : "\u672A\u914D\u7F6E"}`);
583
- console.log(
584
- `\u{1F4CD} \u7AEF\u70B9\u6570\u91CF: ${options.endpoints?.length || 0}`
585
- );
585
+ console.log(`\u{1F4CD} \u7AEF\u70B9\u6570\u91CF: ${options.endpoints?.length || 0}`);
586
586
  }
587
587
  },
588
588
  async buildStart() {
@@ -654,10 +654,12 @@ function parseTypeDefinition(typeStr) {
654
654
  isArray
655
655
  };
656
656
  }
657
+ var index_default = vitePluginAIMockGenerator;
657
658
 
658
659
  exports.MockDataGenerator = MockDataGenerator;
659
660
  exports.MockServer = MockServer;
660
661
  exports.MockStorage = MockStorage;
662
+ exports.default = index_default;
661
663
  exports.vitePluginAIMockGenerator = vitePluginAIMockGenerator;
662
664
  //# sourceMappingURL=index.js.map
663
665
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage.ts","../src/generator.ts","../src/utils.ts","../src/server.ts","../src/index.ts"],"names":["fs","path"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * AI Mock Generator - 数据存储\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { MockDataStore, HttpMethod } from './types';\r\n\r\nexport class MockStorage {\r\n private storageDir: string;\r\n private cache: Map<string, MockDataStore>;\r\n private persist: boolean;\r\n\r\n constructor(options: { dir?: string; persist?: boolean } = {}) {\r\n this.storageDir = options.dir || 'mock-data';\r\n this.persist = options.persist !== false;\r\n this.cache = new Map();\r\n\r\n // 确保存储目录存在\r\n if (this.persist && !fs.existsSync(this.storageDir)) {\r\n fs.mkdirSync(this.storageDir, { recursive: true });\r\n }\r\n\r\n // 加载已有数据\r\n this.load();\r\n }\r\n\r\n /**\r\n * 生成存储 key\r\n */\r\n private getKey(endpoint: string, method: HttpMethod): string {\r\n return `${method}:${endpoint}`;\r\n }\r\n\r\n /**\r\n * 生成文件名\r\n */\r\n private getFileName(endpoint: string, method: HttpMethod): string {\r\n const sanitized = endpoint\r\n .replace(/^\\//, '')\r\n .replace(/\\//g, '_')\r\n .replace(/:/g, '_');\r\n return `${method}_${sanitized}.json`;\r\n }\r\n\r\n /**\r\n * 获取数据\r\n */\r\n get(endpoint: string, method: HttpMethod = 'GET'): any {\r\n const key = this.getKey(endpoint, method);\r\n const store = this.cache.get(key);\r\n return store?.data;\r\n }\r\n\r\n /**\r\n * 设置数据\r\n */\r\n set(\r\n endpoint: string,\r\n method: HttpMethod,\r\n data: any,\r\n metadata?: Partial<MockDataStore['metadata']>\r\n ): void {\r\n const key = this.getKey(endpoint, method);\r\n\r\n const store: MockDataStore = {\r\n endpoint,\r\n method,\r\n data,\r\n metadata: {\r\n count: Array.isArray(data) ? data.length : 1,\r\n generatedAt: new Date().toISOString(),\r\n version: '1.0.0',\r\n type: typeof data,\r\n ...metadata,\r\n },\r\n };\r\n\r\n this.cache.set(key, store);\r\n\r\n // 持久化\r\n if (this.persist) {\r\n this.save(endpoint, method, store);\r\n }\r\n }\r\n\r\n /**\r\n * 删除数据\r\n */\r\n delete(endpoint: string, method: HttpMethod = 'GET'): void {\r\n const key = this.getKey(endpoint, method);\r\n this.cache.delete(key);\r\n\r\n // 删除文件\r\n if (this.persist) {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n\r\n // 清空目录\r\n if (this.persist && fs.existsSync(this.storageDir)) {\r\n const files = fs.readdirSync(this.storageDir);\r\n for (const file of files) {\r\n fs.unlinkSync(path.join(this.storageDir, file));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getAll(): MockDataStore[] {\r\n return Array.from(this.cache.values());\r\n }\r\n\r\n /**\r\n * 保存到文件\r\n */\r\n private save(\r\n endpoint: string,\r\n method: HttpMethod,\r\n store: MockDataStore\r\n ): void {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n\r\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 从文件加载\r\n */\r\n private load(): void {\r\n if (!this.persist || !fs.existsSync(this.storageDir)) {\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.storageDir);\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n\r\n try {\r\n const filePath = path.join(this.storageDir, file);\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const store: MockDataStore = JSON.parse(content);\r\n\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n } catch (error) {\r\n console.warn(`Failed to load mock data from ${file}:`, error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出所有数据\r\n */\r\n export(outputPath: string): void {\r\n const allData = this.getAll();\r\n fs.writeFileSync(outputPath, JSON.stringify(allData, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 导入数据\r\n */\r\n import(inputPath: string): void {\r\n const content = fs.readFileSync(inputPath, 'utf-8');\r\n const allData: MockDataStore[] = JSON.parse(content);\r\n\r\n for (const store of allData) {\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n\r\n if (this.persist) {\r\n this.save(store.endpoint, store.method, store);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 数据生成器\r\n */\r\n\r\nimport type {\r\n TypeDefinition,\r\n GenerationContext,\r\n PropertyDefinition,\r\n} from './types';\r\n\r\nexport class MockDataGenerator {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private model: string;\r\n\r\n constructor(options: { apiKey: string; apiUrl: string; model: string }) {\r\n this.apiKey = options.apiKey;\r\n this.apiUrl = options.apiUrl;\r\n this.model = options.model;\r\n }\r\n\r\n /**\r\n * 生成 Mock 数据\r\n */\r\n async generate(context: GenerationContext): Promise<any> {\r\n const { type, count, locale, quality } = context;\r\n\r\n // 构建 AI Prompt\r\n const prompt = this.buildPrompt(type, count, locale, quality);\r\n\r\n // 调用 AI API\r\n const response = await this.callAI(prompt);\r\n\r\n // 解析响应\r\n return this.parseResponse(response, type.isArray);\r\n }\r\n\r\n /**\r\n * 构建 AI Prompt\r\n */\r\n private buildPrompt(\r\n type: TypeDefinition,\r\n count: number,\r\n locale: string,\r\n quality: string\r\n ): string {\r\n const properties = type.properties\r\n .map((p) => this.formatProperty(p))\r\n .join('\\n');\r\n\r\n return `\r\n你是一个专业的 Mock 数据生成器。请根据以下类型定义生成真实、合理的测试数据。\r\n\r\n类型名称: ${type.name}\r\n数据语言: ${locale === 'zh-CN' ? '中文' : '英文'}\r\n数据数量: ${count}\r\n质量要求: ${quality === 'high' ? '高质量(真实业务数据)' : quality === 'fast' ? '快速生成' : '平衡质量和速度'}\r\n\r\n类型定义:\r\n${properties}\r\n\r\n要求:\r\n1. 生成 ${count} 条数据\r\n2. 数据要符合业务逻辑和真实场景\r\n3. 字段值要合理(如价格不能为负数,年龄在合理范围)\r\n4. 日期格式使用 ISO 8601\r\n5. 返回 JSON 数组格式,不要包含任何其他文字\r\n6. 理解字段语义,生成真实数据(如 userName 生成真实姓名)\r\n\r\n示例格式:\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"张三\",\r\n ...\r\n }\r\n]\r\n\r\n请生成数据:\r\n`.trim();\r\n }\r\n\r\n /**\r\n * 格式化属性\r\n */\r\n private formatProperty(prop: PropertyDefinition): string {\r\n let line = `- ${prop.name}: ${prop.type}`;\r\n\r\n if (prop.comment) {\r\n line += ` // ${prop.comment}`;\r\n }\r\n\r\n if (prop.constraints) {\r\n const constraints = [];\r\n if (prop.constraints.min !== undefined) {\r\n constraints.push(`min: ${prop.constraints.min}`);\r\n }\r\n if (prop.constraints.max !== undefined) {\r\n constraints.push(`max: ${prop.constraints.max}`);\r\n }\r\n if (prop.constraints.unique) {\r\n constraints.push('unique');\r\n }\r\n if (prop.constraints.enum) {\r\n constraints.push(`enum: [${prop.constraints.enum.join(', ')}]`);\r\n }\r\n if (constraints.length > 0) {\r\n line += ` (${constraints.join(', ')})`;\r\n }\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * 调用 AI API\r\n */\r\n private async callAI(prompt: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${this.apiUrl}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n temperature: 0.7,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`AI API error: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data.choices[0].message.content;\r\n } catch (error: any) {\r\n console.error('Failed to call AI API:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 解析 AI 响应\r\n */\r\n private parseResponse(response: string, isArray: boolean = true): any {\r\n try {\r\n // 移除 markdown 代码块标记\r\n let cleanedResponse = response.trim();\r\n \r\n // 移除开头的 ```json 或 ```\r\n cleanedResponse = cleanedResponse.replace(/^```json\\s*/i, '');\r\n cleanedResponse = cleanedResponse.replace(/^```\\s*/, '');\r\n \r\n // 移除结尾的 ```\r\n cleanedResponse = cleanedResponse.replace(/\\s*```$/, '');\r\n \r\n // 提取 JSON 部分(查找数组或对象)\r\n const jsonMatch = cleanedResponse.match(/(\\[[\\s\\S]*\\]|\\{[\\s\\S]*\\})/);\r\n if (!jsonMatch) {\r\n throw new Error('No JSON array or object found in response');\r\n }\r\n\r\n const data = JSON.parse(jsonMatch[0]);\r\n\r\n return isArray ? data : data[0];\r\n } catch (error: any) {\r\n console.error('Failed to parse AI response:', error);\r\n console.error('Response:', response);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 生成基础数据(不使用 AI)\r\n */\r\n generateBasic(type: TypeDefinition, count: number): any[] {\r\n const data = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const item: any = {};\r\n\r\n for (const prop of type.properties) {\r\n item[prop.name] = this.generateBasicValue(prop, i);\r\n }\r\n\r\n data.push(item);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 生成基础值\r\n */\r\n private generateBasicValue(prop: PropertyDefinition, index: number): any {\r\n const { type, constraints } = prop;\r\n\r\n // 处理枚举\r\n if (constraints?.enum) {\r\n return constraints.enum[index % constraints.enum.length];\r\n }\r\n\r\n // 根据类型生成\r\n switch (type) {\r\n case 'number':\r\n const min = constraints?.min ?? 0;\r\n const max = constraints?.max ?? 100;\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n\r\n case 'string':\r\n return `${prop.name}_${index + 1}`;\r\n\r\n case 'boolean':\r\n return Math.random() > 0.5;\r\n\r\n case 'Date':\r\n return new Date().toISOString();\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 工具函数\r\n */\r\n\r\nimport type { HttpMethod, RequestParams } from './types';\r\n\r\n/**\r\n * 延迟函数\r\n */\r\nexport function delay(ms: number | [number, number]): Promise<void> {\r\n const delayTime = Array.isArray(ms)\r\n ? Math.random() * (ms[1] - ms[0]) + ms[0]\r\n : ms;\r\n\r\n return new Promise((resolve) => setTimeout(resolve, delayTime));\r\n}\r\n\r\n/**\r\n * 匹配路径参数\r\n * @example\r\n * matchPathParams('/api/users/:id', '/api/users/123') // { id: '123' }\r\n */\r\nexport function matchPathParams(\r\n pattern: string,\r\n path: string\r\n): Record<string, string> | null {\r\n const patternParts = pattern.split('/');\r\n const pathParts = path.split('/');\r\n\r\n if (patternParts.length !== pathParts.length) {\r\n return null;\r\n }\r\n\r\n const params: Record<string, string> = {};\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n const pathPart = pathParts[i];\r\n\r\n if (patternPart.startsWith(':')) {\r\n // 路径参数\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = pathPart;\r\n } else if (patternPart !== pathPart) {\r\n // 不匹配\r\n return null;\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 解析查询参数\r\n */\r\nexport function parseQueryParams(url: string): Record<string, any> {\r\n const queryString = url.split('?')[1];\r\n if (!queryString) return {};\r\n\r\n const params: Record<string, any> = {};\r\n const pairs = queryString.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=');\r\n params[decodeURIComponent(key)] = decodeURIComponent(value || '');\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 生成唯一 ID\r\n */\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * 深度克隆\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * 应用过滤\r\n */\r\nexport function applyFilters(data: any[], filters: Record<string, any>): any[] {\r\n if (!filters || Object.keys(filters).length === 0) {\r\n return data;\r\n }\r\n\r\n return data.filter((item) => {\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (item[key] !== value) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * 应用排序\r\n */\r\nexport function applySorting(\r\n data: any[],\r\n sort?: string | { field: string; order: 'asc' | 'desc' }\r\n): any[] {\r\n if (!sort) return data;\r\n\r\n const sortConfig =\r\n typeof sort === 'string'\r\n ? { field: sort, order: 'asc' as const }\r\n : sort;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = a[sortConfig.field];\r\n const bValue = b[sortConfig.field];\r\n\r\n if (aValue < bValue) return sortConfig.order === 'asc' ? -1 : 1;\r\n if (aValue > bValue) return sortConfig.order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/**\r\n * 应用分页\r\n */\r\nexport function applyPagination(\r\n data: any[],\r\n page: number = 1,\r\n pageSize: number = 20\r\n): {\r\n data: any[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n total: number;\r\n totalPages: number;\r\n };\r\n} {\r\n const total = data.length;\r\n const totalPages = Math.ceil(total / pageSize);\r\n const start = (page - 1) * pageSize;\r\n const end = start + pageSize;\r\n\r\n return {\r\n data: data.slice(start, end),\r\n pagination: {\r\n page,\r\n pageSize,\r\n total,\r\n totalPages,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 格式化响应\r\n */\r\nexport function formatResponse(\r\n data: any,\r\n success: boolean = true,\r\n message?: string\r\n) {\r\n return {\r\n code: success ? 200 : 500,\r\n data,\r\n message: message || (success ? 'Success' : 'Error'),\r\n };\r\n}\r\n\r\n/**\r\n * 生成随机种子\r\n */\r\nexport function generateSeed(): number {\r\n return Math.floor(Math.random() * 1000000);\r\n}\r\n\r\n/**\r\n * 设置随机种子\r\n */\r\nexport function setSeed(seed: number): void {\r\n // 简单的伪随机数生成器\r\n let currentSeed = seed;\r\n Math.random = () => {\r\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\r\n return currentSeed / 233280;\r\n };\r\n}\r\n","/**\r\n * AI Mock Generator - Mock 服务器\r\n */\r\n\r\nimport type { ViteDevServer } from 'vite';\r\nimport type {\r\n EndpointConfig,\r\n HttpMethod,\r\n MockGeneratorOptions,\r\n} from './types';\r\nimport { MockStorage } from './storage';\r\nimport {\r\n delay,\r\n matchPathParams,\r\n parseQueryParams,\r\n applyFilters,\r\n applySorting,\r\n applyPagination,\r\n formatResponse,\r\n} from './utils';\r\n\r\nexport class MockServer {\r\n private storage: MockStorage;\r\n private endpoints: EndpointConfig[];\r\n private options: MockGeneratorOptions;\r\n\r\n constructor(storage: MockStorage, options: MockGeneratorOptions) {\r\n this.storage = storage;\r\n this.endpoints = options.endpoints || [];\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 配置服务器中间件\r\n */\r\n configureServer(server: ViteDevServer): void {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '';\r\n const method = req.method as HttpMethod;\r\n\r\n // 检查是否匹配 Mock 端点\r\n const endpoint = this.matchEndpoint(url, method);\r\n\r\n if (!endpoint) {\r\n return next();\r\n }\r\n\r\n try {\r\n // 解析请求参数\r\n const params = this.parseRequest(req, url);\r\n\r\n // 获取 Mock 数据\r\n const data = await this.getMockData(endpoint, params);\r\n\r\n // 模拟延迟\r\n if (this.options.server?.delay) {\r\n await delay(this.options.server.delay);\r\n }\r\n\r\n // 设置响应头\r\n res.setHeader('Content-Type', 'application/json');\r\n if (this.options.server?.cors) {\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', '*');\r\n res.setHeader('Access-Control-Allow-Headers', '*');\r\n }\r\n\r\n // 返回响应\r\n res.statusCode = 200;\r\n res.end(JSON.stringify(data));\r\n\r\n // 日志\r\n if (this.options.output?.logs) {\r\n console.log(`[Mock] ${method} ${url} → ${data ? 'OK' : 'Empty'}`);\r\n }\r\n } catch (error: any) {\r\n console.error(`[Mock] Error handling ${method} ${url}:`, error);\r\n res.statusCode = 500;\r\n res.end(\r\n JSON.stringify({\r\n code: 500,\r\n message: error.message,\r\n })\r\n );\r\n }\r\n });\r\n\r\n console.log('\\n🎭 Mock 服务器已启动');\r\n console.log(`📍 已注册 ${this.endpoints.length} 个端点\\n`);\r\n }\r\n\r\n /**\r\n * 匹配端点\r\n */\r\n private matchEndpoint(\r\n url: string,\r\n method: HttpMethod\r\n ): EndpointConfig | null {\r\n // 移除查询参数\r\n const path = url.split('?')[0];\r\n\r\n // 移除前缀\r\n const prefix = this.options.server?.prefix || '';\r\n const cleanPath = prefix ? path.replace(new RegExp(`^${prefix}`), '') : path;\r\n\r\n for (const endpoint of this.endpoints) {\r\n // 检查是否禁用\r\n if (endpoint.enabled === false) continue;\r\n\r\n // 检查方法\r\n if (endpoint.method !== method) continue;\r\n\r\n // 精确匹配\r\n if (endpoint.path === cleanPath) {\r\n return endpoint;\r\n }\r\n\r\n // 路径参数匹配\r\n if (matchPathParams(endpoint.path, cleanPath)) {\r\n return endpoint;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 解析请求\r\n */\r\n private parseRequest(req: any, url: string): any {\r\n const query = parseQueryParams(url);\r\n const path = url.split('?')[0];\r\n\r\n // 查找匹配的端点以提取路径参数\r\n const endpoint = this.matchEndpoint(path, req.method);\r\n const pathParams = endpoint\r\n ? matchPathParams(endpoint.path, path.split('?')[0])\r\n : null;\r\n\r\n return {\r\n query,\r\n params: pathParams || {},\r\n body: req.body,\r\n headers: req.headers,\r\n };\r\n }\r\n\r\n /**\r\n * 获取 Mock 数据\r\n */\r\n private async getMockData(\r\n endpoint: EndpointConfig,\r\n params: any\r\n ): Promise<any> {\r\n // 从存储获取数据\r\n let data = this.storage.get(endpoint.path, endpoint.method);\r\n\r\n if (!data) {\r\n console.warn(\r\n `[Mock] No data found for ${endpoint.method} ${endpoint.path}`\r\n );\r\n return formatResponse([], false, 'No mock data available');\r\n }\r\n\r\n // 如果是数组,应用过滤、排序、分页\r\n if (Array.isArray(data)) {\r\n // 过滤\r\n if (params.query.filter) {\r\n data = applyFilters(data, JSON.parse(params.query.filter));\r\n }\r\n\r\n // 排序\r\n if (params.query.sort) {\r\n data = applySorting(data, params.query.sort);\r\n }\r\n\r\n // 分页\r\n if (params.query.page || params.query.pageSize) {\r\n const page = parseInt(params.query.page) || 1;\r\n const pageSize = parseInt(params.query.pageSize) || 20;\r\n const result = applyPagination(data, page, pageSize);\r\n\r\n return formatResponse({\r\n list: result.data,\r\n pagination: result.pagination,\r\n });\r\n }\r\n }\r\n\r\n // 应用自定义处理\r\n if (endpoint.custom) {\r\n data = await endpoint.custom(data, params);\r\n }\r\n\r\n // 格式化响应\r\n return formatResponse(data);\r\n }\r\n\r\n /**\r\n * 添加端点\r\n */\r\n addEndpoint(endpoint: EndpointConfig): void {\r\n this.endpoints.push(endpoint);\r\n }\r\n\r\n /**\r\n * 移除端点\r\n */\r\n removeEndpoint(path: string, method: HttpMethod): void {\r\n this.endpoints = this.endpoints.filter(\r\n (e) => !(e.path === path && e.method === method)\r\n );\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getEndpoints(): EndpointConfig[] {\r\n return this.endpoints;\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - Vite 插件入口\r\n */\r\n\r\nimport type { Plugin } from 'vite';\r\nimport type { MockGeneratorOptions, TypeDefinition } from './types';\r\nimport { MockStorage } from './storage';\r\nimport { MockDataGenerator } from './generator';\r\nimport { MockServer } from './server';\r\n\r\nexport function vitePluginAIMockGenerator(\r\n options: MockGeneratorOptions = {}\r\n): Plugin {\r\n const {\r\n apiKey = process.env.OPENAI_API_KEY || '',\r\n apiUrl = process.env.OPENAI_API_URL || 'https://api.openai.com/v1',\r\n model = process.env.OPENAI_MODEL || 'gpt-4',\r\n enabled = true,\r\n autoGenerate = false,\r\n generation = {\r\n locale: 'zh-CN',\r\n count: 20,\r\n quality: 'balanced',\r\n },\r\n storage: storageOptions = {\r\n dir: 'mock-data',\r\n persist: true,\r\n cache: true,\r\n },\r\n output = {\r\n console: true,\r\n logs: false,\r\n },\r\n } = options;\r\n\r\n // 如果未启用,返回空插件\r\n if (!enabled) {\r\n return {\r\n name: 'vite-plugin-ai-mock-generator',\r\n };\r\n }\r\n\r\n // 初始化组件\r\n const storage = new MockStorage(storageOptions);\r\n const generator = new MockDataGenerator({ apiKey, apiUrl, model });\r\n const server = new MockServer(storage, options);\r\n\r\n return {\r\n name: 'vite-plugin-ai-mock-generator',\r\n enforce: 'pre',\r\n\r\n configResolved(config) {\r\n if (output.console) {\r\n console.log('\\n🤖 AI Mock Generator 已启动');\r\n console.log(`📂 存储目录: ${storageOptions.dir}`);\r\n console.log(`🌍 数据语言: ${generation.locale}`);\r\n console.log(`📊 默认数量: ${generation.count}`);\r\n console.log(`🔑 API Key: ${apiKey ? '已配置' : '未配置'}`);\r\n console.log(\r\n `📍 端点数量: ${options.endpoints?.length || 0}`\r\n );\r\n }\r\n },\r\n\r\n async buildStart() {\r\n // 如果启用自动生成\r\n if (autoGenerate && options.endpoints) {\r\n if (output.console) {\r\n console.log('\\n🔄 开始自动生成 Mock 数据...\\n');\r\n }\r\n\r\n for (const endpoint of options.endpoints) {\r\n // 检查是否已有数据\r\n const existingData = storage.get(endpoint.path, endpoint.method);\r\n if (existingData) {\r\n if (output.console) {\r\n console.log(\r\n `⏭️ 跳过 ${endpoint.method} ${endpoint.path} (已有数据)`\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n try {\r\n if (output.console) {\r\n console.log(`🎲 生成 ${endpoint.method} ${endpoint.path}...`);\r\n }\r\n\r\n // 解析类型定义\r\n const typeDefinition = parseTypeDefinition(endpoint.response);\r\n\r\n // 生成数据\r\n const count = endpoint.count || generation.count || 20;\r\n let data;\r\n \r\n // 根据质量设置选择生成方式\r\n if (generation.quality === 'fast') {\r\n // 使用基础生成器(不需要 AI)\r\n data = generator.generateBasic(typeDefinition, count);\r\n } else {\r\n // 使用 AI 生成\r\n data = await generator.generate({\r\n type: typeDefinition,\r\n count,\r\n locale: generation.locale || 'zh-CN',\r\n quality: generation.quality || 'balanced',\r\n });\r\n }\r\n\r\n // 存储数据\r\n storage.set(endpoint.path, endpoint.method, data, {\r\n type: endpoint.response as string,\r\n });\r\n\r\n if (output.console) {\r\n console.log(\r\n `✅ 已生成 ${count} 条数据: ${endpoint.method} ${endpoint.path}`\r\n );\r\n }\r\n } catch (error: any) {\r\n console.error(\r\n `❌ 生成失败 ${endpoint.method} ${endpoint.path}:`,\r\n error.message\r\n );\r\n }\r\n }\r\n\r\n if (output.console) {\r\n console.log('\\n✨ Mock 数据生成完成\\n');\r\n }\r\n }\r\n },\r\n\r\n configureServer(viteServer) {\r\n // 配置 Mock 服务器中间件\r\n server.configureServer(viteServer);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 解析类型定义\r\n * 简化版本,实际应该使用 TypeScript Compiler API\r\n */\r\nfunction parseTypeDefinition(typeStr: string | TypeDefinition): TypeDefinition {\r\n if (typeof typeStr === 'object') {\r\n return typeStr;\r\n }\r\n\r\n // 简单解析(实际应该更复杂)\r\n const isArray = typeStr.endsWith('[]');\r\n const typeName = isArray ? typeStr.slice(0, -2) : typeStr;\r\n\r\n // 返回基础类型定义\r\n return {\r\n name: typeName,\r\n properties: [],\r\n isArray,\r\n };\r\n}\r\n\r\n// 导出类型\r\nexport type { MockGeneratorOptions, EndpointConfig } from './types';\r\nexport { MockStorage } from './storage';\r\nexport { MockDataGenerator } from './generator';\r\nexport { MockServer } from './server';\r\n"]}
1
+ {"version":3,"sources":["../src/storage.ts","../src/generator.ts","../src/utils.ts","../src/server.ts","../src/index.ts"],"names":["fs","path"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * AI Mock Generator - 数据存储\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { MockDataStore, HttpMethod } from './types';\r\n\r\nexport class MockStorage {\r\n private storageDir: string;\r\n private cache: Map<string, MockDataStore>;\r\n private persist: boolean;\r\n\r\n constructor(options: { dir?: string; persist?: boolean } = {}) {\r\n this.storageDir = options.dir || 'mock-data';\r\n this.persist = options.persist !== false;\r\n this.cache = new Map();\r\n\r\n // 确保存储目录存在\r\n if (this.persist && !fs.existsSync(this.storageDir)) {\r\n fs.mkdirSync(this.storageDir, { recursive: true });\r\n }\r\n\r\n // 加载已有数据\r\n this.load();\r\n }\r\n\r\n /**\r\n * 生成存储 key\r\n */\r\n private getKey(endpoint: string, method: HttpMethod): string {\r\n return `${method}:${endpoint}`;\r\n }\r\n\r\n /**\r\n * 生成文件名\r\n */\r\n private getFileName(endpoint: string, method: HttpMethod): string {\r\n const sanitized = endpoint\r\n .replace(/^\\//, '')\r\n .replace(/\\//g, '_')\r\n .replace(/:/g, '_');\r\n return `${method}_${sanitized}.json`;\r\n }\r\n\r\n /**\r\n * 获取数据\r\n */\r\n get(endpoint: string, method: HttpMethod = 'GET'): any {\r\n const key = this.getKey(endpoint, method);\r\n const store = this.cache.get(key);\r\n return store?.data;\r\n }\r\n\r\n /**\r\n * 设置数据\r\n */\r\n set(\r\n endpoint: string,\r\n method: HttpMethod,\r\n data: any,\r\n metadata?: Partial<MockDataStore['metadata']>\r\n ): void {\r\n const key = this.getKey(endpoint, method);\r\n\r\n const store: MockDataStore = {\r\n endpoint,\r\n method,\r\n data,\r\n metadata: {\r\n count: Array.isArray(data) ? data.length : 1,\r\n generatedAt: new Date().toISOString(),\r\n version: '1.0.0',\r\n type: typeof data,\r\n ...metadata,\r\n },\r\n };\r\n\r\n this.cache.set(key, store);\r\n\r\n // 持久化\r\n if (this.persist) {\r\n this.save(endpoint, method, store);\r\n }\r\n }\r\n\r\n /**\r\n * 删除数据\r\n */\r\n delete(endpoint: string, method: HttpMethod = 'GET'): void {\r\n const key = this.getKey(endpoint, method);\r\n this.cache.delete(key);\r\n\r\n // 删除文件\r\n if (this.persist) {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n\r\n // 清空目录\r\n if (this.persist && fs.existsSync(this.storageDir)) {\r\n const files = fs.readdirSync(this.storageDir);\r\n for (const file of files) {\r\n fs.unlinkSync(path.join(this.storageDir, file));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getAll(): MockDataStore[] {\r\n return Array.from(this.cache.values());\r\n }\r\n\r\n /**\r\n * 保存到文件\r\n */\r\n private save(\r\n endpoint: string,\r\n method: HttpMethod,\r\n store: MockDataStore\r\n ): void {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n\r\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 从文件加载\r\n */\r\n private load(): void {\r\n if (!this.persist || !fs.existsSync(this.storageDir)) {\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.storageDir);\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n\r\n try {\r\n const filePath = path.join(this.storageDir, file);\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const store: MockDataStore = JSON.parse(content);\r\n\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n } catch (error) {\r\n console.warn(`Failed to load mock data from ${file}:`, error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出所有数据\r\n */\r\n export(outputPath: string): void {\r\n const allData = this.getAll();\r\n fs.writeFileSync(outputPath, JSON.stringify(allData, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 导入数据\r\n */\r\n import(inputPath: string): void {\r\n const content = fs.readFileSync(inputPath, 'utf-8');\r\n const allData: MockDataStore[] = JSON.parse(content);\r\n\r\n for (const store of allData) {\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n\r\n if (this.persist) {\r\n this.save(store.endpoint, store.method, store);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 数据生成器\r\n */\r\n\r\nimport type {\r\n TypeDefinition,\r\n GenerationContext,\r\n PropertyDefinition,\r\n} from './types';\r\n\r\nexport class MockDataGenerator {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private model: string;\r\n\r\n constructor(options: { apiKey: string; apiUrl: string; model: string }) {\r\n this.apiKey = options.apiKey;\r\n this.apiUrl = options.apiUrl;\r\n this.model = options.model;\r\n }\r\n\r\n /**\r\n * 生成 Mock 数据\r\n */\r\n async generate(context: GenerationContext): Promise<any> {\r\n const { type, count, locale, quality } = context;\r\n\r\n // 构建 AI Prompt\r\n const prompt = this.buildPrompt(type, count, locale, quality);\r\n\r\n // 调用 AI API\r\n const response = await this.callAI(prompt);\r\n\r\n // 解析响应\r\n return this.parseResponse(response, type.isArray);\r\n }\r\n\r\n /**\r\n * 构建 AI Prompt\r\n */\r\n private buildPrompt(\r\n type: TypeDefinition,\r\n count: number,\r\n locale: string,\r\n quality: string\r\n ): string {\r\n const properties = type.properties\r\n .map((p) => this.formatProperty(p))\r\n .join('\\n');\r\n\r\n return `\r\n你是一个专业的 Mock 数据生成器。请根据以下类型定义生成真实、合理的测试数据。\r\n\r\n类型名称: ${type.name}\r\n数据语言: ${locale === 'zh-CN' ? '中文' : '英文'}\r\n数据数量: ${count}\r\n质量要求: ${quality === 'high' ? '高质量(真实业务数据)' : quality === 'fast' ? '快速生成' : '平衡质量和速度'}\r\n\r\n类型定义:\r\n${properties}\r\n\r\n要求:\r\n1. 生成 ${count} 条数据\r\n2. 数据要符合业务逻辑和真实场景\r\n3. 字段值要合理(如价格不能为负数,年龄在合理范围)\r\n4. 日期格式使用 ISO 8601\r\n5. 返回 JSON 数组格式,不要包含任何其他文字\r\n6. 理解字段语义,生成真实数据(如 userName 生成真实姓名)\r\n\r\n示例格式:\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"张三\",\r\n ...\r\n }\r\n]\r\n\r\n请生成数据:\r\n`.trim();\r\n }\r\n\r\n /**\r\n * 格式化属性\r\n */\r\n private formatProperty(prop: PropertyDefinition): string {\r\n let line = `- ${prop.name}: ${prop.type}`;\r\n\r\n if (prop.comment) {\r\n line += ` // ${prop.comment}`;\r\n }\r\n\r\n if (prop.constraints) {\r\n const constraints = [];\r\n if (prop.constraints.min !== undefined) {\r\n constraints.push(`min: ${prop.constraints.min}`);\r\n }\r\n if (prop.constraints.max !== undefined) {\r\n constraints.push(`max: ${prop.constraints.max}`);\r\n }\r\n if (prop.constraints.unique) {\r\n constraints.push('unique');\r\n }\r\n if (prop.constraints.enum) {\r\n constraints.push(`enum: [${prop.constraints.enum.join(', ')}]`);\r\n }\r\n if (constraints.length > 0) {\r\n line += ` (${constraints.join(', ')})`;\r\n }\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * 调用 AI API\r\n */\r\n private async callAI(prompt: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${this.apiUrl}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n temperature: 0.7,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`AI API error: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data.choices[0].message.content;\r\n } catch (error: any) {\r\n console.error('Failed to call AI API:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 解析 AI 响应\r\n */\r\n private parseResponse(response: string, isArray: boolean = true): any {\r\n try {\r\n // 移除 markdown 代码块标记\r\n let cleanedResponse = response.trim();\r\n \r\n // 移除开头的 ```json 或 ```\r\n cleanedResponse = cleanedResponse.replace(/^```json\\s*/i, '');\r\n cleanedResponse = cleanedResponse.replace(/^```\\s*/, '');\r\n \r\n // 移除结尾的 ```\r\n cleanedResponse = cleanedResponse.replace(/\\s*```$/, '');\r\n \r\n // 提取 JSON 部分(查找数组或对象)\r\n const jsonMatch = cleanedResponse.match(/(\\[[\\s\\S]*\\]|\\{[\\s\\S]*\\})/);\r\n if (!jsonMatch) {\r\n throw new Error('No JSON array or object found in response');\r\n }\r\n\r\n const data = JSON.parse(jsonMatch[0]);\r\n\r\n return isArray ? data : data[0];\r\n } catch (error: any) {\r\n console.error('Failed to parse AI response:', error);\r\n console.error('Response:', response);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 生成基础数据(不使用 AI)\r\n */\r\n generateBasic(type: TypeDefinition, count: number): any[] {\r\n const data = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const item: any = {};\r\n\r\n for (const prop of type.properties) {\r\n item[prop.name] = this.generateBasicValue(prop, i);\r\n }\r\n\r\n data.push(item);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 生成基础值\r\n */\r\n private generateBasicValue(prop: PropertyDefinition, index: number): any {\r\n const { type, constraints } = prop;\r\n\r\n // 处理枚举\r\n if (constraints?.enum) {\r\n return constraints.enum[index % constraints.enum.length];\r\n }\r\n\r\n // 根据类型生成\r\n switch (type) {\r\n case 'number':\r\n const min = constraints?.min ?? 0;\r\n const max = constraints?.max ?? 100;\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n\r\n case 'string':\r\n return `${prop.name}_${index + 1}`;\r\n\r\n case 'boolean':\r\n return Math.random() > 0.5;\r\n\r\n case 'Date':\r\n return new Date().toISOString();\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 工具函数\r\n */\r\n\r\nimport type { HttpMethod, RequestParams } from './types';\r\n\r\n/**\r\n * 延迟函数\r\n */\r\nexport function delay(ms: number | [number, number]): Promise<void> {\r\n const delayTime = Array.isArray(ms)\r\n ? Math.random() * (ms[1] - ms[0]) + ms[0]\r\n : ms;\r\n\r\n return new Promise((resolve) => setTimeout(resolve, delayTime));\r\n}\r\n\r\n/**\r\n * 匹配路径参数\r\n * @example\r\n * matchPathParams('/api/users/:id', '/api/users/123') // { id: '123' }\r\n */\r\nexport function matchPathParams(\r\n pattern: string,\r\n path: string\r\n): Record<string, string> | null {\r\n const patternParts = pattern.split('/');\r\n const pathParts = path.split('/');\r\n\r\n if (patternParts.length !== pathParts.length) {\r\n return null;\r\n }\r\n\r\n const params: Record<string, string> = {};\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n const pathPart = pathParts[i];\r\n\r\n if (patternPart.startsWith(':')) {\r\n // 路径参数\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = pathPart;\r\n } else if (patternPart !== pathPart) {\r\n // 不匹配\r\n return null;\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 解析查询参数\r\n */\r\nexport function parseQueryParams(url: string): Record<string, any> {\r\n const queryString = url.split('?')[1];\r\n if (!queryString) return {};\r\n\r\n const params: Record<string, any> = {};\r\n const pairs = queryString.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=');\r\n params[decodeURIComponent(key)] = decodeURIComponent(value || '');\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 生成唯一 ID\r\n */\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * 深度克隆\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * 应用过滤\r\n */\r\nexport function applyFilters(data: any[], filters: Record<string, any>): any[] {\r\n if (!filters || Object.keys(filters).length === 0) {\r\n return data;\r\n }\r\n\r\n return data.filter((item) => {\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (item[key] !== value) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * 应用排序\r\n */\r\nexport function applySorting(\r\n data: any[],\r\n sort?: string | { field: string; order: 'asc' | 'desc' }\r\n): any[] {\r\n if (!sort) return data;\r\n\r\n const sortConfig =\r\n typeof sort === 'string'\r\n ? { field: sort, order: 'asc' as const }\r\n : sort;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = a[sortConfig.field];\r\n const bValue = b[sortConfig.field];\r\n\r\n if (aValue < bValue) return sortConfig.order === 'asc' ? -1 : 1;\r\n if (aValue > bValue) return sortConfig.order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/**\r\n * 应用分页\r\n */\r\nexport function applyPagination(\r\n data: any[],\r\n page: number = 1,\r\n pageSize: number = 20\r\n): {\r\n data: any[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n total: number;\r\n totalPages: number;\r\n };\r\n} {\r\n const total = data.length;\r\n const totalPages = Math.ceil(total / pageSize);\r\n const start = (page - 1) * pageSize;\r\n const end = start + pageSize;\r\n\r\n return {\r\n data: data.slice(start, end),\r\n pagination: {\r\n page,\r\n pageSize,\r\n total,\r\n totalPages,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 格式化响应\r\n */\r\nexport function formatResponse(\r\n data: any,\r\n success: boolean = true,\r\n message?: string\r\n) {\r\n return {\r\n code: success ? 200 : 500,\r\n data,\r\n message: message || (success ? 'Success' : 'Error'),\r\n };\r\n}\r\n\r\n/**\r\n * 生成随机种子\r\n */\r\nexport function generateSeed(): number {\r\n return Math.floor(Math.random() * 1000000);\r\n}\r\n\r\n/**\r\n * 设置随机种子\r\n */\r\nexport function setSeed(seed: number): void {\r\n // 简单的伪随机数生成器\r\n let currentSeed = seed;\r\n Math.random = () => {\r\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\r\n return currentSeed / 233280;\r\n };\r\n}\r\n","/**\r\n * AI Mock Generator - Mock 服务器\r\n */\r\n\r\nimport type { ViteDevServer } from 'vite';\r\nimport type {\r\n EndpointConfig,\r\n HttpMethod,\r\n MockGeneratorOptions,\r\n} from './types';\r\nimport { MockStorage } from './storage';\r\nimport {\r\n delay,\r\n matchPathParams,\r\n parseQueryParams,\r\n applyFilters,\r\n applySorting,\r\n applyPagination,\r\n formatResponse,\r\n} from './utils';\r\n\r\nexport class MockServer {\r\n private storage: MockStorage;\r\n private endpoints: EndpointConfig[];\r\n private options: MockGeneratorOptions;\r\n\r\n constructor(storage: MockStorage, options: MockGeneratorOptions) {\r\n this.storage = storage;\r\n this.endpoints = options.endpoints || [];\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 配置服务器中间件\r\n */\r\n configureServer(server: ViteDevServer): void {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '';\r\n const method = req.method as HttpMethod;\r\n\r\n // 检查是否匹配 Mock 端点\r\n const endpoint = this.matchEndpoint(url, method);\r\n\r\n if (!endpoint) {\r\n return next();\r\n }\r\n\r\n try {\r\n // 解析请求参数\r\n const params = this.parseRequest(req, url);\r\n\r\n // 获取 Mock 数据\r\n const data = await this.getMockData(endpoint, params);\r\n\r\n // 模拟延迟\r\n if (this.options.server?.delay) {\r\n await delay(this.options.server.delay);\r\n }\r\n\r\n // 设置响应头\r\n res.setHeader('Content-Type', 'application/json');\r\n if (this.options.server?.cors) {\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', '*');\r\n res.setHeader('Access-Control-Allow-Headers', '*');\r\n }\r\n\r\n // 返回响应\r\n res.statusCode = 200;\r\n res.end(JSON.stringify(data));\r\n\r\n // 日志\r\n if (this.options.output?.logs) {\r\n console.log(`[Mock] ${method} ${url} → ${data ? 'OK' : 'Empty'}`);\r\n }\r\n } catch (error: any) {\r\n console.error(`[Mock] Error handling ${method} ${url}:`, error);\r\n res.statusCode = 500;\r\n res.end(\r\n JSON.stringify({\r\n code: 500,\r\n message: error.message,\r\n })\r\n );\r\n }\r\n });\r\n\r\n console.log('\\n🎭 Mock 服务器已启动');\r\n console.log(`📍 已注册 ${this.endpoints.length} 个端点\\n`);\r\n }\r\n\r\n /**\r\n * 匹配端点\r\n */\r\n private matchEndpoint(\r\n url: string,\r\n method: HttpMethod\r\n ): EndpointConfig | null {\r\n // 移除查询参数\r\n const path = url.split('?')[0];\r\n\r\n // 移除前缀\r\n const prefix = this.options.server?.prefix || '';\r\n const cleanPath = prefix ? path.replace(new RegExp(`^${prefix}`), '') : path;\r\n\r\n for (const endpoint of this.endpoints) {\r\n // 检查是否禁用\r\n if (endpoint.enabled === false) continue;\r\n\r\n // 检查方法\r\n if (endpoint.method !== method) continue;\r\n\r\n // 精确匹配\r\n if (endpoint.path === cleanPath) {\r\n return endpoint;\r\n }\r\n\r\n // 路径参数匹配\r\n if (matchPathParams(endpoint.path, cleanPath)) {\r\n return endpoint;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 解析请求\r\n */\r\n private parseRequest(req: any, url: string): any {\r\n const query = parseQueryParams(url);\r\n const path = url.split('?')[0];\r\n\r\n // 查找匹配的端点以提取路径参数\r\n const endpoint = this.matchEndpoint(path, req.method);\r\n const pathParams = endpoint\r\n ? matchPathParams(endpoint.path, path.split('?')[0])\r\n : null;\r\n\r\n return {\r\n query,\r\n params: pathParams || {},\r\n body: req.body,\r\n headers: req.headers,\r\n };\r\n }\r\n\r\n /**\r\n * 获取 Mock 数据\r\n */\r\n private async getMockData(\r\n endpoint: EndpointConfig,\r\n params: any\r\n ): Promise<any> {\r\n // 从存储获取数据\r\n let data = this.storage.get(endpoint.path, endpoint.method);\r\n\r\n if (!data) {\r\n console.warn(\r\n `[Mock] No data found for ${endpoint.method} ${endpoint.path}`\r\n );\r\n return formatResponse([], false, 'No mock data available');\r\n }\r\n\r\n // 如果是数组,应用过滤、排序、分页\r\n if (Array.isArray(data)) {\r\n // 过滤\r\n if (params.query.filter) {\r\n data = applyFilters(data, JSON.parse(params.query.filter));\r\n }\r\n\r\n // 排序\r\n if (params.query.sort) {\r\n data = applySorting(data, params.query.sort);\r\n }\r\n\r\n // 分页\r\n if (params.query.page || params.query.pageSize) {\r\n const page = parseInt(params.query.page) || 1;\r\n const pageSize = parseInt(params.query.pageSize) || 20;\r\n const result = applyPagination(data, page, pageSize);\r\n\r\n return formatResponse({\r\n list: result.data,\r\n pagination: result.pagination,\r\n });\r\n }\r\n }\r\n\r\n // 应用自定义处理\r\n if (endpoint.custom) {\r\n data = await endpoint.custom(data, params);\r\n }\r\n\r\n // 格式化响应\r\n return formatResponse(data);\r\n }\r\n\r\n /**\r\n * 添加端点\r\n */\r\n addEndpoint(endpoint: EndpointConfig): void {\r\n this.endpoints.push(endpoint);\r\n }\r\n\r\n /**\r\n * 移除端点\r\n */\r\n removeEndpoint(path: string, method: HttpMethod): void {\r\n this.endpoints = this.endpoints.filter(\r\n (e) => !(e.path === path && e.method === method)\r\n );\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getEndpoints(): EndpointConfig[] {\r\n return this.endpoints;\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - Vite 插件入口\r\n */\r\n\r\nimport type { Plugin } from \"vite\";\r\nimport type { MockGeneratorOptions, TypeDefinition } from \"./types\";\r\nimport { MockStorage } from \"./storage\";\r\nimport { MockDataGenerator } from \"./generator\";\r\nimport { MockServer } from \"./server\";\r\n\r\nexport function vitePluginAIMockGenerator(\r\n options: MockGeneratorOptions = {},\r\n): Plugin {\r\n const {\r\n apiKey = process.env.OPENAI_API_KEY || \"\",\r\n apiUrl = process.env.OPENAI_API_URL || \"https://api.openai.com/v1\",\r\n model = process.env.OPENAI_MODEL || \"gpt-4\",\r\n enabled = true,\r\n autoGenerate = false,\r\n generation = {\r\n locale: \"zh-CN\",\r\n count: 20,\r\n quality: \"balanced\",\r\n },\r\n storage: storageOptions = {\r\n dir: \"mock-data\",\r\n persist: true,\r\n cache: true,\r\n },\r\n output = {\r\n console: true,\r\n logs: false,\r\n },\r\n } = options;\r\n\r\n // 如果未启用,返回空插件\r\n if (!enabled) {\r\n return {\r\n name: \"vite-plugin-ai-mock-generator\",\r\n };\r\n }\r\n\r\n // 初始化组件\r\n const storage = new MockStorage(storageOptions);\r\n const generator = new MockDataGenerator({ apiKey, apiUrl, model });\r\n const server = new MockServer(storage, options);\r\n\r\n return {\r\n name: \"vite-plugin-ai-mock-generator\",\r\n enforce: \"pre\",\r\n\r\n configResolved(config) {\r\n if (output.console) {\r\n console.log(\"\\n🤖 AI Mock Generator 已启动\");\r\n console.log(`📂 存储目录: ${storageOptions.dir}`);\r\n console.log(`🌍 数据语言: ${generation.locale}`);\r\n console.log(`📊 默认数量: ${generation.count}`);\r\n console.log(`🔑 API Key: ${apiKey ? \"已配置\" : \"未配置\"}`);\r\n console.log(`📍 端点数量: ${options.endpoints?.length || 0}`);\r\n }\r\n },\r\n\r\n async buildStart() {\r\n // 如果启用自动生成\r\n if (autoGenerate && options.endpoints) {\r\n if (output.console) {\r\n console.log(\"\\n🔄 开始自动生成 Mock 数据...\\n\");\r\n }\r\n\r\n for (const endpoint of options.endpoints) {\r\n // 检查是否已有数据\r\n const existingData = storage.get(endpoint.path, endpoint.method);\r\n if (existingData) {\r\n if (output.console) {\r\n console.log(\r\n `⏭️ 跳过 ${endpoint.method} ${endpoint.path} (已有数据)`,\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n try {\r\n if (output.console) {\r\n console.log(`🎲 生成 ${endpoint.method} ${endpoint.path}...`);\r\n }\r\n\r\n // 解析类型定义\r\n const typeDefinition = parseTypeDefinition(endpoint.response);\r\n\r\n // 生成数据\r\n const count = endpoint.count || generation.count || 20;\r\n let data;\r\n\r\n // 根据质量设置选择生成方式\r\n if (generation.quality === \"fast\") {\r\n // 使用基础生成器(不需要 AI)\r\n data = generator.generateBasic(typeDefinition, count);\r\n } else {\r\n // 使用 AI 生成\r\n data = await generator.generate({\r\n type: typeDefinition,\r\n count,\r\n locale: generation.locale || \"zh-CN\",\r\n quality: generation.quality || \"balanced\",\r\n });\r\n }\r\n\r\n // 存储数据\r\n storage.set(endpoint.path, endpoint.method, data, {\r\n type: endpoint.response as string,\r\n });\r\n\r\n if (output.console) {\r\n console.log(\r\n `✅ 已生成 ${count} 条数据: ${endpoint.method} ${endpoint.path}`,\r\n );\r\n }\r\n } catch (error: any) {\r\n console.error(\r\n `❌ 生成失败 ${endpoint.method} ${endpoint.path}:`,\r\n error.message,\r\n );\r\n }\r\n }\r\n\r\n if (output.console) {\r\n console.log(\"\\n✨ Mock 数据生成完成\\n\");\r\n }\r\n }\r\n },\r\n\r\n configureServer(viteServer) {\r\n // 配置 Mock 服务器中间件\r\n server.configureServer(viteServer);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 解析类型定义\r\n * 简化版本,实际应该使用 TypeScript Compiler API\r\n */\r\nfunction parseTypeDefinition(typeStr: string | TypeDefinition): TypeDefinition {\r\n if (typeof typeStr === \"object\") {\r\n return typeStr;\r\n }\r\n\r\n // 简单解析(实际应该更复杂)\r\n const isArray = typeStr.endsWith(\"[]\");\r\n const typeName = isArray ? typeStr.slice(0, -2) : typeStr;\r\n\r\n // 返回基础类型定义\r\n return {\r\n name: typeName,\r\n properties: [],\r\n isArray,\r\n };\r\n}\r\n\r\n// 导出类型\r\nexport type { MockGeneratorOptions, EndpointConfig } from \"./types\";\r\nexport { MockStorage } from \"./storage\";\r\nexport { MockDataGenerator } from \"./generator\";\r\nexport { MockServer } from \"./server\";\r\n\r\n// 默认导出\r\nexport default vitePluginAIMockGenerator;\r\n"]}
package/dist/index.mjs CHANGED
@@ -573,9 +573,7 @@ function vitePluginAIMockGenerator(options = {}) {
573
573
  console.log(`\u{1F30D} \u6570\u636E\u8BED\u8A00: ${generation.locale}`);
574
574
  console.log(`\u{1F4CA} \u9ED8\u8BA4\u6570\u91CF: ${generation.count}`);
575
575
  console.log(`\u{1F511} API Key: ${apiKey ? "\u5DF2\u914D\u7F6E" : "\u672A\u914D\u7F6E"}`);
576
- console.log(
577
- `\u{1F4CD} \u7AEF\u70B9\u6570\u91CF: ${options.endpoints?.length || 0}`
578
- );
576
+ console.log(`\u{1F4CD} \u7AEF\u70B9\u6570\u91CF: ${options.endpoints?.length || 0}`);
579
577
  }
580
578
  },
581
579
  async buildStart() {
@@ -647,7 +645,8 @@ function parseTypeDefinition(typeStr) {
647
645
  isArray
648
646
  };
649
647
  }
648
+ var index_default = vitePluginAIMockGenerator;
650
649
 
651
- export { MockDataGenerator, MockServer, MockStorage, vitePluginAIMockGenerator };
650
+ export { MockDataGenerator, MockServer, MockStorage, index_default as default, vitePluginAIMockGenerator };
652
651
  //# sourceMappingURL=index.mjs.map
653
652
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage.ts","../src/generator.ts","../src/utils.ts","../src/server.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * AI Mock Generator - 数据存储\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { MockDataStore, HttpMethod } from './types';\r\n\r\nexport class MockStorage {\r\n private storageDir: string;\r\n private cache: Map<string, MockDataStore>;\r\n private persist: boolean;\r\n\r\n constructor(options: { dir?: string; persist?: boolean } = {}) {\r\n this.storageDir = options.dir || 'mock-data';\r\n this.persist = options.persist !== false;\r\n this.cache = new Map();\r\n\r\n // 确保存储目录存在\r\n if (this.persist && !fs.existsSync(this.storageDir)) {\r\n fs.mkdirSync(this.storageDir, { recursive: true });\r\n }\r\n\r\n // 加载已有数据\r\n this.load();\r\n }\r\n\r\n /**\r\n * 生成存储 key\r\n */\r\n private getKey(endpoint: string, method: HttpMethod): string {\r\n return `${method}:${endpoint}`;\r\n }\r\n\r\n /**\r\n * 生成文件名\r\n */\r\n private getFileName(endpoint: string, method: HttpMethod): string {\r\n const sanitized = endpoint\r\n .replace(/^\\//, '')\r\n .replace(/\\//g, '_')\r\n .replace(/:/g, '_');\r\n return `${method}_${sanitized}.json`;\r\n }\r\n\r\n /**\r\n * 获取数据\r\n */\r\n get(endpoint: string, method: HttpMethod = 'GET'): any {\r\n const key = this.getKey(endpoint, method);\r\n const store = this.cache.get(key);\r\n return store?.data;\r\n }\r\n\r\n /**\r\n * 设置数据\r\n */\r\n set(\r\n endpoint: string,\r\n method: HttpMethod,\r\n data: any,\r\n metadata?: Partial<MockDataStore['metadata']>\r\n ): void {\r\n const key = this.getKey(endpoint, method);\r\n\r\n const store: MockDataStore = {\r\n endpoint,\r\n method,\r\n data,\r\n metadata: {\r\n count: Array.isArray(data) ? data.length : 1,\r\n generatedAt: new Date().toISOString(),\r\n version: '1.0.0',\r\n type: typeof data,\r\n ...metadata,\r\n },\r\n };\r\n\r\n this.cache.set(key, store);\r\n\r\n // 持久化\r\n if (this.persist) {\r\n this.save(endpoint, method, store);\r\n }\r\n }\r\n\r\n /**\r\n * 删除数据\r\n */\r\n delete(endpoint: string, method: HttpMethod = 'GET'): void {\r\n const key = this.getKey(endpoint, method);\r\n this.cache.delete(key);\r\n\r\n // 删除文件\r\n if (this.persist) {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n\r\n // 清空目录\r\n if (this.persist && fs.existsSync(this.storageDir)) {\r\n const files = fs.readdirSync(this.storageDir);\r\n for (const file of files) {\r\n fs.unlinkSync(path.join(this.storageDir, file));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getAll(): MockDataStore[] {\r\n return Array.from(this.cache.values());\r\n }\r\n\r\n /**\r\n * 保存到文件\r\n */\r\n private save(\r\n endpoint: string,\r\n method: HttpMethod,\r\n store: MockDataStore\r\n ): void {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n\r\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 从文件加载\r\n */\r\n private load(): void {\r\n if (!this.persist || !fs.existsSync(this.storageDir)) {\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.storageDir);\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n\r\n try {\r\n const filePath = path.join(this.storageDir, file);\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const store: MockDataStore = JSON.parse(content);\r\n\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n } catch (error) {\r\n console.warn(`Failed to load mock data from ${file}:`, error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出所有数据\r\n */\r\n export(outputPath: string): void {\r\n const allData = this.getAll();\r\n fs.writeFileSync(outputPath, JSON.stringify(allData, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 导入数据\r\n */\r\n import(inputPath: string): void {\r\n const content = fs.readFileSync(inputPath, 'utf-8');\r\n const allData: MockDataStore[] = JSON.parse(content);\r\n\r\n for (const store of allData) {\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n\r\n if (this.persist) {\r\n this.save(store.endpoint, store.method, store);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 数据生成器\r\n */\r\n\r\nimport type {\r\n TypeDefinition,\r\n GenerationContext,\r\n PropertyDefinition,\r\n} from './types';\r\n\r\nexport class MockDataGenerator {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private model: string;\r\n\r\n constructor(options: { apiKey: string; apiUrl: string; model: string }) {\r\n this.apiKey = options.apiKey;\r\n this.apiUrl = options.apiUrl;\r\n this.model = options.model;\r\n }\r\n\r\n /**\r\n * 生成 Mock 数据\r\n */\r\n async generate(context: GenerationContext): Promise<any> {\r\n const { type, count, locale, quality } = context;\r\n\r\n // 构建 AI Prompt\r\n const prompt = this.buildPrompt(type, count, locale, quality);\r\n\r\n // 调用 AI API\r\n const response = await this.callAI(prompt);\r\n\r\n // 解析响应\r\n return this.parseResponse(response, type.isArray);\r\n }\r\n\r\n /**\r\n * 构建 AI Prompt\r\n */\r\n private buildPrompt(\r\n type: TypeDefinition,\r\n count: number,\r\n locale: string,\r\n quality: string\r\n ): string {\r\n const properties = type.properties\r\n .map((p) => this.formatProperty(p))\r\n .join('\\n');\r\n\r\n return `\r\n你是一个专业的 Mock 数据生成器。请根据以下类型定义生成真实、合理的测试数据。\r\n\r\n类型名称: ${type.name}\r\n数据语言: ${locale === 'zh-CN' ? '中文' : '英文'}\r\n数据数量: ${count}\r\n质量要求: ${quality === 'high' ? '高质量(真实业务数据)' : quality === 'fast' ? '快速生成' : '平衡质量和速度'}\r\n\r\n类型定义:\r\n${properties}\r\n\r\n要求:\r\n1. 生成 ${count} 条数据\r\n2. 数据要符合业务逻辑和真实场景\r\n3. 字段值要合理(如价格不能为负数,年龄在合理范围)\r\n4. 日期格式使用 ISO 8601\r\n5. 返回 JSON 数组格式,不要包含任何其他文字\r\n6. 理解字段语义,生成真实数据(如 userName 生成真实姓名)\r\n\r\n示例格式:\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"张三\",\r\n ...\r\n }\r\n]\r\n\r\n请生成数据:\r\n`.trim();\r\n }\r\n\r\n /**\r\n * 格式化属性\r\n */\r\n private formatProperty(prop: PropertyDefinition): string {\r\n let line = `- ${prop.name}: ${prop.type}`;\r\n\r\n if (prop.comment) {\r\n line += ` // ${prop.comment}`;\r\n }\r\n\r\n if (prop.constraints) {\r\n const constraints = [];\r\n if (prop.constraints.min !== undefined) {\r\n constraints.push(`min: ${prop.constraints.min}`);\r\n }\r\n if (prop.constraints.max !== undefined) {\r\n constraints.push(`max: ${prop.constraints.max}`);\r\n }\r\n if (prop.constraints.unique) {\r\n constraints.push('unique');\r\n }\r\n if (prop.constraints.enum) {\r\n constraints.push(`enum: [${prop.constraints.enum.join(', ')}]`);\r\n }\r\n if (constraints.length > 0) {\r\n line += ` (${constraints.join(', ')})`;\r\n }\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * 调用 AI API\r\n */\r\n private async callAI(prompt: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${this.apiUrl}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n temperature: 0.7,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`AI API error: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data.choices[0].message.content;\r\n } catch (error: any) {\r\n console.error('Failed to call AI API:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 解析 AI 响应\r\n */\r\n private parseResponse(response: string, isArray: boolean = true): any {\r\n try {\r\n // 移除 markdown 代码块标记\r\n let cleanedResponse = response.trim();\r\n \r\n // 移除开头的 ```json 或 ```\r\n cleanedResponse = cleanedResponse.replace(/^```json\\s*/i, '');\r\n cleanedResponse = cleanedResponse.replace(/^```\\s*/, '');\r\n \r\n // 移除结尾的 ```\r\n cleanedResponse = cleanedResponse.replace(/\\s*```$/, '');\r\n \r\n // 提取 JSON 部分(查找数组或对象)\r\n const jsonMatch = cleanedResponse.match(/(\\[[\\s\\S]*\\]|\\{[\\s\\S]*\\})/);\r\n if (!jsonMatch) {\r\n throw new Error('No JSON array or object found in response');\r\n }\r\n\r\n const data = JSON.parse(jsonMatch[0]);\r\n\r\n return isArray ? data : data[0];\r\n } catch (error: any) {\r\n console.error('Failed to parse AI response:', error);\r\n console.error('Response:', response);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 生成基础数据(不使用 AI)\r\n */\r\n generateBasic(type: TypeDefinition, count: number): any[] {\r\n const data = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const item: any = {};\r\n\r\n for (const prop of type.properties) {\r\n item[prop.name] = this.generateBasicValue(prop, i);\r\n }\r\n\r\n data.push(item);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 生成基础值\r\n */\r\n private generateBasicValue(prop: PropertyDefinition, index: number): any {\r\n const { type, constraints } = prop;\r\n\r\n // 处理枚举\r\n if (constraints?.enum) {\r\n return constraints.enum[index % constraints.enum.length];\r\n }\r\n\r\n // 根据类型生成\r\n switch (type) {\r\n case 'number':\r\n const min = constraints?.min ?? 0;\r\n const max = constraints?.max ?? 100;\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n\r\n case 'string':\r\n return `${prop.name}_${index + 1}`;\r\n\r\n case 'boolean':\r\n return Math.random() > 0.5;\r\n\r\n case 'Date':\r\n return new Date().toISOString();\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 工具函数\r\n */\r\n\r\nimport type { HttpMethod, RequestParams } from './types';\r\n\r\n/**\r\n * 延迟函数\r\n */\r\nexport function delay(ms: number | [number, number]): Promise<void> {\r\n const delayTime = Array.isArray(ms)\r\n ? Math.random() * (ms[1] - ms[0]) + ms[0]\r\n : ms;\r\n\r\n return new Promise((resolve) => setTimeout(resolve, delayTime));\r\n}\r\n\r\n/**\r\n * 匹配路径参数\r\n * @example\r\n * matchPathParams('/api/users/:id', '/api/users/123') // { id: '123' }\r\n */\r\nexport function matchPathParams(\r\n pattern: string,\r\n path: string\r\n): Record<string, string> | null {\r\n const patternParts = pattern.split('/');\r\n const pathParts = path.split('/');\r\n\r\n if (patternParts.length !== pathParts.length) {\r\n return null;\r\n }\r\n\r\n const params: Record<string, string> = {};\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n const pathPart = pathParts[i];\r\n\r\n if (patternPart.startsWith(':')) {\r\n // 路径参数\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = pathPart;\r\n } else if (patternPart !== pathPart) {\r\n // 不匹配\r\n return null;\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 解析查询参数\r\n */\r\nexport function parseQueryParams(url: string): Record<string, any> {\r\n const queryString = url.split('?')[1];\r\n if (!queryString) return {};\r\n\r\n const params: Record<string, any> = {};\r\n const pairs = queryString.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=');\r\n params[decodeURIComponent(key)] = decodeURIComponent(value || '');\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 生成唯一 ID\r\n */\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * 深度克隆\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * 应用过滤\r\n */\r\nexport function applyFilters(data: any[], filters: Record<string, any>): any[] {\r\n if (!filters || Object.keys(filters).length === 0) {\r\n return data;\r\n }\r\n\r\n return data.filter((item) => {\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (item[key] !== value) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * 应用排序\r\n */\r\nexport function applySorting(\r\n data: any[],\r\n sort?: string | { field: string; order: 'asc' | 'desc' }\r\n): any[] {\r\n if (!sort) return data;\r\n\r\n const sortConfig =\r\n typeof sort === 'string'\r\n ? { field: sort, order: 'asc' as const }\r\n : sort;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = a[sortConfig.field];\r\n const bValue = b[sortConfig.field];\r\n\r\n if (aValue < bValue) return sortConfig.order === 'asc' ? -1 : 1;\r\n if (aValue > bValue) return sortConfig.order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/**\r\n * 应用分页\r\n */\r\nexport function applyPagination(\r\n data: any[],\r\n page: number = 1,\r\n pageSize: number = 20\r\n): {\r\n data: any[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n total: number;\r\n totalPages: number;\r\n };\r\n} {\r\n const total = data.length;\r\n const totalPages = Math.ceil(total / pageSize);\r\n const start = (page - 1) * pageSize;\r\n const end = start + pageSize;\r\n\r\n return {\r\n data: data.slice(start, end),\r\n pagination: {\r\n page,\r\n pageSize,\r\n total,\r\n totalPages,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 格式化响应\r\n */\r\nexport function formatResponse(\r\n data: any,\r\n success: boolean = true,\r\n message?: string\r\n) {\r\n return {\r\n code: success ? 200 : 500,\r\n data,\r\n message: message || (success ? 'Success' : 'Error'),\r\n };\r\n}\r\n\r\n/**\r\n * 生成随机种子\r\n */\r\nexport function generateSeed(): number {\r\n return Math.floor(Math.random() * 1000000);\r\n}\r\n\r\n/**\r\n * 设置随机种子\r\n */\r\nexport function setSeed(seed: number): void {\r\n // 简单的伪随机数生成器\r\n let currentSeed = seed;\r\n Math.random = () => {\r\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\r\n return currentSeed / 233280;\r\n };\r\n}\r\n","/**\r\n * AI Mock Generator - Mock 服务器\r\n */\r\n\r\nimport type { ViteDevServer } from 'vite';\r\nimport type {\r\n EndpointConfig,\r\n HttpMethod,\r\n MockGeneratorOptions,\r\n} from './types';\r\nimport { MockStorage } from './storage';\r\nimport {\r\n delay,\r\n matchPathParams,\r\n parseQueryParams,\r\n applyFilters,\r\n applySorting,\r\n applyPagination,\r\n formatResponse,\r\n} from './utils';\r\n\r\nexport class MockServer {\r\n private storage: MockStorage;\r\n private endpoints: EndpointConfig[];\r\n private options: MockGeneratorOptions;\r\n\r\n constructor(storage: MockStorage, options: MockGeneratorOptions) {\r\n this.storage = storage;\r\n this.endpoints = options.endpoints || [];\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 配置服务器中间件\r\n */\r\n configureServer(server: ViteDevServer): void {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '';\r\n const method = req.method as HttpMethod;\r\n\r\n // 检查是否匹配 Mock 端点\r\n const endpoint = this.matchEndpoint(url, method);\r\n\r\n if (!endpoint) {\r\n return next();\r\n }\r\n\r\n try {\r\n // 解析请求参数\r\n const params = this.parseRequest(req, url);\r\n\r\n // 获取 Mock 数据\r\n const data = await this.getMockData(endpoint, params);\r\n\r\n // 模拟延迟\r\n if (this.options.server?.delay) {\r\n await delay(this.options.server.delay);\r\n }\r\n\r\n // 设置响应头\r\n res.setHeader('Content-Type', 'application/json');\r\n if (this.options.server?.cors) {\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', '*');\r\n res.setHeader('Access-Control-Allow-Headers', '*');\r\n }\r\n\r\n // 返回响应\r\n res.statusCode = 200;\r\n res.end(JSON.stringify(data));\r\n\r\n // 日志\r\n if (this.options.output?.logs) {\r\n console.log(`[Mock] ${method} ${url} → ${data ? 'OK' : 'Empty'}`);\r\n }\r\n } catch (error: any) {\r\n console.error(`[Mock] Error handling ${method} ${url}:`, error);\r\n res.statusCode = 500;\r\n res.end(\r\n JSON.stringify({\r\n code: 500,\r\n message: error.message,\r\n })\r\n );\r\n }\r\n });\r\n\r\n console.log('\\n🎭 Mock 服务器已启动');\r\n console.log(`📍 已注册 ${this.endpoints.length} 个端点\\n`);\r\n }\r\n\r\n /**\r\n * 匹配端点\r\n */\r\n private matchEndpoint(\r\n url: string,\r\n method: HttpMethod\r\n ): EndpointConfig | null {\r\n // 移除查询参数\r\n const path = url.split('?')[0];\r\n\r\n // 移除前缀\r\n const prefix = this.options.server?.prefix || '';\r\n const cleanPath = prefix ? path.replace(new RegExp(`^${prefix}`), '') : path;\r\n\r\n for (const endpoint of this.endpoints) {\r\n // 检查是否禁用\r\n if (endpoint.enabled === false) continue;\r\n\r\n // 检查方法\r\n if (endpoint.method !== method) continue;\r\n\r\n // 精确匹配\r\n if (endpoint.path === cleanPath) {\r\n return endpoint;\r\n }\r\n\r\n // 路径参数匹配\r\n if (matchPathParams(endpoint.path, cleanPath)) {\r\n return endpoint;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 解析请求\r\n */\r\n private parseRequest(req: any, url: string): any {\r\n const query = parseQueryParams(url);\r\n const path = url.split('?')[0];\r\n\r\n // 查找匹配的端点以提取路径参数\r\n const endpoint = this.matchEndpoint(path, req.method);\r\n const pathParams = endpoint\r\n ? matchPathParams(endpoint.path, path.split('?')[0])\r\n : null;\r\n\r\n return {\r\n query,\r\n params: pathParams || {},\r\n body: req.body,\r\n headers: req.headers,\r\n };\r\n }\r\n\r\n /**\r\n * 获取 Mock 数据\r\n */\r\n private async getMockData(\r\n endpoint: EndpointConfig,\r\n params: any\r\n ): Promise<any> {\r\n // 从存储获取数据\r\n let data = this.storage.get(endpoint.path, endpoint.method);\r\n\r\n if (!data) {\r\n console.warn(\r\n `[Mock] No data found for ${endpoint.method} ${endpoint.path}`\r\n );\r\n return formatResponse([], false, 'No mock data available');\r\n }\r\n\r\n // 如果是数组,应用过滤、排序、分页\r\n if (Array.isArray(data)) {\r\n // 过滤\r\n if (params.query.filter) {\r\n data = applyFilters(data, JSON.parse(params.query.filter));\r\n }\r\n\r\n // 排序\r\n if (params.query.sort) {\r\n data = applySorting(data, params.query.sort);\r\n }\r\n\r\n // 分页\r\n if (params.query.page || params.query.pageSize) {\r\n const page = parseInt(params.query.page) || 1;\r\n const pageSize = parseInt(params.query.pageSize) || 20;\r\n const result = applyPagination(data, page, pageSize);\r\n\r\n return formatResponse({\r\n list: result.data,\r\n pagination: result.pagination,\r\n });\r\n }\r\n }\r\n\r\n // 应用自定义处理\r\n if (endpoint.custom) {\r\n data = await endpoint.custom(data, params);\r\n }\r\n\r\n // 格式化响应\r\n return formatResponse(data);\r\n }\r\n\r\n /**\r\n * 添加端点\r\n */\r\n addEndpoint(endpoint: EndpointConfig): void {\r\n this.endpoints.push(endpoint);\r\n }\r\n\r\n /**\r\n * 移除端点\r\n */\r\n removeEndpoint(path: string, method: HttpMethod): void {\r\n this.endpoints = this.endpoints.filter(\r\n (e) => !(e.path === path && e.method === method)\r\n );\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getEndpoints(): EndpointConfig[] {\r\n return this.endpoints;\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - Vite 插件入口\r\n */\r\n\r\nimport type { Plugin } from 'vite';\r\nimport type { MockGeneratorOptions, TypeDefinition } from './types';\r\nimport { MockStorage } from './storage';\r\nimport { MockDataGenerator } from './generator';\r\nimport { MockServer } from './server';\r\n\r\nexport function vitePluginAIMockGenerator(\r\n options: MockGeneratorOptions = {}\r\n): Plugin {\r\n const {\r\n apiKey = process.env.OPENAI_API_KEY || '',\r\n apiUrl = process.env.OPENAI_API_URL || 'https://api.openai.com/v1',\r\n model = process.env.OPENAI_MODEL || 'gpt-4',\r\n enabled = true,\r\n autoGenerate = false,\r\n generation = {\r\n locale: 'zh-CN',\r\n count: 20,\r\n quality: 'balanced',\r\n },\r\n storage: storageOptions = {\r\n dir: 'mock-data',\r\n persist: true,\r\n cache: true,\r\n },\r\n output = {\r\n console: true,\r\n logs: false,\r\n },\r\n } = options;\r\n\r\n // 如果未启用,返回空插件\r\n if (!enabled) {\r\n return {\r\n name: 'vite-plugin-ai-mock-generator',\r\n };\r\n }\r\n\r\n // 初始化组件\r\n const storage = new MockStorage(storageOptions);\r\n const generator = new MockDataGenerator({ apiKey, apiUrl, model });\r\n const server = new MockServer(storage, options);\r\n\r\n return {\r\n name: 'vite-plugin-ai-mock-generator',\r\n enforce: 'pre',\r\n\r\n configResolved(config) {\r\n if (output.console) {\r\n console.log('\\n🤖 AI Mock Generator 已启动');\r\n console.log(`📂 存储目录: ${storageOptions.dir}`);\r\n console.log(`🌍 数据语言: ${generation.locale}`);\r\n console.log(`📊 默认数量: ${generation.count}`);\r\n console.log(`🔑 API Key: ${apiKey ? '已配置' : '未配置'}`);\r\n console.log(\r\n `📍 端点数量: ${options.endpoints?.length || 0}`\r\n );\r\n }\r\n },\r\n\r\n async buildStart() {\r\n // 如果启用自动生成\r\n if (autoGenerate && options.endpoints) {\r\n if (output.console) {\r\n console.log('\\n🔄 开始自动生成 Mock 数据...\\n');\r\n }\r\n\r\n for (const endpoint of options.endpoints) {\r\n // 检查是否已有数据\r\n const existingData = storage.get(endpoint.path, endpoint.method);\r\n if (existingData) {\r\n if (output.console) {\r\n console.log(\r\n `⏭️ 跳过 ${endpoint.method} ${endpoint.path} (已有数据)`\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n try {\r\n if (output.console) {\r\n console.log(`🎲 生成 ${endpoint.method} ${endpoint.path}...`);\r\n }\r\n\r\n // 解析类型定义\r\n const typeDefinition = parseTypeDefinition(endpoint.response);\r\n\r\n // 生成数据\r\n const count = endpoint.count || generation.count || 20;\r\n let data;\r\n \r\n // 根据质量设置选择生成方式\r\n if (generation.quality === 'fast') {\r\n // 使用基础生成器(不需要 AI)\r\n data = generator.generateBasic(typeDefinition, count);\r\n } else {\r\n // 使用 AI 生成\r\n data = await generator.generate({\r\n type: typeDefinition,\r\n count,\r\n locale: generation.locale || 'zh-CN',\r\n quality: generation.quality || 'balanced',\r\n });\r\n }\r\n\r\n // 存储数据\r\n storage.set(endpoint.path, endpoint.method, data, {\r\n type: endpoint.response as string,\r\n });\r\n\r\n if (output.console) {\r\n console.log(\r\n `✅ 已生成 ${count} 条数据: ${endpoint.method} ${endpoint.path}`\r\n );\r\n }\r\n } catch (error: any) {\r\n console.error(\r\n `❌ 生成失败 ${endpoint.method} ${endpoint.path}:`,\r\n error.message\r\n );\r\n }\r\n }\r\n\r\n if (output.console) {\r\n console.log('\\n✨ Mock 数据生成完成\\n');\r\n }\r\n }\r\n },\r\n\r\n configureServer(viteServer) {\r\n // 配置 Mock 服务器中间件\r\n server.configureServer(viteServer);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 解析类型定义\r\n * 简化版本,实际应该使用 TypeScript Compiler API\r\n */\r\nfunction parseTypeDefinition(typeStr: string | TypeDefinition): TypeDefinition {\r\n if (typeof typeStr === 'object') {\r\n return typeStr;\r\n }\r\n\r\n // 简单解析(实际应该更复杂)\r\n const isArray = typeStr.endsWith('[]');\r\n const typeName = isArray ? typeStr.slice(0, -2) : typeStr;\r\n\r\n // 返回基础类型定义\r\n return {\r\n name: typeName,\r\n properties: [],\r\n isArray,\r\n };\r\n}\r\n\r\n// 导出类型\r\nexport type { MockGeneratorOptions, EndpointConfig } from './types';\r\nexport { MockStorage } from './storage';\r\nexport { MockDataGenerator } from './generator';\r\nexport { MockServer } from './server';\r\n"]}
1
+ {"version":3,"sources":["../src/storage.ts","../src/generator.ts","../src/utils.ts","../src/server.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * AI Mock Generator - 数据存储\r\n */\r\n\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport type { MockDataStore, HttpMethod } from './types';\r\n\r\nexport class MockStorage {\r\n private storageDir: string;\r\n private cache: Map<string, MockDataStore>;\r\n private persist: boolean;\r\n\r\n constructor(options: { dir?: string; persist?: boolean } = {}) {\r\n this.storageDir = options.dir || 'mock-data';\r\n this.persist = options.persist !== false;\r\n this.cache = new Map();\r\n\r\n // 确保存储目录存在\r\n if (this.persist && !fs.existsSync(this.storageDir)) {\r\n fs.mkdirSync(this.storageDir, { recursive: true });\r\n }\r\n\r\n // 加载已有数据\r\n this.load();\r\n }\r\n\r\n /**\r\n * 生成存储 key\r\n */\r\n private getKey(endpoint: string, method: HttpMethod): string {\r\n return `${method}:${endpoint}`;\r\n }\r\n\r\n /**\r\n * 生成文件名\r\n */\r\n private getFileName(endpoint: string, method: HttpMethod): string {\r\n const sanitized = endpoint\r\n .replace(/^\\//, '')\r\n .replace(/\\//g, '_')\r\n .replace(/:/g, '_');\r\n return `${method}_${sanitized}.json`;\r\n }\r\n\r\n /**\r\n * 获取数据\r\n */\r\n get(endpoint: string, method: HttpMethod = 'GET'): any {\r\n const key = this.getKey(endpoint, method);\r\n const store = this.cache.get(key);\r\n return store?.data;\r\n }\r\n\r\n /**\r\n * 设置数据\r\n */\r\n set(\r\n endpoint: string,\r\n method: HttpMethod,\r\n data: any,\r\n metadata?: Partial<MockDataStore['metadata']>\r\n ): void {\r\n const key = this.getKey(endpoint, method);\r\n\r\n const store: MockDataStore = {\r\n endpoint,\r\n method,\r\n data,\r\n metadata: {\r\n count: Array.isArray(data) ? data.length : 1,\r\n generatedAt: new Date().toISOString(),\r\n version: '1.0.0',\r\n type: typeof data,\r\n ...metadata,\r\n },\r\n };\r\n\r\n this.cache.set(key, store);\r\n\r\n // 持久化\r\n if (this.persist) {\r\n this.save(endpoint, method, store);\r\n }\r\n }\r\n\r\n /**\r\n * 删除数据\r\n */\r\n delete(endpoint: string, method: HttpMethod = 'GET'): void {\r\n const key = this.getKey(endpoint, method);\r\n this.cache.delete(key);\r\n\r\n // 删除文件\r\n if (this.persist) {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n if (fs.existsSync(filePath)) {\r\n fs.unlinkSync(filePath);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.cache.clear();\r\n\r\n // 清空目录\r\n if (this.persist && fs.existsSync(this.storageDir)) {\r\n const files = fs.readdirSync(this.storageDir);\r\n for (const file of files) {\r\n fs.unlinkSync(path.join(this.storageDir, file));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getAll(): MockDataStore[] {\r\n return Array.from(this.cache.values());\r\n }\r\n\r\n /**\r\n * 保存到文件\r\n */\r\n private save(\r\n endpoint: string,\r\n method: HttpMethod,\r\n store: MockDataStore\r\n ): void {\r\n const fileName = this.getFileName(endpoint, method);\r\n const filePath = path.join(this.storageDir, fileName);\r\n\r\n fs.writeFileSync(filePath, JSON.stringify(store, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 从文件加载\r\n */\r\n private load(): void {\r\n if (!this.persist || !fs.existsSync(this.storageDir)) {\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.storageDir);\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.json')) continue;\r\n\r\n try {\r\n const filePath = path.join(this.storageDir, file);\r\n const content = fs.readFileSync(filePath, 'utf-8');\r\n const store: MockDataStore = JSON.parse(content);\r\n\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n } catch (error) {\r\n console.warn(`Failed to load mock data from ${file}:`, error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出所有数据\r\n */\r\n export(outputPath: string): void {\r\n const allData = this.getAll();\r\n fs.writeFileSync(outputPath, JSON.stringify(allData, null, 2), 'utf-8');\r\n }\r\n\r\n /**\r\n * 导入数据\r\n */\r\n import(inputPath: string): void {\r\n const content = fs.readFileSync(inputPath, 'utf-8');\r\n const allData: MockDataStore[] = JSON.parse(content);\r\n\r\n for (const store of allData) {\r\n const key = this.getKey(store.endpoint, store.method);\r\n this.cache.set(key, store);\r\n\r\n if (this.persist) {\r\n this.save(store.endpoint, store.method, store);\r\n }\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 数据生成器\r\n */\r\n\r\nimport type {\r\n TypeDefinition,\r\n GenerationContext,\r\n PropertyDefinition,\r\n} from './types';\r\n\r\nexport class MockDataGenerator {\r\n private apiKey: string;\r\n private apiUrl: string;\r\n private model: string;\r\n\r\n constructor(options: { apiKey: string; apiUrl: string; model: string }) {\r\n this.apiKey = options.apiKey;\r\n this.apiUrl = options.apiUrl;\r\n this.model = options.model;\r\n }\r\n\r\n /**\r\n * 生成 Mock 数据\r\n */\r\n async generate(context: GenerationContext): Promise<any> {\r\n const { type, count, locale, quality } = context;\r\n\r\n // 构建 AI Prompt\r\n const prompt = this.buildPrompt(type, count, locale, quality);\r\n\r\n // 调用 AI API\r\n const response = await this.callAI(prompt);\r\n\r\n // 解析响应\r\n return this.parseResponse(response, type.isArray);\r\n }\r\n\r\n /**\r\n * 构建 AI Prompt\r\n */\r\n private buildPrompt(\r\n type: TypeDefinition,\r\n count: number,\r\n locale: string,\r\n quality: string\r\n ): string {\r\n const properties = type.properties\r\n .map((p) => this.formatProperty(p))\r\n .join('\\n');\r\n\r\n return `\r\n你是一个专业的 Mock 数据生成器。请根据以下类型定义生成真实、合理的测试数据。\r\n\r\n类型名称: ${type.name}\r\n数据语言: ${locale === 'zh-CN' ? '中文' : '英文'}\r\n数据数量: ${count}\r\n质量要求: ${quality === 'high' ? '高质量(真实业务数据)' : quality === 'fast' ? '快速生成' : '平衡质量和速度'}\r\n\r\n类型定义:\r\n${properties}\r\n\r\n要求:\r\n1. 生成 ${count} 条数据\r\n2. 数据要符合业务逻辑和真实场景\r\n3. 字段值要合理(如价格不能为负数,年龄在合理范围)\r\n4. 日期格式使用 ISO 8601\r\n5. 返回 JSON 数组格式,不要包含任何其他文字\r\n6. 理解字段语义,生成真实数据(如 userName 生成真实姓名)\r\n\r\n示例格式:\r\n[\r\n {\r\n \"id\": 1,\r\n \"name\": \"张三\",\r\n ...\r\n }\r\n]\r\n\r\n请生成数据:\r\n`.trim();\r\n }\r\n\r\n /**\r\n * 格式化属性\r\n */\r\n private formatProperty(prop: PropertyDefinition): string {\r\n let line = `- ${prop.name}: ${prop.type}`;\r\n\r\n if (prop.comment) {\r\n line += ` // ${prop.comment}`;\r\n }\r\n\r\n if (prop.constraints) {\r\n const constraints = [];\r\n if (prop.constraints.min !== undefined) {\r\n constraints.push(`min: ${prop.constraints.min}`);\r\n }\r\n if (prop.constraints.max !== undefined) {\r\n constraints.push(`max: ${prop.constraints.max}`);\r\n }\r\n if (prop.constraints.unique) {\r\n constraints.push('unique');\r\n }\r\n if (prop.constraints.enum) {\r\n constraints.push(`enum: [${prop.constraints.enum.join(', ')}]`);\r\n }\r\n if (constraints.length > 0) {\r\n line += ` (${constraints.join(', ')})`;\r\n }\r\n }\r\n\r\n return line;\r\n }\r\n\r\n /**\r\n * 调用 AI API\r\n */\r\n private async callAI(prompt: string): Promise<string> {\r\n try {\r\n const response = await fetch(`${this.apiUrl}/chat/completions`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.apiKey}`,\r\n },\r\n body: JSON.stringify({\r\n model: this.model,\r\n messages: [\r\n {\r\n role: 'user',\r\n content: prompt,\r\n },\r\n ],\r\n temperature: 0.7,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`AI API error: ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return data.choices[0].message.content;\r\n } catch (error: any) {\r\n console.error('Failed to call AI API:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 解析 AI 响应\r\n */\r\n private parseResponse(response: string, isArray: boolean = true): any {\r\n try {\r\n // 移除 markdown 代码块标记\r\n let cleanedResponse = response.trim();\r\n \r\n // 移除开头的 ```json 或 ```\r\n cleanedResponse = cleanedResponse.replace(/^```json\\s*/i, '');\r\n cleanedResponse = cleanedResponse.replace(/^```\\s*/, '');\r\n \r\n // 移除结尾的 ```\r\n cleanedResponse = cleanedResponse.replace(/\\s*```$/, '');\r\n \r\n // 提取 JSON 部分(查找数组或对象)\r\n const jsonMatch = cleanedResponse.match(/(\\[[\\s\\S]*\\]|\\{[\\s\\S]*\\})/);\r\n if (!jsonMatch) {\r\n throw new Error('No JSON array or object found in response');\r\n }\r\n\r\n const data = JSON.parse(jsonMatch[0]);\r\n\r\n return isArray ? data : data[0];\r\n } catch (error: any) {\r\n console.error('Failed to parse AI response:', error);\r\n console.error('Response:', response);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 生成基础数据(不使用 AI)\r\n */\r\n generateBasic(type: TypeDefinition, count: number): any[] {\r\n const data = [];\r\n\r\n for (let i = 0; i < count; i++) {\r\n const item: any = {};\r\n\r\n for (const prop of type.properties) {\r\n item[prop.name] = this.generateBasicValue(prop, i);\r\n }\r\n\r\n data.push(item);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 生成基础值\r\n */\r\n private generateBasicValue(prop: PropertyDefinition, index: number): any {\r\n const { type, constraints } = prop;\r\n\r\n // 处理枚举\r\n if (constraints?.enum) {\r\n return constraints.enum[index % constraints.enum.length];\r\n }\r\n\r\n // 根据类型生成\r\n switch (type) {\r\n case 'number':\r\n const min = constraints?.min ?? 0;\r\n const max = constraints?.max ?? 100;\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n\r\n case 'string':\r\n return `${prop.name}_${index + 1}`;\r\n\r\n case 'boolean':\r\n return Math.random() > 0.5;\r\n\r\n case 'Date':\r\n return new Date().toISOString();\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - 工具函数\r\n */\r\n\r\nimport type { HttpMethod, RequestParams } from './types';\r\n\r\n/**\r\n * 延迟函数\r\n */\r\nexport function delay(ms: number | [number, number]): Promise<void> {\r\n const delayTime = Array.isArray(ms)\r\n ? Math.random() * (ms[1] - ms[0]) + ms[0]\r\n : ms;\r\n\r\n return new Promise((resolve) => setTimeout(resolve, delayTime));\r\n}\r\n\r\n/**\r\n * 匹配路径参数\r\n * @example\r\n * matchPathParams('/api/users/:id', '/api/users/123') // { id: '123' }\r\n */\r\nexport function matchPathParams(\r\n pattern: string,\r\n path: string\r\n): Record<string, string> | null {\r\n const patternParts = pattern.split('/');\r\n const pathParts = path.split('/');\r\n\r\n if (patternParts.length !== pathParts.length) {\r\n return null;\r\n }\r\n\r\n const params: Record<string, string> = {};\r\n\r\n for (let i = 0; i < patternParts.length; i++) {\r\n const patternPart = patternParts[i];\r\n const pathPart = pathParts[i];\r\n\r\n if (patternPart.startsWith(':')) {\r\n // 路径参数\r\n const paramName = patternPart.slice(1);\r\n params[paramName] = pathPart;\r\n } else if (patternPart !== pathPart) {\r\n // 不匹配\r\n return null;\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 解析查询参数\r\n */\r\nexport function parseQueryParams(url: string): Record<string, any> {\r\n const queryString = url.split('?')[1];\r\n if (!queryString) return {};\r\n\r\n const params: Record<string, any> = {};\r\n const pairs = queryString.split('&');\r\n\r\n for (const pair of pairs) {\r\n const [key, value] = pair.split('=');\r\n params[decodeURIComponent(key)] = decodeURIComponent(value || '');\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * 生成唯一 ID\r\n */\r\nexport function generateId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n}\r\n\r\n/**\r\n * 深度克隆\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * 应用过滤\r\n */\r\nexport function applyFilters(data: any[], filters: Record<string, any>): any[] {\r\n if (!filters || Object.keys(filters).length === 0) {\r\n return data;\r\n }\r\n\r\n return data.filter((item) => {\r\n for (const [key, value] of Object.entries(filters)) {\r\n if (item[key] !== value) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n}\r\n\r\n/**\r\n * 应用排序\r\n */\r\nexport function applySorting(\r\n data: any[],\r\n sort?: string | { field: string; order: 'asc' | 'desc' }\r\n): any[] {\r\n if (!sort) return data;\r\n\r\n const sortConfig =\r\n typeof sort === 'string'\r\n ? { field: sort, order: 'asc' as const }\r\n : sort;\r\n\r\n return [...data].sort((a, b) => {\r\n const aValue = a[sortConfig.field];\r\n const bValue = b[sortConfig.field];\r\n\r\n if (aValue < bValue) return sortConfig.order === 'asc' ? -1 : 1;\r\n if (aValue > bValue) return sortConfig.order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/**\r\n * 应用分页\r\n */\r\nexport function applyPagination(\r\n data: any[],\r\n page: number = 1,\r\n pageSize: number = 20\r\n): {\r\n data: any[];\r\n pagination: {\r\n page: number;\r\n pageSize: number;\r\n total: number;\r\n totalPages: number;\r\n };\r\n} {\r\n const total = data.length;\r\n const totalPages = Math.ceil(total / pageSize);\r\n const start = (page - 1) * pageSize;\r\n const end = start + pageSize;\r\n\r\n return {\r\n data: data.slice(start, end),\r\n pagination: {\r\n page,\r\n pageSize,\r\n total,\r\n totalPages,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 格式化响应\r\n */\r\nexport function formatResponse(\r\n data: any,\r\n success: boolean = true,\r\n message?: string\r\n) {\r\n return {\r\n code: success ? 200 : 500,\r\n data,\r\n message: message || (success ? 'Success' : 'Error'),\r\n };\r\n}\r\n\r\n/**\r\n * 生成随机种子\r\n */\r\nexport function generateSeed(): number {\r\n return Math.floor(Math.random() * 1000000);\r\n}\r\n\r\n/**\r\n * 设置随机种子\r\n */\r\nexport function setSeed(seed: number): void {\r\n // 简单的伪随机数生成器\r\n let currentSeed = seed;\r\n Math.random = () => {\r\n currentSeed = (currentSeed * 9301 + 49297) % 233280;\r\n return currentSeed / 233280;\r\n };\r\n}\r\n","/**\r\n * AI Mock Generator - Mock 服务器\r\n */\r\n\r\nimport type { ViteDevServer } from 'vite';\r\nimport type {\r\n EndpointConfig,\r\n HttpMethod,\r\n MockGeneratorOptions,\r\n} from './types';\r\nimport { MockStorage } from './storage';\r\nimport {\r\n delay,\r\n matchPathParams,\r\n parseQueryParams,\r\n applyFilters,\r\n applySorting,\r\n applyPagination,\r\n formatResponse,\r\n} from './utils';\r\n\r\nexport class MockServer {\r\n private storage: MockStorage;\r\n private endpoints: EndpointConfig[];\r\n private options: MockGeneratorOptions;\r\n\r\n constructor(storage: MockStorage, options: MockGeneratorOptions) {\r\n this.storage = storage;\r\n this.endpoints = options.endpoints || [];\r\n this.options = options;\r\n }\r\n\r\n /**\r\n * 配置服务器中间件\r\n */\r\n configureServer(server: ViteDevServer): void {\r\n server.middlewares.use(async (req, res, next) => {\r\n const url = req.url || '';\r\n const method = req.method as HttpMethod;\r\n\r\n // 检查是否匹配 Mock 端点\r\n const endpoint = this.matchEndpoint(url, method);\r\n\r\n if (!endpoint) {\r\n return next();\r\n }\r\n\r\n try {\r\n // 解析请求参数\r\n const params = this.parseRequest(req, url);\r\n\r\n // 获取 Mock 数据\r\n const data = await this.getMockData(endpoint, params);\r\n\r\n // 模拟延迟\r\n if (this.options.server?.delay) {\r\n await delay(this.options.server.delay);\r\n }\r\n\r\n // 设置响应头\r\n res.setHeader('Content-Type', 'application/json');\r\n if (this.options.server?.cors) {\r\n res.setHeader('Access-Control-Allow-Origin', '*');\r\n res.setHeader('Access-Control-Allow-Methods', '*');\r\n res.setHeader('Access-Control-Allow-Headers', '*');\r\n }\r\n\r\n // 返回响应\r\n res.statusCode = 200;\r\n res.end(JSON.stringify(data));\r\n\r\n // 日志\r\n if (this.options.output?.logs) {\r\n console.log(`[Mock] ${method} ${url} → ${data ? 'OK' : 'Empty'}`);\r\n }\r\n } catch (error: any) {\r\n console.error(`[Mock] Error handling ${method} ${url}:`, error);\r\n res.statusCode = 500;\r\n res.end(\r\n JSON.stringify({\r\n code: 500,\r\n message: error.message,\r\n })\r\n );\r\n }\r\n });\r\n\r\n console.log('\\n🎭 Mock 服务器已启动');\r\n console.log(`📍 已注册 ${this.endpoints.length} 个端点\\n`);\r\n }\r\n\r\n /**\r\n * 匹配端点\r\n */\r\n private matchEndpoint(\r\n url: string,\r\n method: HttpMethod\r\n ): EndpointConfig | null {\r\n // 移除查询参数\r\n const path = url.split('?')[0];\r\n\r\n // 移除前缀\r\n const prefix = this.options.server?.prefix || '';\r\n const cleanPath = prefix ? path.replace(new RegExp(`^${prefix}`), '') : path;\r\n\r\n for (const endpoint of this.endpoints) {\r\n // 检查是否禁用\r\n if (endpoint.enabled === false) continue;\r\n\r\n // 检查方法\r\n if (endpoint.method !== method) continue;\r\n\r\n // 精确匹配\r\n if (endpoint.path === cleanPath) {\r\n return endpoint;\r\n }\r\n\r\n // 路径参数匹配\r\n if (matchPathParams(endpoint.path, cleanPath)) {\r\n return endpoint;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * 解析请求\r\n */\r\n private parseRequest(req: any, url: string): any {\r\n const query = parseQueryParams(url);\r\n const path = url.split('?')[0];\r\n\r\n // 查找匹配的端点以提取路径参数\r\n const endpoint = this.matchEndpoint(path, req.method);\r\n const pathParams = endpoint\r\n ? matchPathParams(endpoint.path, path.split('?')[0])\r\n : null;\r\n\r\n return {\r\n query,\r\n params: pathParams || {},\r\n body: req.body,\r\n headers: req.headers,\r\n };\r\n }\r\n\r\n /**\r\n * 获取 Mock 数据\r\n */\r\n private async getMockData(\r\n endpoint: EndpointConfig,\r\n params: any\r\n ): Promise<any> {\r\n // 从存储获取数据\r\n let data = this.storage.get(endpoint.path, endpoint.method);\r\n\r\n if (!data) {\r\n console.warn(\r\n `[Mock] No data found for ${endpoint.method} ${endpoint.path}`\r\n );\r\n return formatResponse([], false, 'No mock data available');\r\n }\r\n\r\n // 如果是数组,应用过滤、排序、分页\r\n if (Array.isArray(data)) {\r\n // 过滤\r\n if (params.query.filter) {\r\n data = applyFilters(data, JSON.parse(params.query.filter));\r\n }\r\n\r\n // 排序\r\n if (params.query.sort) {\r\n data = applySorting(data, params.query.sort);\r\n }\r\n\r\n // 分页\r\n if (params.query.page || params.query.pageSize) {\r\n const page = parseInt(params.query.page) || 1;\r\n const pageSize = parseInt(params.query.pageSize) || 20;\r\n const result = applyPagination(data, page, pageSize);\r\n\r\n return formatResponse({\r\n list: result.data,\r\n pagination: result.pagination,\r\n });\r\n }\r\n }\r\n\r\n // 应用自定义处理\r\n if (endpoint.custom) {\r\n data = await endpoint.custom(data, params);\r\n }\r\n\r\n // 格式化响应\r\n return formatResponse(data);\r\n }\r\n\r\n /**\r\n * 添加端点\r\n */\r\n addEndpoint(endpoint: EndpointConfig): void {\r\n this.endpoints.push(endpoint);\r\n }\r\n\r\n /**\r\n * 移除端点\r\n */\r\n removeEndpoint(path: string, method: HttpMethod): void {\r\n this.endpoints = this.endpoints.filter(\r\n (e) => !(e.path === path && e.method === method)\r\n );\r\n }\r\n\r\n /**\r\n * 获取所有端点\r\n */\r\n getEndpoints(): EndpointConfig[] {\r\n return this.endpoints;\r\n }\r\n}\r\n","/**\r\n * AI Mock Generator - Vite 插件入口\r\n */\r\n\r\nimport type { Plugin } from \"vite\";\r\nimport type { MockGeneratorOptions, TypeDefinition } from \"./types\";\r\nimport { MockStorage } from \"./storage\";\r\nimport { MockDataGenerator } from \"./generator\";\r\nimport { MockServer } from \"./server\";\r\n\r\nexport function vitePluginAIMockGenerator(\r\n options: MockGeneratorOptions = {},\r\n): Plugin {\r\n const {\r\n apiKey = process.env.OPENAI_API_KEY || \"\",\r\n apiUrl = process.env.OPENAI_API_URL || \"https://api.openai.com/v1\",\r\n model = process.env.OPENAI_MODEL || \"gpt-4\",\r\n enabled = true,\r\n autoGenerate = false,\r\n generation = {\r\n locale: \"zh-CN\",\r\n count: 20,\r\n quality: \"balanced\",\r\n },\r\n storage: storageOptions = {\r\n dir: \"mock-data\",\r\n persist: true,\r\n cache: true,\r\n },\r\n output = {\r\n console: true,\r\n logs: false,\r\n },\r\n } = options;\r\n\r\n // 如果未启用,返回空插件\r\n if (!enabled) {\r\n return {\r\n name: \"vite-plugin-ai-mock-generator\",\r\n };\r\n }\r\n\r\n // 初始化组件\r\n const storage = new MockStorage(storageOptions);\r\n const generator = new MockDataGenerator({ apiKey, apiUrl, model });\r\n const server = new MockServer(storage, options);\r\n\r\n return {\r\n name: \"vite-plugin-ai-mock-generator\",\r\n enforce: \"pre\",\r\n\r\n configResolved(config) {\r\n if (output.console) {\r\n console.log(\"\\n🤖 AI Mock Generator 已启动\");\r\n console.log(`📂 存储目录: ${storageOptions.dir}`);\r\n console.log(`🌍 数据语言: ${generation.locale}`);\r\n console.log(`📊 默认数量: ${generation.count}`);\r\n console.log(`🔑 API Key: ${apiKey ? \"已配置\" : \"未配置\"}`);\r\n console.log(`📍 端点数量: ${options.endpoints?.length || 0}`);\r\n }\r\n },\r\n\r\n async buildStart() {\r\n // 如果启用自动生成\r\n if (autoGenerate && options.endpoints) {\r\n if (output.console) {\r\n console.log(\"\\n🔄 开始自动生成 Mock 数据...\\n\");\r\n }\r\n\r\n for (const endpoint of options.endpoints) {\r\n // 检查是否已有数据\r\n const existingData = storage.get(endpoint.path, endpoint.method);\r\n if (existingData) {\r\n if (output.console) {\r\n console.log(\r\n `⏭️ 跳过 ${endpoint.method} ${endpoint.path} (已有数据)`,\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n try {\r\n if (output.console) {\r\n console.log(`🎲 生成 ${endpoint.method} ${endpoint.path}...`);\r\n }\r\n\r\n // 解析类型定义\r\n const typeDefinition = parseTypeDefinition(endpoint.response);\r\n\r\n // 生成数据\r\n const count = endpoint.count || generation.count || 20;\r\n let data;\r\n\r\n // 根据质量设置选择生成方式\r\n if (generation.quality === \"fast\") {\r\n // 使用基础生成器(不需要 AI)\r\n data = generator.generateBasic(typeDefinition, count);\r\n } else {\r\n // 使用 AI 生成\r\n data = await generator.generate({\r\n type: typeDefinition,\r\n count,\r\n locale: generation.locale || \"zh-CN\",\r\n quality: generation.quality || \"balanced\",\r\n });\r\n }\r\n\r\n // 存储数据\r\n storage.set(endpoint.path, endpoint.method, data, {\r\n type: endpoint.response as string,\r\n });\r\n\r\n if (output.console) {\r\n console.log(\r\n `✅ 已生成 ${count} 条数据: ${endpoint.method} ${endpoint.path}`,\r\n );\r\n }\r\n } catch (error: any) {\r\n console.error(\r\n `❌ 生成失败 ${endpoint.method} ${endpoint.path}:`,\r\n error.message,\r\n );\r\n }\r\n }\r\n\r\n if (output.console) {\r\n console.log(\"\\n✨ Mock 数据生成完成\\n\");\r\n }\r\n }\r\n },\r\n\r\n configureServer(viteServer) {\r\n // 配置 Mock 服务器中间件\r\n server.configureServer(viteServer);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * 解析类型定义\r\n * 简化版本,实际应该使用 TypeScript Compiler API\r\n */\r\nfunction parseTypeDefinition(typeStr: string | TypeDefinition): TypeDefinition {\r\n if (typeof typeStr === \"object\") {\r\n return typeStr;\r\n }\r\n\r\n // 简单解析(实际应该更复杂)\r\n const isArray = typeStr.endsWith(\"[]\");\r\n const typeName = isArray ? typeStr.slice(0, -2) : typeStr;\r\n\r\n // 返回基础类型定义\r\n return {\r\n name: typeName,\r\n properties: [],\r\n isArray,\r\n };\r\n}\r\n\r\n// 导出类型\r\nexport type { MockGeneratorOptions, EndpointConfig } from \"./types\";\r\nexport { MockStorage } from \"./storage\";\r\nexport { MockDataGenerator } from \"./generator\";\r\nexport { MockServer } from \"./server\";\r\n\r\n// 默认导出\r\nexport default vitePluginAIMockGenerator;\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plugin-ai-mock-generator",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "AI-powered Mock data generator for Vite - Generate realistic test data with AI or basic algorithms",
5
5
  "keywords": [
6
6
  "vite",