vite-plugin-automock 1.1.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  loadMockData,
7
7
  registerHttpInstance,
8
8
  setMockEnabled
9
- } from "./chunk-DJWYFFPU.mjs";
9
+ } from "./chunk-2KRAWI7J.mjs";
10
10
 
11
11
  // src/index.ts
12
12
  import path6 from "path";
@@ -721,6 +721,11 @@ function serveMockResponse(res, mockFilePath, mockResult) {
721
721
  }
722
722
  }, delay);
723
723
  }
724
+ function matchesApiPrefix(pathname, apiPrefix) {
725
+ if (!apiPrefix || apiPrefix === "/") return true;
726
+ const normalizedPrefix = apiPrefix.endsWith("/") && apiPrefix !== "/" ? apiPrefix.slice(0, -1) : apiPrefix;
727
+ return pathname === normalizedPrefix || pathname.startsWith(`${normalizedPrefix}/`);
728
+ }
724
729
  function proxyAndCapture(req, res, options) {
725
730
  const { proxyBaseUrl, pathRewrite, shouldSave, method, pathname, mockDir, onMockSaved } = options;
726
731
  const targetUrl = proxyBaseUrl + pathRewrite(req.url || "");
@@ -896,7 +901,8 @@ function automock(options) {
896
901
  const absolutePath = resolveAbsolutePath(mockFilePath);
897
902
  if (!fs3.existsSync(absolutePath)) return null;
898
903
  const { default: mockModule } = await import(`${absolutePath}?t=${Date.now()}`);
899
- const mockResult = typeof mockModule.data === "function" ? mockModule.data() : mockModule;
904
+ const exportedConfig = typeof mockModule === "function" ? await mockModule() : mockModule;
905
+ const mockResult = typeof exportedConfig?.data === "function" ? { ...exportedConfig, data: await exportedConfig.data() } : exportedConfig;
900
906
  const { enable = true } = mockResult || {};
901
907
  return enable ? { absolutePath, mockResult } : null;
902
908
  }
@@ -907,7 +913,11 @@ function automock(options) {
907
913
  const handled = await inspectorHandler(req, res);
908
914
  if (handled) return;
909
915
  }
910
- if (!req.url?.startsWith(apiPrefix)) {
916
+ if (!req.url) {
917
+ return next();
918
+ }
919
+ const pathname = new URL(req.url, "http://localhost").pathname;
920
+ if (!matchesApiPrefix(pathname, apiPrefix)) {
911
921
  return next();
912
922
  }
913
923
  const accept = req.headers.accept || "";
@@ -916,7 +926,6 @@ function automock(options) {
916
926
  return next();
917
927
  }
918
928
  const method = (req.method || "GET").toLowerCase();
919
- const pathname = new URL(req.url, "http://localhost").pathname;
920
929
  const key = `${pathname}/${method}.js`.toLowerCase();
921
930
  try {
922
931
  const mock = await tryLoadMock(key);
@@ -1018,6 +1027,11 @@ function writeMockBundle(bundle, outputPath) {
1018
1027
  }
1019
1028
 
1020
1029
  // src/index.ts
1030
+ function resolveProductionMockEnabled(productionMock, mode = process.env.NODE_ENV) {
1031
+ if (productionMock === true) return true;
1032
+ if (productionMock === "auto") return mode !== "production";
1033
+ return false;
1034
+ }
1021
1035
  function automock2(options = {}) {
1022
1036
  const {
1023
1037
  bundleMockData = true,
@@ -1026,8 +1040,10 @@ function automock2(options = {}) {
1026
1040
  } = options;
1027
1041
  const basePlugin = automock(pluginOptions);
1028
1042
  let cachedBundle = null;
1043
+ let productionMockEnabled = resolveProductionMockEnabled(pluginOptions.productionMock);
1044
+ const resolveBundleOutputPath = () => path6.isAbsolute(bundleOutputPath) ? bundleOutputPath : path6.join(process.cwd(), bundleOutputPath);
1029
1045
  const ensureBundleExists = () => {
1030
- const outputPath = path6.join(process.cwd(), bundleOutputPath);
1046
+ const outputPath = resolveBundleOutputPath();
1031
1047
  if (!fs5.existsSync(outputPath) && cachedBundle) {
1032
1048
  console.log("[automock] Re-writing mock bundle...");
1033
1049
  writeMockBundle(cachedBundle, outputPath);
@@ -1036,16 +1052,22 @@ function automock2(options = {}) {
1036
1052
  return {
1037
1053
  ...basePlugin,
1038
1054
  name: "vite-plugin-automock-with-bundle",
1039
- config() {
1040
- const enabled = pluginOptions.productionMock !== false;
1055
+ config(userConfig, env) {
1056
+ if (typeof basePlugin.config === "function") {
1057
+ basePlugin.config.call(this, userConfig, env);
1058
+ }
1059
+ productionMockEnabled = resolveProductionMockEnabled(
1060
+ pluginOptions.productionMock,
1061
+ env.mode
1062
+ );
1041
1063
  return {
1042
1064
  define: {
1043
- __AUTOMOCK_ENABLED__: JSON.stringify(enabled)
1065
+ __AUTOMOCK_ENABLED__: JSON.stringify(productionMockEnabled)
1044
1066
  }
1045
1067
  };
1046
1068
  },
1047
1069
  buildEnd: async () => {
1048
- if (bundleMockData && pluginOptions.productionMock !== false) {
1070
+ if (bundleMockData && productionMockEnabled) {
1049
1071
  try {
1050
1072
  const mockDir = pluginOptions.mockDir || path6.join(process.cwd(), "mock");
1051
1073
  if (!fs5.existsSync(mockDir)) {
@@ -1059,7 +1081,7 @@ function automock2(options = {}) {
1059
1081
  return;
1060
1082
  }
1061
1083
  cachedBundle = await bundleMockFiles({ mockDir });
1062
- const outputPath = path6.join(process.cwd(), bundleOutputPath);
1084
+ const outputPath = resolveBundleOutputPath();
1063
1085
  writeMockBundle(cachedBundle, outputPath);
1064
1086
  console.log(`[automock] Mock bundle written to: ${outputPath}`);
1065
1087
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/middleware.ts","../src/mockFileUtils.ts","../src/utils.ts","../src/inspector.ts","../src/mockBundler.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\n\nimport { automock as createAutomockPlugin } from './middleware'\nimport { bundleMockFiles, writeMockBundle } from './mockBundler'\nimport { buildMockIndex } from './mockFileUtils'\nimport type { Plugin } from 'vite'\nimport type { AutomockPluginOptions } from './types'\nimport type { MockBundle } from './mockBundler'\n\nexport type { AutomockPluginOptions, InspectorOptions } from './types'\nexport { saveMockData, buildMockIndex, parseMockModule, writeMockFile } from './mockFileUtils'\nexport type { MockBundle, MockBundleData } from './mockBundler'\nexport { bundleMockFiles, writeMockBundle } from './mockBundler'\n\n// Client interceptor exports\nexport {\n createMockInterceptor,\n initMockInterceptor,\n initMockInterceptorForPureHttp,\n setMockEnabled,\n isMockEnabled,\n loadMockData,\n registerHttpInstance\n} from './client'\nexport type { MockInterceptorOptions, MockBundleData as ClientMockBundleData } from './client/interceptor'\n\nexport interface AutomockWithBundleOptions extends AutomockPluginOptions {\n bundleMockData?: boolean\n bundleOutputPath?: string\n}\n\nexport function automock(options: AutomockWithBundleOptions = {}): Plugin {\n const {\n bundleMockData = true,\n bundleOutputPath = 'public/mock-data.json',\n ...pluginOptions\n } = options\n\n const basePlugin = createAutomockPlugin(pluginOptions)\n\n let cachedBundle: MockBundle | null = null\n\n const ensureBundleExists = () => {\n const outputPath = path.join(process.cwd(), bundleOutputPath)\n if (!fs.existsSync(outputPath) && cachedBundle) {\n console.log('[automock] Re-writing mock bundle...')\n writeMockBundle(cachedBundle, outputPath)\n }\n }\n\n return {\n ...basePlugin,\n name: 'vite-plugin-automock-with-bundle',\n config() {\n // Inject compile-time constant for client interceptor\n const enabled = pluginOptions.productionMock !== false\n return {\n define: {\n __AUTOMOCK_ENABLED__: JSON.stringify(enabled),\n },\n }\n },\n buildEnd: async () => {\n if (bundleMockData && pluginOptions.productionMock !== false) {\n try {\n const mockDir = pluginOptions.mockDir || path.join(process.cwd(), 'mock')\n\n if (!fs.existsSync(mockDir)) {\n console.log('[automock] Mock directory not found, skipping bundle generation')\n console.log('[automock] Using existing mock-data.json if present')\n return\n }\n\n const mockFileMap = await buildMockIndex(mockDir)\n if (mockFileMap.size === 0) {\n console.log('[automock] No mock files found, skipping bundle generation')\n return\n }\n\n cachedBundle = await bundleMockFiles({ mockDir })\n\n const outputPath = path.join(process.cwd(), bundleOutputPath)\n writeMockBundle(cachedBundle, outputPath)\n console.log(`[automock] Mock bundle written to: ${outputPath}`)\n } catch (error) {\n console.error('[automock] Failed to bundle mock data:', error)\n }\n }\n },\n writeBundle: ensureBundleExists,\n closeBundle: ensureBundleExists,\n }\n}\n\n","import chokidar from \"chokidar\";\nimport debounce from \"lodash.debounce\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport http from \"http\";\nimport https from \"https\";\nimport type { AddressInfo } from \"net\";\n\nimport { buildMockIndex, saveMockData } from \"./mockFileUtils\";\nimport { createInspectorHandler, normalizeInspectorConfig } from \"./inspector\";\nimport {\n resolveAbsolutePath,\n getServerAddress,\n sendError,\n} from \"./utils\";\n\nimport type { Plugin } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { FSWatcher } from \"chokidar\";\nimport type { AutomockPluginOptions } from \"./types\";\n\nfunction serveMockResponse(\n res: ServerResponse,\n mockFilePath: string,\n mockResult: { data?: unknown; delay?: number; status?: number },\n): void {\n const { data, delay = 0, status = 200 } = mockResult;\n\n setTimeout(() => {\n const isBinaryMock = data && typeof data === \"object\" && (data as Record<string, unknown>).__binaryFile;\n\n if (isBinaryMock) {\n const binaryData = data as Record<string, unknown>;\n const binaryFilePath = mockFilePath.replace(\n /\\.js$/,\n \".\" + binaryData.__binaryFile,\n );\n\n if (!fs.existsSync(binaryFilePath)) {\n console.error(\n `[automock] Binary mock file not found: ${binaryFilePath}`,\n );\n sendError(res, \"Binary mock file not found\", 404);\n return;\n }\n\n try {\n const fileData = fs.readFileSync(binaryFilePath);\n const contentType =\n (binaryData.__contentType as string) || \"application/octet-stream\";\n res.setHeader(\"Content-Type\", contentType);\n res.setHeader(\"Content-Length\", fileData.length);\n res.setHeader(\"X-Mock-Response\", \"true\");\n res.setHeader(\"X-Mock-Source\", \"vite-plugin-automock\");\n res.setHeader(\"X-Mock-Binary-File\", \"true\");\n res.statusCode = status;\n res.end(fileData);\n } catch (error) {\n console.error(\"[automock] Failed to read binary mock file:\", error);\n sendError(res, \"Failed to read binary mock file\");\n }\n } else {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.setHeader(\"X-Mock-Response\", \"true\");\n res.setHeader(\"X-Mock-Source\", \"vite-plugin-automock\");\n res.statusCode = status;\n res.end(typeof data === \"string\" ? data : JSON.stringify(data));\n }\n }, delay);\n}\n\nfunction proxyAndCapture(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n proxyBaseUrl: string;\n pathRewrite: (p: string) => string;\n shouldSave: boolean;\n method: string;\n pathname: string;\n mockDir: string;\n onMockSaved: () => void;\n },\n): void {\n const { proxyBaseUrl, pathRewrite, shouldSave, method, pathname, mockDir, onMockSaved } = options;\n const targetUrl = proxyBaseUrl + pathRewrite(req.url || \"\");\n const client = targetUrl.startsWith(\"https\") ? https : http;\n\n function sendProxyRequest(body?: string) {\n const targetUrlObj = new URL(proxyBaseUrl);\n const proxyOptions = {\n method: req.method,\n headers: {\n ...req.headers,\n host: targetUrlObj.host,\n },\n rejectUnauthorized: false,\n };\n\n const proxyReq = client.request(targetUrl, proxyOptions, (proxyRes) => {\n const contentType = proxyRes.headers[\"content-type\"] || \"\";\n const isJson = contentType.includes(\"application/json\");\n\n // Non-JSON response (file download, stream, etc.) → pipe directly\n if (!isJson) {\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n proxyRes.pipe(res);\n return;\n }\n\n // JSON response → buffer, save mock, then respond\n const chunks: Buffer[] = [];\n\n proxyRes.on(\"data\", (chunk) => chunks.push(chunk));\n proxyRes.on(\"end\", async () => {\n try {\n const responseData = Buffer.concat(chunks);\n\n if (shouldSave) {\n try {\n console.log(\n `[automock] Capturing mock: ${req.url!} -> ${pathname}`,\n );\n const savedFilePath = await saveMockData(\n req.url!,\n method,\n responseData,\n mockDir,\n proxyRes.statusCode,\n contentType,\n );\n if (savedFilePath) {\n console.log(`[automock] Mock saved: ${pathname}`);\n onMockSaved();\n } else {\n console.log(\n `[automock] Mock file already exists, skipped: ${pathname}`,\n );\n }\n } catch (saveError) {\n console.error(\"[automock] Failed to save mock:\", saveError);\n }\n }\n\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n res.end(responseData);\n } catch (error) {\n console.error(\"[automock] Failed to process response:\", error);\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n res.end(Buffer.concat(chunks));\n }\n });\n });\n\n proxyReq.on(\"error\", (err) => {\n console.error(\"[automock] Proxy request failed:\", err);\n sendError(res, err.message);\n });\n\n if (\n body &&\n (req.method === \"POST\" || req.method === \"PUT\" || req.method === \"PATCH\")\n ) {\n proxyReq.write(body);\n }\n\n proxyReq.end();\n }\n\n if (\n req.method === \"POST\" ||\n req.method === \"PUT\" ||\n req.method === \"PATCH\"\n ) {\n let bodyStr = \"\";\n req.on(\"data\", (chunk) => (bodyStr += chunk.toString()));\n req.on(\"end\", () => sendProxyRequest(bodyStr));\n } else {\n sendProxyRequest();\n }\n}\n\nfunction printServerUrls(\n server: { httpServer?: { address(): AddressInfo | string | null; once(event: string, cb: () => void): void } | null; config: { server: { https?: unknown } } },\n urls: Array<{ path: string; label: string; color: string; delay: number }>,\n): void {\n server.httpServer?.once(\"listening\", () => {\n const address = server.httpServer?.address();\n if (!address || typeof address !== \"object\") return;\n\n const { protocol, host, port } = getServerAddress(\n address,\n !!server.config.server.https,\n );\n\n for (const { path: urlPath, label, color, delay } of urls) {\n setTimeout(() => {\n const fullUrl = `${protocol}://${host}:${port}${urlPath}`;\n console.log(` ➜ ${color}${label}\\x1b[0m: \\x1b[1m${fullUrl}\\x1b[0m`);\n }, delay);\n }\n });\n}\n\nexport function automock(options: AutomockPluginOptions): Plugin {\n const {\n mockDir: configMockDir = path.join(process.cwd(), \"mock\"),\n apiPrefix = \"/api\",\n pathRewrite = (p) => p,\n proxyBaseUrl,\n inspector = false,\n enabled = true,\n proxy: proxyEnabled = true,\n capture: captureEnabled = true,\n } = options;\n\n const mockDir = resolveAbsolutePath(configMockDir);\n\n if (!fs.existsSync(mockDir)) {\n try {\n fs.ensureDirSync(mockDir);\n console.log(`[automock] Mock directory created: ${mockDir}`);\n } catch (error) {\n console.error(`[automock] Failed to create mock directory: ${mockDir}`, error);\n }\n }\n\n let watcher: FSWatcher | undefined;\n\n return {\n name: \"vite-plugin-automock\",\n config(userConfig) {\n if (proxyBaseUrl && userConfig.server?.proxy) {\n const proxyConfig = userConfig.server.proxy;\n const hasConflictingPrefix =\n typeof proxyConfig === \"object\" && apiPrefix in proxyConfig;\n\n if (hasConflictingPrefix) {\n console.warn(\n `\\n⚠️ [automock] WARNING: You have both Vite's server.proxy[\"${apiPrefix}\"] and automock's proxyBaseUrl configured.`,\n );\n console.warn(\n ` This may cause request conflicts. Remove the \"${apiPrefix}\" entry from vite.config.ts server.proxy to avoid issues.`,\n );\n console.warn(\n ` Automock will handle all ${apiPrefix} requests when proxyBaseUrl is set.\\n`,\n );\n }\n }\n },\n async configureServer(server) {\n let mockFileMap = await buildMockIndex(mockDir);\n console.log(`[automock] Loaded ${mockFileMap.size} mock files`);\n\n const rebuildMockFileMap = debounce(async () => {\n mockFileMap = await buildMockIndex(mockDir);\n }, 200);\n\n watcher = chokidar.watch(mockDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 30,\n });\n watcher.on(\"add\", () => rebuildMockFileMap());\n watcher.on(\"unlink\", () => rebuildMockFileMap());\n\n server.httpServer?.on(\"close\", () => watcher?.close());\n\n const inspectorHandler = createInspectorHandler({\n inspector,\n apiPrefix,\n mockDir,\n getMockFileMap: () => mockFileMap,\n });\n\n const urlsToPrint: Array<{ path: string; label: string; color: string; delay: number }> = [\n { path: apiPrefix, label: \"Mock API\", color: \"\\x1b[32m\", delay: 100 },\n ];\n\n if (inspector) {\n const inspectorConfig = normalizeInspectorConfig(inspector);\n urlsToPrint.push({\n path: inspectorConfig.route,\n label: \"Mock Inspector\",\n color: \"\\x1b[95m\",\n delay: 150,\n });\n }\n\n printServerUrls(server, urlsToPrint);\n\n async function tryLoadMock(key: string): Promise<{ absolutePath: string; mockResult: Record<string, unknown> } | null> {\n const mockFilePath = mockFileMap.get(key);\n if (!mockFilePath) return null;\n\n const absolutePath = resolveAbsolutePath(mockFilePath);\n if (!fs.existsSync(absolutePath)) return null;\n\n const { default: mockModule } = await import(\n `${absolutePath}?t=${Date.now()}`\n );\n const mockResult =\n typeof mockModule.data === \"function\"\n ? mockModule.data()\n : mockModule;\n\n const { enable = true } = mockResult || {};\n return enable ? { absolutePath, mockResult } : null;\n }\n\n server.middlewares.use(\n async (\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: Error | unknown) => void,\n ): Promise<void> => {\n // Global switch: skip all mock handling\n if (!enabled) return next();\n\n if (inspectorHandler && req.url) {\n const handled = await inspectorHandler(req, res);\n if (handled) return;\n }\n\n if (!req.url?.startsWith(apiPrefix)) {\n return next();\n }\n\n // Skip non-standard requests (SSE, WebSocket, file streams)\n const accept = req.headers.accept || \"\";\n const upgrade = req.headers.upgrade || \"\";\n if (accept.includes(\"text/event-stream\") || upgrade.toLowerCase() === \"websocket\") {\n return next();\n }\n\n const method = (req.method || \"GET\").toLowerCase();\n const pathname = new URL(req.url, \"http://localhost\").pathname;\n const key = `${pathname}/${method}.js`.toLowerCase();\n\n // 1. Try mock\n try {\n const mock = await tryLoadMock(key);\n if (mock) {\n serveMockResponse(res, mock.absolutePath, mock.mockResult);\n return;\n }\n } catch (error) {\n console.error(\"[automock] Failed to load mock file:\", error);\n }\n\n // 2. Try proxy\n if (!proxyBaseUrl || !proxyEnabled) return next();\n\n try {\n proxyAndCapture(req, res, {\n proxyBaseUrl,\n pathRewrite,\n shouldSave: captureEnabled && !mockFileMap.has(key),\n method,\n pathname,\n mockDir,\n onMockSaved: async () => {\n mockFileMap = await buildMockIndex(mockDir);\n },\n });\n } catch (error) {\n console.error(\"[automock] Proxy request error:\", error);\n sendError(res, \"Internal server error\");\n }\n },\n );\n },\n closeBundle() {\n watcher?.close();\n },\n transform() {\n return null;\n },\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prettier from \"prettier\";\n\nimport { resolveAbsolutePath, toPosixPath } from \"./utils\";\n\nexport interface MockFileConfig {\n enable: boolean;\n data: unknown;\n delay: number;\n status: number;\n [key: string]: unknown;\n}\n\nexport interface MockFileInfo {\n config: MockFileConfig;\n serializable: boolean;\n hasDynamicData: boolean;\n headerComment?: string;\n description?: string;\n dataText: string;\n isBinary?: boolean;\n}\n\nexport const DEFAULT_CONFIG: MockFileConfig = {\n enable: true,\n data: null,\n delay: 0,\n status: 200,\n};\n\nconst isBufferTextLike = (buffer: Buffer): boolean => {\n try {\n const sample = buffer.slice(0, 100);\n const nullBytes = [...sample].filter((b) => b === 0).length;\n const controlChars = [...sample].filter(\n (b) => b < 32 && b !== 9 && b !== 10 && b !== 13,\n ).length;\n return nullBytes === 0 && controlChars < 5;\n } catch {\n return false;\n }\n};\n\nconst isBinaryResponse = (\n contentType: string | undefined,\n data: Buffer,\n): boolean => {\n if (!contentType) return false;\n\n const binaryTypes = [\n \"application/octet-stream\",\n \"application/pdf\",\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"image/\",\n \"video/\",\n \"audio/\",\n ];\n\n return (\n binaryTypes.some((type) => contentType.toLowerCase().includes(type)) ||\n !isBufferTextLike(data)\n );\n};\n\nconst getFileExtension = (\n contentType: string | undefined,\n url: string,\n): string => {\n const mimeMap: Record<string, string> = {\n \"application/json\": \"json\",\n \"application/pdf\": \"pdf\",\n \"application/zip\": \"zip\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n \"image/jpeg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"text/plain\": \"txt\",\n \"text/html\": \"html\",\n \"text/css\": \"css\",\n \"application/javascript\": \"js\",\n \"text/xml\": \"xml\",\n };\n\n if (contentType && mimeMap[contentType.toLowerCase()]) {\n return mimeMap[contentType.toLowerCase()];\n }\n\n try {\n const urlObj = new URL(url, \"http://localhost\");\n const fileName = urlObj.searchParams.get(\"file_name\");\n if (fileName) {\n const extensionMatch = fileName.match(/\\.([a-zA-Z0-9]+)$/);\n if (extensionMatch) {\n return extensionMatch[1];\n }\n }\n } catch {\n // Ignore URL parse errors\n }\n\n return \"bin\";\n};\n\nasync function formatWithPrettier(content: string): Promise<string> {\n try {\n return await prettier.format(content, { parser: \"babel\" });\n } catch {\n return content;\n }\n}\n\nfunction buildMockFileHeader(\n pathname: string,\n method: string,\n search: string,\n extra?: string,\n): string {\n return `/**\n * Mock data for ${pathname} (${method.toUpperCase()})${search || \"\"}\n * @description ${pathname}${search || \"\"}${extra ? ` - ${extra}` : \"\"}\n * Generated at ${new Date().toISOString()}\n */`;\n}\n\nasync function saveBinaryMock(\n filePath: string,\n binaryData: Buffer,\n pathname: string,\n method: string,\n search: string,\n contentType: string | undefined,\n url: string,\n statusCode: number | undefined,\n): Promise<string | null> {\n const extension = getFileExtension(contentType, url);\n const binaryFilePath = filePath.replace(/\\.js$/, \".\" + extension);\n\n if (fs.existsSync(binaryFilePath)) return null;\n\n fs.writeFileSync(binaryFilePath, binaryData);\n\n const header = buildMockFileHeader(pathname, method, search, `Binary file (${extension})`);\n const configContent = `${header}\nexport default {\n enable: false,\n data: {\n __binaryFile: '${extension}',\n __originalPath: '${pathname}',\n __originalQuery: '${search}',\n __originalUrl: '${pathname}${search || \"\"}',\n __contentType: '${contentType}',\n __fileSize: ${binaryData.length}\n },\n delay: 0,\n status: ${statusCode || 200}\n}`;\n\n const formatted = await formatWithPrettier(configContent);\n fs.writeFileSync(filePath, formatted, \"utf-8\");\n return filePath;\n}\n\nasync function saveJsonMock(\n filePath: string,\n dataStr: string,\n pathname: string,\n method: string,\n search: string,\n statusCode: number | undefined,\n): Promise<string | null> {\n if (fs.existsSync(filePath)) return null;\n\n let jsonData;\n if (!dataStr || dataStr.trim() === \"\") {\n jsonData = {\n error: true,\n message: `Empty response (${statusCode || \"unknown status\"})`,\n status: statusCode || 404,\n data: null,\n };\n } else {\n try {\n jsonData = JSON.parse(dataStr);\n if (statusCode && statusCode >= 400) {\n const errorMeta = { __mockStatusCode: statusCode, __isErrorResponse: true };\n jsonData =\n typeof jsonData === \"object\" && jsonData !== null\n ? { ...jsonData, ...errorMeta }\n : { originalData: jsonData, ...errorMeta };\n }\n } catch {\n jsonData = {\n error: true,\n message: `Non-JSON response (${statusCode || \"unknown status\"})`,\n status: statusCode || 404,\n data: dataStr,\n __mockStatusCode: statusCode,\n __isErrorResponse: true,\n };\n }\n }\n\n const header = buildMockFileHeader(pathname, method, search);\n const content = `${header}\nexport default {\n enable: false,\n data: ${JSON.stringify(jsonData)},\n delay: 0,\n status: ${statusCode || 200}\n}`;\n\n const formatted = await formatWithPrettier(content);\n fs.writeFileSync(filePath, formatted, \"utf-8\");\n return filePath;\n}\n\nexport async function saveMockData(\n url: string,\n method: string,\n data: Buffer | string,\n rootDir: string,\n statusCode?: number,\n contentType?: string,\n): Promise<string | null> {\n try {\n const absoluteRootDir = resolveAbsolutePath(rootDir);\n const urlObj = new URL(url, \"http://localhost\");\n const pathname = urlObj.pathname;\n const search = urlObj.search;\n\n const filePath = path.join(\n absoluteRootDir,\n pathname.replace(/^\\//, \"\"),\n method.toLowerCase() + \".js\",\n );\n\n await fs.ensureDir(path.dirname(filePath));\n\n const isBuffer = Buffer.isBuffer(data);\n const binaryData = isBuffer ? data : Buffer.from(data || \"\");\n const isBinary = isBinaryResponse(contentType, binaryData);\n\n if (isBinary) {\n return saveBinaryMock(\n filePath, binaryData, pathname, method, search,\n contentType, url, statusCode,\n );\n }\n\n const dataStr = isBuffer ? data.toString(\"utf8\") : data || \"\";\n return saveJsonMock(filePath, dataStr, pathname, method, search, statusCode);\n } catch (error) {\n console.error(`Failed to save mock data for ${url}:`, error);\n console.error(\n `URL details: url=${url}, method=${method}, statusCode=${statusCode}, contentType=${contentType}`,\n );\n throw error;\n }\n}\n\nconst recursiveReadAllFiles = async (dir: string): Promise<string[]> => {\n if (!(await fs.pathExists(dir))) return [];\n\n const files: string[] = [];\n try {\n const list = await fs.readdir(dir);\n for (const file of list) {\n const filePath = path.join(dir, file);\n const stat = await fs.stat(filePath);\n if (stat.isDirectory()) {\n files.push(...(await recursiveReadAllFiles(filePath)));\n } else {\n files.push(filePath);\n }\n }\n } catch (error) {\n console.error(`Error reading directory ${dir}:`, error);\n }\n return files;\n};\n\nexport async function buildMockIndex(mockDir: string): Promise<Map<string, string>> {\n const mockFileMap = new Map<string, string>();\n\n if (!(await fs.pathExists(mockDir))) {\n await fs.ensureDir(mockDir);\n return mockFileMap;\n }\n\n const files = await recursiveReadAllFiles(mockDir);\n\n files.forEach((filePath) => {\n if (!filePath.endsWith(\".js\")) return;\n\n try {\n const relativePath = path.relative(mockDir, filePath);\n const method = path.basename(filePath, \".js\");\n const dirPath = path.dirname(relativePath);\n const urlPath = \"/\" + toPosixPath(dirPath);\n const absolutePath = resolveAbsolutePath(filePath);\n const key = `${urlPath}/${method}.js`.toLowerCase();\n\n mockFileMap.set(key, absolutePath);\n } catch (error) {\n console.error(`[automock] Failed to process file ${filePath}:`, error);\n }\n });\n\n return mockFileMap;\n}\n\nexport async function parseMockModule(filePath: string): Promise<MockFileInfo> {\n const absolutePath = resolveAbsolutePath(filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Mock file does not exist: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n const headerCommentMatch = content.match(/^(\\/\\*\\*[\\s\\S]*?\\*\\/)/);\n const headerComment = headerCommentMatch ? headerCommentMatch[1] : undefined;\n\n let description: string | undefined;\n if (headerComment) {\n const descMatch = headerComment.match(/@description\\s+(.+?)(?:\\n|\\*\\/)/s);\n if (descMatch) {\n description = descMatch[1].trim();\n }\n }\n\n const { default: mockModule } = await import(\n `${absolutePath}?t=${Date.now()}`\n );\n\n const exportedConfig =\n typeof mockModule === \"function\" ? mockModule() : mockModule;\n const hasDynamicData = typeof exportedConfig?.data === \"function\";\n const config: MockFileConfig = {\n ...DEFAULT_CONFIG,\n ...(exportedConfig ?? {}),\n };\n\n const serializable = !hasDynamicData;\n const dataObj =\n typeof config.data === \"object\" && config.data !== null\n ? (config.data as Record<string, unknown>)\n : null;\n const isBinary = dataObj !== null && \"__binaryFile\" in dataObj;\n\n return {\n config,\n serializable,\n hasDynamicData,\n headerComment,\n description,\n dataText: isBinary\n ? `/* Binary file: ${dataObj?.__binaryFile} */`\n : serializable\n ? JSON.stringify(config.data ?? null, null, 2)\n : \"/* data is generated dynamically and cannot be edited here */\",\n isBinary,\n };\n}\n\nexport async function writeMockFile(\n filePath: string,\n mockInfo: Pick<MockFileInfo, \"config\" | \"headerComment\" | \"description\">,\n): Promise<void> {\n const absolutePath = resolveAbsolutePath(filePath);\n\n let header = mockInfo.headerComment || \"\";\n\n if (mockInfo.description !== undefined) {\n if (header) {\n if (/@description/.test(header)) {\n header = header.replace(\n /@description\\s+.+?(?=\\n|\\*\\/)/s,\n `@description ${mockInfo.description}`,\n );\n } else {\n header = header.replace(\n /\\*\\//,\n ` * @description ${mockInfo.description}\\n */`,\n );\n }\n }\n }\n\n const content = header ? `${header}\\n` : \"\";\n const finalContent = `${content}export default ${JSON.stringify(mockInfo.config, null, 2)}\\n`;\n\n try {\n const formatted = await formatWithPrettier(finalContent);\n fs.writeFileSync(absolutePath, formatted, \"utf-8\");\n } catch {\n console.error(\"Error formatting code with prettier, writing raw content\");\n fs.writeFileSync(absolutePath, finalContent, \"utf-8\");\n }\n}\n","import path from \"path\";\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { AddressInfo } from \"net\";\n\nexport function resolveAbsolutePath(p: string): string {\n return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);\n}\n\nexport function toPosixPath(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\nexport interface ServerAddress {\n protocol: string;\n host: string;\n port: number;\n}\n\nexport function getServerAddress(\n address: AddressInfo,\n isHttps: boolean,\n): ServerAddress {\n return {\n protocol: isHttps ? \"https\" : \"http\",\n host:\n address.address === \"::\" || address.address === \"0.0.0.0\"\n ? \"localhost\"\n : address.address,\n port: address.port,\n };\n}\n\nexport function sendJson(\n res: ServerResponse,\n data: unknown,\n status = 200,\n): void {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.statusCode = status;\n res.end(typeof data === \"string\" ? data : JSON.stringify(data));\n}\n\nexport function sendError(\n res: ServerResponse,\n message: string,\n status = 500,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nconst MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB\n\nexport function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n req.on(\"data\", (chunk: Buffer) => {\n totalSize += chunk.length;\n if (totalSize > MAX_BODY_SIZE) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { fileURLToPath } from \"url\";\n\n// ESM/CJS compatible __dirname\nconst _dirName = typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\nimport { parseMockModule, writeMockFile, saveMockData, buildMockIndex, type MockFileConfig } from \"./mockFileUtils\";\nimport { toPosixPath, sendJson, readBody } from \"./utils\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { AutomockPluginOptions, InspectorOptions } from \"./types\";\n\ninterface InspectorContext {\n req: IncomingMessage;\n res: ServerResponse;\n mockDir: string;\n inspectorRoute: string;\n apiPrefix: string;\n inspectorConfig: Required<InspectorOptions>;\n getMockFileMap: () => Map<string, string>;\n}\n\ninterface InspectorHandlerOptions {\n inspector: AutomockPluginOptions[\"inspector\"];\n apiPrefix: string;\n mockDir: string;\n getMockFileMap: () => Map<string, string>;\n}\n\ninterface InspectorApiContext extends InspectorContext {\n pathname: string;\n}\n\ninterface InspectorPayload {\n key: string;\n config?: Partial<MockFileConfig>;\n description?: string;\n}\n\ninterface MockItem {\n key: string;\n file: string;\n method: string;\n path: string;\n config: MockFileConfig;\n editable: boolean;\n description?: string;\n dataText: string;\n}\n\nfunction buildMockItem(\n key: string,\n filePath: string,\n mockDir: string,\n info: Awaited<ReturnType<typeof parseMockModule>>,\n): MockItem {\n return {\n key,\n file: path.relative(mockDir, filePath),\n method: key.split(\"/\").pop()?.replace(/\\.js$/, \"\") ?? \"get\",\n path: key.replace(/\\/[^/]+\\.js$/, \"\"),\n config: info.config,\n editable: info.serializable,\n description: info.description,\n dataText: info.dataText,\n };\n}\n\nexport const DEFAULT_ROUTE = \"/__mock/\";\n\nfunction ensureTrailingSlash(route: string): string {\n return route.endsWith(\"/\") ? route : `${route}/`;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nexport function normalizeInspectorConfig(\n input: AutomockPluginOptions[\"inspector\"],\n): Required<InspectorOptions> {\n if (input === false || input === undefined) {\n return { route: DEFAULT_ROUTE, enableToggle: true };\n }\n if (input === true) {\n return { route: DEFAULT_ROUTE, enableToggle: true };\n }\n return {\n route: ensureTrailingSlash(input.route ?? DEFAULT_ROUTE),\n enableToggle: input.enableToggle ?? true,\n };\n}\n\nexport type InspectorRequestHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n) => Promise<boolean>;\n\nexport function createInspectorHandler(\n options: InspectorHandlerOptions,\n): InspectorRequestHandler | null {\n if (!options.inspector) {\n return null;\n }\n\n const inspectorConfig = normalizeInspectorConfig(options.inspector);\n const inspectorRoute = ensureTrailingSlash(inspectorConfig.route);\n\n return async (req, res) => {\n if (!req.url) {\n return false;\n }\n const url = new URL(req.url, \"http://localhost\");\n if (!url.pathname.startsWith(inspectorRoute)) {\n return false;\n }\n\n await handleInspectorRequest({\n req,\n res,\n mockDir: options.mockDir,\n inspectorRoute,\n apiPrefix: options.apiPrefix,\n inspectorConfig,\n getMockFileMap: options.getMockFileMap,\n });\n\n return true;\n };\n}\n\nasync function handleInspectorRequest(\n context: InspectorContext,\n): Promise<void> {\n const { req, res, inspectorRoute } = context;\n const url = new URL(req.url || inspectorRoute, \"http://localhost\");\n const normalizedRoute = ensureTrailingSlash(inspectorRoute);\n\n if (\n url.pathname === normalizedRoute.slice(0, -1) ||\n url.pathname === normalizedRoute\n ) {\n await serveInspectorHtml(context);\n return;\n }\n\n const relativePath = url.pathname.startsWith(normalizedRoute)\n ? url.pathname.slice(normalizedRoute.length)\n : null;\n\n if (relativePath && relativePath.startsWith(\"api/\")) {\n await handleInspectorApi({ ...context, pathname: relativePath.slice(4) });\n return;\n }\n\n res.statusCode = 404;\n res.end(\"Not Found\");\n}\n\nasync function serveInspectorHtml({\n res,\n inspectorRoute,\n apiPrefix,\n inspectorConfig,\n}: InspectorContext): Promise<void> {\n const routeJson = JSON.stringify(ensureTrailingSlash(inspectorRoute));\n const allowToggleJson = JSON.stringify(inspectorConfig.enableToggle);\n const apiPrefixEscaped = escapeHtml(apiPrefix);\n\n const templatePath = path.join(_dirName, \"inspector-template.html\");\n const template = fs.readFileSync(templatePath, \"utf-8\");\n const html = template\n .replace(\"__API_PREFIX__\", apiPrefixEscaped)\n .replace(\"__ROUTE_JSON__\", routeJson)\n .replace(\"__ALLOW_TOGGLE_JSON__\", allowToggleJson);\n\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n res.end(html);\n}\n\nasync function handleList(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { res, mockDir } = ctx;\n const list = await Promise.all(\n Array.from(mockFileMap.entries()).map(async ([key, filePath]) => {\n const info = await parseMockModule(filePath);\n return buildMockItem(key, filePath, mockDir, info);\n }),\n );\n sendJson(res, { mocks: list });\n return true;\n}\n\nasync function handleDetail(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir } = ctx;\n const url = new URL(req.url || \"\", \"http://localhost\");\n const key = url.searchParams.get(\"key\");\n if (!key) {\n sendJson(res, { error: \"Missing key\" }, 400);\n return true;\n }\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n const info = await parseMockModule(filePath);\n sendJson(res, { mock: buildMockItem(key, filePath, mockDir, info) });\n return true;\n}\n\nasync function handleUpdate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir, inspectorConfig } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: InspectorPayload;\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const { key, config, description } = payload || {};\n if (!key) {\n sendJson(res, { error: \"Invalid payload: missing key\" }, 400);\n return true;\n }\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n\n const info = await parseMockModule(filePath);\n\n let nextConfig = info.config;\n if (config && typeof config === \"object\") {\n if (!inspectorConfig.enableToggle && config.enable !== undefined) {\n delete config.enable;\n }\n nextConfig = { ...info.config, ...config };\n }\n\n const nextDescription =\n description !== undefined ? description : info.description;\n\n await writeMockFile(filePath, {\n headerComment: info.headerComment,\n config: nextConfig,\n description: nextDescription,\n });\n\n const updatedInfo = await parseMockModule(filePath);\n sendJson(res, { mock: buildMockItem(key, filePath, mockDir, updatedInfo) });\n return true;\n}\n\nasync function handleCreate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir, apiPrefix } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: { method: string; path: string; description?: string; data?: unknown };\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const { method, path: apiPath, data } = payload || {};\n if (!method || !apiPath) {\n sendJson(res, { error: \"Invalid payload: missing method or path\" }, 400);\n return true;\n }\n\n const fullUrl = apiPrefix + apiPath;\n\n try {\n let dataToSave: Buffer | string;\n if (typeof data === \"object\" && data !== null) {\n dataToSave = JSON.stringify(data, null, 2);\n } else {\n dataToSave = typeof data === \"string\" ? data : \"\";\n }\n\n await saveMockData(fullUrl, method.toLowerCase(), dataToSave, mockDir, 200);\n\n const newMockFileMap = await buildMockIndex(mockDir);\n for (const [key, value] of newMockFileMap.entries()) {\n mockFileMap.set(key, value);\n }\n\n const normalizedPath = toPosixPath(apiPath);\n const key = (normalizedPath.startsWith(\"/\") ? \"\" : \"/\") +\n normalizedPath.toLowerCase() + \"/\" + method.toLowerCase() + \".js\";\n const filePath = mockFileMap.get(key);\n\n if (!filePath) {\n sendJson(res, { error: \"Mock file created but not found in map\" }, 500);\n return true;\n }\n\n const info = await parseMockModule(filePath);\n sendJson(res, {\n success: true,\n mock: buildMockItem(key, filePath, mockDir, info),\n });\n return true;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n sendJson(res, { error: \"Failed to create mock: \" + errorMessage }, 500);\n return true;\n }\n}\n\nasync function handleDelete(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res } = ctx;\n const url = new URL(req.url || \"\", \"http://localhost\");\n const key = url.searchParams.get(\"key\");\n if (!key) {\n sendJson(res, { error: \"Missing key\" }, 400);\n return true;\n }\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n\n try {\n const stats = await fs.stat(filePath);\n if (stats.isDirectory()) {\n await fs.remove(filePath);\n for (const [mapKey, mapPath] of mockFileMap.entries()) {\n if (mapPath.startsWith(filePath + path.sep) || mapPath === filePath) {\n mockFileMap.delete(mapKey);\n }\n }\n } else {\n await fs.unlink(filePath);\n mockFileMap.delete(key);\n }\n sendJson(res, { success: true });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n sendJson(res, { error: \"Failed to delete: \" + errorMessage }, 500);\n }\n return true;\n}\n\ntype ApiHandler = (ctx: InspectorApiContext, mockFileMap: Map<string, string>) => Promise<boolean>;\n\nasync function handleBatchUpdate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: { updates?: Array<{ key: string; config?: Record<string, unknown> }> };\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const updates = payload?.updates;\n if (!Array.isArray(updates) || updates.length === 0) {\n sendJson(res, { error: \"Invalid payload: updates must be a non-empty array\" }, 400);\n return true;\n }\n\n let updated = 0;\n const errors: string[] = [];\n\n for (const item of updates) {\n const { key, config } = item;\n if (!key) continue;\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n errors.push(`Mock not found: ${key}`);\n continue;\n }\n\n try {\n const info = await parseMockModule(filePath);\n const nextConfig = config ? { ...info.config, ...config } : info.config;\n\n await writeMockFile(filePath, {\n headerComment: info.headerComment,\n config: nextConfig,\n description: info.description,\n });\n updated++;\n } catch (err) {\n errors.push(`Failed to update ${key}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n sendJson(res, { success: true, updated, errors: errors.length > 0 ? errors : undefined });\n return true;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n list: handleList,\n detail: handleDetail,\n update: handleUpdate,\n \"batch-update\": handleBatchUpdate,\n create: handleCreate,\n delete: handleDelete,\n};\n\nasync function handleInspectorApi(ctx: InspectorApiContext): Promise<void> {\n try {\n const mockFileMap = ctx.getMockFileMap();\n const handler = API_ROUTES[ctx.pathname];\n if (handler) {\n await handler(ctx, mockFileMap);\n return;\n }\n sendJson(ctx.res, { error: \"Unknown inspector endpoint\" }, 404);\n } catch (error) {\n console.error(\"[automock] Inspector request failed:\", error);\n sendJson(ctx.res, { error: \"Inspector failed\" }, 500);\n }\n}\n","import path from 'path'\nimport fs from 'fs-extra'\n\nimport { buildMockIndex, parseMockModule } from './mockFileUtils'\n\nexport interface MockBundleData {\n enable: boolean\n data: unknown\n delay: number\n status: number\n isBinary?: boolean\n}\n\nexport interface MockBundle {\n [key: string]: MockBundleData\n}\n\nexport interface BundleOptions {\n mockDir: string\n includeDisabled?: boolean\n log?: boolean\n}\n\nconst DEFAULT_BUNDLE_OPTIONS: Partial<BundleOptions> = {\n includeDisabled: true,\n log: true\n}\n\nasync function bundleMockFiles(options: BundleOptions): Promise<MockBundle> {\n const opts = { ...DEFAULT_BUNDLE_OPTIONS, ...options }\n const { mockDir, log } = opts\n\n if (!fs.existsSync(mockDir)) {\n if (log) {\n console.log(`[mock-bundler] Mock directory does not exist: ${mockDir}`)\n }\n return {}\n }\n\n const mockFileMap = await buildMockIndex(mockDir)\n const bundle: MockBundle = {}\n let bundledCount = 0\n let skippedCount = 0\n\n for (const [key, filePath] of mockFileMap) {\n try {\n const mockInfo = await parseMockModule(filePath)\n\n if (!mockInfo.serializable) {\n skippedCount++\n if (log) {\n console.log(`[mock-bundler] Skipping non-serializable mock: ${key}`)\n }\n continue\n }\n\n bundle[key] = {\n enable: mockInfo.config.enable,\n data: mockInfo.config.data,\n delay: mockInfo.config.delay,\n status: mockInfo.config.status,\n isBinary: mockInfo.isBinary\n }\n\n bundledCount++\n } catch (error) {\n if (log) {\n console.error(`[mock-bundler] Failed to bundle mock ${key}:`, error)\n }\n }\n }\n\n if (log) {\n console.log(`[mock-bundler] Bundled ${bundledCount} mocks, skipped ${skippedCount} non-serializable mocks`)\n }\n\n return bundle\n}\n\nfunction writeMockBundle(bundle: MockBundle, outputPath: string): void {\n const outputDir = path.dirname(outputPath)\n\n if (!fs.existsSync(outputDir)) {\n fs.ensureDirSync(outputDir)\n }\n\n fs.writeFileSync(\n outputPath,\n JSON.stringify(bundle, null, 2),\n 'utf-8'\n )\n}\n\nexport { bundleMockFiles, writeMockBundle }\n"],"mappings":"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","names":["path","fs","path","fs","path","path","path","fs","path","fs","key","fs","path","path","fs","fs","path","automock","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/middleware.ts","../src/mockFileUtils.ts","../src/utils.ts","../src/inspector.ts","../src/mockBundler.ts"],"sourcesContent":["import path from 'path'\nimport fs from 'fs-extra'\n\nimport { automock as createAutomockPlugin } from './middleware'\nimport { bundleMockFiles, writeMockBundle } from './mockBundler'\nimport { buildMockIndex } from './mockFileUtils'\nimport type { Plugin } from 'vite'\nimport type { AutomockPluginOptions } from './types'\nimport type { MockBundle } from './mockBundler'\n\nexport type { AutomockPluginOptions, InspectorOptions } from './types'\nexport { saveMockData, buildMockIndex, parseMockModule, writeMockFile } from './mockFileUtils'\nexport type { MockBundle, MockBundleData } from './mockBundler'\nexport { bundleMockFiles, writeMockBundle } from './mockBundler'\n\n// Client interceptor exports\nexport {\n createMockInterceptor,\n initMockInterceptor,\n initMockInterceptorForPureHttp,\n setMockEnabled,\n isMockEnabled,\n loadMockData,\n registerHttpInstance\n} from './client'\nexport type { MockInterceptorOptions, MockBundleData as ClientMockBundleData } from './client/interceptor'\n\nexport interface AutomockWithBundleOptions extends AutomockPluginOptions {\n bundleMockData?: boolean\n bundleOutputPath?: string\n}\n\nfunction resolveProductionMockEnabled(\n productionMock: AutomockPluginOptions['productionMock'],\n mode = process.env.NODE_ENV\n): boolean {\n if (productionMock === true) return true\n if (productionMock === 'auto') return mode !== 'production'\n return false\n}\n\nexport function automock(options: AutomockWithBundleOptions = {}): Plugin {\n const {\n bundleMockData = true,\n bundleOutputPath = 'public/mock-data.json',\n ...pluginOptions\n } = options\n\n const basePlugin = createAutomockPlugin(pluginOptions)\n\n let cachedBundle: MockBundle | null = null\n let productionMockEnabled = resolveProductionMockEnabled(pluginOptions.productionMock)\n\n const resolveBundleOutputPath = () =>\n path.isAbsolute(bundleOutputPath)\n ? bundleOutputPath\n : path.join(process.cwd(), bundleOutputPath)\n\n const ensureBundleExists = () => {\n const outputPath = resolveBundleOutputPath()\n if (!fs.existsSync(outputPath) && cachedBundle) {\n console.log('[automock] Re-writing mock bundle...')\n writeMockBundle(cachedBundle, outputPath)\n }\n }\n\n return {\n ...basePlugin,\n name: 'vite-plugin-automock-with-bundle',\n config(userConfig, env) {\n if (typeof basePlugin.config === 'function') {\n basePlugin.config.call(this, userConfig, env)\n }\n // Inject compile-time constant for client interceptor\n productionMockEnabled = resolveProductionMockEnabled(\n pluginOptions.productionMock,\n env.mode\n )\n return {\n define: {\n __AUTOMOCK_ENABLED__: JSON.stringify(productionMockEnabled),\n },\n }\n },\n buildEnd: async () => {\n if (bundleMockData && productionMockEnabled) {\n try {\n const mockDir = pluginOptions.mockDir || path.join(process.cwd(), 'mock')\n\n if (!fs.existsSync(mockDir)) {\n console.log('[automock] Mock directory not found, skipping bundle generation')\n console.log('[automock] Using existing mock-data.json if present')\n return\n }\n\n const mockFileMap = await buildMockIndex(mockDir)\n if (mockFileMap.size === 0) {\n console.log('[automock] No mock files found, skipping bundle generation')\n return\n }\n\n cachedBundle = await bundleMockFiles({ mockDir })\n\n const outputPath = resolveBundleOutputPath()\n writeMockBundle(cachedBundle, outputPath)\n console.log(`[automock] Mock bundle written to: ${outputPath}`)\n } catch (error) {\n console.error('[automock] Failed to bundle mock data:', error)\n }\n }\n },\n writeBundle: ensureBundleExists,\n closeBundle: ensureBundleExists,\n }\n}\n","import chokidar from \"chokidar\";\nimport debounce from \"lodash.debounce\";\nimport path from \"path\";\nimport fs from \"fs-extra\";\nimport http from \"http\";\nimport https from \"https\";\nimport type { AddressInfo } from \"net\";\n\nimport { buildMockIndex, saveMockData } from \"./mockFileUtils\";\nimport { createInspectorHandler, normalizeInspectorConfig } from \"./inspector\";\nimport {\n resolveAbsolutePath,\n getServerAddress,\n sendError,\n} from \"./utils\";\n\nimport type { Plugin } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { FSWatcher } from \"chokidar\";\nimport type { AutomockPluginOptions } from \"./types\";\n\nfunction serveMockResponse(\n res: ServerResponse,\n mockFilePath: string,\n mockResult: { data?: unknown; delay?: number; status?: number },\n): void {\n const { data, delay = 0, status = 200 } = mockResult;\n\n setTimeout(() => {\n const isBinaryMock = data && typeof data === \"object\" && (data as Record<string, unknown>).__binaryFile;\n\n if (isBinaryMock) {\n const binaryData = data as Record<string, unknown>;\n const binaryFilePath = mockFilePath.replace(\n /\\.js$/,\n \".\" + binaryData.__binaryFile,\n );\n\n if (!fs.existsSync(binaryFilePath)) {\n console.error(\n `[automock] Binary mock file not found: ${binaryFilePath}`,\n );\n sendError(res, \"Binary mock file not found\", 404);\n return;\n }\n\n try {\n const fileData = fs.readFileSync(binaryFilePath);\n const contentType =\n (binaryData.__contentType as string) || \"application/octet-stream\";\n res.setHeader(\"Content-Type\", contentType);\n res.setHeader(\"Content-Length\", fileData.length);\n res.setHeader(\"X-Mock-Response\", \"true\");\n res.setHeader(\"X-Mock-Source\", \"vite-plugin-automock\");\n res.setHeader(\"X-Mock-Binary-File\", \"true\");\n res.statusCode = status;\n res.end(fileData);\n } catch (error) {\n console.error(\"[automock] Failed to read binary mock file:\", error);\n sendError(res, \"Failed to read binary mock file\");\n }\n } else {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.setHeader(\"X-Mock-Response\", \"true\");\n res.setHeader(\"X-Mock-Source\", \"vite-plugin-automock\");\n res.statusCode = status;\n res.end(typeof data === \"string\" ? data : JSON.stringify(data));\n }\n }, delay);\n}\n\nfunction matchesApiPrefix(pathname: string, apiPrefix: string): boolean {\n if (!apiPrefix || apiPrefix === \"/\") return true;\n const normalizedPrefix =\n apiPrefix.endsWith(\"/\") && apiPrefix !== \"/\"\n ? apiPrefix.slice(0, -1)\n : apiPrefix;\n\n return pathname === normalizedPrefix || pathname.startsWith(`${normalizedPrefix}/`);\n}\n\nfunction proxyAndCapture(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n proxyBaseUrl: string;\n pathRewrite: (p: string) => string;\n shouldSave: boolean;\n method: string;\n pathname: string;\n mockDir: string;\n onMockSaved: () => void;\n },\n): void {\n const { proxyBaseUrl, pathRewrite, shouldSave, method, pathname, mockDir, onMockSaved } = options;\n const targetUrl = proxyBaseUrl + pathRewrite(req.url || \"\");\n const client = targetUrl.startsWith(\"https\") ? https : http;\n\n function sendProxyRequest(body?: string) {\n const targetUrlObj = new URL(proxyBaseUrl);\n const proxyOptions = {\n method: req.method,\n headers: {\n ...req.headers,\n host: targetUrlObj.host,\n },\n rejectUnauthorized: false,\n };\n\n const proxyReq = client.request(targetUrl, proxyOptions, (proxyRes) => {\n const contentType = proxyRes.headers[\"content-type\"] || \"\";\n const isJson = contentType.includes(\"application/json\");\n\n // Non-JSON response (file download, stream, etc.) → pipe directly\n if (!isJson) {\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n proxyRes.pipe(res);\n return;\n }\n\n // JSON response → buffer, save mock, then respond\n const chunks: Buffer[] = [];\n\n proxyRes.on(\"data\", (chunk) => chunks.push(chunk));\n proxyRes.on(\"end\", async () => {\n try {\n const responseData = Buffer.concat(chunks);\n\n if (shouldSave) {\n try {\n console.log(\n `[automock] Capturing mock: ${req.url!} -> ${pathname}`,\n );\n const savedFilePath = await saveMockData(\n req.url!,\n method,\n responseData,\n mockDir,\n proxyRes.statusCode,\n contentType,\n );\n if (savedFilePath) {\n console.log(`[automock] Mock saved: ${pathname}`);\n onMockSaved();\n } else {\n console.log(\n `[automock] Mock file already exists, skipped: ${pathname}`,\n );\n }\n } catch (saveError) {\n console.error(\"[automock] Failed to save mock:\", saveError);\n }\n }\n\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n res.end(responseData);\n } catch (error) {\n console.error(\"[automock] Failed to process response:\", error);\n res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);\n res.end(Buffer.concat(chunks));\n }\n });\n });\n\n proxyReq.on(\"error\", (err) => {\n console.error(\"[automock] Proxy request failed:\", err);\n sendError(res, err.message);\n });\n\n if (\n body &&\n (req.method === \"POST\" || req.method === \"PUT\" || req.method === \"PATCH\")\n ) {\n proxyReq.write(body);\n }\n\n proxyReq.end();\n }\n\n if (\n req.method === \"POST\" ||\n req.method === \"PUT\" ||\n req.method === \"PATCH\"\n ) {\n let bodyStr = \"\";\n req.on(\"data\", (chunk) => (bodyStr += chunk.toString()));\n req.on(\"end\", () => sendProxyRequest(bodyStr));\n } else {\n sendProxyRequest();\n }\n}\n\nfunction printServerUrls(\n server: { httpServer?: { address(): AddressInfo | string | null; once(event: string, cb: () => void): void } | null; config: { server: { https?: unknown } } },\n urls: Array<{ path: string; label: string; color: string; delay: number }>,\n): void {\n server.httpServer?.once(\"listening\", () => {\n const address = server.httpServer?.address();\n if (!address || typeof address !== \"object\") return;\n\n const { protocol, host, port } = getServerAddress(\n address,\n !!server.config.server.https,\n );\n\n for (const { path: urlPath, label, color, delay } of urls) {\n setTimeout(() => {\n const fullUrl = `${protocol}://${host}:${port}${urlPath}`;\n console.log(` ➜ ${color}${label}\\x1b[0m: \\x1b[1m${fullUrl}\\x1b[0m`);\n }, delay);\n }\n });\n}\n\nexport function automock(options: AutomockPluginOptions): Plugin {\n const {\n mockDir: configMockDir = path.join(process.cwd(), \"mock\"),\n apiPrefix = \"/api\",\n pathRewrite = (p) => p,\n proxyBaseUrl,\n inspector = false,\n enabled = true,\n proxy: proxyEnabled = true,\n capture: captureEnabled = true,\n } = options;\n\n const mockDir = resolveAbsolutePath(configMockDir);\n\n if (!fs.existsSync(mockDir)) {\n try {\n fs.ensureDirSync(mockDir);\n console.log(`[automock] Mock directory created: ${mockDir}`);\n } catch (error) {\n console.error(`[automock] Failed to create mock directory: ${mockDir}`, error);\n }\n }\n\n let watcher: FSWatcher | undefined;\n\n return {\n name: \"vite-plugin-automock\",\n config(userConfig) {\n if (proxyBaseUrl && userConfig.server?.proxy) {\n const proxyConfig = userConfig.server.proxy;\n const hasConflictingPrefix =\n typeof proxyConfig === \"object\" && apiPrefix in proxyConfig;\n\n if (hasConflictingPrefix) {\n console.warn(\n `\\n⚠️ [automock] WARNING: You have both Vite's server.proxy[\"${apiPrefix}\"] and automock's proxyBaseUrl configured.`,\n );\n console.warn(\n ` This may cause request conflicts. Remove the \"${apiPrefix}\" entry from vite.config.ts server.proxy to avoid issues.`,\n );\n console.warn(\n ` Automock will handle all ${apiPrefix} requests when proxyBaseUrl is set.\\n`,\n );\n }\n }\n },\n async configureServer(server) {\n let mockFileMap = await buildMockIndex(mockDir);\n console.log(`[automock] Loaded ${mockFileMap.size} mock files`);\n\n const rebuildMockFileMap = debounce(async () => {\n mockFileMap = await buildMockIndex(mockDir);\n }, 200);\n\n watcher = chokidar.watch(mockDir, {\n ignoreInitial: true,\n persistent: true,\n depth: 30,\n });\n watcher.on(\"add\", () => rebuildMockFileMap());\n watcher.on(\"unlink\", () => rebuildMockFileMap());\n\n server.httpServer?.on(\"close\", () => watcher?.close());\n\n const inspectorHandler = createInspectorHandler({\n inspector,\n apiPrefix,\n mockDir,\n getMockFileMap: () => mockFileMap,\n });\n\n const urlsToPrint: Array<{ path: string; label: string; color: string; delay: number }> = [\n { path: apiPrefix, label: \"Mock API\", color: \"\\x1b[32m\", delay: 100 },\n ];\n\n if (inspector) {\n const inspectorConfig = normalizeInspectorConfig(inspector);\n urlsToPrint.push({\n path: inspectorConfig.route,\n label: \"Mock Inspector\",\n color: \"\\x1b[95m\",\n delay: 150,\n });\n }\n\n printServerUrls(server, urlsToPrint);\n\n async function tryLoadMock(key: string): Promise<{ absolutePath: string; mockResult: Record<string, unknown> } | null> {\n const mockFilePath = mockFileMap.get(key);\n if (!mockFilePath) return null;\n\n const absolutePath = resolveAbsolutePath(mockFilePath);\n if (!fs.existsSync(absolutePath)) return null;\n\n const { default: mockModule } = await import(\n `${absolutePath}?t=${Date.now()}`\n );\n const exportedConfig =\n typeof mockModule === \"function\" ? await mockModule() : mockModule;\n const mockResult =\n typeof exportedConfig?.data === \"function\"\n ? { ...exportedConfig, data: await exportedConfig.data() }\n : exportedConfig;\n\n const { enable = true } = mockResult || {};\n return enable ? { absolutePath, mockResult } : null;\n }\n\n server.middlewares.use(\n async (\n req: IncomingMessage,\n res: ServerResponse,\n next: (err?: Error | unknown) => void,\n ): Promise<void> => {\n // Global switch: skip all mock handling\n if (!enabled) return next();\n\n if (inspectorHandler && req.url) {\n const handled = await inspectorHandler(req, res);\n if (handled) return;\n }\n\n if (!req.url) {\n return next();\n }\n\n const pathname = new URL(req.url, \"http://localhost\").pathname;\n if (!matchesApiPrefix(pathname, apiPrefix)) {\n return next();\n }\n\n // Skip non-standard requests (SSE, WebSocket, file streams)\n const accept = req.headers.accept || \"\";\n const upgrade = req.headers.upgrade || \"\";\n if (accept.includes(\"text/event-stream\") || upgrade.toLowerCase() === \"websocket\") {\n return next();\n }\n\n const method = (req.method || \"GET\").toLowerCase();\n const key = `${pathname}/${method}.js`.toLowerCase();\n\n // 1. Try mock\n try {\n const mock = await tryLoadMock(key);\n if (mock) {\n serveMockResponse(res, mock.absolutePath, mock.mockResult);\n return;\n }\n } catch (error) {\n console.error(\"[automock] Failed to load mock file:\", error);\n }\n\n // 2. Try proxy\n if (!proxyBaseUrl || !proxyEnabled) return next();\n\n try {\n proxyAndCapture(req, res, {\n proxyBaseUrl,\n pathRewrite,\n shouldSave: captureEnabled && !mockFileMap.has(key),\n method,\n pathname,\n mockDir,\n onMockSaved: async () => {\n mockFileMap = await buildMockIndex(mockDir);\n },\n });\n } catch (error) {\n console.error(\"[automock] Proxy request error:\", error);\n sendError(res, \"Internal server error\");\n }\n },\n );\n },\n closeBundle() {\n watcher?.close();\n },\n transform() {\n return null;\n },\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prettier from \"prettier\";\n\nimport { resolveAbsolutePath, toPosixPath } from \"./utils\";\n\nexport interface MockFileConfig {\n enable: boolean;\n data: unknown;\n delay: number;\n status: number;\n [key: string]: unknown;\n}\n\nexport interface MockFileInfo {\n config: MockFileConfig;\n serializable: boolean;\n hasDynamicData: boolean;\n headerComment?: string;\n description?: string;\n dataText: string;\n isBinary?: boolean;\n}\n\nexport const DEFAULT_CONFIG: MockFileConfig = {\n enable: true,\n data: null,\n delay: 0,\n status: 200,\n};\n\nconst isBufferTextLike = (buffer: Buffer): boolean => {\n try {\n const sample = buffer.slice(0, 100);\n const nullBytes = [...sample].filter((b) => b === 0).length;\n const controlChars = [...sample].filter(\n (b) => b < 32 && b !== 9 && b !== 10 && b !== 13,\n ).length;\n return nullBytes === 0 && controlChars < 5;\n } catch {\n return false;\n }\n};\n\nconst isBinaryResponse = (\n contentType: string | undefined,\n data: Buffer,\n): boolean => {\n if (!contentType) return false;\n\n const binaryTypes = [\n \"application/octet-stream\",\n \"application/pdf\",\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"image/\",\n \"video/\",\n \"audio/\",\n ];\n\n return (\n binaryTypes.some((type) => contentType.toLowerCase().includes(type)) ||\n !isBufferTextLike(data)\n );\n};\n\nconst getFileExtension = (\n contentType: string | undefined,\n url: string,\n): string => {\n const mimeMap: Record<string, string> = {\n \"application/json\": \"json\",\n \"application/pdf\": \"pdf\",\n \"application/zip\": \"zip\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n \"image/jpeg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"text/plain\": \"txt\",\n \"text/html\": \"html\",\n \"text/css\": \"css\",\n \"application/javascript\": \"js\",\n \"text/xml\": \"xml\",\n };\n\n if (contentType && mimeMap[contentType.toLowerCase()]) {\n return mimeMap[contentType.toLowerCase()];\n }\n\n try {\n const urlObj = new URL(url, \"http://localhost\");\n const fileName = urlObj.searchParams.get(\"file_name\");\n if (fileName) {\n const extensionMatch = fileName.match(/\\.([a-zA-Z0-9]+)$/);\n if (extensionMatch) {\n return extensionMatch[1];\n }\n }\n } catch {\n // Ignore URL parse errors\n }\n\n return \"bin\";\n};\n\nasync function formatWithPrettier(content: string): Promise<string> {\n try {\n return await prettier.format(content, { parser: \"babel\" });\n } catch {\n return content;\n }\n}\n\nfunction buildMockFileHeader(\n pathname: string,\n method: string,\n search: string,\n extra?: string,\n): string {\n return `/**\n * Mock data for ${pathname} (${method.toUpperCase()})${search || \"\"}\n * @description ${pathname}${search || \"\"}${extra ? ` - ${extra}` : \"\"}\n * Generated at ${new Date().toISOString()}\n */`;\n}\n\nasync function saveBinaryMock(\n filePath: string,\n binaryData: Buffer,\n pathname: string,\n method: string,\n search: string,\n contentType: string | undefined,\n url: string,\n statusCode: number | undefined,\n): Promise<string | null> {\n const extension = getFileExtension(contentType, url);\n const binaryFilePath = filePath.replace(/\\.js$/, \".\" + extension);\n\n if (fs.existsSync(binaryFilePath)) return null;\n\n fs.writeFileSync(binaryFilePath, binaryData);\n\n const header = buildMockFileHeader(pathname, method, search, `Binary file (${extension})`);\n const configContent = `${header}\nexport default {\n enable: false,\n data: {\n __binaryFile: '${extension}',\n __originalPath: '${pathname}',\n __originalQuery: '${search}',\n __originalUrl: '${pathname}${search || \"\"}',\n __contentType: '${contentType}',\n __fileSize: ${binaryData.length}\n },\n delay: 0,\n status: ${statusCode || 200}\n}`;\n\n const formatted = await formatWithPrettier(configContent);\n fs.writeFileSync(filePath, formatted, \"utf-8\");\n return filePath;\n}\n\nasync function saveJsonMock(\n filePath: string,\n dataStr: string,\n pathname: string,\n method: string,\n search: string,\n statusCode: number | undefined,\n): Promise<string | null> {\n if (fs.existsSync(filePath)) return null;\n\n let jsonData;\n if (!dataStr || dataStr.trim() === \"\") {\n jsonData = {\n error: true,\n message: `Empty response (${statusCode || \"unknown status\"})`,\n status: statusCode || 404,\n data: null,\n };\n } else {\n try {\n jsonData = JSON.parse(dataStr);\n if (statusCode && statusCode >= 400) {\n const errorMeta = { __mockStatusCode: statusCode, __isErrorResponse: true };\n jsonData =\n typeof jsonData === \"object\" && jsonData !== null\n ? { ...jsonData, ...errorMeta }\n : { originalData: jsonData, ...errorMeta };\n }\n } catch {\n jsonData = {\n error: true,\n message: `Non-JSON response (${statusCode || \"unknown status\"})`,\n status: statusCode || 404,\n data: dataStr,\n __mockStatusCode: statusCode,\n __isErrorResponse: true,\n };\n }\n }\n\n const header = buildMockFileHeader(pathname, method, search);\n const content = `${header}\nexport default {\n enable: false,\n data: ${JSON.stringify(jsonData)},\n delay: 0,\n status: ${statusCode || 200}\n}`;\n\n const formatted = await formatWithPrettier(content);\n fs.writeFileSync(filePath, formatted, \"utf-8\");\n return filePath;\n}\n\nexport async function saveMockData(\n url: string,\n method: string,\n data: Buffer | string,\n rootDir: string,\n statusCode?: number,\n contentType?: string,\n): Promise<string | null> {\n try {\n const absoluteRootDir = resolveAbsolutePath(rootDir);\n const urlObj = new URL(url, \"http://localhost\");\n const pathname = urlObj.pathname;\n const search = urlObj.search;\n\n const filePath = path.join(\n absoluteRootDir,\n pathname.replace(/^\\//, \"\"),\n method.toLowerCase() + \".js\",\n );\n\n await fs.ensureDir(path.dirname(filePath));\n\n const isBuffer = Buffer.isBuffer(data);\n const binaryData = isBuffer ? data : Buffer.from(data || \"\");\n const isBinary = isBinaryResponse(contentType, binaryData);\n\n if (isBinary) {\n return saveBinaryMock(\n filePath, binaryData, pathname, method, search,\n contentType, url, statusCode,\n );\n }\n\n const dataStr = isBuffer ? data.toString(\"utf8\") : data || \"\";\n return saveJsonMock(filePath, dataStr, pathname, method, search, statusCode);\n } catch (error) {\n console.error(`Failed to save mock data for ${url}:`, error);\n console.error(\n `URL details: url=${url}, method=${method}, statusCode=${statusCode}, contentType=${contentType}`,\n );\n throw error;\n }\n}\n\nconst recursiveReadAllFiles = async (dir: string): Promise<string[]> => {\n if (!(await fs.pathExists(dir))) return [];\n\n const files: string[] = [];\n try {\n const list = await fs.readdir(dir);\n for (const file of list) {\n const filePath = path.join(dir, file);\n const stat = await fs.stat(filePath);\n if (stat.isDirectory()) {\n files.push(...(await recursiveReadAllFiles(filePath)));\n } else {\n files.push(filePath);\n }\n }\n } catch (error) {\n console.error(`Error reading directory ${dir}:`, error);\n }\n return files;\n};\n\nexport async function buildMockIndex(mockDir: string): Promise<Map<string, string>> {\n const mockFileMap = new Map<string, string>();\n\n if (!(await fs.pathExists(mockDir))) {\n await fs.ensureDir(mockDir);\n return mockFileMap;\n }\n\n const files = await recursiveReadAllFiles(mockDir);\n\n files.forEach((filePath) => {\n if (!filePath.endsWith(\".js\")) return;\n\n try {\n const relativePath = path.relative(mockDir, filePath);\n const method = path.basename(filePath, \".js\");\n const dirPath = path.dirname(relativePath);\n const urlPath = \"/\" + toPosixPath(dirPath);\n const absolutePath = resolveAbsolutePath(filePath);\n const key = `${urlPath}/${method}.js`.toLowerCase();\n\n mockFileMap.set(key, absolutePath);\n } catch (error) {\n console.error(`[automock] Failed to process file ${filePath}:`, error);\n }\n });\n\n return mockFileMap;\n}\n\nexport async function parseMockModule(filePath: string): Promise<MockFileInfo> {\n const absolutePath = resolveAbsolutePath(filePath);\n\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`Mock file does not exist: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, \"utf-8\");\n const headerCommentMatch = content.match(/^(\\/\\*\\*[\\s\\S]*?\\*\\/)/);\n const headerComment = headerCommentMatch ? headerCommentMatch[1] : undefined;\n\n let description: string | undefined;\n if (headerComment) {\n const descMatch = headerComment.match(/@description\\s+(.+?)(?:\\n|\\*\\/)/s);\n if (descMatch) {\n description = descMatch[1].trim();\n }\n }\n\n const { default: mockModule } = await import(\n `${absolutePath}?t=${Date.now()}`\n );\n\n const exportedConfig =\n typeof mockModule === \"function\" ? mockModule() : mockModule;\n const hasDynamicData = typeof exportedConfig?.data === \"function\";\n const config: MockFileConfig = {\n ...DEFAULT_CONFIG,\n ...(exportedConfig ?? {}),\n };\n\n const serializable = !hasDynamicData;\n const dataObj =\n typeof config.data === \"object\" && config.data !== null\n ? (config.data as Record<string, unknown>)\n : null;\n const isBinary = dataObj !== null && \"__binaryFile\" in dataObj;\n\n return {\n config,\n serializable,\n hasDynamicData,\n headerComment,\n description,\n dataText: isBinary\n ? `/* Binary file: ${dataObj?.__binaryFile} */`\n : serializable\n ? JSON.stringify(config.data ?? null, null, 2)\n : \"/* data is generated dynamically and cannot be edited here */\",\n isBinary,\n };\n}\n\nexport async function writeMockFile(\n filePath: string,\n mockInfo: Pick<MockFileInfo, \"config\" | \"headerComment\" | \"description\">,\n): Promise<void> {\n const absolutePath = resolveAbsolutePath(filePath);\n\n let header = mockInfo.headerComment || \"\";\n\n if (mockInfo.description !== undefined) {\n if (header) {\n if (/@description/.test(header)) {\n header = header.replace(\n /@description\\s+.+?(?=\\n|\\*\\/)/s,\n `@description ${mockInfo.description}`,\n );\n } else {\n header = header.replace(\n /\\*\\//,\n ` * @description ${mockInfo.description}\\n */`,\n );\n }\n }\n }\n\n const content = header ? `${header}\\n` : \"\";\n const finalContent = `${content}export default ${JSON.stringify(mockInfo.config, null, 2)}\\n`;\n\n try {\n const formatted = await formatWithPrettier(finalContent);\n fs.writeFileSync(absolutePath, formatted, \"utf-8\");\n } catch {\n console.error(\"Error formatting code with prettier, writing raw content\");\n fs.writeFileSync(absolutePath, finalContent, \"utf-8\");\n }\n}\n","import path from \"path\";\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { AddressInfo } from \"net\";\n\nexport function resolveAbsolutePath(p: string): string {\n return path.isAbsolute(p) ? p : path.resolve(process.cwd(), p);\n}\n\nexport function toPosixPath(p: string): string {\n return p.replace(/\\\\/g, \"/\");\n}\n\nexport interface ServerAddress {\n protocol: string;\n host: string;\n port: number;\n}\n\nexport function getServerAddress(\n address: AddressInfo,\n isHttps: boolean,\n): ServerAddress {\n return {\n protocol: isHttps ? \"https\" : \"http\",\n host:\n address.address === \"::\" || address.address === \"0.0.0.0\"\n ? \"localhost\"\n : address.address,\n port: address.port,\n };\n}\n\nexport function sendJson(\n res: ServerResponse,\n data: unknown,\n status = 200,\n): void {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.statusCode = status;\n res.end(typeof data === \"string\" ? data : JSON.stringify(data));\n}\n\nexport function sendError(\n res: ServerResponse,\n message: string,\n status = 500,\n): void {\n sendJson(res, { error: message }, status);\n}\n\nconst MAX_BODY_SIZE = 10 * 1024 * 1024; // 10MB\n\nexport function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n let totalSize = 0;\n req.on(\"data\", (chunk: Buffer) => {\n totalSize += chunk.length;\n if (totalSize > MAX_BODY_SIZE) {\n reject(new Error(\"Request body too large\"));\n req.destroy();\n return;\n }\n chunks.push(chunk);\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { fileURLToPath } from \"url\";\n\n// ESM/CJS compatible __dirname\nconst _dirName = typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\nimport { parseMockModule, writeMockFile, saveMockData, buildMockIndex, type MockFileConfig } from \"./mockFileUtils\";\nimport { toPosixPath, sendJson, readBody } from \"./utils\";\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { AutomockPluginOptions, InspectorOptions } from \"./types\";\n\ninterface InspectorContext {\n req: IncomingMessage;\n res: ServerResponse;\n mockDir: string;\n inspectorRoute: string;\n apiPrefix: string;\n inspectorConfig: Required<InspectorOptions>;\n getMockFileMap: () => Map<string, string>;\n}\n\ninterface InspectorHandlerOptions {\n inspector: AutomockPluginOptions[\"inspector\"];\n apiPrefix: string;\n mockDir: string;\n getMockFileMap: () => Map<string, string>;\n}\n\ninterface InspectorApiContext extends InspectorContext {\n pathname: string;\n}\n\ninterface InspectorPayload {\n key: string;\n config?: Partial<MockFileConfig>;\n description?: string;\n}\n\ninterface MockItem {\n key: string;\n file: string;\n method: string;\n path: string;\n config: MockFileConfig;\n editable: boolean;\n description?: string;\n dataText: string;\n}\n\nfunction buildMockItem(\n key: string,\n filePath: string,\n mockDir: string,\n info: Awaited<ReturnType<typeof parseMockModule>>,\n): MockItem {\n return {\n key,\n file: path.relative(mockDir, filePath),\n method: key.split(\"/\").pop()?.replace(/\\.js$/, \"\") ?? \"get\",\n path: key.replace(/\\/[^/]+\\.js$/, \"\"),\n config: info.config,\n editable: info.serializable,\n description: info.description,\n dataText: info.dataText,\n };\n}\n\nexport const DEFAULT_ROUTE = \"/__mock/\";\n\nfunction ensureTrailingSlash(route: string): string {\n return route.endsWith(\"/\") ? route : `${route}/`;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nexport function normalizeInspectorConfig(\n input: AutomockPluginOptions[\"inspector\"],\n): Required<InspectorOptions> {\n if (input === false || input === undefined) {\n return { route: DEFAULT_ROUTE, enableToggle: true };\n }\n if (input === true) {\n return { route: DEFAULT_ROUTE, enableToggle: true };\n }\n return {\n route: ensureTrailingSlash(input.route ?? DEFAULT_ROUTE),\n enableToggle: input.enableToggle ?? true,\n };\n}\n\nexport type InspectorRequestHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n) => Promise<boolean>;\n\nexport function createInspectorHandler(\n options: InspectorHandlerOptions,\n): InspectorRequestHandler | null {\n if (!options.inspector) {\n return null;\n }\n\n const inspectorConfig = normalizeInspectorConfig(options.inspector);\n const inspectorRoute = ensureTrailingSlash(inspectorConfig.route);\n\n return async (req, res) => {\n if (!req.url) {\n return false;\n }\n const url = new URL(req.url, \"http://localhost\");\n if (!url.pathname.startsWith(inspectorRoute)) {\n return false;\n }\n\n await handleInspectorRequest({\n req,\n res,\n mockDir: options.mockDir,\n inspectorRoute,\n apiPrefix: options.apiPrefix,\n inspectorConfig,\n getMockFileMap: options.getMockFileMap,\n });\n\n return true;\n };\n}\n\nasync function handleInspectorRequest(\n context: InspectorContext,\n): Promise<void> {\n const { req, res, inspectorRoute } = context;\n const url = new URL(req.url || inspectorRoute, \"http://localhost\");\n const normalizedRoute = ensureTrailingSlash(inspectorRoute);\n\n if (\n url.pathname === normalizedRoute.slice(0, -1) ||\n url.pathname === normalizedRoute\n ) {\n await serveInspectorHtml(context);\n return;\n }\n\n const relativePath = url.pathname.startsWith(normalizedRoute)\n ? url.pathname.slice(normalizedRoute.length)\n : null;\n\n if (relativePath && relativePath.startsWith(\"api/\")) {\n await handleInspectorApi({ ...context, pathname: relativePath.slice(4) });\n return;\n }\n\n res.statusCode = 404;\n res.end(\"Not Found\");\n}\n\nasync function serveInspectorHtml({\n res,\n inspectorRoute,\n apiPrefix,\n inspectorConfig,\n}: InspectorContext): Promise<void> {\n const routeJson = JSON.stringify(ensureTrailingSlash(inspectorRoute));\n const allowToggleJson = JSON.stringify(inspectorConfig.enableToggle);\n const apiPrefixEscaped = escapeHtml(apiPrefix);\n\n const templatePath = path.join(_dirName, \"inspector-template.html\");\n const template = fs.readFileSync(templatePath, \"utf-8\");\n const html = template\n .replace(\"__API_PREFIX__\", apiPrefixEscaped)\n .replace(\"__ROUTE_JSON__\", routeJson)\n .replace(\"__ALLOW_TOGGLE_JSON__\", allowToggleJson);\n\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n res.end(html);\n}\n\nasync function handleList(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { res, mockDir } = ctx;\n const list = await Promise.all(\n Array.from(mockFileMap.entries()).map(async ([key, filePath]) => {\n const info = await parseMockModule(filePath);\n return buildMockItem(key, filePath, mockDir, info);\n }),\n );\n sendJson(res, { mocks: list });\n return true;\n}\n\nasync function handleDetail(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir } = ctx;\n const url = new URL(req.url || \"\", \"http://localhost\");\n const key = url.searchParams.get(\"key\");\n if (!key) {\n sendJson(res, { error: \"Missing key\" }, 400);\n return true;\n }\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n const info = await parseMockModule(filePath);\n sendJson(res, { mock: buildMockItem(key, filePath, mockDir, info) });\n return true;\n}\n\nasync function handleUpdate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir, inspectorConfig } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: InspectorPayload;\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const { key, config, description } = payload || {};\n if (!key) {\n sendJson(res, { error: \"Invalid payload: missing key\" }, 400);\n return true;\n }\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n\n const info = await parseMockModule(filePath);\n\n let nextConfig = info.config;\n if (config && typeof config === \"object\") {\n if (!inspectorConfig.enableToggle && config.enable !== undefined) {\n delete config.enable;\n }\n nextConfig = { ...info.config, ...config };\n }\n\n const nextDescription =\n description !== undefined ? description : info.description;\n\n await writeMockFile(filePath, {\n headerComment: info.headerComment,\n config: nextConfig,\n description: nextDescription,\n });\n\n const updatedInfo = await parseMockModule(filePath);\n sendJson(res, { mock: buildMockItem(key, filePath, mockDir, updatedInfo) });\n return true;\n}\n\nasync function handleCreate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res, mockDir, apiPrefix } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: { method: string; path: string; description?: string; data?: unknown };\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const { method, path: apiPath, data } = payload || {};\n if (!method || !apiPath) {\n sendJson(res, { error: \"Invalid payload: missing method or path\" }, 400);\n return true;\n }\n\n const fullUrl = apiPrefix + apiPath;\n\n try {\n let dataToSave: Buffer | string;\n if (typeof data === \"object\" && data !== null) {\n dataToSave = JSON.stringify(data, null, 2);\n } else {\n dataToSave = typeof data === \"string\" ? data : \"\";\n }\n\n await saveMockData(fullUrl, method.toLowerCase(), dataToSave, mockDir, 200);\n\n const newMockFileMap = await buildMockIndex(mockDir);\n for (const [key, value] of newMockFileMap.entries()) {\n mockFileMap.set(key, value);\n }\n\n const normalizedPath = toPosixPath(apiPath);\n const key = (normalizedPath.startsWith(\"/\") ? \"\" : \"/\") +\n normalizedPath.toLowerCase() + \"/\" + method.toLowerCase() + \".js\";\n const filePath = mockFileMap.get(key);\n\n if (!filePath) {\n sendJson(res, { error: \"Mock file created but not found in map\" }, 500);\n return true;\n }\n\n const info = await parseMockModule(filePath);\n sendJson(res, {\n success: true,\n mock: buildMockItem(key, filePath, mockDir, info),\n });\n return true;\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n sendJson(res, { error: \"Failed to create mock: \" + errorMessage }, 500);\n return true;\n }\n}\n\nasync function handleDelete(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res } = ctx;\n const url = new URL(req.url || \"\", \"http://localhost\");\n const key = url.searchParams.get(\"key\");\n if (!key) {\n sendJson(res, { error: \"Missing key\" }, 400);\n return true;\n }\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n sendJson(res, { error: \"Mock not found\" }, 404);\n return true;\n }\n\n try {\n const stats = await fs.stat(filePath);\n if (stats.isDirectory()) {\n await fs.remove(filePath);\n for (const [mapKey, mapPath] of mockFileMap.entries()) {\n if (mapPath.startsWith(filePath + path.sep) || mapPath === filePath) {\n mockFileMap.delete(mapKey);\n }\n }\n } else {\n await fs.unlink(filePath);\n mockFileMap.delete(key);\n }\n sendJson(res, { success: true });\n } catch (error: unknown) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n sendJson(res, { error: \"Failed to delete: \" + errorMessage }, 500);\n }\n return true;\n}\n\ntype ApiHandler = (ctx: InspectorApiContext, mockFileMap: Map<string, string>) => Promise<boolean>;\n\nasync function handleBatchUpdate(\n ctx: InspectorApiContext,\n mockFileMap: Map<string, string>,\n): Promise<boolean> {\n const { req, res } = ctx;\n if (req.method !== \"POST\") {\n sendJson(res, { error: \"Method not allowed\" }, 405);\n return true;\n }\n const body = await readBody(req);\n let payload: { updates?: Array<{ key: string; config?: Record<string, unknown> }> };\n try {\n payload = JSON.parse(body);\n } catch {\n sendJson(res, { error: \"Invalid JSON body\" }, 400);\n return true;\n }\n\n const updates = payload?.updates;\n if (!Array.isArray(updates) || updates.length === 0) {\n sendJson(res, { error: \"Invalid payload: updates must be a non-empty array\" }, 400);\n return true;\n }\n\n let updated = 0;\n const errors: string[] = [];\n\n for (const item of updates) {\n const { key, config } = item;\n if (!key) continue;\n\n const filePath = mockFileMap.get(key);\n if (!filePath) {\n errors.push(`Mock not found: ${key}`);\n continue;\n }\n\n try {\n const info = await parseMockModule(filePath);\n const nextConfig = config ? { ...info.config, ...config } : info.config;\n\n await writeMockFile(filePath, {\n headerComment: info.headerComment,\n config: nextConfig,\n description: info.description,\n });\n updated++;\n } catch (err) {\n errors.push(`Failed to update ${key}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n sendJson(res, { success: true, updated, errors: errors.length > 0 ? errors : undefined });\n return true;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n list: handleList,\n detail: handleDetail,\n update: handleUpdate,\n \"batch-update\": handleBatchUpdate,\n create: handleCreate,\n delete: handleDelete,\n};\n\nasync function handleInspectorApi(ctx: InspectorApiContext): Promise<void> {\n try {\n const mockFileMap = ctx.getMockFileMap();\n const handler = API_ROUTES[ctx.pathname];\n if (handler) {\n await handler(ctx, mockFileMap);\n return;\n }\n sendJson(ctx.res, { error: \"Unknown inspector endpoint\" }, 404);\n } catch (error) {\n console.error(\"[automock] Inspector request failed:\", error);\n sendJson(ctx.res, { error: \"Inspector failed\" }, 500);\n }\n}\n","import path from 'path'\nimport fs from 'fs-extra'\n\nimport { buildMockIndex, parseMockModule } from './mockFileUtils'\n\nexport interface MockBundleData {\n enable: boolean\n data: unknown\n delay: number\n status: number\n isBinary?: boolean\n}\n\nexport interface MockBundle {\n [key: string]: MockBundleData\n}\n\nexport interface BundleOptions {\n mockDir: string\n includeDisabled?: boolean\n log?: boolean\n}\n\nconst DEFAULT_BUNDLE_OPTIONS: Partial<BundleOptions> = {\n includeDisabled: true,\n log: true\n}\n\nasync function bundleMockFiles(options: BundleOptions): Promise<MockBundle> {\n const opts = { ...DEFAULT_BUNDLE_OPTIONS, ...options }\n const { mockDir, log } = opts\n\n if (!fs.existsSync(mockDir)) {\n if (log) {\n console.log(`[mock-bundler] Mock directory does not exist: ${mockDir}`)\n }\n return {}\n }\n\n const mockFileMap = await buildMockIndex(mockDir)\n const bundle: MockBundle = {}\n let bundledCount = 0\n let skippedCount = 0\n\n for (const [key, filePath] of mockFileMap) {\n try {\n const mockInfo = await parseMockModule(filePath)\n\n if (!mockInfo.serializable) {\n skippedCount++\n if (log) {\n console.log(`[mock-bundler] Skipping non-serializable mock: ${key}`)\n }\n continue\n }\n\n bundle[key] = {\n enable: mockInfo.config.enable,\n data: mockInfo.config.data,\n delay: mockInfo.config.delay,\n status: mockInfo.config.status,\n isBinary: mockInfo.isBinary\n }\n\n bundledCount++\n } catch (error) {\n if (log) {\n console.error(`[mock-bundler] Failed to bundle mock ${key}:`, error)\n }\n }\n }\n\n if (log) {\n console.log(`[mock-bundler] Bundled ${bundledCount} mocks, skipped ${skippedCount} non-serializable mocks`)\n }\n\n return bundle\n}\n\nfunction writeMockBundle(bundle: MockBundle, outputPath: string): void {\n const outputDir = path.dirname(outputPath)\n\n if (!fs.existsSync(outputDir)) {\n fs.ensureDirSync(outputDir)\n }\n\n fs.writeFileSync(\n outputPath,\n JSON.stringify(bundle, null, 2),\n 'utf-8'\n )\n}\n\nexport { bundleMockFiles, writeMockBundle }\n"],"mappings":"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","names":["path","fs","path","fs","path","path","path","fs","path","fs","key","fs","path","path","fs","fs","path","automock","path","fs"]}