@jrmc/adonis-attachment 5.2.1 → 6.0.0-alpha.1

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 (424) hide show
  1. package/README.md +10 -81
  2. package/build/bin/test.d.ts +2 -0
  3. package/build/bin/test.d.ts.map +1 -0
  4. package/build/bin/test.js +9 -0
  5. package/build/bin/test.js.map +1 -0
  6. package/build/commands/commands.json +1 -1
  7. package/build/commands/make/attachment_v5_migration.d.ts +17 -0
  8. package/build/commands/make/attachment_v5_migration.d.ts.map +1 -0
  9. package/build/commands/make/attachment_v5_migration.js +26 -0
  10. package/build/commands/make/attachment_v5_migration.js.map +1 -0
  11. package/build/commands/make/{converter.d.ts → attachments_table.d.ts} +6 -4
  12. package/build/commands/make/attachments_table.d.ts.map +1 -0
  13. package/build/commands/make/attachments_table.js +30 -0
  14. package/build/commands/make/attachments_table.js.map +1 -0
  15. package/build/configure.d.ts.map +1 -1
  16. package/build/configure.js +2 -1
  17. package/build/configure.js.map +1 -0
  18. package/build/index.d.ts +26 -10
  19. package/build/index.d.ts.map +1 -1
  20. package/build/index.js +16 -9
  21. package/build/index.js.map +1 -0
  22. package/build/providers/attachment_provider.d.ts +0 -19
  23. package/build/providers/attachment_provider.d.ts.map +1 -1
  24. package/build/providers/attachment_provider.js +30 -26
  25. package/build/providers/attachment_provider.js.map +1 -0
  26. package/build/services/main.d.ts +3 -3
  27. package/build/services/main.d.ts.map +1 -1
  28. package/build/services/main.js +42 -5
  29. package/build/services/main.js.map +1 -0
  30. package/build/src/adapters/adonis_drive_storage.d.ts +33 -0
  31. package/build/src/adapters/adonis_drive_storage.d.ts.map +1 -0
  32. package/build/src/adapters/adonis_drive_storage.js +35 -0
  33. package/build/src/adapters/adonis_drive_storage.js.map +1 -0
  34. package/build/src/adapters/local_file_storage.d.ts +25 -0
  35. package/build/src/adapters/local_file_storage.d.ts.map +1 -0
  36. package/build/src/adapters/local_file_storage.js +54 -0
  37. package/build/src/adapters/local_file_storage.js.map +1 -0
  38. package/build/src/controllers/attachments_controller.d.ts +13 -2
  39. package/build/src/controllers/attachments_controller.d.ts.map +1 -1
  40. package/build/src/controllers/attachments_controller.js +20 -107
  41. package/build/src/controllers/attachments_controller.js.map +1 -0
  42. package/build/src/core/attachment.d.ts +70 -0
  43. package/build/src/core/attachment.d.ts.map +1 -0
  44. package/build/src/core/attachment.js +150 -0
  45. package/build/src/core/attachment.js.map +1 -0
  46. package/build/src/core/attachment_job_processor.d.ts +30 -0
  47. package/build/src/core/attachment_job_processor.d.ts.map +1 -0
  48. package/build/src/core/attachment_job_processor.js +47 -0
  49. package/build/src/core/attachment_job_processor.js.map +1 -0
  50. package/build/src/core/attachment_options.d.ts +32 -0
  51. package/build/src/core/attachment_options.d.ts.map +1 -0
  52. package/build/src/core/attachment_options.js +24 -0
  53. package/build/src/core/attachment_options.js.map +1 -0
  54. package/build/src/core/attachment_repository.d.ts +15 -0
  55. package/build/src/core/attachment_repository.d.ts.map +1 -0
  56. package/build/src/core/attachment_repository.js +8 -0
  57. package/build/src/core/attachment_repository.js.map +1 -0
  58. package/build/src/core/attachment_service.d.ts +34 -0
  59. package/build/src/core/attachment_service.d.ts.map +1 -0
  60. package/build/src/core/attachment_service.js +93 -0
  61. package/build/src/core/attachment_service.js.map +1 -0
  62. package/build/src/core/attachment_state.d.ts +11 -0
  63. package/build/src/core/attachment_state.d.ts.map +1 -0
  64. package/build/src/core/attachment_state.js +17 -0
  65. package/build/src/core/attachment_state.js.map +1 -0
  66. package/build/src/core/index.d.ts +14 -0
  67. package/build/src/core/index.d.ts.map +1 -0
  68. package/build/src/core/index.js +11 -0
  69. package/build/src/core/index.js.map +1 -0
  70. package/build/src/core/queue.d.ts +20 -0
  71. package/build/src/core/queue.d.ts.map +1 -0
  72. package/build/src/{types/event.js → core/queue.js} +1 -0
  73. package/build/src/core/queue.js.map +1 -0
  74. package/build/src/core/storage.d.ts +23 -0
  75. package/build/src/core/storage.d.ts.map +1 -0
  76. package/build/src/{types/config.js → core/storage.js} +1 -0
  77. package/build/src/core/storage.js.map +1 -0
  78. package/build/src/define_config.d.ts +39 -20
  79. package/build/src/define_config.d.ts.map +1 -1
  80. package/build/src/define_config.js +46 -24
  81. package/build/src/define_config.js.map +1 -0
  82. package/build/src/integrations/lucid/attachment_column.d.ts +18 -0
  83. package/build/src/integrations/lucid/attachment_column.d.ts.map +1 -0
  84. package/build/src/integrations/lucid/attachment_column.js +151 -0
  85. package/build/src/integrations/lucid/attachment_column.js.map +1 -0
  86. package/build/src/integrations/lucid/attachment_model.d.ts +37 -0
  87. package/build/src/integrations/lucid/attachment_model.d.ts.map +1 -0
  88. package/build/src/integrations/lucid/attachment_model.js +99 -0
  89. package/build/src/integrations/lucid/attachment_model.js.map +1 -0
  90. package/build/src/integrations/lucid/attachment_owner.d.ts +18 -0
  91. package/build/src/integrations/lucid/attachment_owner.d.ts.map +1 -0
  92. package/build/src/integrations/lucid/attachment_owner.js +15 -0
  93. package/build/src/integrations/lucid/attachment_owner.js.map +1 -0
  94. package/build/src/integrations/lucid/attachment_relation.d.ts +60 -0
  95. package/build/src/integrations/lucid/attachment_relation.d.ts.map +1 -0
  96. package/build/src/integrations/lucid/attachment_relation.js +163 -0
  97. package/build/src/integrations/lucid/attachment_relation.js.map +1 -0
  98. package/build/src/integrations/lucid/attachments_table_stub.d.ts +21 -0
  99. package/build/src/integrations/lucid/attachments_table_stub.d.ts.map +1 -0
  100. package/build/src/integrations/lucid/attachments_table_stub.js +26 -0
  101. package/build/src/integrations/lucid/attachments_table_stub.js.map +1 -0
  102. package/build/src/integrations/lucid/create_legacy_attachment_migration_script.d.ts +13 -0
  103. package/build/src/integrations/lucid/create_legacy_attachment_migration_script.d.ts.map +1 -0
  104. package/build/src/integrations/lucid/create_legacy_attachment_migration_script.js +20 -0
  105. package/build/src/integrations/lucid/create_legacy_attachment_migration_script.js.map +1 -0
  106. package/build/src/integrations/lucid/index.d.ts +20 -0
  107. package/build/src/integrations/lucid/index.d.ts.map +1 -0
  108. package/build/src/integrations/lucid/index.js +20 -0
  109. package/build/src/integrations/lucid/index.js.map +1 -0
  110. package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.d.ts +30 -0
  111. package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.d.ts.map +1 -0
  112. package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.js +188 -0
  113. package/build/src/integrations/lucid/lucid_attachment_lifecycle_service.js.map +1 -0
  114. package/build/src/integrations/lucid/lucid_attachment_repository.d.ts +18 -0
  115. package/build/src/integrations/lucid/lucid_attachment_repository.d.ts.map +1 -0
  116. package/build/src/integrations/lucid/lucid_attachment_repository.js +21 -0
  117. package/build/src/integrations/lucid/lucid_attachment_repository.js.map +1 -0
  118. package/build/src/integrations/lucid/lucid_attachment_store.d.ts +36 -0
  119. package/build/src/integrations/lucid/lucid_attachment_store.d.ts.map +1 -0
  120. package/build/src/integrations/lucid/lucid_attachment_store.js +179 -0
  121. package/build/src/integrations/lucid/lucid_attachment_store.js.map +1 -0
  122. package/build/src/integrations/lucid/lucid_variant_generation_service.d.ts +24 -0
  123. package/build/src/integrations/lucid/lucid_variant_generation_service.d.ts.map +1 -0
  124. package/build/src/integrations/lucid/lucid_variant_generation_service.js +42 -0
  125. package/build/src/integrations/lucid/lucid_variant_generation_service.js.map +1 -0
  126. package/build/src/integrations/lucid/migrate_legacy_attachment.d.ts +64 -0
  127. package/build/src/integrations/lucid/migrate_legacy_attachment.d.ts.map +1 -0
  128. package/build/src/integrations/lucid/migrate_legacy_attachment.js +89 -0
  129. package/build/src/integrations/lucid/migrate_legacy_attachment.js.map +1 -0
  130. package/build/src/integrations/lucid/migrate_legacy_attachment_records.d.ts +34 -0
  131. package/build/src/integrations/lucid/migrate_legacy_attachment_records.d.ts.map +1 -0
  132. package/build/src/integrations/lucid/migrate_legacy_attachment_records.js +47 -0
  133. package/build/src/integrations/lucid/migrate_legacy_attachment_records.js.map +1 -0
  134. package/build/src/integrations/lucid/render_legacy_attachment_migration_script.d.ts +11 -0
  135. package/build/src/integrations/lucid/render_legacy_attachment_migration_script.d.ts.map +1 -0
  136. package/build/src/integrations/lucid/render_legacy_attachment_migration_script.js +41 -0
  137. package/build/src/integrations/lucid/render_legacy_attachment_migration_script.js.map +1 -0
  138. package/build/src/queues/adonis_queue.d.ts +27 -0
  139. package/build/src/queues/adonis_queue.d.ts.map +1 -0
  140. package/build/src/queues/adonis_queue.js +22 -0
  141. package/build/src/queues/adonis_queue.js.map +1 -0
  142. package/build/src/queues/memory_queue.d.ts +22 -0
  143. package/build/src/queues/memory_queue.d.ts.map +1 -0
  144. package/build/src/queues/memory_queue.js +67 -0
  145. package/build/src/queues/memory_queue.js.map +1 -0
  146. package/build/src/sources/attachment_manager.d.ts +53 -0
  147. package/build/src/sources/attachment_manager.d.ts.map +1 -0
  148. package/build/src/sources/attachment_manager.js +177 -0
  149. package/build/src/sources/attachment_manager.js.map +1 -0
  150. package/build/src/variants/variant_converter.d.ts +23 -0
  151. package/build/src/variants/variant_converter.d.ts.map +1 -0
  152. package/build/src/{types/converter.js → variants/variant_converter.js} +1 -0
  153. package/build/src/variants/variant_converter.js.map +1 -0
  154. package/build/src/variants/variant_generation_service.d.ts +28 -0
  155. package/build/src/variants/variant_generation_service.d.ts.map +1 -0
  156. package/build/src/variants/variant_generation_service.js +44 -0
  157. package/build/src/variants/variant_generation_service.js.map +1 -0
  158. package/build/stubs/config/attachment.stub +12 -0
  159. package/build/stubs/main.d.ts.map +1 -1
  160. package/build/stubs/main.js +1 -0
  161. package/build/stubs/main.js.map +1 -0
  162. package/build/stubs/migrations/attachments_table.stub +39 -0
  163. package/build/tests/adonis_drive_storage.spec.d.ts +8 -0
  164. package/build/tests/adonis_drive_storage.spec.d.ts.map +1 -0
  165. package/build/tests/adonis_drive_storage.spec.js +69 -0
  166. package/build/tests/adonis_drive_storage.spec.js.map +1 -0
  167. package/build/{src/types/attachment.js → tests/adonis_queue.spec.d.ts} +1 -0
  168. package/build/tests/adonis_queue.spec.d.ts.map +1 -0
  169. package/build/tests/adonis_queue.spec.js +52 -0
  170. package/build/tests/adonis_queue.spec.js.map +1 -0
  171. package/build/tests/attachment_job_processor.spec.d.ts +8 -0
  172. package/build/tests/attachment_job_processor.spec.d.ts.map +1 -0
  173. package/build/tests/attachment_job_processor.spec.js +89 -0
  174. package/build/tests/attachment_job_processor.spec.js.map +1 -0
  175. package/build/tests/attachment_manager.spec.d.ts +8 -0
  176. package/build/tests/attachment_manager.spec.d.ts.map +1 -0
  177. package/build/tests/attachment_manager.spec.js +131 -0
  178. package/build/tests/attachment_manager.spec.js.map +1 -0
  179. package/build/tests/attachment_manager_service.spec.d.ts +8 -0
  180. package/build/tests/attachment_manager_service.spec.d.ts.map +1 -0
  181. package/build/tests/attachment_manager_service.spec.js +47 -0
  182. package/build/tests/attachment_manager_service.spec.js.map +1 -0
  183. package/build/tests/attachment_options.spec.d.ts +2 -0
  184. package/build/tests/attachment_options.spec.d.ts.map +1 -0
  185. package/build/tests/attachment_options.spec.js +31 -0
  186. package/build/tests/attachment_options.spec.js.map +1 -0
  187. package/build/tests/attachment_provider.spec.d.ts +8 -0
  188. package/build/tests/attachment_provider.spec.d.ts.map +1 -0
  189. package/build/tests/attachment_provider.spec.js +71 -0
  190. package/build/tests/attachment_provider.spec.js.map +1 -0
  191. package/build/tests/attachment_service.spec.d.ts +8 -0
  192. package/build/tests/attachment_service.spec.d.ts.map +1 -0
  193. package/build/tests/attachment_service.spec.js +146 -0
  194. package/build/tests/attachment_service.spec.js.map +1 -0
  195. package/build/tests/attachments_controller.spec.d.ts +8 -0
  196. package/build/tests/attachments_controller.spec.d.ts.map +1 -0
  197. package/build/tests/attachments_controller.spec.js +34 -0
  198. package/build/tests/attachments_controller.spec.js.map +1 -0
  199. package/build/tests/attachments_table_stub.spec.d.ts +2 -0
  200. package/build/tests/attachments_table_stub.spec.d.ts.map +1 -0
  201. package/build/tests/attachments_table_stub.spec.js +66 -0
  202. package/build/tests/attachments_table_stub.spec.js.map +1 -0
  203. package/build/tests/configure.spec.d.ts +2 -0
  204. package/build/tests/configure.spec.d.ts.map +1 -0
  205. package/build/tests/configure.spec.js +38 -0
  206. package/build/tests/configure.spec.js.map +1 -0
  207. package/build/tests/container_bindings.types.d.ts +8 -0
  208. package/build/tests/container_bindings.types.d.ts.map +1 -0
  209. package/build/tests/container_bindings.types.js +9 -0
  210. package/build/tests/container_bindings.types.js.map +1 -0
  211. package/build/tests/create_legacy_attachment_migration_script.spec.d.ts +8 -0
  212. package/build/tests/create_legacy_attachment_migration_script.spec.d.ts.map +1 -0
  213. package/build/tests/create_legacy_attachment_migration_script.spec.js +31 -0
  214. package/build/tests/create_legacy_attachment_migration_script.spec.js.map +1 -0
  215. package/build/tests/define_config.spec.d.ts +8 -0
  216. package/build/tests/define_config.spec.d.ts.map +1 -0
  217. package/build/tests/define_config.spec.js +203 -0
  218. package/build/tests/define_config.spec.js.map +1 -0
  219. package/build/tests/helpers/lucid_test_database.d.ts +9 -0
  220. package/build/tests/helpers/lucid_test_database.d.ts.map +1 -0
  221. package/build/tests/helpers/lucid_test_database.js +52 -0
  222. package/build/tests/helpers/lucid_test_database.js.map +1 -0
  223. package/build/tests/local_file_storage.spec.d.ts +8 -0
  224. package/build/tests/local_file_storage.spec.d.ts.map +1 -0
  225. package/build/tests/local_file_storage.spec.js +44 -0
  226. package/build/tests/local_file_storage.spec.js.map +1 -0
  227. package/build/tests/lucid_attachment_collection_store.spec.d.ts +2 -0
  228. package/build/tests/lucid_attachment_collection_store.spec.d.ts.map +1 -0
  229. package/build/tests/lucid_attachment_collection_store.spec.js +52 -0
  230. package/build/tests/lucid_attachment_collection_store.spec.js.map +1 -0
  231. package/build/tests/lucid_attachment_column.spec.d.ts +8 -0
  232. package/build/tests/lucid_attachment_column.spec.d.ts.map +1 -0
  233. package/build/tests/lucid_attachment_column.spec.js +193 -0
  234. package/build/tests/lucid_attachment_column.spec.js.map +1 -0
  235. package/build/tests/lucid_attachment_lifecycle_service.spec.d.ts +8 -0
  236. package/build/tests/lucid_attachment_lifecycle_service.spec.d.ts.map +1 -0
  237. package/build/tests/lucid_attachment_lifecycle_service.spec.js +378 -0
  238. package/build/tests/lucid_attachment_lifecycle_service.spec.js.map +1 -0
  239. package/build/tests/lucid_attachment_relation.spec.d.ts +8 -0
  240. package/build/tests/lucid_attachment_relation.spec.d.ts.map +1 -0
  241. package/build/tests/lucid_attachment_relation.spec.js +216 -0
  242. package/build/tests/lucid_attachment_relation.spec.js.map +1 -0
  243. package/build/tests/lucid_attachment_repository.spec.d.ts +8 -0
  244. package/build/tests/lucid_attachment_repository.spec.d.ts.map +1 -0
  245. package/build/tests/lucid_attachment_repository.spec.js +50 -0
  246. package/build/tests/lucid_attachment_repository.spec.js.map +1 -0
  247. package/build/tests/lucid_attachment_store.spec.d.ts +8 -0
  248. package/build/tests/lucid_attachment_store.spec.d.ts.map +1 -0
  249. package/build/tests/lucid_attachment_store.spec.js +73 -0
  250. package/build/tests/lucid_attachment_store.spec.js.map +1 -0
  251. package/build/tests/lucid_sqlite_integration.spec.d.ts +8 -0
  252. package/build/tests/lucid_sqlite_integration.spec.d.ts.map +1 -0
  253. package/build/tests/lucid_sqlite_integration.spec.js +103 -0
  254. package/build/tests/lucid_sqlite_integration.spec.js.map +1 -0
  255. package/build/tests/lucid_variant_generation_service.spec.d.ts +8 -0
  256. package/build/tests/lucid_variant_generation_service.spec.d.ts.map +1 -0
  257. package/build/tests/lucid_variant_generation_service.spec.js +56 -0
  258. package/build/tests/lucid_variant_generation_service.spec.js.map +1 -0
  259. package/build/tests/memory_queue.spec.d.ts +8 -0
  260. package/build/tests/memory_queue.spec.d.ts.map +1 -0
  261. package/build/tests/memory_queue.spec.js +52 -0
  262. package/build/tests/memory_queue.spec.js.map +1 -0
  263. package/build/tests/migrate_legacy_attachment.spec.d.ts +8 -0
  264. package/build/tests/migrate_legacy_attachment.spec.d.ts.map +1 -0
  265. package/build/tests/migrate_legacy_attachment.spec.js +133 -0
  266. package/build/tests/migrate_legacy_attachment.spec.js.map +1 -0
  267. package/build/tests/migrate_legacy_attachment_records.spec.d.ts +8 -0
  268. package/build/tests/migrate_legacy_attachment_records.spec.d.ts.map +1 -0
  269. package/build/tests/migrate_legacy_attachment_records.spec.js +66 -0
  270. package/build/tests/migrate_legacy_attachment_records.spec.js.map +1 -0
  271. package/build/tests/package_exports.spec.d.ts +8 -0
  272. package/build/tests/package_exports.spec.d.ts.map +1 -0
  273. package/build/tests/package_exports.spec.js +31 -0
  274. package/build/tests/package_exports.spec.js.map +1 -0
  275. package/build/tests/variant_generation_service.spec.d.ts +8 -0
  276. package/build/tests/variant_generation_service.spec.d.ts.map +1 -0
  277. package/build/tests/variant_generation_service.spec.js +79 -0
  278. package/build/tests/variant_generation_service.spec.js.map +1 -0
  279. package/package.json +82 -76
  280. package/build/commands/make/converter.d.ts.map +0 -1
  281. package/build/commands/make/converter.js +0 -28
  282. package/build/services/regenerate_service.d.ts +0 -9
  283. package/build/services/regenerate_service.d.ts.map +0 -1
  284. package/build/services/regenerate_service.js +0 -29
  285. package/build/src/adapters/blurhash.d.ts +0 -11
  286. package/build/src/adapters/blurhash.d.ts.map +0 -1
  287. package/build/src/adapters/blurhash.js +0 -12
  288. package/build/src/adapters/exif.d.ts +0 -15
  289. package/build/src/adapters/exif.d.ts.map +0 -1
  290. package/build/src/adapters/exif.js +0 -165
  291. package/build/src/adapters/ffmpeg.d.ts +0 -19
  292. package/build/src/adapters/ffmpeg.d.ts.map +0 -1
  293. package/build/src/adapters/ffmpeg.js +0 -115
  294. package/build/src/adapters/lock.d.ts +0 -9
  295. package/build/src/adapters/lock.d.ts.map +0 -1
  296. package/build/src/adapters/lock.js +0 -21
  297. package/build/src/adapters/meta.d.ts +0 -10
  298. package/build/src/adapters/meta.d.ts.map +0 -1
  299. package/build/src/adapters/meta.js +0 -49
  300. package/build/src/adapters/poppler.d.ts +0 -20
  301. package/build/src/adapters/poppler.d.ts.map +0 -1
  302. package/build/src/adapters/poppler.js +0 -117
  303. package/build/src/adapters/soffice.d.ts +0 -14
  304. package/build/src/adapters/soffice.d.ts.map +0 -1
  305. package/build/src/adapters/soffice.js +0 -64
  306. package/build/src/attachment_manager.d.ts +0 -50
  307. package/build/src/attachment_manager.d.ts.map +0 -1
  308. package/build/src/attachment_manager.js +0 -145
  309. package/build/src/attachments/attachment.d.ts +0 -42
  310. package/build/src/attachments/attachment.d.ts.map +0 -1
  311. package/build/src/attachments/attachment.js +0 -233
  312. package/build/src/attachments/attachment_base.d.ts +0 -59
  313. package/build/src/attachments/attachment_base.d.ts.map +0 -1
  314. package/build/src/attachments/attachment_base.js +0 -211
  315. package/build/src/attachments/variant_attachment.d.ts +0 -27
  316. package/build/src/attachments/variant_attachment.d.ts.map +0 -1
  317. package/build/src/attachments/variant_attachment.js +0 -40
  318. package/build/src/converters/autodetect_converter.d.ts +0 -13
  319. package/build/src/converters/autodetect_converter.d.ts.map +0 -1
  320. package/build/src/converters/autodetect_converter.js +0 -77
  321. package/build/src/converters/converter.d.ts +0 -14
  322. package/build/src/converters/converter.d.ts.map +0 -1
  323. package/build/src/converters/converter.js +0 -14
  324. package/build/src/converters/document_thumbnail_converter.d.ts +0 -14
  325. package/build/src/converters/document_thumbnail_converter.d.ts.map +0 -1
  326. package/build/src/converters/document_thumbnail_converter.js +0 -36
  327. package/build/src/converters/image_converter.d.ts +0 -13
  328. package/build/src/converters/image_converter.d.ts.map +0 -1
  329. package/build/src/converters/image_converter.js +0 -27
  330. package/build/src/converters/pdf_thumbnail_converter.d.ts +0 -14
  331. package/build/src/converters/pdf_thumbnail_converter.d.ts.map +0 -1
  332. package/build/src/converters/pdf_thumbnail_converter.js +0 -39
  333. package/build/src/converters/video_thumbnail_converter.d.ts +0 -14
  334. package/build/src/converters/video_thumbnail_converter.d.ts.map +0 -1
  335. package/build/src/converters/video_thumbnail_converter.js +0 -40
  336. package/build/src/decorators/attachment.d.ts +0 -15
  337. package/build/src/decorators/attachment.d.ts.map +0 -1
  338. package/build/src/decorators/attachment.js +0 -103
  339. package/build/src/errors.d.ts +0 -67
  340. package/build/src/errors.d.ts.map +0 -1
  341. package/build/src/errors.js +0 -68
  342. package/build/src/services/attachment/attachment_detachment_service.d.ts +0 -19
  343. package/build/src/services/attachment/attachment_detachment_service.d.ts.map +0 -1
  344. package/build/src/services/attachment/attachment_detachment_service.js +0 -66
  345. package/build/src/services/attachment/attachment_persister_service.d.ts +0 -22
  346. package/build/src/services/attachment/attachment_persister_service.d.ts.map +0 -1
  347. package/build/src/services/attachment/attachment_persister_service.js +0 -96
  348. package/build/src/services/attachment/attachment_recorder_service.d.ts +0 -68
  349. package/build/src/services/attachment/attachment_recorder_service.d.ts.map +0 -1
  350. package/build/src/services/attachment/attachment_recorder_service.js +0 -121
  351. package/build/src/services/attachment/attachment_transaction_service.d.ts +0 -26
  352. package/build/src/services/attachment/attachment_transaction_service.d.ts.map +0 -1
  353. package/build/src/services/attachment/attachment_transaction_service.js +0 -46
  354. package/build/src/services/attachment/attachment_utils.d.ts +0 -35
  355. package/build/src/services/attachment/attachment_utils.d.ts.map +0 -1
  356. package/build/src/services/attachment/attachment_utils.js +0 -71
  357. package/build/src/services/attachment/attachment_variant_service.d.ts +0 -17
  358. package/build/src/services/attachment/attachment_variant_service.d.ts.map +0 -1
  359. package/build/src/services/attachment/attachment_variant_service.js +0 -99
  360. package/build/src/services/attachment/index.d.ts +0 -15
  361. package/build/src/services/attachment/index.d.ts.map +0 -1
  362. package/build/src/services/attachment/index.js +0 -15
  363. package/build/src/services/attachment_service.d.ts +0 -8
  364. package/build/src/services/attachment_service.d.ts.map +0 -1
  365. package/build/src/services/attachment_service.js +0 -7
  366. package/build/src/services/variant/variant_generator_service.d.ts +0 -24
  367. package/build/src/services/variant/variant_generator_service.d.ts.map +0 -1
  368. package/build/src/services/variant/variant_generator_service.js +0 -101
  369. package/build/src/services/variant/variant_persister_service.d.ts +0 -24
  370. package/build/src/services/variant/variant_persister_service.d.ts.map +0 -1
  371. package/build/src/services/variant/variant_persister_service.js +0 -59
  372. package/build/src/services/variant/variant_purger_service.d.ts +0 -15
  373. package/build/src/services/variant/variant_purger_service.d.ts.map +0 -1
  374. package/build/src/services/variant/variant_purger_service.js +0 -47
  375. package/build/src/services/variant_service.d.ts +0 -13
  376. package/build/src/services/variant_service.d.ts.map +0 -1
  377. package/build/src/services/variant_service.js +0 -63
  378. package/build/src/types/attachment.d.ts +0 -100
  379. package/build/src/types/attachment.d.ts.map +0 -1
  380. package/build/src/types/config.d.ts +0 -58
  381. package/build/src/types/config.d.ts.map +0 -1
  382. package/build/src/types/converter.d.ts +0 -144
  383. package/build/src/types/converter.d.ts.map +0 -1
  384. package/build/src/types/drive.d.ts +0 -6
  385. package/build/src/types/drive.d.ts.map +0 -1
  386. package/build/src/types/drive.js +0 -1
  387. package/build/src/types/event.d.ts +0 -16
  388. package/build/src/types/event.d.ts.map +0 -1
  389. package/build/src/types/index.d.ts +0 -15
  390. package/build/src/types/index.d.ts.map +0 -1
  391. package/build/src/types/index.js +0 -14
  392. package/build/src/types/input.d.ts +0 -35
  393. package/build/src/types/input.d.ts.map +0 -1
  394. package/build/src/types/input.js +0 -7
  395. package/build/src/types/lock.d.ts +0 -14
  396. package/build/src/types/lock.d.ts.map +0 -1
  397. package/build/src/types/lock.js +0 -7
  398. package/build/src/types/metadata.d.ts +0 -24
  399. package/build/src/types/metadata.d.ts.map +0 -1
  400. package/build/src/types/metadata.js +0 -7
  401. package/build/src/types/mixin.d.ts +0 -17
  402. package/build/src/types/mixin.d.ts.map +0 -1
  403. package/build/src/types/mixin.js +0 -7
  404. package/build/src/types/regenerate.d.ts +0 -12
  405. package/build/src/types/regenerate.d.ts.map +0 -1
  406. package/build/src/types/regenerate.js +0 -7
  407. package/build/src/types/service.d.ts +0 -25
  408. package/build/src/types/service.d.ts.map +0 -1
  409. package/build/src/types/service.js +0 -7
  410. package/build/src/utils/default_values.d.ts +0 -20
  411. package/build/src/utils/default_values.d.ts.map +0 -1
  412. package/build/src/utils/default_values.js +0 -19
  413. package/build/src/utils/helpers.d.ts +0 -19
  414. package/build/src/utils/helpers.d.ts.map +0 -1
  415. package/build/src/utils/helpers.js +0 -131
  416. package/build/src/utils/hooks.d.ts +0 -12
  417. package/build/src/utils/hooks.d.ts.map +0 -1
  418. package/build/src/utils/hooks.js +0 -42
  419. package/build/src/utils/symbols.d.ts +0 -8
  420. package/build/src/utils/symbols.d.ts.map +0 -1
  421. package/build/src/utils/symbols.js +0 -7
  422. package/build/stubs/config.stub +0 -140
  423. package/build/stubs/make/converter/main.stub +0 -20
  424. package/build/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adonis_drive_storage.js","sourceRoot":"","sources":["../../../src/adapters/adonis_drive_storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAmB/C,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAoB;IAC1B,WAAW,CAAoB;IAExC,YAAY,KAAyB,EAAE,WAAoB;QACzD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAuB;QAC1C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CACzC,GAAG,EACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CACxB,CAAA;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;QACnF,CAAC;QAED,OAAO,IAAI,kBAAkB,CAC3B,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAuB,EACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CACtB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA2B;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,IAAI,CAAC,QAAyB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAyB;QACpC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5D,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { ApplicationService } from '@adonisjs/core/types';
8
+ import type { AttachmentStorage, StorageLocation, WriteAttachmentInput } from '../core/storage.js';
9
+ export type LocalFileStorageOptions = {
10
+ location: string;
11
+ disk?: string;
12
+ };
13
+ /**
14
+ * Stores attachment bytes on the local filesystem without requiring Drive.
15
+ */
16
+ export declare class LocalFileStorage implements AttachmentStorage {
17
+ #private;
18
+ readonly defaultDisk: string;
19
+ constructor(options: LocalFileStorageOptions);
20
+ static fromApp(app: ApplicationService): LocalFileStorage;
21
+ write(input: WriteAttachmentInput): Promise<void>;
22
+ read(location: StorageLocation): Promise<Uint8Array>;
23
+ remove(location: StorageLocation): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=local_file_storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_file_storage.d.ts","sourceRoot":"","sources":["../../../src/adapters/local_file_storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAElG,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;;IAExD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;gBAEhB,OAAO,EAAE,uBAAuB;IAK5C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,gBAAgB;IAInD,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAIpD,MAAM,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBvD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
8
+ import { dirname, relative, resolve, sep } from 'node:path';
9
+ import { randomUUID } from 'node:crypto';
10
+ /**
11
+ * Stores attachment bytes on the local filesystem without requiring Drive.
12
+ */
13
+ export class LocalFileStorage {
14
+ #location;
15
+ defaultDisk;
16
+ constructor(options) {
17
+ this.#location = resolve(options.location);
18
+ this.defaultDisk = options.disk ?? 'fs';
19
+ }
20
+ static fromApp(app) {
21
+ return new LocalFileStorage({ location: app.makePath('storage/attachments') });
22
+ }
23
+ async write(input) {
24
+ const filePath = this.#resolve(input);
25
+ const temporaryPath = `${filePath}.${randomUUID()}.tmp`;
26
+ await mkdir(dirname(filePath), { recursive: true });
27
+ try {
28
+ await writeFile(temporaryPath, input.body);
29
+ await rename(temporaryPath, filePath);
30
+ }
31
+ catch (error) {
32
+ await rm(temporaryPath, { force: true }).catch(() => undefined);
33
+ throw error;
34
+ }
35
+ }
36
+ async read(location) {
37
+ return new Uint8Array(await readFile(this.#resolve(location)));
38
+ }
39
+ async remove(location) {
40
+ await rm(this.#resolve(location), { force: true });
41
+ }
42
+ #resolve(location) {
43
+ if (location.disk !== this.defaultDisk) {
44
+ throw new Error(`LocalFileStorage cannot access the "${location.disk}" disk`);
45
+ }
46
+ const filePath = resolve(this.#location, location.path);
47
+ const pathFromRoot = relative(this.#location, filePath);
48
+ if (!pathFromRoot || pathFromRoot === '..' || pathFromRoot.startsWith(`..${sep}`)) {
49
+ throw new Error('Attachment paths must stay inside the local storage directory');
50
+ }
51
+ return filePath;
52
+ }
53
+ }
54
+ //# sourceMappingURL=local_file_storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_file_storage.js","sourceRoot":"","sources":["../../../src/adapters/local_file_storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAWxC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAClB,SAAS,CAAQ;IACjB,WAAW,CAAQ;IAE5B,YAAY,OAAgC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC1C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAA;IACzC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,GAAuB;QACpC,OAAO,IAAI,gBAAgB,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA2B;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,aAAa,GAAG,GAAG,QAAQ,IAAI,UAAU,EAAE,MAAM,CAAA;QAEvD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAM,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YAC/D,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAyB;QAClC,OAAO,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAChE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAyB;QACpC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,QAAQ,CAAC,QAAyB;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAA;QAC/E,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAEvD,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;QAClF,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
@@ -1,5 +1,16 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
1
7
  import type { HttpContext } from '@adonisjs/core/http';
2
- export default class AttachmentsController {
3
- handle({ request, response }: HttpContext): Promise<void>;
8
+ import type { AttachmentService } from '../core/attachment_service.js';
9
+ import type { AttachmentRepository } from '../core/attachment_repository.js';
10
+ export declare class AttachmentsController {
11
+ private readonly attachments;
12
+ private readonly repository;
13
+ constructor(attachments: Pick<AttachmentService, 'read'>, repository: AttachmentRepository);
14
+ handle({ request, response }: HttpContext): Promise<unknown>;
4
15
  }
5
16
  //# sourceMappingURL=attachments_controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachments_controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/attachments_controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAqBtD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAClC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,WAAW;CAkHhD"}
1
+ {"version":3,"file":"attachments_controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/attachments_controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAE5E,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAC5C,UAAU,EAAE,oBAAoB;IAG7C,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;CAUnE"}
@@ -1,110 +1,23 @@
1
- import path from 'node:path';
2
- import { Readable } from 'node:stream';
3
- import encryption from '@adonisjs/core/services/encryption';
4
- import db from '@adonisjs/lucid/services/db';
5
- import { attachmentManager } from '@jrmc/adonis-attachment';
6
- import VariantGeneratorService from '../services/variant/variant_generator_service.js';
7
- import VariantPersisterService from '../services/variant/variant_persister_service.js';
8
- export default class AttachmentsController {
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ export class AttachmentsController {
8
+ attachments;
9
+ repository;
10
+ constructor(attachments, repository) {
11
+ this.attachments = attachments;
12
+ this.repository = repository;
13
+ }
9
14
  async handle({ request, response }) {
10
- const { key } = request.params();
11
- const format = request.qs()?.variant;
12
- let multiple = false;
13
- const data = encryption.decrypt(key);
14
- await attachmentManager.lock
15
- .createLock(`attachment.${data.model}-${data.attribute}`)
16
- .run(async () => {
17
- const queryWithTableSelection = await db
18
- .from(data.model)
19
- .select(data.attribute)
20
- .where(data.primaryKey, data.id)
21
- .first();
22
- /*
23
- * 1. Get the Attachment(s)
24
- */
25
- const result = typeof queryWithTableSelection[data.attribute] === 'string'
26
- ? JSON.parse(queryWithTableSelection[data.attribute])
27
- : queryWithTableSelection[data.attribute];
28
- const attachments = [];
29
- let currentAttachment = null;
30
- if (Array.isArray(result)) {
31
- multiple = true;
32
- for (const item of result) {
33
- item.folder = path.dirname(item.path);
34
- const attachment = attachmentManager.createFromDbResponse(item);
35
- if (attachment) {
36
- attachment.setOptions(data.options);
37
- attachments.push(attachment);
38
- }
39
- }
40
- currentAttachment = attachments[data.index || 0];
41
- }
42
- else {
43
- result.folder = path.dirname(result.path);
44
- currentAttachment = attachmentManager.createFromDbResponse(result);
45
- if (currentAttachment) {
46
- currentAttachment.setOptions(data.options);
47
- }
48
- }
49
- if (!currentAttachment) {
50
- return response.notFound();
51
- }
52
- /*
53
- * 2. Get the variant
54
- */
55
- let variant = currentAttachment.getVariant(format);
56
- /*
57
- * 3. Get the stream
58
- * if variant and path, get the stream and return it
59
- * if not, generate the variant
60
- * if not, return the default file
61
- */
62
- if (!variant && format) {
63
- const converter = (await attachmentManager.getConverter(format));
64
- variant = await new VariantGeneratorService().generateVariant({
65
- key: format,
66
- attachment: currentAttachment,
67
- converter,
68
- });
69
- if (variant) {
70
- const variantPersister = new VariantPersisterService({
71
- id: data.id,
72
- modelTable: data.model,
73
- attributeName: data.attribute,
74
- multiple,
75
- primaryKey: data.primaryKey,
76
- });
77
- const attachmentsOrCurrent = attachments.length ? attachments : [currentAttachment];
78
- await variantPersister.persist({
79
- attachments: attachmentsOrCurrent,
80
- variants: [variant],
81
- });
82
- }
83
- }
84
- /*
85
- * 5. Get the stream
86
- */
87
- let stream;
88
- let mimeType;
89
- if (variant) {
90
- stream = await variant.getStream();
91
- mimeType = variant.mimeType;
92
- }
93
- else if (currentAttachment) {
94
- stream = await currentAttachment.getStream();
95
- mimeType = currentAttachment.mimeType;
96
- }
97
- /*
98
- * 6. Return the stream
99
- */
100
- if (stream && mimeType) {
101
- const readable = Readable.from(stream);
102
- response.header('Content-Type', mimeType);
103
- response.stream(readable);
104
- }
105
- else {
106
- return response.notFound();
107
- }
108
- });
15
+ const attachment = await this.repository.findById(request.param('id'));
16
+ if (!attachment) {
17
+ return response.notFound();
18
+ }
19
+ response.header('content-type', attachment.mimeType);
20
+ return response.send(await this.attachments.read(attachment));
109
21
  }
110
22
  }
23
+ //# sourceMappingURL=attachments_controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments_controller.js","sourceRoot":"","sources":["../../../src/controllers/attachments_controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,OAAO,qBAAqB;IAEb;IACA;IAFnB,YACmB,WAA4C,EAC5C,UAAgC;QADhC,gBAAW,GAAX,WAAW,CAAiC;QAC5C,eAAU,GAAV,UAAU,CAAsB;IAChD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;QAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAEtE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC;QAED,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;QACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IAC/D,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { AttachmentPersistenceContext, AttachmentPersistenceOptions } from './attachment_options.js';
8
+ export type Attachment = Readonly<{
9
+ id: string;
10
+ disk: string;
11
+ name: string;
12
+ originalName: string;
13
+ path: string;
14
+ size: number;
15
+ extname: string;
16
+ mimeType: string;
17
+ metadata?: Record<string, unknown> | undefined;
18
+ }>;
19
+ export type AttachmentPersistRequest<Model = any> = {
20
+ options?: AttachmentPersistenceOptions<Model>;
21
+ context?: Omit<AttachmentPersistenceContext<Model>, 'originalName'>;
22
+ };
23
+ export type AttachmentDraftPersistence = (draft: AttachmentDraft, request?: AttachmentPersistRequest<any>) => Promise<Attachment>;
24
+ export type CreateAttachmentInput = {
25
+ body: Uint8Array;
26
+ originalName: string;
27
+ mimeType?: string;
28
+ disk?: string;
29
+ folder?: string;
30
+ metadata?: Record<string, unknown>;
31
+ };
32
+ /**
33
+ * A source-backed attachment that has not been written to storage yet.
34
+ * Its public properties become final after `persist()` resolves.
35
+ */
36
+ export declare class AttachmentDraft implements Attachment {
37
+ #private;
38
+ readonly id: string;
39
+ disk: string;
40
+ name: string;
41
+ originalName: string;
42
+ path: string;
43
+ size: number;
44
+ extname: string;
45
+ mimeType: string;
46
+ metadata?: Record<string, unknown> | undefined;
47
+ constructor(source: CreateAttachmentInput, provisional: Attachment, options: AttachmentPersistenceOptions, persistence: AttachmentDraftPersistence);
48
+ get isPersisted(): boolean;
49
+ get source(): Readonly<CreateAttachmentInput>;
50
+ get options(): Readonly<AttachmentPersistenceOptions>;
51
+ persist(request?: AttachmentPersistRequest<any>): Promise<Attachment>;
52
+ toJSON(): Attachment;
53
+ toAttachment(): Attachment;
54
+ }
55
+ export declare function isAttachmentDraft(value: unknown): value is AttachmentDraft;
56
+ export type AttachmentFactoryOptions = {
57
+ defaultDisk: string;
58
+ createId?: () => string;
59
+ };
60
+ export declare class AttachmentFactory {
61
+ #private;
62
+ constructor(options: AttachmentFactoryOptions);
63
+ create(input: CreateAttachmentInput, options?: {
64
+ id?: string;
65
+ name?: string;
66
+ disk?: string;
67
+ folder?: string;
68
+ }): Attachment;
69
+ }
70
+ //# sourceMappingURL=attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/core/attachment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,yBAAyB,CAAA;AAEhC,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CAC/C,CAAC,CAAA;AAEF,MAAM,MAAM,wBAAwB,CAAC,KAAK,GAAG,GAAG,IAAI;IAClD,OAAO,CAAC,EAAE,4BAA4B,CAAC,KAAK,CAAC,CAAA;IAC7C,OAAO,CAAC,EAAE,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,CAAA;CACpE,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG,CACvC,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,wBAAwB,CAAC,GAAG,CAAC,KACpC,OAAO,CAAC,UAAU,CAAC,CAAA;AAExB,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,UAAU,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,UAAU;;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;gBAS5C,MAAM,EAAE,qBAAqB,EAC7B,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,4BAA4B,EACrC,WAAW,EAAE,0BAA0B;IAkBzC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,MAAM,IAAI,QAAQ,CAAC,qBAAqB,CAAC,CAM5C;IAED,IAAI,OAAO,IAAI,QAAQ,CAAC,4BAA4B,CAAC,CAEpD;IAED,OAAO,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCrE,MAAM,IAAI,UAAU;IAQpB,YAAY,IAAI,UAAU;CAa3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAA;CACxB,CAAA;AAED,qBAAa,iBAAiB;;gBAIhB,OAAO,EAAE,wBAAwB;IAK7C,MAAM,CACJ,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,UAAU;CAkBd"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { extname } from 'node:path';
9
+ /**
10
+ * A source-backed attachment that has not been written to storage yet.
11
+ * Its public properties become final after `persist()` resolves.
12
+ */
13
+ export class AttachmentDraft {
14
+ id;
15
+ disk;
16
+ name;
17
+ originalName;
18
+ path;
19
+ size;
20
+ extname;
21
+ mimeType;
22
+ metadata;
23
+ #options;
24
+ #source;
25
+ #persisted = false;
26
+ #persisting;
27
+ #persistence;
28
+ constructor(source, provisional, options, persistence) {
29
+ this.id = provisional.id;
30
+ this.disk = provisional.disk;
31
+ this.name = provisional.name;
32
+ this.originalName = provisional.originalName;
33
+ this.path = provisional.path;
34
+ this.size = provisional.size;
35
+ this.extname = provisional.extname;
36
+ this.mimeType = provisional.mimeType;
37
+ if (provisional.metadata) {
38
+ this.metadata = provisional.metadata;
39
+ }
40
+ this.#source = source;
41
+ this.#options = options;
42
+ this.#persistence = persistence;
43
+ }
44
+ get isPersisted() {
45
+ return this.#persisted;
46
+ }
47
+ get source() {
48
+ if (!this.#source) {
49
+ throw new Error('Attachment draft source is no longer available after persistence');
50
+ }
51
+ return this.#source;
52
+ }
53
+ get options() {
54
+ return this.#options;
55
+ }
56
+ persist(request) {
57
+ if (this.#persisted) {
58
+ return Promise.resolve(this);
59
+ }
60
+ if (!this.#persisting) {
61
+ this.#persisting = this.#persistence(this, request)
62
+ .then((attachment) => {
63
+ this.disk = attachment.disk;
64
+ this.name = attachment.name;
65
+ this.path = attachment.path;
66
+ this.size = attachment.size;
67
+ this.extname = attachment.extname;
68
+ this.mimeType = attachment.mimeType;
69
+ if (attachment.metadata) {
70
+ this.metadata = attachment.metadata;
71
+ }
72
+ else {
73
+ delete this.metadata;
74
+ }
75
+ this.#source = undefined;
76
+ this.#persisted = true;
77
+ return this;
78
+ })
79
+ .catch((error) => {
80
+ this.#persisting = undefined;
81
+ throw error;
82
+ });
83
+ }
84
+ return this.#persisting;
85
+ }
86
+ toJSON() {
87
+ if (!this.#persisted) {
88
+ throw new Error('Attachment drafts must be persisted before serialization');
89
+ }
90
+ return this.toAttachment();
91
+ }
92
+ toAttachment() {
93
+ return {
94
+ id: this.id,
95
+ disk: this.disk,
96
+ name: this.name,
97
+ originalName: this.originalName,
98
+ path: this.path,
99
+ size: this.size,
100
+ extname: this.extname,
101
+ mimeType: this.mimeType,
102
+ ...(this.metadata ? { metadata: this.metadata } : {}),
103
+ };
104
+ }
105
+ }
106
+ export function isAttachmentDraft(value) {
107
+ return value instanceof AttachmentDraft;
108
+ }
109
+ export class AttachmentFactory {
110
+ #defaultDisk;
111
+ #createId;
112
+ constructor(options) {
113
+ this.#defaultDisk = options.defaultDisk;
114
+ this.#createId = options.createId ?? randomUUID;
115
+ }
116
+ create(input, options = {}) {
117
+ const id = options.id ?? this.#createId();
118
+ const extension = getExtension(input.originalName);
119
+ const name = options.name ?? (extension ? `${id}.${extension}` : id);
120
+ const path = joinPath(options.folder ?? input.folder, name);
121
+ return {
122
+ id,
123
+ disk: options.disk ?? input.disk ?? this.#defaultDisk,
124
+ name,
125
+ originalName: input.originalName,
126
+ path,
127
+ size: input.body.byteLength,
128
+ extname: extension,
129
+ mimeType: input.mimeType ?? 'application/octet-stream',
130
+ ...(input.metadata ? { metadata: input.metadata } : {}),
131
+ };
132
+ }
133
+ }
134
+ function getExtension(fileName) {
135
+ return extname(fileName).slice(1).toLowerCase();
136
+ }
137
+ function joinPath(folder, name) {
138
+ if (name.includes('/') || name.includes('\\') || name === '.' || name === '..') {
139
+ throw new Error('Attachment names must not contain path separators');
140
+ }
141
+ if (!folder) {
142
+ return name;
143
+ }
144
+ const normalizedFolder = folder.replaceAll('\\', '/').replace(/^\/+|\/+$/g, '');
145
+ if (!normalizedFolder || normalizedFolder.split('/').includes('..')) {
146
+ throw new Error('Attachment folder must be a relative path without parent segments');
147
+ }
148
+ return `${normalizedFolder}/${name}`;
149
+ }
150
+ //# sourceMappingURL=attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../../src/core/attachment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { Attachment } from './attachment.js';
8
+ import type { AttachmentJob } from './queue.js';
9
+ import type { AttachmentRepository } from './attachment_repository.js';
10
+ export type VariantGenerationRequest = {
11
+ attachment: Attachment;
12
+ variantKeys?: readonly string[];
13
+ };
14
+ export interface VariantGenerator {
15
+ generate(request: VariantGenerationRequest): Promise<void>;
16
+ }
17
+ export type VariantGeneratorFactory = () => VariantGenerator | Promise<VariantGenerator>;
18
+ export type AttachmentJobProcessorOptions = {
19
+ attachments: AttachmentRepository;
20
+ variants: VariantGenerator | VariantGeneratorFactory;
21
+ };
22
+ export declare class AttachmentJobProcessor {
23
+ #private;
24
+ constructor(options: AttachmentJobProcessorOptions);
25
+ process(job: AttachmentJob): Promise<void>;
26
+ }
27
+ export declare class AttachmentNotFoundError extends Error {
28
+ constructor(attachmentId: string);
29
+ }
30
+ //# sourceMappingURL=attachment_job_processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment_job_processor.d.ts","sourceRoot":"","sources":["../../../src/core/attachment_job_processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAEtE,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,UAAU,CAAA;IACtB,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAChC,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3D;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;AAExF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,WAAW,EAAE,oBAAoB,CAAA;IACjC,QAAQ,EAAE,gBAAgB,GAAG,uBAAuB,CAAA;CACrD,CAAA;AAED,qBAAa,sBAAsB;;gBAKrB,OAAO,EAAE,6BAA6B;IAK5C,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA8BjD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,YAAY,EAAE,MAAM;CAIjC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ export class AttachmentJobProcessor {
8
+ #attachments;
9
+ #variants;
10
+ #resolvedVariants;
11
+ constructor(options) {
12
+ this.#attachments = options.attachments;
13
+ this.#variants = options.variants;
14
+ }
15
+ async process(job) {
16
+ switch (job.type) {
17
+ case 'generate-variants':
18
+ await this.#generateVariants(job.attachmentId, job.variantKeys);
19
+ return;
20
+ }
21
+ }
22
+ async #generateVariants(attachmentId, variantKeys) {
23
+ const attachment = await this.#attachments.findById(attachmentId);
24
+ if (!attachment) {
25
+ throw new AttachmentNotFoundError(attachmentId);
26
+ }
27
+ const variants = await this.#getVariants();
28
+ await variants.generate({
29
+ attachment,
30
+ ...(variantKeys ? { variantKeys } : {}),
31
+ });
32
+ }
33
+ #getVariants() {
34
+ if (typeof this.#variants !== 'function') {
35
+ return Promise.resolve(this.#variants);
36
+ }
37
+ this.#resolvedVariants ??= Promise.resolve(this.#variants());
38
+ return this.#resolvedVariants;
39
+ }
40
+ }
41
+ export class AttachmentNotFoundError extends Error {
42
+ constructor(attachmentId) {
43
+ super(`Attachment "${attachmentId}" was not found`);
44
+ this.name = 'AttachmentNotFoundError';
45
+ }
46
+ }
47
+ //# sourceMappingURL=attachment_job_processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment_job_processor.js","sourceRoot":"","sources":["../../../src/core/attachment_job_processor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,MAAM,OAAO,sBAAsB;IACxB,YAAY,CAAsB;IAClC,SAAS,CAA4C;IAC9D,iBAAiB,CAAuC;IAExD,YAAY,OAAsC;QAChD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAA;QACvC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAkB;QAC9B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,mBAAmB;gBACtB,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;gBAC/D,OAAM;QACV,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,YAAoB,EAAE,WAA+B;QAC3E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAEjE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,uBAAuB,CAAC,YAAY,CAAC,CAAA;QACjD,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;QAC1C,MAAM,QAAQ,CAAC,QAAQ,CAAC;YACtB,UAAU;YACV,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY;QACV,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YACzC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,CAAC,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,YAAoB;QAC9B,KAAK,CAAC,eAAe,YAAY,iBAAiB,CAAC,CAAA;QACnD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ export type AttachmentPersistenceContext<Model = unknown> = {
2
+ model?: Model;
3
+ field?: string;
4
+ originalName: string;
5
+ };
6
+ export type AttachmentFolder<Model = unknown> = string | ((context: AttachmentPersistenceContext<Model>) => string | Promise<string>);
7
+ export type AttachmentRename<Model = unknown> = boolean | ((context: AttachmentPersistenceContext<Model>) => string | Promise<string>);
8
+ /**
9
+ * File-persistence settings. `null` explicitly disables an inherited setting.
10
+ */
11
+ export type AttachmentPersistenceOptions<Model = unknown> = {
12
+ disk?: string | null;
13
+ folder?: AttachmentFolder<Model> | null;
14
+ rename?: AttachmentRename<Model> | null;
15
+ meta?: boolean | null;
16
+ preComputeUrl?: boolean | null;
17
+ variants?: readonly string[] | null;
18
+ };
19
+ export type ResolvedAttachmentPersistenceOptions<Model = unknown> = {
20
+ disk?: string;
21
+ folder?: AttachmentFolder<Model>;
22
+ rename?: AttachmentRename<Model>;
23
+ meta?: boolean;
24
+ preComputeUrl?: boolean;
25
+ variants?: readonly string[];
26
+ };
27
+ /**
28
+ * Resolves options from lowest to highest priority. An explicit `null` clears
29
+ * the inherited value for one setting.
30
+ */
31
+ export declare function resolveAttachmentPersistenceOptions<Model = unknown>(...layers: ReadonlyArray<AttachmentPersistenceOptions<Model> | undefined>): ResolvedAttachmentPersistenceOptions<Model>;
32
+ //# sourceMappingURL=attachment_options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment_options.d.ts","sourceRoot":"","sources":["../../../src/core/attachment_options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,CAAC,KAAK,GAAG,OAAO,IAAI;IAC1D,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IACxC,MAAM,GACN,CAAC,CAAC,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AAEhF,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IACxC,OAAO,GACP,CAAC,CAAC,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AAEhF;;GAEG;AACH,MAAM,MAAM,4BAA4B,CAAC,KAAK,GAAG,OAAO,IAAI;IAC1D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACvC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;IACvC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IACrB,aAAa,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,oCAAoC,CAAC,KAAK,GAAG,OAAO,IAAI;IAClE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAA;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,KAAK,GAAG,OAAO,EACjE,GAAG,MAAM,EAAE,aAAa,CAAC,4BAA4B,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,GACxE,oCAAoC,CAAC,KAAK,CAAC,CAS7C"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Resolves options from lowest to highest priority. An explicit `null` clears
3
+ * the inherited value for one setting.
4
+ */
5
+ export function resolveAttachmentPersistenceOptions(...layers) {
6
+ return {
7
+ ...resolveOption('disk', layers),
8
+ ...resolveOption('folder', layers),
9
+ ...resolveOption('rename', layers),
10
+ ...resolveOption('meta', layers),
11
+ ...resolveOption('preComputeUrl', layers),
12
+ ...resolveOption('variants', layers),
13
+ };
14
+ }
15
+ function resolveOption(key, layers) {
16
+ for (const layer of [...layers].reverse()) {
17
+ const value = layer?.[key];
18
+ if (value !== undefined) {
19
+ return value === null ? {} : { [key]: value };
20
+ }
21
+ }
22
+ return {};
23
+ }
24
+ //# sourceMappingURL=attachment_options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment_options.js","sourceRoot":"","sources":["../../../src/core/attachment_options.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CACjD,GAAG,MAAsE;IAEzE,OAAO;QACL,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAChC,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClC,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClC,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAChC,GAAG,aAAa,CAAC,eAAe,EAAE,MAAM,CAAC;QACzC,GAAG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC;KACrC,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CACpB,GAAQ,EACR,MAAsE;IAEtE,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAA;QAE1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC"}