sonamu 0.4.13 → 0.5.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 (371) hide show
  1. package/.swcrc +15 -0
  2. package/dist/api/base-frame.d.ts +8 -0
  3. package/dist/api/base-frame.d.ts.map +1 -0
  4. package/dist/api/base-frame.js +2 -0
  5. package/dist/api/base-frame.js.map +1 -0
  6. package/dist/api/caster.d.ts +5 -0
  7. package/dist/api/caster.d.ts.map +1 -0
  8. package/dist/api/caster.js +2 -0
  9. package/dist/api/caster.js.map +1 -0
  10. package/dist/api/code-converters.d.ts +23 -0
  11. package/dist/api/code-converters.d.ts.map +1 -0
  12. package/dist/api/code-converters.js +2 -0
  13. package/dist/api/code-converters.js.map +1 -0
  14. package/dist/api/context.d.ts +16 -0
  15. package/dist/api/context.d.ts.map +1 -0
  16. package/dist/api/context.js +2 -0
  17. package/dist/api/context.js.map +1 -0
  18. package/dist/api/decorators.d.ts +50 -0
  19. package/dist/api/decorators.d.ts.map +1 -0
  20. package/dist/api/decorators.js +2 -0
  21. package/dist/api/decorators.js.map +1 -0
  22. package/dist/api/index.d.ts +8 -0
  23. package/dist/api/index.d.ts.map +1 -0
  24. package/dist/api/index.js +2 -0
  25. package/dist/api/index.js.map +1 -0
  26. package/dist/api/sonamu.d.ts +83 -0
  27. package/dist/api/sonamu.d.ts.map +1 -0
  28. package/dist/api/sonamu.js +2 -0
  29. package/dist/api/sonamu.js.map +1 -0
  30. package/dist/api/sonamu.types.d.ts +30 -0
  31. package/dist/api/sonamu.types.d.ts.map +1 -0
  32. package/dist/api/sonamu.types.js +2 -0
  33. package/dist/api/sonamu.types.js.map +1 -0
  34. package/dist/bin/build-config.d.ts +5 -0
  35. package/dist/bin/build-config.d.ts.map +1 -0
  36. package/dist/bin/build-config.js +2 -0
  37. package/dist/bin/build-config.js.map +1 -0
  38. package/dist/bin/cli-wrapper.d.ts +2 -0
  39. package/dist/bin/cli-wrapper.d.ts.map +1 -0
  40. package/dist/bin/cli-wrapper.js +1 -38
  41. package/dist/bin/cli-wrapper.js.map +1 -1
  42. package/dist/bin/cli.d.ts +2 -2
  43. package/dist/bin/cli.d.ts.map +1 -0
  44. package/dist/bin/cli.js +1 -903
  45. package/dist/bin/cli.js.map +1 -1
  46. package/dist/bin/cli.mjs +2 -2
  47. package/dist/{chunk-DMJSNO2L.js → chunk-2WAC2GER.js} +44 -44
  48. package/dist/{chunk-DMJSNO2L.js.map → chunk-2WAC2GER.js.map} +1 -1
  49. package/dist/{chunk-NI37CY4T.mjs → chunk-C3IPIF6O.mjs} +2 -2
  50. package/dist/{chunk-DYFCACHD.js → chunk-EXHKSVTE.js} +7 -7
  51. package/dist/{chunk-QJFHDCBN.mjs → chunk-FCERKIIF.mjs} +2 -2
  52. package/dist/chunk-FCERKIIF.mjs.map +1 -0
  53. package/dist/{chunk-DDJ7T4MA.mjs → chunk-HGIBJYOU.mjs} +2 -2
  54. package/dist/{chunk-NIFOTHBW.mjs → chunk-JKSOJRQA.mjs} +2 -2
  55. package/dist/{chunk-CXAVBVKC.js → chunk-OTKKFP3Y.js} +100 -100
  56. package/dist/{chunk-J6S43O7G.js → chunk-UZ2IY5VE.js} +4 -4
  57. package/dist/database/_batch_update.d.ts +15 -0
  58. package/dist/database/_batch_update.d.ts.map +1 -0
  59. package/dist/database/_batch_update.js +2 -0
  60. package/dist/database/_batch_update.js.map +1 -0
  61. package/dist/database/base-model.d.ts +41 -0
  62. package/dist/database/base-model.d.ts.map +1 -0
  63. package/dist/database/base-model.js +2 -0
  64. package/dist/database/base-model.js.map +1 -0
  65. package/dist/database/code-generator.d.ts +13 -0
  66. package/dist/database/code-generator.d.ts.map +1 -0
  67. package/dist/database/code-generator.js +2 -0
  68. package/dist/database/code-generator.js.map +1 -0
  69. package/dist/database/db.d.ts +40 -0
  70. package/dist/database/db.d.ts.map +1 -0
  71. package/dist/database/db.js +2 -0
  72. package/dist/database/db.js.map +1 -0
  73. package/dist/database/drivers/knex/base-model.js +8 -8
  74. package/dist/database/drivers/knex/base-model.mjs +3 -3
  75. package/dist/database/drivers/kysely/base-model.js +9 -9
  76. package/dist/database/drivers/kysely/base-model.mjs +3 -3
  77. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +2 -0
  78. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +1 -0
  79. package/dist/database/knex-plugins/knex-on-duplicate-update.js +2 -0
  80. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +1 -0
  81. package/dist/database/puri-wrapper.d.ts +34 -0
  82. package/dist/database/puri-wrapper.d.ts.map +1 -0
  83. package/dist/database/puri-wrapper.js +2 -0
  84. package/dist/database/puri-wrapper.js.map +1 -0
  85. package/dist/database/puri.d.ts +83 -0
  86. package/dist/database/puri.d.ts.map +1 -0
  87. package/dist/database/puri.js +2 -0
  88. package/dist/database/puri.js.map +1 -0
  89. package/dist/database/puri.types.d.ts +60 -0
  90. package/dist/database/puri.types.d.ts.map +1 -0
  91. package/dist/database/puri.types.js +2 -0
  92. package/dist/database/puri.types.js.map +1 -0
  93. package/dist/database/transaction-context.d.ts +9 -0
  94. package/dist/database/transaction-context.d.ts.map +1 -0
  95. package/dist/database/transaction-context.js +2 -0
  96. package/dist/database/transaction-context.js.map +1 -0
  97. package/dist/database/types.d.ts +39 -0
  98. package/dist/database/types.d.ts.map +1 -0
  99. package/dist/database/types.js +2 -0
  100. package/dist/database/types.js.map +1 -0
  101. package/dist/database/upsert-builder.d.ts +34 -0
  102. package/dist/database/upsert-builder.d.ts.map +1 -0
  103. package/dist/database/upsert-builder.js +2 -0
  104. package/dist/database/upsert-builder.js.map +1 -0
  105. package/dist/entity/entity-manager.d.ts +32 -0
  106. package/dist/entity/entity-manager.d.ts.map +1 -0
  107. package/dist/entity/entity-manager.js +2 -0
  108. package/dist/entity/entity-manager.js.map +1 -0
  109. package/dist/entity/entity-utils.d.ts +61 -0
  110. package/dist/entity/entity-utils.d.ts.map +1 -0
  111. package/dist/entity/entity-utils.js +2 -0
  112. package/dist/entity/entity-utils.js.map +1 -0
  113. package/dist/entity/entity.d.ts +62 -0
  114. package/dist/entity/entity.d.ts.map +1 -0
  115. package/dist/entity/entity.js +2 -0
  116. package/dist/entity/entity.js.map +1 -0
  117. package/dist/entity/migrator.d.ts +135 -0
  118. package/dist/entity/migrator.d.ts.map +1 -0
  119. package/dist/entity/migrator.js +2 -0
  120. package/dist/entity/migrator.js.map +1 -0
  121. package/dist/exceptions/error-handler.d.ts +3 -0
  122. package/dist/exceptions/error-handler.d.ts.map +1 -0
  123. package/dist/exceptions/error-handler.js +2 -0
  124. package/dist/exceptions/error-handler.js.map +1 -0
  125. package/dist/exceptions/so-exceptions.d.ts +48 -0
  126. package/dist/exceptions/so-exceptions.d.ts.map +1 -0
  127. package/dist/exceptions/so-exceptions.js +2 -0
  128. package/dist/exceptions/so-exceptions.js.map +1 -0
  129. package/dist/file-storage/driver.d.ts +45 -0
  130. package/dist/file-storage/driver.d.ts.map +1 -0
  131. package/dist/file-storage/driver.js +2 -0
  132. package/dist/file-storage/driver.js.map +1 -0
  133. package/dist/file-storage/file-storage.d.ts +50 -0
  134. package/dist/file-storage/file-storage.d.ts.map +1 -0
  135. package/dist/file-storage/file-storage.js +2 -0
  136. package/dist/file-storage/file-storage.js.map +1 -0
  137. package/dist/index.d.ts +22 -813
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +1 -433
  140. package/dist/index.js.map +1 -1
  141. package/dist/index.mjs +3 -3
  142. package/dist/migration/code-generation.d.ts +15 -0
  143. package/dist/migration/code-generation.d.ts.map +1 -0
  144. package/dist/migration/code-generation.js +2 -0
  145. package/dist/migration/code-generation.js.map +1 -0
  146. package/dist/migration/migration-set.d.ts +17 -0
  147. package/dist/migration/migration-set.d.ts.map +1 -0
  148. package/dist/migration/migration-set.js +2 -0
  149. package/dist/migration/migration-set.js.map +1 -0
  150. package/dist/migration/migrator.d.ts +130 -0
  151. package/dist/migration/migrator.d.ts.map +1 -0
  152. package/dist/migration/migrator.js +2 -0
  153. package/dist/migration/migrator.js.map +1 -0
  154. package/dist/migration/types.d.ts +52 -0
  155. package/dist/migration/types.d.ts.map +1 -0
  156. package/dist/migration/types.js +2 -0
  157. package/dist/migration/types.js.map +1 -0
  158. package/dist/smd/smd-manager.d.ts +28 -0
  159. package/dist/smd/smd-manager.d.ts.map +1 -0
  160. package/dist/smd/smd-manager.js +2 -0
  161. package/dist/smd/smd-manager.js.map +1 -0
  162. package/dist/smd/smd.d.ts +40 -0
  163. package/dist/smd/smd.d.ts.map +1 -0
  164. package/dist/smd/smd.js +2 -0
  165. package/dist/smd/smd.js.map +1 -0
  166. package/dist/syncer/index.d.ts +2 -0
  167. package/dist/syncer/index.d.ts.map +1 -0
  168. package/dist/syncer/index.js +2 -0
  169. package/dist/syncer/index.js.map +1 -0
  170. package/dist/syncer/syncer.d.ts +127 -0
  171. package/dist/syncer/syncer.d.ts.map +1 -0
  172. package/dist/syncer/syncer.js +2 -0
  173. package/dist/syncer/syncer.js.map +1 -0
  174. package/dist/templates/base-template.d.ts +13 -0
  175. package/dist/templates/base-template.d.ts.map +1 -0
  176. package/dist/templates/base-template.js +2 -0
  177. package/dist/templates/base-template.js.map +1 -0
  178. package/dist/templates/entity.template.d.ts +17 -0
  179. package/dist/templates/entity.template.d.ts.map +1 -0
  180. package/dist/templates/entity.template.js +2 -0
  181. package/dist/templates/entity.template.js.map +1 -0
  182. package/dist/templates/generated.template.d.ts +27 -0
  183. package/dist/templates/generated.template.d.ts.map +1 -0
  184. package/dist/templates/generated.template.js +2 -0
  185. package/dist/templates/generated.template.js.map +1 -0
  186. package/dist/templates/generated_http.template.d.ts +24 -0
  187. package/dist/templates/generated_http.template.d.ts.map +1 -0
  188. package/dist/templates/generated_http.template.js +2 -0
  189. package/dist/templates/generated_http.template.js.map +1 -0
  190. package/dist/templates/generated_sso.template.d.ts +20 -0
  191. package/dist/templates/generated_sso.template.d.ts.map +1 -0
  192. package/dist/templates/generated_sso.template.js +2 -0
  193. package/dist/templates/generated_sso.template.js.map +1 -0
  194. package/dist/templates/index.d.ts +2 -0
  195. package/dist/templates/index.d.ts.map +1 -0
  196. package/dist/templates/index.js +2 -0
  197. package/dist/templates/index.js.map +1 -0
  198. package/dist/templates/init_types.template.d.ts +17 -0
  199. package/dist/templates/init_types.template.d.ts.map +1 -0
  200. package/dist/templates/init_types.template.js +2 -0
  201. package/dist/templates/init_types.template.js.map +1 -0
  202. package/dist/templates/model.template.d.ts +17 -0
  203. package/dist/templates/model.template.d.ts.map +1 -0
  204. package/dist/templates/model.template.js +2 -0
  205. package/dist/templates/model.template.js.map +1 -0
  206. package/dist/templates/model_test.template.d.ts +17 -0
  207. package/dist/templates/model_test.template.d.ts.map +1 -0
  208. package/dist/templates/model_test.template.js +2 -0
  209. package/dist/templates/model_test.template.js.map +1 -0
  210. package/dist/templates/service.template.d.ts +29 -0
  211. package/dist/templates/service.template.d.ts.map +1 -0
  212. package/dist/templates/service.template.js +2 -0
  213. package/dist/templates/service.template.js.map +1 -0
  214. package/dist/templates/view_enums_buttonset.template.d.ts +17 -0
  215. package/dist/templates/view_enums_buttonset.template.d.ts.map +1 -0
  216. package/dist/templates/view_enums_buttonset.template.js +2 -0
  217. package/dist/templates/view_enums_buttonset.template.js.map +1 -0
  218. package/dist/templates/view_enums_dropdown.template.d.ts +18 -0
  219. package/dist/templates/view_enums_dropdown.template.d.ts.map +1 -0
  220. package/dist/templates/view_enums_dropdown.template.js +2 -0
  221. package/dist/templates/view_enums_dropdown.template.js.map +1 -0
  222. package/dist/templates/view_enums_select.template.d.ts +17 -0
  223. package/dist/templates/view_enums_select.template.d.ts.map +1 -0
  224. package/dist/templates/view_enums_select.template.js +2 -0
  225. package/dist/templates/view_enums_select.template.js.map +1 -0
  226. package/dist/templates/view_form.template.d.ts +26 -0
  227. package/dist/templates/view_form.template.d.ts.map +1 -0
  228. package/dist/templates/view_form.template.js +2 -0
  229. package/dist/templates/view_form.template.js.map +1 -0
  230. package/dist/templates/view_id_all_select.template.d.ts +17 -0
  231. package/dist/templates/view_id_all_select.template.d.ts.map +1 -0
  232. package/dist/templates/view_id_all_select.template.js +2 -0
  233. package/dist/templates/view_id_all_select.template.js.map +1 -0
  234. package/dist/templates/view_id_async_select.template.d.ts +17 -0
  235. package/dist/templates/view_id_async_select.template.d.ts.map +1 -0
  236. package/dist/templates/view_id_async_select.template.js +2 -0
  237. package/dist/templates/view_id_async_select.template.js.map +1 -0
  238. package/dist/templates/view_list.template.d.ts +38 -0
  239. package/dist/templates/view_list.template.d.ts.map +1 -0
  240. package/dist/templates/view_list.template.js +2 -0
  241. package/dist/templates/view_list.template.js.map +1 -0
  242. package/dist/templates/view_list_columns.template.d.ts +17 -0
  243. package/dist/templates/view_list_columns.template.d.ts.map +1 -0
  244. package/dist/templates/view_list_columns.template.js +2 -0
  245. package/dist/templates/view_list_columns.template.js.map +1 -0
  246. package/dist/templates/view_search_input.template.d.ts +17 -0
  247. package/dist/templates/view_search_input.template.d.ts.map +1 -0
  248. package/dist/templates/view_search_input.template.js +2 -0
  249. package/dist/templates/view_search_input.template.js.map +1 -0
  250. package/dist/testing/_relation-graph.d.ts +7 -0
  251. package/dist/testing/_relation-graph.d.ts.map +1 -0
  252. package/dist/testing/_relation-graph.js +2 -0
  253. package/dist/testing/_relation-graph.js.map +1 -0
  254. package/dist/testing/fixture-manager.d.ts +35 -0
  255. package/dist/testing/fixture-manager.d.ts.map +1 -0
  256. package/dist/testing/fixture-manager.js +2 -0
  257. package/dist/testing/fixture-manager.js.map +1 -0
  258. package/dist/types/types.d.ts +609 -0
  259. package/dist/types/types.d.ts.map +1 -0
  260. package/dist/types/types.js +2 -0
  261. package/dist/types/types.js.map +1 -0
  262. package/dist/typings/knex.d.js +2 -0
  263. package/dist/typings/knex.d.js.map +1 -0
  264. package/dist/utils/async-utils.d.ts +25 -0
  265. package/dist/utils/async-utils.d.ts.map +1 -0
  266. package/dist/utils/async-utils.js +2 -0
  267. package/dist/utils/async-utils.js.map +1 -0
  268. package/dist/utils/controller.d.ts +9 -0
  269. package/dist/utils/controller.d.ts.map +1 -0
  270. package/dist/utils/controller.js +2 -0
  271. package/dist/utils/controller.js.map +1 -0
  272. package/dist/utils/fs-utils.d.ts +9 -0
  273. package/dist/utils/fs-utils.d.ts.map +1 -0
  274. package/dist/utils/fs-utils.js +2 -0
  275. package/dist/utils/fs-utils.js.map +1 -0
  276. package/dist/utils/lodash-able.d.ts +2 -0
  277. package/dist/utils/lodash-able.d.ts.map +1 -0
  278. package/dist/utils/lodash-able.js +2 -0
  279. package/dist/utils/lodash-able.js.map +1 -0
  280. package/dist/utils/model.d.ts +17 -0
  281. package/dist/utils/model.d.ts.map +1 -0
  282. package/dist/utils/model.js +2 -0
  283. package/dist/utils/model.js.map +1 -0
  284. package/dist/utils/sql-parser.d.ts +4 -0
  285. package/dist/utils/sql-parser.d.ts.map +1 -0
  286. package/dist/utils/sql-parser.js +2 -0
  287. package/dist/utils/sql-parser.js.map +1 -0
  288. package/dist/utils/utils.d.ts +9 -0
  289. package/dist/utils/utils.d.ts.map +1 -0
  290. package/dist/utils/utils.js +2 -0
  291. package/dist/utils/utils.js.map +1 -0
  292. package/dist/utils/zod-error.d.ts +8 -0
  293. package/dist/utils/zod-error.d.ts.map +1 -0
  294. package/dist/utils/zod-error.js +2 -0
  295. package/dist/utils/zod-error.js.map +1 -0
  296. package/nodemon.json +6 -0
  297. package/package.json +29 -44
  298. package/src/api/base-frame.ts +3 -4
  299. package/src/api/caster.ts +22 -23
  300. package/src/api/code-converters.ts +170 -134
  301. package/src/api/context.ts +13 -6
  302. package/src/api/decorators.ts +146 -20
  303. package/src/api/index.ts +2 -0
  304. package/src/api/sonamu.ts +374 -165
  305. package/src/bin/build-config.ts +5 -0
  306. package/src/bin/cli-wrapper.ts +29 -40
  307. package/src/bin/cli.ts +132 -190
  308. package/src/database/_batch_update.ts +10 -15
  309. package/src/database/base-model.ts +300 -216
  310. package/src/database/db.ts +191 -21
  311. package/src/database/{drivers/knex/plugins → knex-plugins}/knex-on-duplicate-update.ts +1 -1
  312. package/src/database/puri-wrapper.ts +129 -0
  313. package/src/database/puri.ts +808 -0
  314. package/src/database/puri.types.ts +222 -0
  315. package/src/database/transaction-context.ts +18 -0
  316. package/src/database/upsert-builder.ts +32 -35
  317. package/src/entity/entity-manager.ts +7 -15
  318. package/src/entity/entity.ts +9 -31
  319. package/src/entity/migrator-/354/235/264/354/202/254/352/260/224/354/226/264/354/232/224.md +1 -0
  320. package/src/file-storage/driver.ts +121 -0
  321. package/src/file-storage/file-storage.ts +100 -0
  322. package/src/index.ts +14 -11
  323. package/src/migration/code-generation.ts +777 -0
  324. package/src/migration/migration-set.ts +453 -0
  325. package/src/migration/migrator.ts +823 -0
  326. package/src/migration/types.ts +53 -0
  327. package/src/shared/web.shared.ts.txt +33 -2
  328. package/src/syncer/syncer.ts +294 -127
  329. package/src/templates/generated.template.ts +13 -1
  330. package/src/templates/generated_http.template.ts +15 -12
  331. package/src/templates/generated_sso.template.ts +50 -2
  332. package/src/templates/model.template.ts +138 -2
  333. package/src/templates/service.template.ts +0 -1
  334. package/src/templates/view_form.template.ts +11 -7
  335. package/src/templates/view_list.template.ts +12 -4
  336. package/src/testing/fixture-manager.ts +229 -174
  337. package/src/types/types.ts +102 -14
  338. package/src/utils/async-utils.ts +64 -0
  339. package/src/utils/fs-utils.ts +17 -0
  340. package/src/utils/model.ts +0 -2
  341. package/src/utils/utils.ts +14 -58
  342. package/src/utils/zod-error.ts +12 -176
  343. package/tsconfig.json +2 -0
  344. package/tsup.config.js +4 -2
  345. package/.pnp.cjs +0 -14363
  346. package/.pnp.loader.mjs +0 -2047
  347. package/.vscode/extensions.json +0 -6
  348. package/.vscode/settings.json +0 -9
  349. package/.yarnrc.yml +0 -5
  350. package/dist/chunk-QJFHDCBN.mjs.map +0 -1
  351. package/src/database/base-model.abstract.ts +0 -97
  352. package/src/database/db.abstract.ts +0 -75
  353. package/src/database/drivers/knex/base-model.ts +0 -55
  354. package/src/database/drivers/knex/client.ts +0 -209
  355. package/src/database/drivers/knex/db.ts +0 -232
  356. package/src/database/drivers/knex/generator.ts +0 -659
  357. package/src/database/drivers/kysely/base-model.ts +0 -89
  358. package/src/database/drivers/kysely/client.ts +0 -309
  359. package/src/database/drivers/kysely/db.ts +0 -238
  360. package/src/database/drivers/kysely/generator.ts +0 -714
  361. package/src/database/types.ts +0 -118
  362. package/src/entity/migrator.ts +0 -1400
  363. package/src/smd/smd-manager.ts +0 -139
  364. package/src/smd/smd.ts +0 -571
  365. package/src/templates/kysely_types.template.ts +0 -205
  366. /package/dist/{chunk-NI37CY4T.mjs.map → chunk-C3IPIF6O.mjs.map} +0 -0
  367. /package/dist/{chunk-DYFCACHD.js.map → chunk-EXHKSVTE.js.map} +0 -0
  368. /package/dist/{chunk-DDJ7T4MA.mjs.map → chunk-HGIBJYOU.mjs.map} +0 -0
  369. /package/dist/{chunk-NIFOTHBW.mjs.map → chunk-JKSOJRQA.mjs.map} +0 -0
  370. /package/dist/{chunk-CXAVBVKC.js.map → chunk-OTKKFP3Y.js.map} +0 -0
  371. /package/dist/{chunk-J6S43O7G.js.map → chunk-UZ2IY5VE.js.map} +0 -0
@@ -0,0 +1,45 @@
1
+ import { S3Client, S3ClientConfig } from "@aws-sdk/client-s3";
2
+ /**
3
+ * 파일 저장소의 공통 인터페이스
4
+ */
5
+ export interface Driver {
6
+ put(key: string, contents: Buffer, options?: {
7
+ contentType?: string;
8
+ visibility?: "public" | "private";
9
+ }): Promise<void>;
10
+ del(key: string): Promise<void>;
11
+ getUrl(key: string): string;
12
+ getSignedUrl(key: string, expiresIn?: number): Promise<string>;
13
+ }
14
+ export type FSDriverConfig = {
15
+ location: string;
16
+ urlPrefix: string;
17
+ };
18
+ /**
19
+ * 로컬 파일시스템
20
+ */
21
+ export declare class FSDriver implements Driver {
22
+ private config;
23
+ constructor(config: FSDriverConfig);
24
+ put(key: string, contents: Buffer): Promise<void>;
25
+ del(key: string): Promise<void>;
26
+ getUrl(key: string): string;
27
+ getSignedUrl(key: string, _expiresIn?: number): Promise<string>;
28
+ }
29
+ export type S3DriverConfig = S3ClientConfig & {
30
+ bucket: string;
31
+ };
32
+ export declare class S3Driver implements Driver {
33
+ private config;
34
+ s3: S3Client;
35
+ constructor(config: S3DriverConfig);
36
+ put(key: string, contents: Buffer, options?: {
37
+ contentType?: string;
38
+ visibility?: "public" | "private";
39
+ }): Promise<void>;
40
+ del(key: string): Promise<void>;
41
+ getUrl(key: string): string;
42
+ getSignedUrl(key: string, expiresIn?: number): Promise<string>;
43
+ private getAcl;
44
+ }
45
+ //# sourceMappingURL=driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/file-storage/driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,QAAQ,EACR,cAAc,EACf,MAAM,oBAAoB,CAAC;AAK5B;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,GAAG,CACD,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAChE;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,qBAAa,QAAS,YAAW,MAAM;IACzB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAEpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,GAAG,CAAC,GAAG,EAAE,MAAM;IAIrB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKrB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGtE;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,QAAS,YAAW,MAAM;IAGzB,OAAO,CAAC,MAAM;IAF1B,EAAE,EAAE,QAAQ,CAAC;gBAEO,MAAM,EAAE,cAAc;IAIpC,GAAG,CACP,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,GACpE,OAAO,CAAC,IAAI,CAAC;IAYV,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIrB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWpE,OAAO,CAAC,MAAM;CAOf"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get FSDriver(){return FSDriver},get S3Driver(){return S3Driver}});var _clients3=require("@aws-sdk/client-s3");var _s3requestpresigner=require("@aws-sdk/s3-request-presigner");var _promises=/*#__PURE__*/_interop_require_default(require("fs/promises"));var _path=/*#__PURE__*/_interop_require_default(require("path"));function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var FSDriver=/*#__PURE__*/function(){"use strict";function FSDriver(config){_class_call_check(this,FSDriver);_define_property(this,"config",void 0);this.config=config}_create_class(FSDriver,[{key:"put",value:function put(key,contents){return _async_to_generator(function(){var filePath,dir;return _ts_generator(this,function(_state){switch(_state.label){case 0:filePath=_path.default.join(this.config.location,key);dir=_path.default.dirname(filePath);return[4,_promises.default.mkdir(dir,{recursive:true})];case 1:_state.sent();return[4,_promises.default.writeFile(filePath,contents)];case 2:_state.sent();return[2]}})}).call(this)}},{key:"del",value:function del(key){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,_promises.default.rm(_path.default.join(this.config.location,key))];case 1:_state.sent();return[2]}})}).call(this)}},{key:"getUrl",value:function getUrl(key){return"".concat(this.config.urlPrefix,"/").concat(key)}},{key:"getSignedUrl",value:function getSignedUrl(key,_expiresIn){return _async_to_generator(function(){return _ts_generator(this,function(_state){return[2,this.getUrl(key)]})}).call(this)}}]);return FSDriver}();var S3Driver=/*#__PURE__*/function(){"use strict";function S3Driver(config){_class_call_check(this,S3Driver);_define_property(this,"config",void 0);_define_property(this,"s3",void 0);this.config=config;this.s3=new _clients3.S3Client(config)}_create_class(S3Driver,[{key:"put",value:function put(key,contents,options){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.s3.send(new _clients3.PutObjectCommand({Bucket:this.config.bucket,Key:key,Body:contents,ContentType:options===null||options===void 0?void 0:options.contentType,ACL:this.getAcl(options===null||options===void 0?void 0:options.visibility)}))];case 1:_state.sent();return[2]}})}).call(this)}},{key:"del",value:function del(key){return _async_to_generator(function(){return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.s3.send(new _clients3.DeleteObjectCommand({Bucket:this.config.bucket,Key:key}))];case 1:_state.sent();return[2]}})}).call(this)}},{key:"getUrl",value:function getUrl(key){return"https://".concat(this.config.bucket,".s3.").concat(this.config.region,".amazonaws.com/").concat(key)}},{key:"getSignedUrl",value:function getSignedUrl(key,expiresIn){return _async_to_generator(function(){var command;return _ts_generator(this,function(_state){command=new _clients3.GetObjectCommand({Bucket:this.config.bucket,Key:key});return[2,(0,_s3requestpresigner.getSignedUrl)(this.s3,command,{expiresIn:expiresIn!==null&&expiresIn!==void 0?expiresIn:60*60*24*7})]})}).call(this)}},{key:"getAcl",value:function getAcl(visibility){if(visibility==="public"){return"public-read"}return visibility}}]);return S3Driver}();
2
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file-storage/driver.ts"],"sourcesContent":["import {\n DeleteObjectCommand,\n GetObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ClientConfig,\n} from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\n\n/**\n * 파일 저장소의 공통 인터페이스\n */\nexport interface Driver {\n put(\n key: string,\n contents: Buffer,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<void>;\n\n del(key: string): Promise<void>;\n\n getUrl(key: string): string;\n\n getSignedUrl(key: string, expiresIn?: number): Promise<string>;\n}\n\nexport type FSDriverConfig = {\n location: string;\n urlPrefix: string;\n};\n\n/**\n * 로컬 파일시스템\n */\nexport class FSDriver implements Driver {\n constructor(private config: FSDriverConfig) {}\n\n async put(key: string, contents: Buffer): Promise<void> {\n const filePath = path.join(this.config.location, key);\n const dir = path.dirname(filePath);\n\n await fs.mkdir(dir, { recursive: true });\n\n await fs.writeFile(filePath, contents);\n }\n\n async del(key: string) {\n await fs.rm(path.join(this.config.location, key));\n }\n\n getUrl(key: string): string {\n return `${this.config.urlPrefix}/${key}`;\n }\n\n // 로컬 파일시스템은 signed URL을 지원하지 않으므로 일반 URL 반환\n async getSignedUrl(key: string, _expiresIn?: number): Promise<string> {\n return this.getUrl(key);\n }\n}\n\nexport type S3DriverConfig = S3ClientConfig & {\n bucket: string;\n};\n\nexport class S3Driver implements Driver {\n s3: S3Client;\n\n constructor(private config: S3DriverConfig) {\n this.s3 = new S3Client(config);\n }\n\n async put(\n key: string,\n contents: Buffer,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<void> {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: contents,\n ContentType: options?.contentType,\n ACL: this.getAcl(options?.visibility),\n })\n );\n }\n\n async del(key: string): Promise<void> {\n await this.s3.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n }\n\n getUrl(key: string): string {\n return `https://${this.config.bucket}.s3.${this.config.region}.amazonaws.com/${key}`;\n }\n\n async getSignedUrl(key: string, expiresIn?: number): Promise<string> {\n const command = new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n });\n\n return getSignedUrl(this.s3, command, {\n expiresIn: expiresIn ?? 60 * 60 * 24 * 7,\n });\n }\n\n private getAcl(visibility?: \"public\" | \"private\") {\n if (visibility === \"public\") {\n return \"public-read\";\n }\n\n return visibility;\n }\n}\n"],"names":["FSDriver","S3Driver","config","put","key","contents","filePath","dir","path","join","location","dirname","fs","mkdir","recursive","writeFile","del","rm","getUrl","urlPrefix","getSignedUrl","_expiresIn","s3","S3Client","options","send","PutObjectCommand","Bucket","bucket","Key","Body","ContentType","contentType","ACL","getAcl","visibility","DeleteObjectCommand","region","expiresIn","command","GetObjectCommand"],"mappings":"mPAoCaA,kBAAAA,cA8BAC,kBAAAA,kCA5DN,sDACsB,6FACd,wEACE,8qFA2BV,IAAA,AAAMD,sBAAN,iCAAMA,SACC,AAAQE,MAAsB,yBAD/BF,sDACSE,OAAAA,qBADTF,WAGLG,IAAAA,YAAN,SAAMA,IAAIC,GAAW,CAAEC,QAAgB,4CAC/BC,SACAC,2EADAD,SAAWE,aAAI,CAACC,IAAI,CAAC,IAAI,CAACP,MAAM,CAACQ,QAAQ,CAAEN,KAC3CG,IAAMC,aAAI,CAACG,OAAO,CAACL,UAEzB,SAAMM,iBAAE,CAACC,KAAK,CAACN,IAAK,CAAEO,UAAW,IAAK,WAAtC,cAEA,SAAMF,iBAAE,CAACG,SAAS,CAACT,SAAUD,kBAA7B,0BACF,iBAEMW,IAAAA,YAAN,SAAMA,IAAIZ,GAAW,+GACnB,SAAMQ,iBAAE,CAACK,EAAE,CAACT,aAAI,CAACC,IAAI,CAAC,IAAI,CAACP,MAAM,CAACQ,QAAQ,CAAEN,cAA5C,0BACF,iBAEAc,IAAAA,eAAAA,SAAAA,OAAOd,GAAW,EAChB,MAAO,AAAC,GAA2BA,OAAzB,IAAI,CAACF,MAAM,CAACiB,SAAS,CAAC,KAAO,OAAJf,IACrC,IAGMgB,IAAAA,qBAAN,SAAMA,aAAahB,GAAW,CAAEiB,UAAmB,mFACjD,SAAO,IAAI,CAACH,MAAM,CAACd,OACrB,yBAvBWJ,YA8BN,IAAA,AAAMC,sBAAN,iCAAMA,SAGC,AAAQC,MAAsB,yBAH/BD,iDACXqB,sBAAAA,KAAAA,KAAAA,QAEoBpB,OAAAA,MAClB,CAAA,IAAI,CAACoB,EAAE,CAAG,IAAIC,kBAAQ,CAACrB,sBAJdD,WAOLE,IAAAA,YAAN,SAAMA,IACJC,GAAW,CACXC,QAAgB,CAChBmB,OAAqE,+GAErE,SAAM,IAAI,CAACF,EAAE,CAACG,IAAI,CAChB,IAAIC,0BAAgB,CAAC,CACnBC,OAAQ,IAAI,CAACzB,MAAM,CAAC0B,MAAM,CAC1BC,IAAKzB,IACL0B,KAAMzB,SACN0B,WAAW,CAAEP,gBAAAA,wBAAAA,QAASQ,WAAW,CACjCC,IAAK,IAAI,CAACC,MAAM,CAACV,gBAAAA,wBAAAA,QAASW,UAAU,CACtC,YAPF,0BASF,iBAEMnB,IAAAA,YAAN,SAAMA,IAAIZ,GAAW,+GACnB,SAAM,IAAI,CAACkB,EAAE,CAACG,IAAI,CAChB,IAAIW,6BAAmB,CAAC,CACtBT,OAAQ,IAAI,CAACzB,MAAM,CAAC0B,MAAM,CAC1BC,IAAKzB,GACP,YAJF,0BAMF,iBAEAc,IAAAA,eAAAA,SAAAA,OAAOd,GAAW,EAChB,MAAO,AAAC,WAAmC,OAAzB,IAAI,CAACF,MAAM,CAAC0B,MAAM,CAAC,QAA0CxB,OAApC,IAAI,CAACF,MAAM,CAACmC,MAAM,CAAC,mBAAqB,OAAJjC,IACjF,IAEMgB,IAAAA,qBAAN,SAAMA,aAAahB,GAAW,CAAEkC,SAAkB,4CAC1CC,mDAAAA,QAAU,IAAIC,0BAAgB,CAAC,CACnCb,OAAQ,IAAI,CAACzB,MAAM,CAAC0B,MAAM,CAC1BC,IAAKzB,GACP,GAEA,SAAOgB,GAAAA,gCAAY,EAAC,IAAI,CAACE,EAAE,CAAEiB,QAAS,CACpCD,UAAWA,kBAAAA,mBAAAA,UAAa,GAAK,GAAK,GAAK,CACzC,KACF,iBAEQJ,IAAAA,eAAR,SAAQA,OAAOC,UAAiC,EAC9C,GAAIA,aAAe,SAAU,CAC3B,MAAO,aACT,CAEA,OAAOA,UACT,YArDWlC"}
@@ -0,0 +1,50 @@
1
+ import type { MultipartFile } from "@fastify/multipart";
2
+ import type { Driver } from "./driver";
3
+ /**
4
+ * @fastify/multipart의 MultipartFile 래퍼
5
+ */
6
+ export declare class FileStorage {
7
+ private _file;
8
+ private _buffer?;
9
+ private _driver;
10
+ constructor(file: MultipartFile, driver: Driver);
11
+ /**
12
+ * 사용자 컴퓨터의 원본 파일명
13
+ */
14
+ get clientName(): string;
15
+ /**
16
+ * 파일명 (clientName의 별칭)
17
+ */
18
+ get filename(): string;
19
+ /**
20
+ * HTML input 필드명
21
+ */
22
+ get fieldName(): string;
23
+ /**
24
+ * 파일 크기 (바이트)
25
+ */
26
+ get size(): number;
27
+ /**
28
+ * 파일 확장자 (점 제외)
29
+ */
30
+ get extname(): string | false;
31
+ get mimetype(): string;
32
+ get encoding(): string;
33
+ toBuffer(): Promise<Buffer>;
34
+ md5(): Promise<string>;
35
+ /**
36
+ * 파일을 저장소에 저장
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const { file } = Sonamu.getUploadContext();
41
+ * const url = await file.saveToDisk('uploads/avatar.png');
42
+ * ```
43
+ */
44
+ saveToDisk(key: string, options?: {
45
+ contentType?: string;
46
+ visibility?: "public" | "private";
47
+ }): Promise<string>;
48
+ get raw(): MultipartFile;
49
+ }
50
+ //# sourceMappingURL=file-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage.d.ts","sourceRoot":"","sources":["../../src/file-storage/file-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM;IAK/C;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,GAAG,KAAK,CAE5B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAEK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAO3B,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAK5B;;;;;;;;OAQG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KAAE,GACpE,OAAO,CAAC,MAAM,CAAC;IAWlB,IAAI,GAAG,IAAI,aAAa,CAEvB;CACF"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"FileStorage",{enumerable:true,get:function(){return FileStorage}});var _mimetypes=/*#__PURE__*/_interop_require_default(require("mime-types"));var _crypto=require("crypto");function asyncGeneratorStep(gen,resolve,reject,_next,_throw,key,arg){try{var info=gen[key](arg);var value=info.value}catch(error){reject(error);return}if(info.done){resolve(value)}else{Promise.resolve(value).then(_next,_throw)}}function _async_to_generator(fn){return function(){var self=this,args=arguments;return new Promise(function(resolve,reject){var gen=fn.apply(self,args);function _next(value){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"next",value)}function _throw(err){asyncGeneratorStep(gen,resolve,reject,_next,_throw,"throw",err)}_next(undefined)})}}function _class_call_check(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}function _defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}function _create_class(Constructor,protoProps,staticProps){if(protoProps)_defineProperties(Constructor.prototype,protoProps);if(staticProps)_defineProperties(Constructor,staticProps);return Constructor}function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _interop_require_default(obj){return obj&&obj.__esModule?obj:{default:obj}}function _ts_generator(thisArg,body){var f,y,t,_={label:0,sent:function(){if(t[0]&1)throw t[1];return t[1]},trys:[],ops:[]},g=Object.create((typeof Iterator==="function"?Iterator:Object).prototype);return g.next=verb(0),g["throw"]=verb(1),g["return"]=verb(2),typeof Symbol==="function"&&(g[Symbol.iterator]=function(){return this}),g;function verb(n){return function(v){return step([n,v])}}function step(op){if(f)throw new TypeError("Generator is already executing.");while(g&&(g=0,op[0]&&(_=0)),_)try{if(f=1,y&&(t=op[0]&2?y["return"]:op[0]?y["throw"]||((t=y["return"])&&t.call(y),0):y.next)&&!(t=t.call(y,op[1])).done)return t;if(y=0,t)op=[op[0]&2,t.value];switch(op[0]){case 0:case 1:t=op;break;case 4:_.label++;return{value:op[1],done:false};case 5:_.label++;y=op[1];op=[0];continue;case 7:op=_.ops.pop();_.trys.pop();continue;default:if(!(t=_.trys,t=t.length>0&&t[t.length-1])&&(op[0]===6||op[0]===2)){_=0;continue}if(op[0]===3&&(!t||op[1]>t[0]&&op[1]<t[3])){_.label=op[1];break}if(op[0]===6&&_.label<t[1]){_.label=t[1];t=op;break}if(t&&_.label<t[2]){_.label=t[2];_.ops.push(op);break}if(t[2])_.ops.pop();_.trys.pop();continue}op=body.call(thisArg,_)}catch(e){op=[6,e];y=0}finally{f=t=0}if(op[0]&5)throw op[1];return{value:op[0]?op[1]:void 0,done:true}}}var FileStorage=/*#__PURE__*/function(){"use strict";function FileStorage(file,driver){_class_call_check(this,FileStorage);_define_property(this,"_file",void 0);_define_property(this,"_buffer",void 0);_define_property(this,"_driver",void 0);this._file=file;this._driver=driver}_create_class(FileStorage,[{key:"clientName",get:function get(){return this._file.filename}},{key:"filename",get:function get(){return this._file.filename}},{key:"fieldName",get:function get(){return this._file.fieldname}},{key:"size",get:function get(){return this._file.file.bytesRead}},{key:"extname",get:function get(){return _mimetypes.default.extension(this._file.mimetype)}},{key:"mimetype",get:function get(){return this._file.mimetype}},{key:"encoding",get:function get(){return this._file.encoding}},{key:"toBuffer",value:function toBuffer(){return _async_to_generator(function(){var _;return _ts_generator(this,function(_state){switch(_state.label){case 0:if(!!this._buffer)return[3,2];_=this;return[4,this._file.toBuffer()];case 1:_._buffer=_state.sent();_state.label=2;case 2:return[2,this._buffer]}})}).call(this)}},{key:"md5",value:function md5(){return _async_to_generator(function(){var buffer;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.toBuffer()];case 1:buffer=_state.sent();return[2,(0,_crypto.createHash)("md5").update(buffer).digest("hex")]}})}).call(this)}},{key:"saveToDisk",value:function saveToDisk(key,options){return _async_to_generator(function(){var buffer,_options_contentType;return _ts_generator(this,function(_state){switch(_state.label){case 0:return[4,this.toBuffer()];case 1:buffer=_state.sent();return[4,this._driver.put(key,buffer,{contentType:(_options_contentType=options===null||options===void 0?void 0:options.contentType)!==null&&_options_contentType!==void 0?_options_contentType:this.mimetype,visibility:options===null||options===void 0?void 0:options.visibility})];case 2:_state.sent();return[2,this._driver.getSignedUrl(key)]}})}).call(this)}},{key:"raw",get:function get(){return this._file}}]);return FileStorage}();
2
+ //# sourceMappingURL=file-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/file-storage/file-storage.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport mime from \"mime-types\";\nimport { createHash } from \"crypto\";\nimport type { Driver } from \"./driver\";\n\n/**\n * @fastify/multipart의 MultipartFile 래퍼\n */\nexport class FileStorage {\n private _file: MultipartFile;\n private _buffer?: Buffer;\n private _driver: Driver;\n\n constructor(file: MultipartFile, driver: Driver) {\n this._file = file;\n this._driver = driver;\n }\n\n /**\n * 사용자 컴퓨터의 원본 파일명\n */\n get clientName(): string {\n return this._file.filename;\n }\n\n /**\n * 파일명 (clientName의 별칭)\n */\n get filename(): string {\n return this._file.filename;\n }\n\n /**\n * HTML input 필드명\n */\n get fieldName(): string {\n return this._file.fieldname;\n }\n\n /**\n * 파일 크기 (바이트)\n */\n get size(): number {\n return this._file.file.bytesRead;\n }\n\n /**\n * 파일 확장자 (점 제외)\n */\n get extname(): string | false {\n return mime.extension(this._file.mimetype);\n }\n\n get mimetype(): string {\n return this._file.mimetype;\n }\n\n get encoding(): string {\n return this._file.encoding;\n }\n\n async toBuffer(): Promise<Buffer> {\n if (!this._buffer) {\n this._buffer = await this._file.toBuffer();\n }\n return this._buffer;\n }\n\n async md5(): Promise<string> {\n const buffer = await this.toBuffer();\n return createHash(\"md5\").update(buffer).digest(\"hex\");\n }\n\n /**\n * 파일을 저장소에 저장\n *\n * @example\n * ```typescript\n * const { file } = Sonamu.getUploadContext();\n * const url = await file.saveToDisk('uploads/avatar.png');\n * ```\n */\n async saveToDisk(\n key: string,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<string> {\n const buffer = await this.toBuffer();\n\n await this._driver.put(key, buffer, {\n contentType: options?.contentType ?? this.mimetype,\n visibility: options?.visibility,\n });\n\n return this._driver.getSignedUrl(key);\n }\n\n get raw(): MultipartFile {\n return this._file;\n }\n}\n"],"names":["FileStorage","file","driver","_file","_buffer","_driver","clientName","filename","fieldName","fieldname","size","bytesRead","extname","mime","extension","mimetype","encoding","toBuffer","md5","buffer","createHash","update","digest","saveToDisk","key","options","put","contentType","visibility","getSignedUrl","raw"],"mappings":"oGAQaA,qDAAAA,4EAPI,mCACU,+qFAMpB,IAAA,AAAMA,yBAAN,iCAAMA,YAKCC,IAAmB,CAAEC,MAAc,yBALpCF,aACX,sBAAQG,QAAR,KAAA,GACA,sBAAQC,UAAR,KAAA,GACA,sBAAQC,UAAR,KAAA,EAGE,CAAA,IAAI,CAACF,KAAK,CAAGF,IACb,CAAA,IAAI,CAACI,OAAO,CAAGH,qBAPNF,cAaPM,IAAAA,iBAAJ,eACE,OAAO,IAAI,CAACH,KAAK,CAACI,QAAQ,AAC5B,IAKIA,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACJ,KAAK,CAACI,QAAQ,AAC5B,IAKIC,IAAAA,gBAAJ,eACE,OAAO,IAAI,CAACL,KAAK,CAACM,SAAS,AAC7B,IAKIC,IAAAA,WAAJ,eACE,OAAO,IAAI,CAACP,KAAK,CAACF,IAAI,CAACU,SAAS,AAClC,IAKIC,IAAAA,cAAJ,eACE,OAAOC,kBAAI,CAACC,SAAS,CAAC,IAAI,CAACX,KAAK,CAACY,QAAQ,CAC3C,IAEIA,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACZ,KAAK,CAACY,QAAQ,AAC5B,IAEIC,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACb,KAAK,CAACa,QAAQ,AAC5B,IAEMC,IAAAA,iBAAN,SAAMA,kIACA,CAAC,IAAI,CAACb,OAAO,CAAb,cACF,IAAI,CAAW,SAAM,IAAI,CAACD,KAAK,CAACc,QAAQ,WAAxC,EAAKb,OAAO,CAAG,oCAEjB,SAAO,IAAI,CAACA,OAAO,IACrB,iBAEMc,IAAAA,YAAN,SAAMA,gDACEC,8EAAS,SAAM,IAAI,CAACF,QAAQ,WAA5BE,OAAS,cACf,SAAOC,GAAAA,kBAAU,EAAC,OAAOC,MAAM,CAACF,QAAQG,MAAM,CAAC,UACjD,iBAWMC,IAAAA,mBAAN,SAAMA,WACJC,GAAW,CACXC,OAAqE,4CAE/DN,OAGSM,4FAHA,SAAM,IAAI,CAACR,QAAQ,WAA5BE,OAAS,cAEf,SAAM,IAAI,CAACd,OAAO,CAACqB,GAAG,CAACF,IAAKL,OAAQ,CAClCQ,YAAaF,CAAAA,qBAAAA,gBAAAA,wBAAAA,QAASE,WAAW,UAApBF,8BAAAA,qBAAwB,IAAI,CAACV,QAAQ,CAClDa,UAAU,CAAEH,gBAAAA,wBAAAA,QAASG,UAAU,AACjC,WAHA,cAKA,SAAO,IAAI,CAACvB,OAAO,CAACwB,YAAY,CAACL,QACnC,iBAEIM,IAAAA,UAAJ,eACE,OAAO,IAAI,CAAC3B,KAAK,AACnB,YA1FWH"}