{"_id":"@dhlab/msw-auto-mock","_rev":"5-23b7ef09a4fcc509eb47ca463c8a1c9a","name":"@dhlab/msw-auto-mock","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@dhlab/msw-auto-mock","version":"0.1.0","keywords":["msw","mock","service-worker","openapi"],"author":{"name":"dhlab-fe"},"license":"MIT","_id":"@dhlab/msw-auto-mock@0.1.0","maintainers":[{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"}],"homepage":"https://github.com/dhlab-org/msw-auto-mock","bugs":{"url":"https://github.com/dhlab-org/msw-auto-mock/issues"},"dist":{"shasum":"dd31afb6981696e5f135877f1ac62e0139574d39","tarball":"https://registry.npmjs.org/@dhlab/msw-auto-mock/-/msw-auto-mock-0.1.0.tgz","fileCount":8,"integrity":"sha512-02bqd+k4v8dBt+kcbTXvPxgWPbBTDvH77D5aknihQEAsfgOSy/CBomczXR7DMpPT6qMWac2WL1NXIQQpy29xGA==","signatures":[{"sig":"MEQCIEUdcyKgauKYu9o2jXUJFy68XON4e5KjgIGWJ0BCEm+ZAiAHggZQIePolycY2SsaUvXmz0C7IBZmCiAyjFJ/exsbkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dhlab%2fmsw-auto-mock@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":687572},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"types":"./dist/node/node.d.ts","require":"./dist/node/node.cjs"}},"gitHead":"2337eb18bb40803bcc2f0c3c7fb9ab13bc0fe6da","scripts":{"fmt":"biome format --write .","lint":"biome lint --write .","test":"vitest run","build":"tsup","check":"biome check --write .","release":"changeset publish","changeset":"changeset"},"_npmUser":{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"},"repository":{"url":"git+https://github.com/dhlab-org/msw-auto-mock.git","type":"git"},"_npmVersion":"10.9.2","description":"Generate random mock data from OpenAPI descriptions for msw.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"cac":"6.7.14","prettier":"3.3.2","es-toolkit":"^1.37.2","ts-pattern":"5.2.0","swagger2openapi":"7.0.8","@apidevtools/swagger-parser":"10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.1","devDependencies":{"msw":"2.7.3","tsup":"8.1.0","vitest":"3.0.8","lefthook":"1.6.18","oazapfts":"6.1.0","typescript":"5.5.3","@types/node":"20.14.9","openapi-types":"12.1.3","@biomejs/biome":"^1.8.0","@changesets/cli":"2.27.7"},"peerDependencies":{"msw":">=2","@faker-js/faker":">=8"},"_npmOperationalInternal":{"tmp":"tmp/msw-auto-mock_0.1.0_1752212054978_0.44240871067192433","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.1.1":{"name":"@dhlab/msw-auto-mock","version":"0.1.1","keywords":["msw","mock","service-worker","openapi"],"author":{"name":"dhlab-fe"},"license":"MIT","_id":"@dhlab/msw-auto-mock@0.1.1","maintainers":[{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"}],"homepage":"https://github.com/dhlab-org/msw-auto-mock","bugs":{"url":"https://github.com/dhlab-org/msw-auto-mock/issues"},"dist":{"shasum":"51e95e9599bf2d0ad98258e716bd25b41079a467","tarball":"https://registry.npmjs.org/@dhlab/msw-auto-mock/-/msw-auto-mock-0.1.1.tgz","fileCount":8,"integrity":"sha512-riy1+XRbd7eGorAiUBqMbB4KFQOfrLsTIwiPPb06AxVj7BOq/QY0ZD5RgaYPRq1qtJyv3JbWUnaeEnZcWwqwpw==","signatures":[{"sig":"MEUCIDWAs9ZWzaqOD2/lkuFZecwpj1EM/QPWADSPwFXimgetAiEA+nHCYSjfBVxGN3nHb0Ho1H6ux42d4uYRgSvPjNMvJjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dhlab%2fmsw-auto-mock@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":689790},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"types":"./dist/node/node.d.ts","require":"./dist/node/node.cjs"}},"gitHead":"582dcdfb906c77101ab5ae4f132886677c205472","scripts":{"fmt":"biome format --write .","lint":"biome lint --write .","test":"vitest run","build":"tsup","check":"biome check --write .","release":"changeset publish","changeset":"changeset"},"_npmUser":{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"},"repository":{"url":"git+https://github.com/dhlab-org/msw-auto-mock.git","type":"git"},"_npmVersion":"10.9.2","description":"Generate random mock data from OpenAPI descriptions for msw.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"cac":"6.7.14","prettier":"3.3.2","es-toolkit":"^1.37.2","ts-pattern":"5.2.0","swagger2openapi":"7.0.8","@apidevtools/swagger-parser":"10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.1","devDependencies":{"msw":"2.7.3","tsup":"8.1.0","vitest":"3.0.8","lefthook":"1.6.18","oazapfts":"6.1.0","typescript":"5.5.3","@types/node":"20.14.9","openapi-types":"12.1.3","@biomejs/biome":"^1.8.0","@changesets/cli":"2.27.7"},"peerDependencies":{"msw":">=2","@faker-js/faker":">=8"},"_npmOperationalInternal":{"tmp":"tmp/msw-auto-mock_0.1.1_1752474140122_0.21552060913040916","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.1.2":{"name":"@dhlab/msw-auto-mock","version":"0.1.2","keywords":["msw","mock","service-worker","openapi"],"author":{"name":"dhlab-fe"},"license":"MIT","_id":"@dhlab/msw-auto-mock@0.1.2","maintainers":[{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"}],"homepage":"https://github.com/dhlab-org/msw-auto-mock","bugs":{"url":"https://github.com/dhlab-org/msw-auto-mock/issues"},"dist":{"shasum":"9eaa55d9b55f4820bca754750df46d6d8bcf0e77","tarball":"https://registry.npmjs.org/@dhlab/msw-auto-mock/-/msw-auto-mock-0.1.2.tgz","fileCount":8,"integrity":"sha512-NOfn5RGE9amQgz8zoI9lnGu3YqsLEIsxrp2zzb0kJe55ZXW0dXgoLjw/nIIToxXNIINf80rTWEpNGfwQBm9oFQ==","signatures":[{"sig":"MEUCIQC2rFSTsdlX0zcQB1fi0WIfTgv1sWXH4Rtcb97/VP9kwwIgFElWicFBh+Xztd/xi0VBZuBoX+DLJRLJtBG9Gsf5U0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dhlab%2fmsw-auto-mock@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":700583},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"types":"./dist/node/node.d.ts","require":"./dist/node/node.cjs"}},"gitHead":"3d660a9f2242418f8187a7a7144b0fc1e76be292","scripts":{"fmt":"biome format --write .","lint":"biome lint --write .","test":"vitest run","build":"tsup","check":"biome check --write .","release":"changeset publish","changeset":"changeset"},"_npmUser":{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"},"repository":{"url":"git+https://github.com/dhlab-org/msw-auto-mock.git","type":"git"},"_npmVersion":"10.9.3","description":"Generate random mock data from OpenAPI descriptions for msw.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"cac":"6.7.14","prettier":"3.3.2","es-toolkit":"^1.37.2","ts-pattern":"5.2.0","swagger2openapi":"7.0.8","@apidevtools/swagger-parser":"10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.1","devDependencies":{"msw":"2.7.3","tsup":"8.1.0","vitest":"3.0.8","lefthook":"1.6.18","oazapfts":"6.1.0","typescript":"5.5.3","@types/node":"20.14.9","openapi-types":"12.1.3","@biomejs/biome":"^1.8.0","@changesets/cli":"2.27.7"},"peerDependencies":{"msw":">=2","@faker-js/faker":">=8"},"_npmOperationalInternal":{"tmp":"tmp/msw-auto-mock_0.1.2_1757306934483_0.3463838341453198","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."},"0.1.3":{"name":"@dhlab/msw-auto-mock","version":"0.1.3","keywords":["msw","mock","service-worker","openapi"],"author":{"name":"dhlab-fe"},"license":"MIT","_id":"@dhlab/msw-auto-mock@0.1.3","maintainers":[{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"}],"homepage":"https://github.com/dhlab-org/msw-auto-mock","bugs":{"url":"https://github.com/dhlab-org/msw-auto-mock/issues"},"dist":{"shasum":"90806e70869553850f396ab3d6a7ee3faf0e046d","tarball":"https://registry.npmjs.org/@dhlab/msw-auto-mock/-/msw-auto-mock-0.1.3.tgz","fileCount":8,"integrity":"sha512-+JOvF7PjW7b5EsTDnm3fWkELypvWlygvWounDrEJq3An2ycgGL5HzM8Z6vGT7ICsqBQwV+nmFQIZ54gHCC9DJA==","signatures":[{"sig":"MEUCIQCl5xGMann2SMpC9/6qtvpLZ+4AWzjcSHsd3SXA+2fWAQIgPU3/QX2l1yhxOe4187YhNMHFQ9UbjjSL8sVitqx6/i0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dhlab%2fmsw-auto-mock@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":700795},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"types":"./dist/node/node.d.ts","require":"./dist/node/node.cjs"}},"gitHead":"2114855d5518976df35dba83af780f07b09ef0fd","scripts":{"fmt":"biome format --write .","lint":"biome lint --write .","test":"vitest run","build":"tsup","check":"biome check --write .","release":"changeset publish","changeset":"changeset"},"_npmUser":{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"},"repository":{"url":"git+https://github.com/dhlab-org/msw-auto-mock.git","type":"git"},"_npmVersion":"10.9.4","description":"Generate random mock data from OpenAPI descriptions for msw.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"cac":"6.7.14","prettier":"3.3.2","es-toolkit":"^1.37.2","ts-pattern":"5.2.0","swagger2openapi":"7.0.8","@apidevtools/swagger-parser":"10.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.1","devDependencies":{"msw":"2.7.3","tsup":"8.1.0","vitest":"3.0.8","lefthook":"1.6.18","oazapfts":"6.1.0","typescript":"5.5.3","@types/node":"20.14.9","openapi-types":"12.1.3","@biomejs/biome":"^1.8.0","@changesets/cli":"2.27.7"},"peerDependencies":{"msw":">=2","@faker-js/faker":">=8"},"_npmOperationalInternal":{"tmp":"tmp/msw-auto-mock_0.1.3_1765794956447_0.8292107132219984","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Package no longer supported. Contact Support at https://www.npmjs.com/support for more info."}},"time":{"created":"2025-07-11T05:34:14.883Z","modified":"2025-12-15T10:44:15.903Z","0.1.0":"2025-07-11T05:34:15.236Z","0.1.1":"2025-07-14T06:22:20.293Z","0.1.2":"2025-09-08T04:48:54.686Z","0.1.3":"2025-12-15T10:35:56.613Z"},"bugs":{"url":"https://github.com/dhlab-org/msw-auto-mock/issues"},"author":{"name":"dhlab-fe"},"license":"MIT","homepage":"https://github.com/dhlab-org/msw-auto-mock","keywords":["msw","mock","service-worker","openapi"],"repository":{"url":"git+https://github.com/dhlab-org/msw-auto-mock.git","type":"git"},"description":"Generate random mock data from OpenAPI descriptions for msw.","maintainers":[{"name":"dhlab-fe","email":"dl_dhlab_fe@navercorp.com"}],"readme":"# 🎯 msw-auto-mock\n\n> **⚠️ DEPRECATED**: 이 라이브러리는 더 이상 관리되지 않습니다.\n> 대신 [@jjades/msw-auto-mock](https://www.npmjs.com/package/@jjades/msw-auto-mock) 라이브러리를 사용해주세요.\n\nOpenAPI 스펙을 기반으로 MSW(Mock Service Worker) 핸들러를 자동으로 생성해주는 라이브러리입니다.\n\n## ✨ 주요 기능\n\n- 🚀 OpenAPI 스펙 기반 자동 핸들러 생성\n- 📁 엔티티별 핸들러 파일 분리\n- 🎮 프로그래밍 방식 API 지원\n- 🛠 커스텀 컨트롤러를 통한 응답 커스터마이징 (controllers 타입 추론 지원)\n- 🔄 다양한 응답 타입 지원 (JSON, Event Stream 등)\n\n## 📦 설치 방법\n\nnpm registry에 배포 전이므로, portal 방식으로 link합니다.\n\n### 1️⃣ 프로젝트 구조 설정\n\n먼저 `my-project`와 `msw-auto-mock`을 같은 최상위 디렉토리에 위치시킵니다:\n\n```\n/workspace\n├── my-project/    # 구현 프로젝트\n└── msw-auto-mock/ # 라이브러리\n```\n\n### 2️⃣ `msw-auto-mock` 설정\n\n`msw-auto-mock` 디렉토리에서:\n\n```bash\ncd msw-auto-mock\npnpm install\npnpm build\n```\n\n### 3️⃣ `my-project` 설정\n\n`my-project` 디렉토리에서:\n\n1. `package.json`에 다음 설정을 추가:\n\n```json\n{\n  \"scripts\": {\n    \"generate-msw-mock\": \"tsx src/app/mocks/mock-generator.ts\"\n  },\n  \"devDependencies\": {\n    \"@dhlab/msw-auto-mock\": \"^0.31.0\"\n  },\n  \"resolutions\": {\n    \"@dhlab/msw-auto-mock\": \"portal:../msw-auto-mock\"\n  }\n}\n```\n\n2. 의존성 설치:\n\n```bash\ncd my-project\nyarn\n```\n\n### 4️⃣ `my-project`에 mock-generator 스크립트 추가\n\n`my-project/src/app/mocks/mock-generator.ts` 파일을 생성:\n\n```ts\nimport { type TOptions, generateMocks } from '@dhlab/msw-auto-mock';\nimport type { TControllers } from './__types__/index';\nimport { controllers } from './controllers/index';\n\nasync function autoGenerateMocks() {\n  try {\n    console.log('[MSW] 목 파일 생성 시작...');\n\n    const options: TOptions<TControllers> = {\n      controllers,\n      input: './swagger/openapi.yml',\n      outputDir: './src/app/mocks',\n      environment: 'react',\n      baseUrl: 'https://api.example.com/api/v1',\n    };\n\n    const result = await generateMocks(options);\n\n    console.log('[MSW] 목 파일 생성 완료!');\n    console.log('[MSW] 생성된 파일 경로:', result.targetFolder);\n\n    return result;\n  } catch (error) {\n    console.error('[MSW] 목 파일 생성 중 오류 발생:', error);\n    throw error;\n  }\n}\n\nautoGenerateMocks();\n```\n\n### 5️⃣ MSW 핸들러 생성\n\n`my-project` 디렉토리에서:\n\n```bash\nyarn generate-msw-mock\n```\n\n## 🔧 사용 방법\n\n### 기본 설정\n\n```ts\nconst options: ProgrammaticOptions = {\n  /**\n   * OpenAPI 스펙 파일 경로\n   * YAML 또는 JSON 형식 지원\n   * @required\n   */\n  input: './swagger/openapi.yml',\n\n  /**\n   * 생성된 핸들러 파일이 저장될 디렉토리\n   * @optional\n   * @default 'src/app/mocks'\n   */\n  outputDir: './src/app/mocks',\n\n  /**\n   * API 기본 URL\n   * @optional\n   * - string: 지정된 URL을 기본 URL로 사용\n   * - true: OpenAPI 스펙의 servers[0].url을 기본 URL로 사용\n   */\n  baseUrl: 'https://api.example.com',\n\n  /**\n   * 생성할 mock 파일의 환경 설정\n   * @optional\n   * @default 'react'\n   * - next: Node.js와 브라우저 환경을 위한 mock 파일 생성\n   * - react: 브라우저 환경을 위한 mock 파일 생성\n   * - react-native: React Native 환경을 위한 mock 파일 생성\n   */\n  environment: 'react',\n\n  /**\n   * 배열 응답의 최대 길이\n   * @optional\n   * @default 3\n   * faker.js로 생성되는 배열 응답의 최대 아이템 개수를 제한합니다.\n   * 예: users 배열이 100개의 아이템을 가질 수 있더라도, maxArrayLength: 3으로 설정하면\n   *     최대 3개의 사용자 데이터만 생성됩니다.\n   */\n  maxArrayLength: 3,\n\n  /**\n   * 포함할 API 경로 패턴\n   * @optional\n   * 예: '/api/v1/*' - /api/v1/로 시작하는 경로만 포함\n   */\n  includes: '/api/v1/*',\n\n  /**\n   * 제외할 API 경로 패턴\n   * @optional\n   * 예: '/api/v1/health' - /api/v1/health 경로 제외\n   */\n  excludes: '/api/v1/health',\n\n  /**\n   * HTTP 상태 코드\n   * @optional\n   * 예: '200,201' - 200과 201 상태 코드만 사용\n   */\n  codes: '200,201',\n\n  /**\n   * 정적 응답 사용 여부\n   * @optional\n   * @default false\n   * true: faker.js를 사용하지 않고 정적 응답 생성\n   */\n  static: false,\n\n  /**\n   * 사용자 정의 응답 컨트롤러\n   * @optional\n   * faker.js를 사용하지 않고 API 엔드포인트별 커스텀 응답 생성\n   */\n  controllers: {\n    getGetUsersUsersGet200Response: () => userList,\n    ...\n  },\n\n  /**\n   * 컨트롤러 import 경로\n   * @optional\n   * @default '@/app/mocks/controllers'\n   */\n  controllerPath: '@/app/mocks/controllers',\n\n  /**\n   * DTO 타입 import 경로\n   * @optional\n   * @default '@/shared/api/dto'\n   * FSD(Feature-Sliced Design) 패러다임에 따라 기본값이 @/shared/api/dto로 설정됩니다.\n   */\n  dtoImportPath: '@/shared/api/dto',\n};\n```\n\n## 📁 생성되는 파일 구조\n\n```\nsrc/app/mocks/\n├── __types__/\n│   ├── users.type.ts\n│   ├── chats.type.ts\n│   ├── ...\n│   ├── index.ts\n├── __handlers__/\n│   ├── users.handlers.ts\n│   ├── chats.handlers.ts\n│   └── ...\n│   └── index.ts\n└── browser.ts\n```\n\n## 🔄 지원하는 환경\n\n- 🌐 React (Browser)\n- ⚡ Next.js (Node.js + Browser)\n- 📱 React Native\n\n## 🚀 ESM 지원 및 기술적 해결 방안\n\n### Node.js 전용 기능이 CommonJS인 이유\n\n`generateMocks` 함수는 다음과 같은 이유로 CommonJS로만 빌드됩니다:\n\n1. **의존성 제약**: `@apidevtools/swagger-parser`, `swagger2openapi` 등의 핵심 의존성이 ESM을 지원하지 않음\n2. **파일 시스템 접근**: Node.js의 `fs`, `path` 모듈을 직접 사용하여 파일 생성 작업 수행\n3. **안정성**: CommonJS 환경에서 검증된 라이브러리들과의 호환성 보장\n\n### React 프로젝트에서 ESM 사용 가능\n\nReact 프로젝트에서는 다음과 같은 방식으로 ESM을 완전히 지원합니다:\n\n```typescript\n// ✅ React 환경에서 ESM 사용 가능\nimport { selectResponseByScenario, transformJSONSchemaToFakerCode } from '@dhlab/msw-auto-mock';\n\n// ✅ Node.js 빌드 스크립트에서 CommonJS 사용\n// (예: React 프로젝트의 scripts/mock-generator.ts)\nimport { generateMocks } from '@dhlab/msw-auto-mock/node';\n```\n\n### 이중 패키지 구조의 장점\n\n```\n@dhlab/msw-auto-mock\n├── dist/\n│   ├── index.js      # ESM (브라우저, React 등)\n│   ├── index.cjs     # CommonJS (Node.js 호환)\n│   └── node/\n│       └── node.cjs  # Node.js 전용 CommonJS\n```\n\n이 구조를 통해:\n- **브라우저 환경**: 가벼운 ESM 번들 사용\n- **Node.js 환경**: 안정적인 CommonJS 사용  \n- **React 프로젝트**: ESM으로 런타임 기능 사용, 빌드 스크립트는 CommonJS로 파일 생성\n\n## 설치\n\n```bash\nnpm install @dhlab/msw-auto-mock\n# 또는\nyarn add @dhlab/msw-auto-mock\n# 또는\npnpm add @dhlab/msw-auto-mock\n```\n\n## 환경별 사용법\n\n### 기본 사용법 (환경 상관없이)\n\n환경에 상관없이 사용할 수 있는 기능들입니다.\n\n```typescript\n// 타입 정의, 시나리오 선택, 가짜 데이터 생성 등\nimport { \n  selectResponseByScenario, \n  transformJSONSchemaToFakerCode,\n  type TOptions,\n  type TScenarioConfig,\n  type ResponseObject\n} from '@dhlab/msw-auto-mock';\n```\n\n### Node.js 환경 (코드 생성)\n\nNode.js 환경에서는 OpenAPI 스키마를 기반으로 MSW 핸들러 파일을 생성할 수 있습니다.\n\n```typescript\n// Node.js 전용 기능\nimport { generateMocks } from '@dhlab/msw-auto-mock/node';\n\n// 환경 상관없이 사용 가능한 기능들 (필요시 별도 import)\nimport { \n  selectResponseByScenario, \n  transformJSONSchemaToFakerCode,\n  type TOptions \n} from '@dhlab/msw-auto-mock';\n\nawait generateMocks({\n  input: 'path/to/openapi.json',\n  outputDir: 'src/mocks',\n  environment: 'react' // 'react', 'next', 'react-native'\n});\n```\n\n#### React 컴포넌트에서 사용 예제\n\n```typescript\nimport React, { useState, useEffect } from 'react';\nimport { http, HttpResponse } from 'msw';\nimport { selectResponseByScenario, transformJSONSchemaToFakerCode } from '@dhlab/msw-auto-mock';\n\nconst MyComponent: React.FC = () => {\n  const [mockData, setMockData] = useState(null);\n\n  useEffect(() => {\n    // 시나리오 설정\n    const scenarios = {\n      'user-error': {\n        description: '사용자 오류 시나리오',\n        api: {\n          '/api/users': {\n            'GET': { status: 400 }\n          }\n        }\n      },\n      'success': {\n        description: '성공 시나리오',\n        api: {\n          '/api/users': {\n            'GET': { status: 200 }\n          }\n        }\n      },\n      'custom-error': {\n        description: '커스텀 에러 시나리오',\n        api: {\n          '/api/users': {\n            'GET': { status: 418, allowCustomStatus: true }\n          }\n        }\n      }\n    };\n\n    // MSW 핸들러 설정\n    const handler = http.get('/api/users', (info) => {\n      const responses = [\n        { status: 200, responseType: 'application/json', body: JSON.stringify({ users: [] }) },\n        { status: 400, responseType: 'application/json', body: JSON.stringify({ error: 'Bad Request' }) },\n        { status: 500, responseType: 'application/json', body: JSON.stringify({ error: 'Server Error' }) }\n      ];\n\n      const selectedResponse = selectResponseByScenario('GET', '/api/users', responses, info, scenarios);\n      \n      return HttpResponse.json(\n        JSON.parse(selectedResponse.body || '{}'),\n        { status: selectedResponse.status }\n      );\n    });\n\n    // 가짜 데이터 생성 예제\n    const userSchema = {\n      type: 'object',\n      properties: {\n        id: { type: 'string', format: 'uuid' },\n        name: { type: 'string' },\n        email: { type: 'string', format: 'email' },\n        age: { type: 'integer', minimum: 18, maximum: 100 }\n      }\n    };\n\n    const fakerCode = transformJSONSchemaToFakerCode(userSchema);\n    console.log('Generated faker code:', fakerCode);\n\n  }, []);\n\n  return (\n    <div>\n      <h1>MSW Auto Mock React Example</h1>\n      {/* 컴포넌트 내용 */}\n    </div>\n  );\n};\n```\n\n#### Next.js에서 사용 예제\n\n```typescript\n// pages/api/mocks/setup.ts 또는 app/api/mocks/setup/route.ts\nimport { generateMocks } from '@dhlab/msw-auto-mock/node';\nimport type { TOptions } from '@dhlab/msw-auto-mock';\n\nexport default async function handler(req: any, res: any) {\n  if (process.env.NODE_ENV === 'development') {\n    const options: TOptions = {\n      input: './public/openapi.json',\n      outputDir: './src/mocks',\n      environment: 'next'\n    };\n    \n    await generateMocks(options);\n    \n    res.status(200).json({ message: 'Mocks generated successfully' });\n  } else {\n    res.status(404).json({ message: 'Not found' });\n  }\n}\n```\n\n```typescript\n// components/MockProvider.tsx\nimport React from 'react';\nimport { selectResponseByScenario } from '@dhlab/msw-auto-mock';\n\nexport const MockProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n  // 브라우저 환경에서 MSW 설정\n  React.useEffect(() => {\n    if (typeof window !== 'undefined') {\n      import('../mocks/browser').then(({ worker }) => {\n        worker.start();\n      });\n    }\n  }, []);\n\n  return <>{children}</>;\n};\n```\n\n## API 문서\n\n### 환경 상관없이 사용 가능한 API\n\n#### `selectResponseByScenario`\n\n시나리오 기반으로 응답을 선택하는 함수입니다. 헤더 `x-scenario`를 통해 특정 시나리오를 활성화할 수 있습니다.\n\n```typescript\nfunction selectResponseByScenario(\n  verb: string,\n  path: string,\n  resultArray: ResponseObject[],\n  info: Parameters<HttpResponseResolver<Record<string, never>, null>>[0],\n  scenarios?: TScenarioConfig\n): ResponseObject\n```\n\n#### `allowCustomStatus` 기능\n\n기본적으로 시나리오에서는 OpenAPI 명세에 정의된 status 코드만 사용할 수 있습니다. 하지만 `allowCustomStatus: true`를 설정하면 명세에 없는 임의의 status 코드도 사용할 수 있습니다.\n\n- **기본 동작**: OpenAPI 명세에 정의된 status 코드만 허용 (타입 안전성 보장)\n- **allowCustomStatus: true**: 임의의 status 코드 사용 가능 (동적 에러 응답 생성)\n\n**사용 예시:**\n\n```typescript\n// 시나리오 설정\nconst scenarios = {\n  'success': {\n    description: '성공 시나리오',\n    api: {\n      '/api/users': { 'GET': { status: 200 } }\n    }\n  },\n  'error': {\n    description: '에러 시나리오',\n    api: {\n      '/api/users': { 'GET': { status: 500 } }\n    }\n  },\n  'custom-error': {\n    description: '커스텀 에러 시나리오',\n    api: {\n      '/api/users': { \n        'GET': { \n          status: 418, // \"I'm a teapot\" - OpenAPI 명세에 없는 status\n          allowCustomStatus: true \n        } \n      }\n    }\n  }\n};\n\n// MSW 핸들러에서 사용\nconst handler = http.get('/api/users', (info) => {\n  const responses = [\n    { status: 200, responseType: 'application/json', body: '{\"users\": []}' },\n    { status: 500, responseType: 'application/json', body: '{\"error\": \"Server Error\"}' }\n  ];\n  \n  // 헤더 기반 시나리오 선택 - 이제 ResponseObject를 직접 반환\n  const selectedResponse = selectResponseByScenario('GET', '/api/users', responses, info, scenarios);\n  \n  return HttpResponse.json(JSON.parse(selectedResponse.body || '{}'), {\n    status: selectedResponse.status\n  });\n});\n```\n\n**테스트 시나리오 제어:**\n\n```bash\n# 성공 시나리오 테스트\ncurl -H \"x-scenario: success\" http://localhost:3000/api/users\n\n# 에러 시나리오 테스트  \ncurl -H \"x-scenario: error\" http://localhost:3000/api/users\n\n# 커스텀 에러 시나리오 테스트 (OpenAPI 명세에 없는 418 status)\ncurl -H \"x-scenario: custom-error\" http://localhost:3000/api/users\n\n# 기본 시나리오 (헤더 없음 - 성공 응답 우선)\ncurl http://localhost:3000/api/users\n```\n\n#### `transformJSONSchemaToFakerCode`\n\nOpenAPI 스키마를 Faker.js 코드로 변환하는 함수입니다.\n\n```typescript\nfunction transformJSONSchemaToFakerCode(\n  jsonSchema?: OpenAPIV3.SchemaObject,\n  key?: string\n): string\n```\n\n## 🎯 allowCustomStatus 기능 상세 가이드\n\n### 사용 시나리오\n\n`allowCustomStatus: true` 기능은 다음과 같은 상황에서 유용합니다:\n\n1. **테스트 전용 에러 코드**: 특정 테스트 시나리오에서만 사용하는 에러 코드\n2. **OpenAPI 명세 미정의 응답**: 명세에는 없지만 실제 서버에서 발생할 수 있는 응답\n3. **프로토타이핑**: 새로운 API 응답을 실험하기 위한 임시 응답\n\n### 동작 방식\n\n```typescript\n// OpenAPI 명세에 200, 400, 500만 정의되어 있다고 가정\nconst scenarios = {\n  'teapot-error': {\n    description: '티팟 에러 테스트',\n    api: {\n      '/api/users': {\n        'GET': { \n          status: 418, // 명세에 없는 status\n          allowCustomStatus: true // 허용 플래그\n        }\n      }\n    }\n  }\n};\n```\n\n### 생성되는 응답\n\n`allowCustomStatus: true`로 설정된 시나리오가 활성화되면:\n\n```json\n{\n  \"error\": \"Client Error\", // 400-499는 \"Client Error\"\n  \"status\": 418\n}\n```\n\n또는\n\n```json\n{\n  \"error\": \"Internal Server Error\", // 500+는 \"Internal Server Error\"  \n  \"status\": 503\n}\n```\n\n### 타입 안전성\n\nTypeScript를 사용하는 경우:\n\n```typescript\n// ❌ 컴파일 에러 - 명세에 없는 status\nconst badScenario = {\n  api: {\n    '/api/users': {\n      'GET': { status: 418 } // allowCustomStatus 없이는 사용 불가\n    }\n  }\n};\n\n// ✅ 정상 - allowCustomStatus로 명시적 허용\nconst goodScenario = {\n  api: {\n    '/api/users': {\n      'GET': { status: 418, allowCustomStatus: true }\n    }\n  }\n};\n```\n\n### 주의사항\n\n- **명세 일치성**: `allowCustomStatus`는 명세와 목업 간의 일치성을 일부 포기하는 트레이드오프입니다\n- **테스트 전용**: 프로덕션 환경이 아닌 테스트/개발 환경에서만 사용하는 것을 권장합니다\n- **문서화**: 커스텀 status를 사용하는 경우 팀 내에서 충분한 문서화가 필요합니다\n\n### 타입 정의\n\n```typescript\nexport type TScenarioConfig = {\n  [scenarioId: string]: {\n    description: string;\n    api: Record<string, Record<string, {\n      status: number;\n      allowCustomStatus?: boolean;\n    }>>;\n  };\n};\n\nexport type ResponseObject = {\n  status: number;\n  responseType: string | undefined;\n  body: string | undefined;\n};\n```\n\n## 패키지 구조\n\n이 라이브러리는 기능별로 분리된 패키지로 제공됩니다:\n\n- **기본 (메인 엔트리)**: 환경 상관없이 사용 가능한 기능들\n- **Node.js 전용**: 파일 시스템 접근이 필요한 코드 생성 기능\n\n```\n@dhlab/msw-auto-mock\n├── dist/\n│   ├── index.js      # 기본 ESM (환경 상관없이)\n│   ├── index.cjs     # 기본 CommonJS (환경 상관없이)\n│   └── node/\n│       ├── node.js   # Node.js 전용 ESM\n│       └── node.cjs  # Node.js 전용 CommonJS\n```\n\n## 사용법 요약\n\n- **환경 상관없이 사용 가능**: `import { ... } from '@dhlab/msw-auto-mock'`\n- **Node.js 전용 기능**: `import { generateMocks } from '@dhlab/msw-auto-mock/node'`\n\n### 실제 사용 예시\n\n```typescript\n// React/Vue/Angular 등 모든 환경에서\nimport { selectResponseByScenario, transformJSONSchemaToFakerCode } from '@dhlab/msw-auto-mock';\n\n// Node.js에서 파일 생성 기능이 필요한 경우\nimport { generateMocks } from '@dhlab/msw-auto-mock/node';\n\n// 둘 다 필요하면 각각 import\nimport { selectResponseByScenario } from '@dhlab/msw-auto-mock';\nimport { generateMocks } from '@dhlab/msw-auto-mock/node';\n```\n\n## 라이선스\n\nMIT\n","readmeFilename":"README.md"}