sonamu 0.7.53 → 0.8.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.
Files changed (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
@@ -0,0 +1,421 @@
1
+ /**
2
+ * Fixture 생성 시 사용할 Faker 매핑 테이블입니다.
3
+ *
4
+ * 필드명이나 타입에 따라 적절한 Faker 함수를 선택하여,
5
+ * 현실적이고 의미있는 테스트 데이터를 생성하기 위함입니다.
6
+ *
7
+ * 예: salary 필드는 0~1000이 아닌 30M~150M 범위로 생성
8
+ */ export const fakerMappings = {
9
+ ko: {
10
+ field_patterns: {
11
+ email: {
12
+ faker: "faker.internet.email()",
13
+ comment: "이메일 주소"
14
+ },
15
+ username: {
16
+ faker: "fakerKO.person.fullName()",
17
+ comment: "한국어 이름"
18
+ },
19
+ name: {
20
+ faker: "fakerKO.person.fullName()",
21
+ comment: "한국어 이름"
22
+ },
23
+ firstname: {
24
+ faker: "fakerKO.person.firstName()",
25
+ comment: "이름"
26
+ },
27
+ lastname: {
28
+ faker: "fakerKO.person.lastName()",
29
+ comment: "성"
30
+ },
31
+ phone: {
32
+ faker: "faker.phone.number()",
33
+ comment: "전화번호"
34
+ },
35
+ mobile: {
36
+ faker: "faker.phone.number()",
37
+ comment: "휴대폰"
38
+ },
39
+ address: {
40
+ faker: "fakerKO.location.streetAddress()",
41
+ comment: "주소"
42
+ },
43
+ city: {
44
+ faker: "fakerKO.location.city()",
45
+ comment: "도시"
46
+ },
47
+ country: {
48
+ faker: "fakerKO.location.country()",
49
+ comment: "국가"
50
+ },
51
+ zipcode: {
52
+ faker: "faker.location.zipCode()",
53
+ comment: "우편번호"
54
+ },
55
+ company: {
56
+ faker: "fakerKO.company.name()",
57
+ comment: "회사명"
58
+ },
59
+ department: {
60
+ faker: "fakerKO.commerce.department()",
61
+ comment: "부서명"
62
+ },
63
+ position: {
64
+ faker: "fakerKO.person.jobTitle()",
65
+ comment: "직책"
66
+ },
67
+ jobtitle: {
68
+ faker: "fakerKO.person.jobTitle()",
69
+ comment: "직책"
70
+ },
71
+ birthdate: {
72
+ faker: "faker.date.birthdate()",
73
+ comment: "생년월일"
74
+ },
75
+ title: {
76
+ faker: "faker.lorem.sentence()",
77
+ comment: "제목"
78
+ },
79
+ description: {
80
+ faker: "faker.lorem.paragraph()",
81
+ comment: "설명"
82
+ },
83
+ content: {
84
+ faker: "faker.lorem.paragraphs(3)",
85
+ comment: "내용"
86
+ },
87
+ url: {
88
+ faker: "faker.internet.url()",
89
+ comment: "URL"
90
+ },
91
+ image: {
92
+ faker: "faker.image.url()",
93
+ comment: "이미지 URL"
94
+ },
95
+ avatar: {
96
+ faker: "faker.image.avatar()",
97
+ comment: "아바타 URL"
98
+ },
99
+ uuid: {
100
+ faker: "faker.string.uuid()",
101
+ comment: "UUID"
102
+ },
103
+ salary: {
104
+ faker: 'faker.number.int({ "min": 30000000, "max": 150000000 })',
105
+ comment: "연봉 (한국, 원)"
106
+ },
107
+ budget: {
108
+ faker: 'faker.number.int({ "min": 10000000, "max": 500000000 })',
109
+ comment: "예산"
110
+ },
111
+ price: {
112
+ faker: 'faker.number.int({ "min": 1000, "max": 1000000 })',
113
+ comment: "가격"
114
+ },
115
+ amount: {
116
+ faker: 'faker.number.int({ "min": 1000, "max": 1000000 })',
117
+ comment: "금액"
118
+ },
119
+ cost: {
120
+ faker: 'faker.number.int({ "min": 1000, "max": 1000000 })',
121
+ comment: "비용"
122
+ },
123
+ employeenumber: {
124
+ faker: "faker.string.numeric(8)",
125
+ comment: "사번"
126
+ },
127
+ code: {
128
+ faker: "faker.string.alphanumeric(10)",
129
+ comment: "코드"
130
+ },
131
+ count: {
132
+ faker: 'faker.number.int({ "min": 0, "max": 100 })',
133
+ comment: "개수"
134
+ },
135
+ quantity: {
136
+ faker: 'faker.number.int({ "min": 1, "max": 100 })',
137
+ comment: "수량"
138
+ },
139
+ mimetype: {
140
+ faker: "faker.helpers.arrayElement(['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'text/plain'])",
141
+ comment: "MIME 타입"
142
+ }
143
+ },
144
+ type_defaults: {
145
+ string: {
146
+ faker: "faker.lorem.words(3)",
147
+ comment: "일반 문자열"
148
+ },
149
+ integer: {
150
+ faker: 'faker.number.int({ "min": 1, "max": 1000 })',
151
+ comment: "정수"
152
+ },
153
+ numeric: {
154
+ faker: 'faker.number.float({ "min": 0, "max": 1000, "fractionDigits": 2 })',
155
+ comment: "숫자"
156
+ },
157
+ boolean: {
158
+ faker: "faker.datatype.boolean()",
159
+ comment: "불리언"
160
+ },
161
+ date: {
162
+ faker: "faker.date.past()",
163
+ comment: "날짜"
164
+ },
165
+ uuid: {
166
+ faker: "faker.string.uuid()",
167
+ comment: "UUID"
168
+ },
169
+ json: {
170
+ faker: "{}",
171
+ comment: "JSON 객체"
172
+ }
173
+ }
174
+ },
175
+ en: {
176
+ field_patterns: {
177
+ email: {
178
+ faker: "faker.internet.email()",
179
+ comment: "Email address"
180
+ },
181
+ username: {
182
+ faker: "faker.internet.username()",
183
+ comment: "Username"
184
+ },
185
+ name: {
186
+ faker: "faker.person.fullName()",
187
+ comment: "Full name"
188
+ },
189
+ firstname: {
190
+ faker: "faker.person.firstName()",
191
+ comment: "First name"
192
+ },
193
+ lastname: {
194
+ faker: "faker.person.lastName()",
195
+ comment: "Last name"
196
+ },
197
+ phone: {
198
+ faker: "faker.phone.number()",
199
+ comment: "Phone number"
200
+ },
201
+ mobile: {
202
+ faker: "faker.phone.number()",
203
+ comment: "Mobile number"
204
+ },
205
+ address: {
206
+ faker: "faker.location.streetAddress()",
207
+ comment: "Street address"
208
+ },
209
+ city: {
210
+ faker: "faker.location.city()",
211
+ comment: "City"
212
+ },
213
+ country: {
214
+ faker: "faker.location.country()",
215
+ comment: "Country"
216
+ },
217
+ zipcode: {
218
+ faker: "faker.location.zipCode()",
219
+ comment: "ZIP code"
220
+ },
221
+ company: {
222
+ faker: "faker.company.name()",
223
+ comment: "Company name"
224
+ },
225
+ department: {
226
+ faker: "faker.commerce.department()",
227
+ comment: "Department"
228
+ },
229
+ position: {
230
+ faker: "faker.person.jobTitle()",
231
+ comment: "Job title"
232
+ },
233
+ jobtitle: {
234
+ faker: "faker.person.jobTitle()",
235
+ comment: "Job title"
236
+ },
237
+ birthdate: {
238
+ faker: "faker.date.birthdate()",
239
+ comment: "Birth date"
240
+ },
241
+ title: {
242
+ faker: "faker.lorem.sentence()",
243
+ comment: "Title"
244
+ },
245
+ description: {
246
+ faker: "faker.lorem.paragraph()",
247
+ comment: "Description"
248
+ },
249
+ content: {
250
+ faker: "faker.lorem.paragraphs(3)",
251
+ comment: "Content"
252
+ },
253
+ url: {
254
+ faker: "faker.internet.url()",
255
+ comment: "URL"
256
+ },
257
+ image: {
258
+ faker: "faker.image.url()",
259
+ comment: "Image URL"
260
+ },
261
+ avatar: {
262
+ faker: "faker.image.avatar()",
263
+ comment: "Avatar URL"
264
+ },
265
+ uuid: {
266
+ faker: "faker.string.uuid()",
267
+ comment: "UUID"
268
+ },
269
+ salary: {
270
+ faker: 'faker.number.int({ "min": 30000, "max": 200000 })',
271
+ comment: "Annual salary (USD)"
272
+ },
273
+ budget: {
274
+ faker: 'faker.number.int({ "min": 10000, "max": 500000 })',
275
+ comment: "Budget"
276
+ },
277
+ price: {
278
+ faker: 'faker.number.int({ "min": 10, "max": 10000 })',
279
+ comment: "Price"
280
+ },
281
+ amount: {
282
+ faker: 'faker.number.int({ "min": 10, "max": 10000 })',
283
+ comment: "Amount"
284
+ },
285
+ cost: {
286
+ faker: 'faker.number.int({ "min": 10, "max": 10000 })',
287
+ comment: "Cost"
288
+ },
289
+ employeenumber: {
290
+ faker: "faker.string.numeric(8)",
291
+ comment: "Employee number"
292
+ },
293
+ code: {
294
+ faker: "faker.string.alphanumeric(10)",
295
+ comment: "Code"
296
+ },
297
+ count: {
298
+ faker: 'faker.number.int({ "min": 0, "max": 100 })',
299
+ comment: "Count"
300
+ },
301
+ quantity: {
302
+ faker: 'faker.number.int({ "min": 1, "max": 100 })',
303
+ comment: "Quantity"
304
+ },
305
+ mimetype: {
306
+ faker: "faker.helpers.arrayElement(['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'text/plain'])",
307
+ comment: "MIME type"
308
+ }
309
+ },
310
+ type_defaults: {
311
+ string: {
312
+ faker: "faker.lorem.words(3)",
313
+ comment: "String"
314
+ },
315
+ integer: {
316
+ faker: 'faker.number.int({ "min": 1, "max": 1000 })',
317
+ comment: "Integer"
318
+ },
319
+ numeric: {
320
+ faker: 'faker.number.float({ "min": 0, "max": 1000, "fractionDigits": 2 })',
321
+ comment: "Numeric"
322
+ },
323
+ boolean: {
324
+ faker: "faker.datatype.boolean()",
325
+ comment: "Boolean"
326
+ },
327
+ date: {
328
+ faker: "faker.date.past()",
329
+ comment: "Date"
330
+ },
331
+ uuid: {
332
+ faker: "faker.string.uuid()",
333
+ comment: "UUID"
334
+ },
335
+ json: {
336
+ faker: "{}",
337
+ comment: "JSON object"
338
+ }
339
+ }
340
+ },
341
+ ja: {
342
+ field_patterns: {
343
+ email: {
344
+ faker: "faker.internet.email()",
345
+ comment: "メールアドレス"
346
+ },
347
+ username: {
348
+ faker: "fakerJA.person.fullName()",
349
+ comment: "日本語名"
350
+ },
351
+ name: {
352
+ faker: "fakerJA.person.fullName()",
353
+ comment: "日本語名"
354
+ },
355
+ firstname: {
356
+ faker: "fakerJA.person.firstName()",
357
+ comment: "名"
358
+ },
359
+ lastname: {
360
+ faker: "fakerJA.person.lastName()",
361
+ comment: "姓"
362
+ },
363
+ phone: {
364
+ faker: "faker.phone.number()",
365
+ comment: "電話番号"
366
+ },
367
+ mobile: {
368
+ faker: "faker.phone.number()",
369
+ comment: "携帯電話"
370
+ },
371
+ address: {
372
+ faker: "fakerJA.location.streetAddress()",
373
+ comment: "住所"
374
+ },
375
+ city: {
376
+ faker: "fakerJA.location.city()",
377
+ comment: "都市"
378
+ },
379
+ company: {
380
+ faker: "fakerJA.company.name()",
381
+ comment: "会社名"
382
+ },
383
+ title: {
384
+ faker: "faker.lorem.sentence()",
385
+ comment: "タイトル"
386
+ },
387
+ salary: {
388
+ faker: 'faker.number.int({ "min": 3000000, "max": 15000000 })',
389
+ comment: "年収(円)"
390
+ },
391
+ budget: {
392
+ faker: 'faker.number.int({ "min": 1000000, "max": 50000000 })',
393
+ comment: "予算"
394
+ }
395
+ },
396
+ type_defaults: {
397
+ string: {
398
+ faker: "faker.lorem.words(3)",
399
+ comment: "文字列"
400
+ },
401
+ integer: {
402
+ faker: 'faker.number.int({ "min": 1, "max": 1000 })',
403
+ comment: "整数"
404
+ },
405
+ numeric: {
406
+ faker: 'faker.number.float({ "min": 0, "max": 1000, "fractionDigits": 2 })',
407
+ comment: "数値"
408
+ },
409
+ boolean: {
410
+ faker: "faker.datatype.boolean()",
411
+ comment: "真偽値"
412
+ },
413
+ date: {
414
+ faker: "faker.date.past()",
415
+ comment: "日付"
416
+ }
417
+ }
418
+ }
419
+ };
420
+
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Zha2VyLW1hcHBpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRml4dHVyZSDsg53shLEg7IucIOyCrOyaqe2VoCBGYWtlciDrp6TtlZEg7YWM7J2067iU7J6F64uI64ukLlxuICpcbiAqIO2VhOuTnOuqheydtOuCmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBGYWtlciDtlajsiJjrpbwg7ISg7YOd7ZWY7JesLFxuICog7ZiE7Iuk7KCB7J206rOgIOydmOuvuOyeiOuKlCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VmOq4sCDsnITtlajsnoXri4jri6QuXG4gKlxuICog7JiIOiBzYWxhcnkg7ZWE65Oc64qUIDB+MTAwMOydtCDslYTri4wgMzBNfjE1ME0g67KU7JyE66GcIOyDneyEsVxuICovXG5leHBvcnQgdHlwZSBGYWtlck1hcHBpbmdDb25maWcgPSB7XG4gIGZha2VyOiBzdHJpbmc7XG4gIGNvbW1lbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBGYWtlck1hcHBpbmdzID0ge1xuICBbbG9jYWxlOiBzdHJpbmddOiB7XG4gICAgZmllbGRfcGF0dGVybnM6IFJlY29yZDxzdHJpbmcsIEZha2VyTWFwcGluZ0NvbmZpZz47XG4gICAgdHlwZV9kZWZhdWx0czogUmVjb3JkPHN0cmluZywgRmFrZXJNYXBwaW5nQ29uZmlnPjtcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBmYWtlck1hcHBpbmdzOiBGYWtlck1hcHBpbmdzID0ge1xuICBrbzoge1xuICAgIGZpZWxkX3BhdHRlcm5zOiB7XG4gICAgICBlbWFpbDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7J2066mU7J28IOyjvOyGjFwiLFxuICAgICAgfSxcbiAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyS08ucGVyc29uLmZ1bGxOYW1lKClcIixcbiAgICAgICAgY29tbWVudDogXCLtlZzqta3slrQg7J2066aEXCIsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLnBlcnNvbi5mdWxsTmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7ZWc6rWt7Ja0IOydtOumhFwiLFxuICAgICAgfSxcbiAgICAgIGZpcnN0bmFtZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLnBlcnNvbi5maXJzdE5hbWUoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuydtOumhFwiLFxuICAgICAgfSxcbiAgICAgIGxhc3RuYW1lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyS08ucGVyc29uLmxhc3ROYW1lKClcIixcbiAgICAgICAgY29tbWVudDogXCLshLFcIixcbiAgICAgIH0sXG4gICAgICBwaG9uZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5waG9uZS5udW1iZXIoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuyghO2ZlOuyiO2YuFwiLFxuICAgICAgfSxcbiAgICAgIG1vYmlsZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5waG9uZS5udW1iZXIoKVwiLFxuICAgICAgICBjb21tZW50OiBcIu2ctOuMgO2PsFwiLFxuICAgICAgfSxcbiAgICAgIGFkZHJlc3M6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXJLTy5sb2NhdGlvbi5zdHJlZXRBZGRyZXNzKClcIixcbiAgICAgICAgY29tbWVudDogXCLso7zshoxcIixcbiAgICAgIH0sXG4gICAgICBjaXR5OiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyS08ubG9jYXRpb24uY2l0eSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi64+E7IucXCIsXG4gICAgICB9LFxuICAgICAgY291bnRyeToge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLmxvY2F0aW9uLmNvdW50cnkoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuq1reqwgFwiLFxuICAgICAgfSxcbiAgICAgIHppcGNvZGU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9jYXRpb24uemlwQ29kZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7Jqw7Y6467KI7Zi4XCIsXG4gICAgICB9LFxuICAgICAgY29tcGFueToge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLmNvbXBhbnkubmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7ZqM7IKs66qFXCIsXG4gICAgICB9LFxuICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLmNvbW1lcmNlLmRlcGFydG1lbnQoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuu2gOyEnOuqhVwiLFxuICAgICAgfSxcbiAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyS08ucGVyc29uLmpvYlRpdGxlKClcIixcbiAgICAgICAgY29tbWVudDogXCLsp4HssYVcIixcbiAgICAgIH0sXG4gICAgICBqb2J0aXRsZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlcktPLnBlcnNvbi5qb2JUaXRsZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7KeB7LGFXCIsXG4gICAgICB9LFxuICAgICAgYmlydGhkYXRlOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmRhdGUuYmlydGhkYXRlKClcIixcbiAgICAgICAgY29tbWVudDogXCLsg53rhYTsm5TsnbxcIixcbiAgICAgIH0sXG4gICAgICB0aXRsZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5sb3JlbS5zZW50ZW5jZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7KCc66qpXCIsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9yZW0ucGFyYWdyYXBoKClcIixcbiAgICAgICAgY29tbWVudDogXCLshKTrqoVcIixcbiAgICAgIH0sXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmxvcmVtLnBhcmFncmFwaHMoMylcIixcbiAgICAgICAgY29tbWVudDogXCLrgrTsmqlcIixcbiAgICAgIH0sXG4gICAgICB1cmw6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIuaW50ZXJuZXQudXJsKClcIixcbiAgICAgICAgY29tbWVudDogXCJVUkxcIixcbiAgICAgIH0sXG4gICAgICBpbWFnZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5pbWFnZS51cmwoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuydtOuvuOyngCBVUkxcIixcbiAgICAgIH0sXG4gICAgICBhdmF0YXI6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIuaW1hZ2UuYXZhdGFyKClcIixcbiAgICAgICAgY29tbWVudDogXCLslYTrsJTtg4AgVVJMXCIsXG4gICAgICB9LFxuICAgICAgdXVpZDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5zdHJpbmcudXVpZCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiVVVJRFwiLFxuICAgICAgfSxcbiAgICAgIHNhbGFyeToge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAzMDAwMDAwMCwgXCJtYXhcIjogMTUwMDAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCLsl7DrtIkgKO2VnOq1rSwg7JuQKVwiLFxuICAgICAgfSxcbiAgICAgIGJ1ZGdldDoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAxMDAwMDAwMCwgXCJtYXhcIjogNTAwMDAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCLsmIjsgrBcIixcbiAgICAgIH0sXG4gICAgICBwcmljZToge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAxMDAwLCBcIm1heFwiOiAxMDAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCLqsIDqsqlcIixcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMTAwMCwgXCJtYXhcIjogMTAwMDAwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi6riI7JWhXCIsXG4gICAgICB9LFxuICAgICAgY29zdDoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAxMDAwLCBcIm1heFwiOiAxMDAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCLruYTsmqlcIixcbiAgICAgIH0sXG4gICAgICBlbXBsb3llZW51bWJlcjoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5zdHJpbmcubnVtZXJpYyg4KVwiLFxuICAgICAgICBjb21tZW50OiBcIuyCrOuyiFwiLFxuICAgICAgfSxcbiAgICAgIGNvZGU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIuc3RyaW5nLmFscGhhbnVtZXJpYygxMClcIixcbiAgICAgICAgY29tbWVudDogXCLsvZTrk5xcIixcbiAgICAgIH0sXG4gICAgICBjb3VudDoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAwLCBcIm1heFwiOiAxMDAgfSknLFxuICAgICAgICBjb21tZW50OiBcIuqwnOyImFwiLFxuICAgICAgfSxcbiAgICAgIHF1YW50aXR5OiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDEsIFwibWF4XCI6IDEwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi7IiY65+JXCIsXG4gICAgICB9LFxuICAgICAgbWltZXR5cGU6IHtcbiAgICAgICAgZmFrZXI6XG4gICAgICAgICAgXCJmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcG5nJywgJ2ltYWdlL2dpZicsICdhcHBsaWNhdGlvbi9wZGYnLCAndGV4dC9wbGFpbiddKVwiLFxuICAgICAgICBjb21tZW50OiBcIk1JTUUg7YOA7J6FXCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgdHlwZV9kZWZhdWx0czoge1xuICAgICAgc3RyaW5nOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi7J2867CYIOusuOyekOyXtFwiLFxuICAgICAgfSxcbiAgICAgIGludGVnZXI6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMSwgXCJtYXhcIjogMTAwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi7KCV7IiYXCIsXG4gICAgICB9LFxuICAgICAgbnVtZXJpYzoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5mbG9hdCh7IFwibWluXCI6IDAsIFwibWF4XCI6IDEwMDAsIFwiZnJhY3Rpb25EaWdpdHNcIjogMiB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi7Iir7J6QXCIsXG4gICAgICB9LFxuICAgICAgYm9vbGVhbjoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5kYXRhdHlwZS5ib29sZWFuKClcIixcbiAgICAgICAgY29tbWVudDogXCLrtojrpqzslrhcIixcbiAgICAgIH0sXG4gICAgICBkYXRlOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmRhdGUucGFzdCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi64Kg7KecXCIsXG4gICAgICB9LFxuICAgICAgdXVpZDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5zdHJpbmcudXVpZCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiVVVJRFwiLFxuICAgICAgfSxcbiAgICAgIGpzb246IHtcbiAgICAgICAgZmFrZXI6IFwie31cIixcbiAgICAgICAgY29tbWVudDogXCJKU09OIOqwneyytFwiLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBlbjoge1xuICAgIGZpZWxkX3BhdHRlcm5zOiB7XG4gICAgICBlbWFpbDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiRW1haWwgYWRkcmVzc1wiLFxuICAgICAgfSxcbiAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmludGVybmV0LnVzZXJuYW1lKClcIixcbiAgICAgICAgY29tbWVudDogXCJVc2VybmFtZVwiLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIucGVyc29uLmZ1bGxOYW1lKClcIixcbiAgICAgICAgY29tbWVudDogXCJGdWxsIG5hbWVcIixcbiAgICAgIH0sXG4gICAgICBmaXJzdG5hbWU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIucGVyc29uLmZpcnN0TmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiRmlyc3QgbmFtZVwiLFxuICAgICAgfSxcbiAgICAgIGxhc3RuYW1lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLnBlcnNvbi5sYXN0TmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiTGFzdCBuYW1lXCIsXG4gICAgICB9LFxuICAgICAgcGhvbmU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIucGhvbmUubnVtYmVyKClcIixcbiAgICAgICAgY29tbWVudDogXCJQaG9uZSBudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBtb2JpbGU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIucGhvbmUubnVtYmVyKClcIixcbiAgICAgICAgY29tbWVudDogXCJNb2JpbGUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgYWRkcmVzczoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5sb2NhdGlvbi5zdHJlZXRBZGRyZXNzKClcIixcbiAgICAgICAgY29tbWVudDogXCJTdHJlZXQgYWRkcmVzc1wiLFxuICAgICAgfSxcbiAgICAgIGNpdHk6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9jYXRpb24uY2l0eSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiQ2l0eVwiLFxuICAgICAgfSxcbiAgICAgIGNvdW50cnk6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9jYXRpb24uY291bnRyeSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiQ291bnRyeVwiLFxuICAgICAgfSxcbiAgICAgIHppcGNvZGU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9jYXRpb24uemlwQ29kZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiWklQIGNvZGVcIixcbiAgICAgIH0sXG4gICAgICBjb21wYW55OiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmNvbXBhbnkubmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiQ29tcGFueSBuYW1lXCIsXG4gICAgICB9LFxuICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5jb21tZXJjZS5kZXBhcnRtZW50KClcIixcbiAgICAgICAgY29tbWVudDogXCJEZXBhcnRtZW50XCIsXG4gICAgICB9LFxuICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIucGVyc29uLmpvYlRpdGxlKClcIixcbiAgICAgICAgY29tbWVudDogXCJKb2IgdGl0bGVcIixcbiAgICAgIH0sXG4gICAgICBqb2J0aXRsZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5wZXJzb24uam9iVGl0bGUoKVwiLFxuICAgICAgICBjb21tZW50OiBcIkpvYiB0aXRsZVwiLFxuICAgICAgfSxcbiAgICAgIGJpcnRoZGF0ZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5kYXRlLmJpcnRoZGF0ZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiQmlydGggZGF0ZVwiLFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmxvcmVtLnNlbnRlbmNlKClcIixcbiAgICAgICAgY29tbWVudDogXCJUaXRsZVwiLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmxvcmVtLnBhcmFncmFwaCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiRGVzY3JpcHRpb25cIixcbiAgICAgIH0sXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmxvcmVtLnBhcmFncmFwaHMoMylcIixcbiAgICAgICAgY29tbWVudDogXCJDb250ZW50XCIsXG4gICAgICB9LFxuICAgICAgdXJsOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmludGVybmV0LnVybCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiVVJMXCIsXG4gICAgICB9LFxuICAgICAgaW1hZ2U6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIuaW1hZ2UudXJsKClcIixcbiAgICAgICAgY29tbWVudDogXCJJbWFnZSBVUkxcIixcbiAgICAgIH0sXG4gICAgICBhdmF0YXI6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIuaW1hZ2UuYXZhdGFyKClcIixcbiAgICAgICAgY29tbWVudDogXCJBdmF0YXIgVVJMXCIsXG4gICAgICB9LFxuICAgICAgdXVpZDoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5zdHJpbmcudXVpZCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiVVVJRFwiLFxuICAgICAgfSxcbiAgICAgIHNhbGFyeToge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAzMDAwMCwgXCJtYXhcIjogMjAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCJBbm51YWwgc2FsYXJ5IChVU0QpXCIsXG4gICAgICB9LFxuICAgICAgYnVkZ2V0OiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDEwMDAwLCBcIm1heFwiOiA1MDAwMDAgfSknLFxuICAgICAgICBjb21tZW50OiBcIkJ1ZGdldFwiLFxuICAgICAgfSxcbiAgICAgIHByaWNlOiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDEwLCBcIm1heFwiOiAxMDAwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwiUHJpY2VcIixcbiAgICAgIH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMTAsIFwibWF4XCI6IDEwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCJBbW91bnRcIixcbiAgICAgIH0sXG4gICAgICBjb3N0OiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDEwLCBcIm1heFwiOiAxMDAwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwiQ29zdFwiLFxuICAgICAgfSxcbiAgICAgIGVtcGxveWVlbnVtYmVyOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLnN0cmluZy5udW1lcmljKDgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwiRW1wbG95ZWUgbnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgY29kZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5zdHJpbmcuYWxwaGFudW1lcmljKDEwKVwiLFxuICAgICAgICBjb21tZW50OiBcIkNvZGVcIixcbiAgICAgIH0sXG4gICAgICBjb3VudDoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5pbnQoeyBcIm1pblwiOiAwLCBcIm1heFwiOiAxMDAgfSknLFxuICAgICAgICBjb21tZW50OiBcIkNvdW50XCIsXG4gICAgICB9LFxuICAgICAgcXVhbnRpdHk6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMSwgXCJtYXhcIjogMTAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCJRdWFudGl0eVwiLFxuICAgICAgfSxcbiAgICAgIG1pbWV0eXBlOiB7XG4gICAgICAgIGZha2VyOlxuICAgICAgICAgIFwiZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZycsICdpbWFnZS9naWYnLCAnYXBwbGljYXRpb24vcGRmJywgJ3RleHQvcGxhaW4nXSlcIixcbiAgICAgICAgY29tbWVudDogXCJNSU1FIHR5cGVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0eXBlX2RlZmF1bHRzOiB7XG4gICAgICBzdHJpbmc6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXIubG9yZW0ud29yZHMoMylcIixcbiAgICAgICAgY29tbWVudDogXCJTdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpbnRlZ2VyOiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDEsIFwibWF4XCI6IDEwMDAgfSknLFxuICAgICAgICBjb21tZW50OiBcIkludGVnZXJcIixcbiAgICAgIH0sXG4gICAgICBudW1lcmljOiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmZsb2F0KHsgXCJtaW5cIjogMCwgXCJtYXhcIjogMTAwMCwgXCJmcmFjdGlvbkRpZ2l0c1wiOiAyIH0pJyxcbiAgICAgICAgY29tbWVudDogXCJOdW1lcmljXCIsXG4gICAgICB9LFxuICAgICAgYm9vbGVhbjoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5kYXRhdHlwZS5ib29sZWFuKClcIixcbiAgICAgICAgY29tbWVudDogXCJCb29sZWFuXCIsXG4gICAgICB9LFxuICAgICAgZGF0ZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5kYXRlLnBhc3QoKVwiLFxuICAgICAgICBjb21tZW50OiBcIkRhdGVcIixcbiAgICAgIH0sXG4gICAgICB1dWlkOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLnN0cmluZy51dWlkKClcIixcbiAgICAgICAgY29tbWVudDogXCJVVUlEXCIsXG4gICAgICB9LFxuICAgICAganNvbjoge1xuICAgICAgICBmYWtlcjogXCJ7fVwiLFxuICAgICAgICBjb21tZW50OiBcIkpTT04gb2JqZWN0XCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGphOiB7XG4gICAgZmllbGRfcGF0dGVybnM6IHtcbiAgICAgIGVtYWlsOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmludGVybmV0LmVtYWlsKClcIixcbiAgICAgICAgY29tbWVudDogXCLjg6Hjg7zjg6vjgqLjg4njg6zjgrlcIixcbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlckpBLnBlcnNvbi5mdWxsTmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pel5pys6Kqe5ZCNXCIsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlckpBLnBlcnNvbi5mdWxsTmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pel5pys6Kqe5ZCNXCIsXG4gICAgICB9LFxuICAgICAgZmlyc3RuYW1lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VySkEucGVyc29uLmZpcnN0TmFtZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi5ZCNXCIsXG4gICAgICB9LFxuICAgICAgbGFzdG5hbWU6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXJKQS5wZXJzb24ubGFzdE5hbWUoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuWnk1wiLFxuICAgICAgfSxcbiAgICAgIHBob25lOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLnBob25lLm51bWJlcigpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi6Zu76Kmx55Wq5Y+3XCIsXG4gICAgICB9LFxuICAgICAgbW9iaWxlOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLnBob25lLm51bWJlcigpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pC65biv6Zu76KmxXCIsXG4gICAgICB9LFxuICAgICAgYWRkcmVzczoge1xuICAgICAgICBmYWtlcjogXCJmYWtlckpBLmxvY2F0aW9uLnN0cmVldEFkZHJlc3MoKVwiLFxuICAgICAgICBjb21tZW50OiBcIuS9j+aJgFwiLFxuICAgICAgfSxcbiAgICAgIGNpdHk6IHtcbiAgICAgICAgZmFrZXI6IFwiZmFrZXJKQS5sb2NhdGlvbi5jaXR5KClcIixcbiAgICAgICAgY29tbWVudDogXCLpg73luIJcIixcbiAgICAgIH0sXG4gICAgICBjb21wYW55OiB7XG4gICAgICAgIGZha2VyOiBcImZha2VySkEuY29tcGFueS5uYW1lKClcIixcbiAgICAgICAgY29tbWVudDogXCLkvJrnpL7lkI1cIixcbiAgICAgIH0sXG4gICAgICB0aXRsZToge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5sb3JlbS5zZW50ZW5jZSgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi44K/44Kk44OI44OrXCIsXG4gICAgICB9LFxuICAgICAgc2FsYXJ5OiB7XG4gICAgICAgIGZha2VyOiAnZmFrZXIubnVtYmVyLmludCh7IFwibWluXCI6IDMwMDAwMDAsIFwibWF4XCI6IDE1MDAwMDAwIH0pJyxcbiAgICAgICAgY29tbWVudDogXCLlubTlj47vvIjlhobvvIlcIixcbiAgICAgIH0sXG4gICAgICBidWRnZXQ6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMTAwMDAwMCwgXCJtYXhcIjogNTAwMDAwMDAgfSknLFxuICAgICAgICBjb21tZW50OiBcIuS6iOeul1wiLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHR5cGVfZGVmYXVsdHM6IHtcbiAgICAgIHN0cmluZzoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5sb3JlbS53b3JkcygzKVwiLFxuICAgICAgICBjb21tZW50OiBcIuaWh+Wtl+WIl1wiLFxuICAgICAgfSxcbiAgICAgIGludGVnZXI6IHtcbiAgICAgICAgZmFrZXI6ICdmYWtlci5udW1iZXIuaW50KHsgXCJtaW5cIjogMSwgXCJtYXhcIjogMTAwMCB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pW05pWwXCIsXG4gICAgICB9LFxuICAgICAgbnVtZXJpYzoge1xuICAgICAgICBmYWtlcjogJ2Zha2VyLm51bWJlci5mbG9hdCh7IFwibWluXCI6IDAsIFwibWF4XCI6IDEwMDAsIFwiZnJhY3Rpb25EaWdpdHNcIjogMiB9KScsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pWw5YCkXCIsXG4gICAgICB9LFxuICAgICAgYm9vbGVhbjoge1xuICAgICAgICBmYWtlcjogXCJmYWtlci5kYXRhdHlwZS5ib29sZWFuKClcIixcbiAgICAgICAgY29tbWVudDogXCLnnJ/lgb3lgKRcIixcbiAgICAgIH0sXG4gICAgICBkYXRlOiB7XG4gICAgICAgIGZha2VyOiBcImZha2VyLmRhdGUucGFzdCgpXCIsXG4gICAgICAgIGNvbW1lbnQ6IFwi5pel5LuYXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIl0sIm5hbWVzIjpbImZha2VyTWFwcGluZ3MiLCJrbyIsImZpZWxkX3BhdHRlcm5zIiwiZW1haWwiLCJmYWtlciIsImNvbW1lbnQiLCJ1c2VybmFtZSIsIm5hbWUiLCJmaXJzdG5hbWUiLCJsYXN0bmFtZSIsInBob25lIiwibW9iaWxlIiwiYWRkcmVzcyIsImNpdHkiLCJjb3VudHJ5IiwiemlwY29kZSIsImNvbXBhbnkiLCJkZXBhcnRtZW50IiwicG9zaXRpb24iLCJqb2J0aXRsZSIsImJpcnRoZGF0ZSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJjb250ZW50IiwidXJsIiwiaW1hZ2UiLCJhdmF0YXIiLCJ1dWlkIiwic2FsYXJ5IiwiYnVkZ2V0IiwicHJpY2UiLCJhbW91bnQiLCJjb3N0IiwiZW1wbG95ZWVudW1iZXIiLCJjb2RlIiwiY291bnQiLCJxdWFudGl0eSIsIm1pbWV0eXBlIiwidHlwZV9kZWZhdWx0cyIsInN0cmluZyIsImludGVnZXIiLCJudW1lcmljIiwiYm9vbGVhbiIsImRhdGUiLCJqc29uIiwiZW4iLCJqYSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Q0FPQyxHQWFELE9BQU8sTUFBTUEsZ0JBQStCO0lBQzFDQyxJQUFJO1FBQ0ZDLGdCQUFnQjtZQUNkQyxPQUFPO2dCQUNMQyxPQUFPO2dCQUNQQyxTQUFTO1lBQ1g7WUFDQUMsVUFBVTtnQkFDUkYsT0FBTztnQkFDUEMsU0FBUztZQUNYO1lB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
@@ -0,0 +1,161 @@
1
+ import type { Knex } from "knex";
2
+ import type { EntityManager } from "../entity/entity-manager";
3
+ import type { FixtureImportResult } from "../types/types";
4
+ import { type ExploreWithRelationsOptions } from "./data-explorer";
5
+ export type Locale = "ko" | "en" | "ja";
6
+ export type FixtureGeneratorOptions = {
7
+ locale?: Locale;
8
+ useLLM?: boolean;
9
+ enableLLMCache?: boolean;
10
+ llmModel?: string;
11
+ };
12
+ export type GeneratorContext = {
13
+ /** 생성 중인 fixture들 (메모리 상) */
14
+ fixtures: Map<string, Record<string, unknown>>;
15
+ /** 참조 데이터 캐시 (DataExplorer 결과) */
16
+ referenceCache: Map<string, Record<string, unknown>[]>;
17
+ /** 이미 import된 레코드를 추적하여 중복 import를 방지합니다 */
18
+ importedRecords: Set<string>;
19
+ };
20
+ export declare class FixtureGenerator {
21
+ private sourceDb;
22
+ private targetDbName;
23
+ private entityManager;
24
+ private dataExplorer;
25
+ private locale;
26
+ private mappings;
27
+ private llmCache;
28
+ private options;
29
+ constructor(sourceDb: Knex, _targetDb: Knex, targetDbName: "fixture" | "test" | "production_master", entityManager: typeof EntityManager, options?: FixtureGeneratorOptions);
30
+ /**
31
+ * Fixture 생성 (단일)
32
+ * @returns 생성된 fixture 데이터 (메모리 상)
33
+ */
34
+ generate(entityName: string, overrides?: Record<string, unknown>, context?: GeneratorContext): Promise<Record<string, unknown>>;
35
+ /**
36
+ * Relation 값 생성 + 자동 Import
37
+ */
38
+ private generateRelationValue;
39
+ /**
40
+ * ExploreWithRelations 결과를 targetDb에 import
41
+ *
42
+ * 관계 체인을 따라간 결과(main + related)를 모두 import합니다.
43
+ * 의존성 순서는 FixtureManager.insertFixtures가 자동으로 처리합니다.
44
+ */
45
+ private importExploreResult;
46
+ /**
47
+ * fixtureGenerator 실행 (Faker.js만 지원)
48
+ *
49
+ * faker.* 형식의 표현식을 안전하게 파싱하여 실행합니다.
50
+ * 예: "faker.internet.email()" → faker.internet.email()
51
+ * 예: "faker.lorem.words(3)" → faker.lorem.words(3)
52
+ */
53
+ private executeGenerator;
54
+ /**
55
+ * 필드의 타입과 이름을 분석하여 적절한 기본값을 생성합니다.
56
+ *
57
+ * 우선순위:
58
+ * 1. 필드명 패턴 매칭 (salary, budget 등 의미있는 데이터)
59
+ * 2. 특수 케이스 (Department name 등 도메인 지식)
60
+ * 3. 배열 타입 (JSON 배열)
61
+ * 4. Enum 타입
62
+ * 5. 타입별 기본값
63
+ */
64
+ private generateDefaultValue;
65
+ /**
66
+ * 배열 타입의 값을 생성합니다.
67
+ *
68
+ * 타입 ID와 필드명 패턴을 분석하여 적절한 배열 데이터를 생성합니다.
69
+ * 예: image_urls → [{url, name, mime_type}, ...]
70
+ * tag_ids → [1, 23, 45]
71
+ */
72
+ private generateArrayValue;
73
+ /**
74
+ * JSON 매핑의 Faker 표현식을 파싱하여 실행합니다.
75
+ *
76
+ * 표현식 예시:
77
+ * - "faker.internet.email()" → 인자 없음
78
+ * - "faker.number.int({ min: 1, max: 100 })" → JSON 인자
79
+ * - "{}" → 리터럴 값 (JSON.parse)
80
+ *
81
+ * fakerKO, fakerJA도 지원하여 다국어 데이터를 생성합니다.
82
+ */
83
+ private executeFakerExpression;
84
+ /**
85
+ * fixtureHint를 LLM에게 전달하여 현실적인 테스트 데이터를 생성합니다.
86
+ *
87
+ * faker.js로는 생성하기 어려운 복잡한 텍스트(자기소개, 설명문 등)를
88
+ * LLM을 활용하여 생성합니다. 동일한 hint에 대한 중복 호출을 방지하기 위해
89
+ * 캐싱을 기본으로 지원합니다 (LLM API 비용 절감).
90
+ *
91
+ * ai 패키지는 dynamic import로 불러오므로, useLLM이 false인 경우
92
+ * 의존성이 설치되지 않아도 fixture 생성이 정상 동작합니다.
93
+ */
94
+ private generateWithLLM;
95
+ private buildLLMPrompt;
96
+ private parseLLMResponse;
97
+ private getDefaultValueForType;
98
+ private parseScalarValue;
99
+ /**
100
+ * Sonamu.secret을 우선으로 하고, 없으면 환경변수에서 API 키를 읽습니다.
101
+ *
102
+ * Sonamu.secret은 프로젝트별 설정(sonamu.config.ts)이므로 더 높은 우선순위를 가지며,
103
+ * 환경변수는 개발 환경이나 CI/CD에서 fallback으로 사용됩니다.
104
+ */
105
+ private getApiKey;
106
+ private getExpectedFormat;
107
+ private getScalarFormat;
108
+ private getExampleForType;
109
+ private getScalarExample;
110
+ /**
111
+ * LLM 캐시 통계를 반환합니다.
112
+ */
113
+ getLLMCacheStats(): {
114
+ size: number;
115
+ enabled: boolean | undefined;
116
+ };
117
+ /**
118
+ * LLM 캐시를 초기화합니다.
119
+ */
120
+ clearLLMCache(): void;
121
+ /**
122
+ * 컨텍스트 생성
123
+ */
124
+ private createContext;
125
+ /**
126
+ * 배치 생성 및 자동 저장
127
+ *
128
+ * 1. 각 spec별로 fixture 생성 (메모리)
129
+ * 2. FixtureRecord로 변환
130
+ * 3. FixtureManager.insertFixtures()로 targetDb에 저장
131
+ *
132
+ * @returns 저장된 fixture 데이터 (실제 DB ID 포함)
133
+ */
134
+ generateBatch(specs: Array<{
135
+ entity: string;
136
+ count: number;
137
+ overrides?: Record<string, unknown>;
138
+ }>): Promise<FixtureImportResult[]>;
139
+ /**
140
+ * 실제 DB(sourceDb)에서 데이터를 조회하여 fixture DB(targetDb)에 import합니다.
141
+ *
142
+ * 1. DataExplorer로 sourceDb에서 데이터 조회 (관련 데이터 포함)
143
+ * 2. FixtureRecord로 변환
144
+ * 3. targetDb에 삽입
145
+ *
146
+ * @param entityName - 조회할 entity 이름
147
+ * @param options - 조회 옵션 (strategy, limit, includeRelations 등)
148
+ * @returns 저장된 fixture 데이터 (실제 DB ID 포함)
149
+ *
150
+ * @example
151
+ * // 프로덕션 DB에서 User 10명 + 관련 Employee, Department 가져오기
152
+ * await generator.importFromSource("User", {
153
+ * strategy: "sample",
154
+ * limit: 10,
155
+ * includeRelations: true,
156
+ * maxDepth: 2
157
+ * });
158
+ */
159
+ importFromSource(entityName: string, options: ExploreWithRelationsOptions): Promise<FixtureImportResult[]>;
160
+ }
161
+ //# sourceMappingURL=fixture-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-generator.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-generator.ts"],"names":[],"mappings":"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"}