@jrmc/adonis-attachment 6.0.0-alpha.2 → 6.0.0-alpha.3

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 (244) hide show
  1. package/build/commands/commands.json +1 -1
  2. package/build/commands/make/converter.d.ts +17 -0
  3. package/build/commands/make/converter.d.ts.map +1 -0
  4. package/build/commands/make/converter.js +27 -0
  5. package/build/commands/make/converter.js.map +1 -0
  6. package/build/index.d.ts +12 -6
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +3 -5
  9. package/build/index.js.map +1 -1
  10. package/build/providers/attachment_provider.d.ts.map +1 -1
  11. package/build/providers/attachment_provider.js +20 -1
  12. package/build/providers/attachment_provider.js.map +1 -1
  13. package/build/services/converters.d.ts +10 -0
  14. package/build/services/converters.d.ts.map +1 -0
  15. package/build/services/converters.js +17 -0
  16. package/build/services/converters.js.map +1 -0
  17. package/build/src/adapters/adonis_drive_storage.d.ts.map +1 -1
  18. package/build/src/adapters/adonis_drive_storage.js +4 -1
  19. package/build/src/adapters/adonis_drive_storage.js.map +1 -1
  20. package/build/src/adapters/local_file_storage.d.ts.map +1 -1
  21. package/build/src/adapters/local_file_storage.js +9 -2
  22. package/build/src/adapters/local_file_storage.js.map +1 -1
  23. package/build/src/converters/autodetect_converter.d.ts +24 -0
  24. package/build/src/converters/autodetect_converter.d.ts.map +1 -0
  25. package/build/src/converters/autodetect_converter.js +113 -0
  26. package/build/src/converters/autodetect_converter.js.map +1 -0
  27. package/build/src/converters/configured_variant_converter_registry.d.ts +36 -0
  28. package/build/src/converters/configured_variant_converter_registry.d.ts.map +1 -0
  29. package/build/src/converters/configured_variant_converter_registry.js +81 -0
  30. package/build/src/converters/configured_variant_converter_registry.js.map +1 -0
  31. package/build/src/converters/converter.d.ts +148 -0
  32. package/build/src/converters/converter.d.ts.map +1 -0
  33. package/build/src/converters/converter.js +24 -0
  34. package/build/src/converters/converter.js.map +1 -0
  35. package/build/src/core/attachment.d.ts +7 -3
  36. package/build/src/core/attachment.d.ts.map +1 -1
  37. package/build/src/core/attachment.js +29 -4
  38. package/build/src/core/attachment.js.map +1 -1
  39. package/build/src/core/attachment_job_processor.d.ts +17 -1
  40. package/build/src/core/attachment_job_processor.d.ts.map +1 -1
  41. package/build/src/core/attachment_job_processor.js +81 -8
  42. package/build/src/core/attachment_job_processor.js.map +1 -1
  43. package/build/src/core/attachment_metadata_persister.d.ts +13 -0
  44. package/build/src/core/attachment_metadata_persister.d.ts.map +1 -0
  45. package/build/src/core/attachment_metadata_persister.js +8 -0
  46. package/build/src/core/attachment_metadata_persister.js.map +1 -0
  47. package/build/src/core/attachment_options.d.ts +3 -2
  48. package/build/src/core/attachment_options.d.ts.map +1 -1
  49. package/build/src/core/attachment_options.js.map +1 -1
  50. package/build/src/core/attachment_service.d.ts +24 -1
  51. package/build/src/core/attachment_service.d.ts.map +1 -1
  52. package/build/src/core/attachment_service.js +95 -4
  53. package/build/src/core/attachment_service.js.map +1 -1
  54. package/build/src/core/index.d.ts +9 -2
  55. package/build/src/core/index.d.ts.map +1 -1
  56. package/build/src/core/index.js +8 -2
  57. package/build/src/core/index.js.map +1 -1
  58. package/build/src/core/queue.d.ts +11 -1
  59. package/build/src/core/queue.d.ts.map +1 -1
  60. package/build/src/define_config.d.ts +27 -3
  61. package/build/src/define_config.d.ts.map +1 -1
  62. package/build/src/define_config.js +35 -1
  63. package/build/src/define_config.js.map +1 -1
  64. package/build/src/errors.d.ts +57 -0
  65. package/build/src/errors.d.ts.map +1 -0
  66. package/build/src/errors.js +96 -0
  67. package/build/src/errors.js.map +1 -0
  68. package/build/src/events/adonis_attachment_event_emitter.d.ts +17 -0
  69. package/build/src/events/adonis_attachment_event_emitter.d.ts.map +1 -0
  70. package/build/src/events/adonis_attachment_event_emitter.js +17 -0
  71. package/build/src/events/adonis_attachment_event_emitter.js.map +1 -0
  72. package/build/src/events/attachment_events.d.ts +43 -0
  73. package/build/src/events/attachment_events.d.ts.map +1 -0
  74. package/build/src/events/attachment_events.js +32 -0
  75. package/build/src/events/attachment_events.js.map +1 -0
  76. package/build/src/integrations/lucid/index.d.ts +1 -0
  77. package/build/src/integrations/lucid/index.d.ts.map +1 -1
  78. package/build/src/integrations/lucid/index.js +1 -0
  79. package/build/src/integrations/lucid/index.js.map +1 -1
  80. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.d.ts +3 -0
  81. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.d.ts.map +1 -1
  82. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.js +7 -2
  83. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment.js.map +1 -1
  84. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.d.ts.map +1 -1
  85. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.js +4 -1
  86. package/build/src/integrations/lucid/migrations/legacy/migrate_legacy_attachment_records.js.map +1 -1
  87. package/build/src/integrations/lucid/models/attachment_link_model.d.ts.map +1 -1
  88. package/build/src/integrations/lucid/models/attachment_link_model.js +2 -1
  89. package/build/src/integrations/lucid/models/attachment_link_model.js.map +1 -1
  90. package/build/src/integrations/lucid/models/attachment_model.d.ts +3 -1
  91. package/build/src/integrations/lucid/models/attachment_model.d.ts.map +1 -1
  92. package/build/src/integrations/lucid/models/attachment_model.js +4 -0
  93. package/build/src/integrations/lucid/models/attachment_model.js.map +1 -1
  94. package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.d.ts +1 -1
  95. package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.d.ts.map +1 -1
  96. package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js +92 -35
  97. package/build/src/integrations/lucid/persistence/lucid_attachment_lifecycle_service.js.map +1 -1
  98. package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.d.ts +17 -0
  99. package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.d.ts.map +1 -0
  100. package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.js +18 -0
  101. package/build/src/integrations/lucid/persistence/lucid_attachment_metadata_persister.js.map +1 -0
  102. package/build/src/integrations/lucid/persistence/lucid_attachment_store.d.ts.map +1 -1
  103. package/build/src/integrations/lucid/persistence/lucid_attachment_store.js +5 -3
  104. package/build/src/integrations/lucid/persistence/lucid_attachment_store.js.map +1 -1
  105. package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.d.ts +5 -2
  106. package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.d.ts.map +1 -1
  107. package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.js +9 -3
  108. package/build/src/integrations/lucid/persistence/lucid_variant_generation_service.js.map +1 -1
  109. package/build/src/integrations/lucid/relations/attachment_relation.d.ts +4 -1
  110. package/build/src/integrations/lucid/relations/attachment_relation.d.ts.map +1 -1
  111. package/build/src/integrations/lucid/relations/attachment_relation.js +15 -8
  112. package/build/src/integrations/lucid/relations/attachment_relation.js.map +1 -1
  113. package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts +4 -0
  114. package/build/src/integrations/lucid/schema/attachment_schema_service.d.ts.map +1 -1
  115. package/build/src/integrations/lucid/schema/attachment_schema_service.js +13 -0
  116. package/build/src/integrations/lucid/schema/attachment_schema_service.js.map +1 -1
  117. package/build/src/integrations/lucid/schema/attachment_table_names.d.ts.map +1 -1
  118. package/build/src/integrations/lucid/schema/attachment_table_names.js +4 -1
  119. package/build/src/integrations/lucid/schema/attachment_table_names.js.map +1 -1
  120. package/build/src/media/binaries.d.ts +79 -0
  121. package/build/src/media/binaries.d.ts.map +1 -0
  122. package/build/src/media/binaries.js +288 -0
  123. package/build/src/media/binaries.js.map +1 -0
  124. package/build/src/media/blurhash.d.ts +48 -0
  125. package/build/src/media/blurhash.d.ts.map +1 -0
  126. package/build/src/media/blurhash.js +46 -0
  127. package/build/src/media/blurhash.js.map +1 -0
  128. package/build/src/media/exif.d.ts +23 -0
  129. package/build/src/media/exif.d.ts.map +1 -0
  130. package/build/src/media/exif.js +98 -0
  131. package/build/src/media/exif.js.map +1 -0
  132. package/build/src/media/media_metadata.d.ts +55 -0
  133. package/build/src/media/media_metadata.d.ts.map +1 -0
  134. package/build/src/media/media_metadata.js +27 -0
  135. package/build/src/media/media_metadata.js.map +1 -0
  136. package/build/src/media/sharp.d.ts +45 -0
  137. package/build/src/media/sharp.d.ts.map +1 -0
  138. package/build/src/media/sharp.js +76 -0
  139. package/build/src/media/sharp.js.map +1 -0
  140. package/build/src/media/v5_metadata.d.ts +20 -0
  141. package/build/src/media/v5_metadata.d.ts.map +1 -0
  142. package/build/src/media/v5_metadata.js +20 -0
  143. package/build/src/media/v5_metadata.js.map +1 -0
  144. package/build/src/queues/memory_queue.d.ts.map +1 -1
  145. package/build/src/queues/memory_queue.js +4 -1
  146. package/build/src/queues/memory_queue.js.map +1 -1
  147. package/build/src/sources/attachment_manager.d.ts +1 -3
  148. package/build/src/sources/attachment_manager.d.ts.map +1 -1
  149. package/build/src/sources/attachment_manager.js +19 -12
  150. package/build/src/sources/attachment_manager.js.map +1 -1
  151. package/build/src/variants/variant_converter.d.ts +4 -1
  152. package/build/src/variants/variant_converter.d.ts.map +1 -1
  153. package/build/src/variants/variant_generation_service.d.ts +9 -3
  154. package/build/src/variants/variant_generation_service.d.ts.map +1 -1
  155. package/build/src/variants/variant_generation_service.js +47 -6
  156. package/build/src/variants/variant_generation_service.js.map +1 -1
  157. package/build/stubs/config/attachment.stub +23 -2
  158. package/build/stubs/converters/converter.stub +18 -0
  159. package/build/tests/adonis_queue.spec.js +56 -1
  160. package/build/tests/adonis_queue.spec.js.map +1 -1
  161. package/build/tests/attachment_events.spec.d.ts +8 -0
  162. package/build/tests/attachment_events.spec.d.ts.map +1 -0
  163. package/build/tests/attachment_events.spec.js +65 -0
  164. package/build/tests/attachment_events.spec.js.map +1 -0
  165. package/build/tests/attachment_job_processor.spec.js +77 -2
  166. package/build/tests/attachment_job_processor.spec.js.map +1 -1
  167. package/build/tests/attachment_provider.spec.js +54 -0
  168. package/build/tests/attachment_provider.spec.js.map +1 -1
  169. package/build/tests/attachment_schema_service.spec.js +14 -0
  170. package/build/tests/attachment_schema_service.spec.js.map +1 -1
  171. package/build/tests/attachment_service.spec.js +81 -2
  172. package/build/tests/attachment_service.spec.js.map +1 -1
  173. package/build/tests/autodetect_converter.spec.d.ts +8 -0
  174. package/build/tests/autodetect_converter.spec.d.ts.map +1 -0
  175. package/build/tests/autodetect_converter.spec.js +55 -0
  176. package/build/tests/autodetect_converter.spec.js.map +1 -0
  177. package/build/tests/binary_media.spec.d.ts +8 -0
  178. package/build/tests/binary_media.spec.d.ts.map +1 -0
  179. package/build/tests/binary_media.spec.js +106 -0
  180. package/build/tests/binary_media.spec.js.map +1 -0
  181. package/build/tests/blurhash_media.spec.d.ts +8 -0
  182. package/build/tests/blurhash_media.spec.d.ts.map +1 -0
  183. package/build/tests/blurhash_media.spec.js +40 -0
  184. package/build/tests/blurhash_media.spec.js.map +1 -0
  185. package/build/tests/configure.spec.js +1 -0
  186. package/build/tests/configure.spec.js.map +1 -1
  187. package/build/tests/configured_variant_converter_registry.spec.d.ts +8 -0
  188. package/build/tests/configured_variant_converter_registry.spec.d.ts.map +1 -0
  189. package/build/tests/configured_variant_converter_registry.spec.js +73 -0
  190. package/build/tests/configured_variant_converter_registry.spec.js.map +1 -0
  191. package/build/tests/converter_config.types.d.ts +36 -0
  192. package/build/tests/converter_config.types.d.ts.map +1 -0
  193. package/build/tests/converter_config.types.js +60 -0
  194. package/build/tests/converter_config.types.js.map +1 -0
  195. package/build/tests/define_config.spec.js +91 -0
  196. package/build/tests/define_config.spec.js.map +1 -1
  197. package/build/tests/errors.spec.d.ts +8 -0
  198. package/build/tests/errors.spec.d.ts.map +1 -0
  199. package/build/tests/errors.spec.js +43 -0
  200. package/build/tests/errors.spec.js.map +1 -0
  201. package/build/tests/exif_media.spec.d.ts +8 -0
  202. package/build/tests/exif_media.spec.d.ts.map +1 -0
  203. package/build/tests/exif_media.spec.js +50 -0
  204. package/build/tests/exif_media.spec.js.map +1 -0
  205. package/build/tests/helpers/lucid_test_database.d.ts.map +1 -1
  206. package/build/tests/helpers/lucid_test_database.js +1 -0
  207. package/build/tests/helpers/lucid_test_database.js.map +1 -1
  208. package/build/tests/lucid_attachment_column.spec.js +1 -1
  209. package/build/tests/lucid_attachment_column.spec.js.map +1 -1
  210. package/build/tests/lucid_attachment_lifecycle_service.spec.js +54 -0
  211. package/build/tests/lucid_attachment_lifecycle_service.spec.js.map +1 -1
  212. package/build/tests/lucid_attachment_metadata_persister.spec.d.ts +8 -0
  213. package/build/tests/lucid_attachment_metadata_persister.spec.d.ts.map +1 -0
  214. package/build/tests/lucid_attachment_metadata_persister.spec.js +34 -0
  215. package/build/tests/lucid_attachment_metadata_persister.spec.js.map +1 -0
  216. package/build/tests/lucid_attachment_relation.spec.js +71 -10
  217. package/build/tests/lucid_attachment_relation.spec.js.map +1 -1
  218. package/build/tests/lucid_sqlite_integration.spec.js +2 -1
  219. package/build/tests/lucid_sqlite_integration.spec.js.map +1 -1
  220. package/build/tests/lucid_variant_generation_service.spec.js +17 -0
  221. package/build/tests/lucid_variant_generation_service.spec.js.map +1 -1
  222. package/build/tests/make_converter.spec.d.ts +8 -0
  223. package/build/tests/make_converter.spec.d.ts.map +1 -0
  224. package/build/tests/make_converter.spec.js +32 -0
  225. package/build/tests/make_converter.spec.js.map +1 -0
  226. package/build/tests/media_metadata.spec.d.ts +8 -0
  227. package/build/tests/media_metadata.spec.d.ts.map +1 -0
  228. package/build/tests/media_metadata.spec.js +51 -0
  229. package/build/tests/media_metadata.spec.js.map +1 -0
  230. package/build/tests/migrate_legacy_attachment.spec.js +15 -5
  231. package/build/tests/migrate_legacy_attachment.spec.js.map +1 -1
  232. package/build/tests/package_exports.spec.js +18 -2
  233. package/build/tests/package_exports.spec.js.map +1 -1
  234. package/build/tests/sharp_media.spec.d.ts +8 -0
  235. package/build/tests/sharp_media.spec.d.ts.map +1 -0
  236. package/build/tests/sharp_media.spec.js +84 -0
  237. package/build/tests/sharp_media.spec.js.map +1 -0
  238. package/build/tests/v5_metadata.spec.d.ts +8 -0
  239. package/build/tests/v5_metadata.spec.d.ts.map +1 -0
  240. package/build/tests/v5_metadata.spec.js +19 -0
  241. package/build/tests/v5_metadata.spec.js.map +1 -0
  242. package/build/tests/variant_generation_service.spec.js +122 -0
  243. package/build/tests/variant_generation_service.spec.js.map +1 -1
  244. package/package.json +50 -2
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { MissingOptionalDependencyError } from '../errors.js';
8
+ /** Builds a generator from injected Sharp and blurhash implementations. */
9
+ export function createSharpBlurhashGenerator(sharp, encode) {
10
+ return {
11
+ async generate({ body, componentX, componentY }) {
12
+ const { data, info } = await sharp(body).raw().ensureAlpha().toBuffer({ resolveWithObject: true });
13
+ return encode(new Uint8ClampedArray(data), info.width, info.height, componentX, componentY);
14
+ },
15
+ };
16
+ }
17
+ /** Loads the optional Sharp and blurhash dependencies only when a converter enables blurhash. */
18
+ export class DynamicBlurhashGenerator {
19
+ #generator;
20
+ generate(input) {
21
+ this.#generator ??= loadGenerator();
22
+ return this.#generator.then((generator) => generator.generate(input));
23
+ }
24
+ }
25
+ export function isBlurhashEnabled(options) {
26
+ return options === true || (typeof options === 'object' && options.enabled);
27
+ }
28
+ export function resolveBlurhashComponents(options) {
29
+ return {
30
+ componentX: typeof options === 'object' ? options.componentX ?? 4 : 4,
31
+ componentY: typeof options === 'object' ? options.componentY ?? 4 : 4,
32
+ };
33
+ }
34
+ async function loadGenerator() {
35
+ const sharpSpecifier = 'sharp';
36
+ const blurhashSpecifier = 'blurhash';
37
+ const [sharpModule, blurhashModule] = await Promise.all([
38
+ import(sharpSpecifier),
39
+ import(blurhashSpecifier),
40
+ ]);
41
+ if (typeof sharpModule.default !== 'function' || typeof blurhashModule.encode !== 'function') {
42
+ throw new MissingOptionalDependencyError(['sharp', 'blurhash']);
43
+ }
44
+ return createSharpBlurhashGenerator(sharpModule.default, blurhashModule.encode);
45
+ }
46
+ //# sourceMappingURL=blurhash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blurhash.js","sourceRoot":"","sources":["../../../src/media/blurhash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAA;AA0C7D,2EAA2E;AAC3E,MAAM,UAAU,4BAA4B,CAC1C,KAA2B,EAC3B,MAAuB;IAEvB,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE;YAC7C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAA;YAElG,OAAO,MAAM,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAC7F,CAAC;KACF,CAAA;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,OAAO,wBAAwB;IACnC,UAAU,CAAwC;IAElD,QAAQ,CAAC,KAA6B;QACpC,IAAI,CAAC,UAAU,KAAK,aAAa,EAAE,CAAA;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IACvE,CAAC;CACF;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAoC;IACpE,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAoC;IAEpC,OAAO;QACL,UAAU,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,UAAU,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACtE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,cAAc,GAAG,OAAO,CAAA;IAC9B,MAAM,iBAAiB,GAAG,UAAU,CAAA;IACpC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,MAAM,CAAC,cAAc,CAAmC;QACxD,MAAM,CAAC,iBAAiB,CAAkC;KAC3D,CAAC,CAAA;IAEF,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,cAAc,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC7F,MAAM,IAAI,8BAA8B,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,OAAO,4BAA4B,CACjC,WAAW,CAAC,OAA+B,EAC3C,cAAc,CAAC,MAAyB,CACzC,CAAA;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { MediaMetadataExtractor } from './media_metadata.js';
8
+ export type ExifReaderTag = {
9
+ value?: unknown;
10
+ description?: string;
11
+ };
12
+ export type ExifReaderTags = Record<string, Record<string, ExifReaderTag | undefined> | undefined>;
13
+ export interface ExifReader {
14
+ load(input: Uint8Array, options?: {
15
+ expanded?: boolean;
16
+ }): ExifReaderTags | Promise<ExifReaderTags>;
17
+ }
18
+ export type ExifMetadataExtractorOptions = {
19
+ reader?: ExifReader | (() => Promise<ExifReader>);
20
+ };
21
+ /** Extracts the v5 EXIF, PNG, ICC, and GPS metadata shape for image attachments. */
22
+ export declare function createExifMetadataExtractor(options?: ExifMetadataExtractorOptions): MediaMetadataExtractor;
23
+ //# sourceMappingURL=exif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exif.d.ts","sourceRoot":"","sources":["../../../src/media/exif.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAsB,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAGrF,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAA;AAElG,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACpG;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;CAClD,CAAA;AAED,oFAAoF;AACpF,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,4BAAiC,GACzC,sBAAsB,CAYxB"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { MissingOptionalDependencyError } from '../errors.js';
8
+ /** Extracts the v5 EXIF, PNG, ICC, and GPS metadata shape for image attachments. */
9
+ export function createExifMetadataExtractor(options = {}) {
10
+ let reader;
11
+ return {
12
+ supports({ attachment }) {
13
+ return attachment.mimeType.startsWith('image/');
14
+ },
15
+ async extract({ body }) {
16
+ reader ??= resolveReader(options.reader);
17
+ return normalizeMetadata(await (await reader).load(body, { expanded: true }));
18
+ },
19
+ };
20
+ }
21
+ async function resolveReader(source) {
22
+ if (typeof source === 'function') {
23
+ return source();
24
+ }
25
+ if (source) {
26
+ return source;
27
+ }
28
+ const specifier = 'exifreader';
29
+ const module = await import(specifier);
30
+ const reader = module.default ?? module;
31
+ if (!isExifReader(reader)) {
32
+ throw new MissingOptionalDependencyError('exifreader');
33
+ }
34
+ return reader;
35
+ }
36
+ function isExifReader(value) {
37
+ return !!value && typeof value === 'object' && 'load' in value && typeof value.load === 'function';
38
+ }
39
+ function normalizeMetadata(tags) {
40
+ const exif = tags.exif;
41
+ const png = tags.png;
42
+ const pngFile = tags.pngFile;
43
+ const file = tags.file;
44
+ const icc = tags.icc;
45
+ const width = numberTag(exif?.PixelXDimension)
46
+ ?? numberTag(png?.['Image Width'])
47
+ ?? numberTag(pngFile?.['Image Width'])
48
+ ?? numberTag(file?.['Image Width'])
49
+ ?? numberTag(icc?.['Image Width']);
50
+ const height = numberTag(exif?.PixelYDimension)
51
+ ?? numberTag(png?.['Image Height'])
52
+ ?? numberTag(pngFile?.['Image Height'])
53
+ ?? numberTag(file?.['Image Height'])
54
+ ?? numberTag(icc?.['Image Height']);
55
+ const orientation = numberTag(exif?.Orientation);
56
+ const date = stringTag(exif?.DateTime) ?? stringTag(png?.['Creation Time']) ?? stringTag(icc?.['Creation Time']);
57
+ const host = stringTag(exif?.Software) ?? stringTag(png?.Software) ?? stringTag(icc?.Software);
58
+ const metadata = {
59
+ ...(date ? { date } : {}),
60
+ ...(host ? { host } : {}),
61
+ ...(width !== undefined && height !== undefined ? { dimension: { width, height } } : {}),
62
+ ...(orientation !== undefined
63
+ ? {
64
+ orientation: {
65
+ value: orientation,
66
+ ...(exif?.Orientation?.description ? { description: exif.Orientation.description } : {}),
67
+ },
68
+ }
69
+ : {}),
70
+ ...gpsMetadata(tags.gps),
71
+ };
72
+ return Object.keys(metadata).length > 0 ? metadata : undefined;
73
+ }
74
+ function gpsMetadata(tags) {
75
+ const latitude = numberTag(tags?.Latitude);
76
+ const longitude = numberTag(tags?.Longitude);
77
+ const altitude = numberTag(tags?.Altitude);
78
+ if (latitude === undefined && longitude === undefined && altitude === undefined) {
79
+ return {};
80
+ }
81
+ return {
82
+ gps: {
83
+ ...(latitude !== undefined ? { latitude } : {}),
84
+ ...(longitude !== undefined ? { longitude } : {}),
85
+ ...(altitude !== undefined ? { altitude } : {}),
86
+ },
87
+ };
88
+ }
89
+ function numberTag(tag) {
90
+ const value = tag?.value;
91
+ const number = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
92
+ return Number.isFinite(number) ? number : undefined;
93
+ }
94
+ function stringTag(tag) {
95
+ const value = tag?.description ?? tag?.value;
96
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
97
+ }
98
+ //# sourceMappingURL=exif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exif.js","sourceRoot":"","sources":["../../../src/media/exif.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { Attachment } from '../core/attachment.js';
8
+ /** Stable metadata shape preserved from v5, with room for application-specific fields. */
9
+ export type AttachmentMetadata = {
10
+ orientation?: {
11
+ value: number;
12
+ description?: string;
13
+ };
14
+ date?: string;
15
+ host?: string;
16
+ gps?: {
17
+ latitude?: number;
18
+ longitude?: number;
19
+ altitude?: number;
20
+ };
21
+ dimension?: {
22
+ width: number;
23
+ height: number;
24
+ };
25
+ duration?: number;
26
+ videoCodec?: string;
27
+ audioCodec?: string;
28
+ pages?: number;
29
+ version?: string;
30
+ bitRate?: number;
31
+ format?: string;
32
+ density?: number;
33
+ hasAlpha?: boolean;
34
+ pageHeight?: number;
35
+ [key: string]: unknown;
36
+ };
37
+ export type MediaMetadataInput = {
38
+ attachment: Attachment;
39
+ body: Uint8Array;
40
+ };
41
+ /**
42
+ * Extracts technical metadata from one attachment source. Implementations may
43
+ * opt out of an input by returning false from `supports`.
44
+ */
45
+ export interface MediaMetadataExtractor {
46
+ supports?(input: Pick<MediaMetadataInput, 'attachment'>): boolean | Promise<boolean>;
47
+ extract(input: MediaMetadataInput): Promise<AttachmentMetadata | undefined>;
48
+ }
49
+ /** Runs matching metadata extractors in declaration order. */
50
+ export declare class MediaMetadataService {
51
+ #private;
52
+ constructor(extractors: readonly MediaMetadataExtractor[]);
53
+ extract(input: MediaMetadataInput): Promise<AttachmentMetadata | undefined>;
54
+ }
55
+ //# sourceMappingURL=media_metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media_metadata.d.ts","sourceRoot":"","sources":["../../../src/media/media_metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,0FAA0F;AAC1F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE;QACJ,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,UAAU,CAAA;CACjB,CAAA;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpF,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAA;CAC5E;AAED,8DAA8D;AAC9D,qBAAa,oBAAoB;;gBAGnB,UAAU,EAAE,SAAS,sBAAsB,EAAE;IAInD,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;CAiBlF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ /** Runs matching metadata extractors in declaration order. */
8
+ export class MediaMetadataService {
9
+ #extractors;
10
+ constructor(extractors) {
11
+ this.#extractors = extractors;
12
+ }
13
+ async extract(input) {
14
+ let metadata;
15
+ for (const extractor of this.#extractors) {
16
+ if (extractor.supports && !(await extractor.supports({ attachment: input.attachment }))) {
17
+ continue;
18
+ }
19
+ const extracted = await extractor.extract(input);
20
+ if (extracted) {
21
+ metadata = { ...metadata, ...extracted };
22
+ }
23
+ }
24
+ return metadata;
25
+ }
26
+ }
27
+ //# sourceMappingURL=media_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media_metadata.js","sourceRoot":"","sources":["../../../src/media/media_metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgDH,8DAA8D;AAC9D,MAAM,OAAO,oBAAoB;IACtB,WAAW,CAAmC;IAEvD,YAAY,UAA6C;QACvD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAyB;QACrC,IAAI,QAAwC,CAAA;QAE5C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC;gBACxF,SAAQ;YACV,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAEhD,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import type { MediaMetadataExtractor } from './media_metadata.js';
8
+ import type { VariantConverter, VariantConversionInput } from '../variants/variant_converter.js';
9
+ import { type SharpFormat, type SharpFormatOptions, type SharpResizeOptions } from '../converters/converter.js';
10
+ export type { SharpFormat, SharpFormatOptions, SharpOutputFormat, SharpResizeOptions } from '../converters/converter.js';
11
+ export type SharpMetadata = {
12
+ width?: number;
13
+ height?: number;
14
+ format?: string;
15
+ size?: number;
16
+ density?: number;
17
+ hasAlpha?: boolean;
18
+ pages?: number;
19
+ pageHeight?: number;
20
+ orientation?: number;
21
+ };
22
+ export interface SharpImage {
23
+ metadata(): Promise<SharpMetadata>;
24
+ autoOrient?(): SharpImage;
25
+ resize(width?: number, height?: number, options?: SharpResizeOptions): SharpImage;
26
+ toFormat(format: string, options?: SharpFormatOptions): SharpImage;
27
+ toBuffer(): Promise<Uint8Array>;
28
+ }
29
+ export type SharpFactory = (input: Uint8Array) => SharpImage;
30
+ export type SharpVariantOptions = {
31
+ key: string;
32
+ sharp: SharpFactory;
33
+ width?: number;
34
+ height?: number;
35
+ resize?: SharpResizeOptions;
36
+ format?: SharpFormat;
37
+ autoOrient?: boolean;
38
+ folder?: string;
39
+ transform?: (image: SharpImage, input: VariantConversionInput) => SharpImage | Promise<SharpImage>;
40
+ };
41
+ /** Creates an image-only metadata extractor backed by a caller-provided Sharp factory. */
42
+ export declare function createSharpMetadataExtractor(sharp: SharpFactory): MediaMetadataExtractor;
43
+ /** Creates a Sharp-backed converter for one configured image variant. */
44
+ export declare function createSharpVariantConverter(options: SharpVariantOptions): VariantConverter;
45
+ //# sourceMappingURL=sharp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharp.d.ts","sourceRoot":"","sources":["../../../src/media/sharp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAsB,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAChG,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAA;AAEnC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAExH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;IAClC,UAAU,CAAC,IAAI,UAAU,CAAA;IACzB,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAAA;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAAA;IAClE,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,CAAA;AAE5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,YAAY,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,sBAAsB,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACnG,CAAA;AAED,0FAA0F;AAC1F,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,GAAG,sBAAsB,CASxF;AAED,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,mBAAmB,GAAG,gBAAgB,CA+B1F"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { normalizeSharpFormat, } from '../converters/converter.js';
8
+ /** Creates an image-only metadata extractor backed by a caller-provided Sharp factory. */
9
+ export function createSharpMetadataExtractor(sharp) {
10
+ return {
11
+ supports({ attachment }) {
12
+ return attachment.mimeType.startsWith('image/');
13
+ },
14
+ async extract({ body }) {
15
+ return compactMetadata(await sharp(body).metadata());
16
+ },
17
+ };
18
+ }
19
+ /** Creates a Sharp-backed converter for one configured image variant. */
20
+ export function createSharpVariantConverter(options) {
21
+ return {
22
+ key: options.key,
23
+ async convert(input) {
24
+ let image = options.sharp(input.body);
25
+ if (options.autoOrient && image.autoOrient) {
26
+ image = image.autoOrient();
27
+ }
28
+ if (options.transform) {
29
+ image = await options.transform(image, input);
30
+ }
31
+ else if (options.width !== undefined || options.height !== undefined) {
32
+ image = image.resize(options.width, options.height, options.resize);
33
+ }
34
+ const outputFormat = options.format ? normalizeSharpFormat(options.format) : undefined;
35
+ if (outputFormat) {
36
+ image = image.toFormat(outputFormat.format, outputFormat.options);
37
+ }
38
+ const format = outputFormat?.format ?? input.attachment.extname;
39
+ const extension = format || 'bin';
40
+ return {
41
+ body: await image.toBuffer(),
42
+ fileName: `${options.key}.${extension}`,
43
+ mimeType: mimeTypeForFormat(format) ?? input.attachment.mimeType,
44
+ ...(options.folder ? { folder: options.folder } : {}),
45
+ };
46
+ },
47
+ };
48
+ }
49
+ function compactMetadata(metadata) {
50
+ const compact = {
51
+ ...(metadata.width !== undefined && metadata.height !== undefined
52
+ ? { dimension: { width: metadata.width, height: metadata.height } }
53
+ : {}),
54
+ ...(metadata.format !== undefined ? { format: metadata.format } : {}),
55
+ ...(metadata.density !== undefined ? { density: metadata.density } : {}),
56
+ ...(metadata.hasAlpha !== undefined ? { hasAlpha: metadata.hasAlpha } : {}),
57
+ ...(metadata.pages !== undefined ? { pages: metadata.pages } : {}),
58
+ ...(metadata.pageHeight !== undefined ? { pageHeight: metadata.pageHeight } : {}),
59
+ ...(metadata.orientation !== undefined ? { orientation: { value: metadata.orientation } } : {}),
60
+ };
61
+ return Object.keys(compact).length > 0 ? compact : undefined;
62
+ }
63
+ function mimeTypeForFormat(format) {
64
+ switch (format) {
65
+ case 'avif': return 'image/avif';
66
+ case 'jpeg': return 'image/jpeg';
67
+ case 'gif': return 'image/gif';
68
+ case 'heif': return 'image/heif';
69
+ case 'png': return 'image/png';
70
+ case 'raw': return 'application/octet-stream';
71
+ case 'tiff': return 'image/tiff';
72
+ case 'webp': return 'image/webp';
73
+ default: return undefined;
74
+ }
75
+ }
76
+ //# sourceMappingURL=sharp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharp.js","sourceRoot":"","sources":["../../../src/media/sharp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { type FfprobeMetadataExtractorOptions, type PdfInfoMetadataExtractorOptions } from './binaries.js';
8
+ import { type ExifMetadataExtractorOptions } from './exif.js';
9
+ import type { MediaMetadataExtractor } from './media_metadata.js';
10
+ export type V5CompatibleMetadataExtractorOptions = {
11
+ exif?: false | ExifMetadataExtractorOptions;
12
+ ffprobe?: false | FfprobeMetadataExtractorOptions;
13
+ pdfinfo?: false | PdfInfoMetadataExtractorOptions;
14
+ };
15
+ /**
16
+ * Creates the v5 metadata profile: EXIF for images, ffprobe for media, and
17
+ * pdfinfo for PDFs. Each extractor can be disabled or pointed at a custom binary.
18
+ */
19
+ export declare function createV5CompatibleMetadataExtractors(options?: V5CompatibleMetadataExtractorOptions): readonly MediaMetadataExtractor[];
20
+ //# sourceMappingURL=v5_metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v5_metadata.d.ts","sourceRoot":"","sources":["../../../src/media/v5_metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAkE,KAAK,+BAA+B,EAAE,KAAK,+BAA+B,EAAE,MAAM,eAAe,CAAA;AAC1K,OAAO,EAA+B,KAAK,4BAA4B,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAEjE,MAAM,MAAM,oCAAoC,GAAG;IACjD,IAAI,CAAC,EAAE,KAAK,GAAG,4BAA4B,CAAA;IAC3C,OAAO,CAAC,EAAE,KAAK,GAAG,+BAA+B,CAAA;IACjD,OAAO,CAAC,EAAE,KAAK,GAAG,+BAA+B,CAAA;CAClD,CAAA;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,GAAE,oCAAyC,GACjD,SAAS,sBAAsB,EAAE,CAMnC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @jrmc/adonis-attachment
3
+ *
4
+ * @license MIT
5
+ * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
+ */
7
+ import { createPdfInfoMetadataExtractor, createFfprobeMetadataExtractor } from './binaries.js';
8
+ import { createExifMetadataExtractor } from './exif.js';
9
+ /**
10
+ * Creates the v5 metadata profile: EXIF for images, ffprobe for media, and
11
+ * pdfinfo for PDFs. Each extractor can be disabled or pointed at a custom binary.
12
+ */
13
+ export function createV5CompatibleMetadataExtractors(options = {}) {
14
+ return [
15
+ ...(options.exif === false ? [] : [createExifMetadataExtractor(options.exif)]),
16
+ ...(options.ffprobe === false ? [] : [createFfprobeMetadataExtractor(options.ffprobe)]),
17
+ ...(options.pdfinfo === false ? [] : [createPdfInfoMetadataExtractor(options.pdfinfo)]),
18
+ ];
19
+ }
20
+ //# sourceMappingURL=v5_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v5_metadata.js","sourceRoot":"","sources":["../../../src/media/v5_metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,8BAA8B,EAAE,8BAA8B,EAA8E,MAAM,eAAe,CAAA;AAC1K,OAAO,EAAE,2BAA2B,EAAqC,MAAM,WAAW,CAAA;AAS1F;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAClD,UAAgD,EAAE;IAElD,OAAO;QACL,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9E,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvF,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;KACxF,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory_queue.d.ts","sourceRoot":"","sources":["../../../src/queues/memory_queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAE5F,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE,CAAA;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,eAAe;;gBAQ/C,OAAO,EAAE,4BAA4B;IAU3C,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0C7B"}
1
+ {"version":3,"file":"memory_queue.d.ts","sourceRoot":"","sources":["../../../src/queues/memory_queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG5F,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,oBAAoB,CAAA;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE,CAAA;AAED;;GAEG;AACH,qBAAa,qBAAsB,YAAW,eAAe;;gBAQ/C,OAAO,EAAE,4BAA4B;IAY3C,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA0C7B"}
@@ -4,6 +4,7 @@
4
4
  * @license MIT
5
5
  * @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
6
6
  */
7
+ import { AttachmentError } from '../errors.js';
7
8
  /**
8
9
  * In-process default queue for local development and applications without a worker.
9
10
  */
@@ -16,7 +17,9 @@ export class MemoryAttachmentQueue {
16
17
  #drainWaiters = [];
17
18
  constructor(options) {
18
19
  if (!Number.isInteger(options.concurrency ?? 1) || (options.concurrency ?? 1) < 1) {
19
- throw new Error('Memory queue concurrency must be a positive integer');
20
+ throw new AttachmentError('Memory queue concurrency must be a positive integer', {
21
+ code: 'E_INVALID_QUEUE_CONCURRENCY',
22
+ });
20
23
  }
21
24
  this.#handler = options.handler;
22
25
  this.#onFailure = options.onFailure;
@@ -1 +1 @@
1
- {"version":3,"file":"memory_queue.js","sourceRoot":"","sources":["../../../src/queues/memory_queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACvB,QAAQ,CAAsB;IAC9B,UAAU,CAA4E;IACtF,YAAY,CAAQ;IACpB,QAAQ,GAAoB,EAAE,CAAA;IACvC,OAAO,GAAG,CAAC,CAAA;IACX,aAAa,GAAsB,EAAE,CAAA;IAErC,YAAY,OAAqC;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACxE,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAkB;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACrD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC3B,OAAM;YACR,CAAC;YAED,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAkB;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QACvB,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"memory_queue.js","sourceRoot":"","sources":["../../../src/queues/memory_queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAQ9C;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACvB,QAAQ,CAAsB;IAC9B,UAAU,CAA4E;IACtF,YAAY,CAAQ;IACpB,QAAQ,GAAoB,EAAE,CAAA;IACvC,OAAO,GAAG,CAAC,CAAA;IACX,aAAa,GAAsB,EAAE,CAAA;IAErC,YAAY,OAAqC;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,eAAe,CAAC,qDAAqD,EAAE;gBAC/E,IAAI,EAAE,6BAA6B;aACpC,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAkB;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACrD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;IACxE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;YAEjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,IAAI,CAAC,oBAAoB,EAAE,CAAA;gBAC3B,OAAM;YACR,CAAC;YAED,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAkB;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAA;QAClC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QACvB,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;IACzC,CAAC;CACF"}
@@ -47,7 +47,5 @@ export declare class AttachmentManager {
47
47
  createFromFile(input: MultipartAttachmentFile, options?: AttachmentSourceOptions): Promise<AttachmentDraft>;
48
48
  createFromFiles(inputs: readonly MultipartAttachmentFile[], options?: AttachmentSourceOptions): Promise<AttachmentDraft[]>;
49
49
  }
50
- export declare class AttachmentSourceError extends Error {
51
- constructor(message: string);
52
- }
50
+ export { AttachmentSourceError } from '../errors.js';
53
51
  //# sourceMappingURL=attachment_manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"attachment_manager.d.ts","sourceRoot":"","sources":["../../../src/sources/attachment_manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAA;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAEtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG;IACnE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7B,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,GAAG,GAAG,MAAM,KAChB,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAEtC,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAED;;;GAGG;AACH,qBAAa,iBAAiB;;gBAKhB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE,OAAO,GAAE,wBAA6B;IAUvG,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAQpG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAU1F,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAa9F,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBlG,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAyBzG,cAAc,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAY/G,eAAe,CACb,MAAM,EAAE,SAAS,uBAAuB,EAAE,EAC1C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,eAAe,EAAE,CAAC;CAkC9B;AAaD,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B"}
1
+ {"version":3,"file":"attachment_manager.d.ts","sourceRoot":"","sources":["../../../src/sources/attachment_manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAA;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAGtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG;IACnE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7B,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,GAAG,GAAG,MAAM,KAChB,OAAO,CAAC,wBAAwB,CAAC,CAAA;AAEtC,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAED;;;GAGG;AACH,qBAAa,iBAAiB;;gBAKhB,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,EAAE,OAAO,GAAE,wBAA6B;IAYvG,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAQpG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAU1F,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAa9F,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBlG,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IA0BzG,cAAc,CAAC,KAAK,EAAE,uBAAuB,EAAE,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,eAAe,CAAC;IAc/G,eAAe,CACb,MAAM,EAAE,SAAS,uBAAuB,EAAE,EAC1C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,eAAe,EAAE,CAAC;CAuC9B;AAaD,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { basename, extname } from 'node:path';
8
8
  import { readFile, stat } from 'node:fs/promises';
9
+ import { AttachmentSourceError } from '../errors.js';
9
10
  /**
10
11
  * Normalizes common input sources into drafts. The file is written only when the
11
12
  * caller invokes `draft.persist()` or an integration persists it automatically.
@@ -16,7 +17,9 @@ export class AttachmentManager {
16
17
  #fetch;
17
18
  constructor(attachments, options = {}) {
18
19
  if (options.maxBytes !== undefined && (!Number.isSafeInteger(options.maxBytes) || options.maxBytes < 1)) {
19
- throw new Error('Attachment source maxBytes must be a positive integer');
20
+ throw new AttachmentSourceError('Attachment source maxBytes must be a positive integer', {
21
+ code: 'E_INVALID_ATTACHMENT_SOURCE_OPTIONS',
22
+ });
20
23
  }
21
24
  this.#attachments = attachments;
22
25
  this.#maxBytes = options.maxBytes;
@@ -67,7 +70,7 @@ export class AttachmentManager {
67
70
  async createFromUrl(input, options = {}) {
68
71
  const response = await this.#fetch(input);
69
72
  if (!response.ok) {
70
- throw new AttachmentSourceError(`Unable to download attachment source: ${response.status} ${response.statusText}`);
73
+ throw new AttachmentSourceError(`Unable to download attachment source: ${response.status} ${response.statusText}`, { code: 'E_ATTACHMENT_SOURCE_DOWNLOAD_FAILED', status: 502 });
71
74
  }
72
75
  const contentLength = response.headers.get('content-length');
73
76
  if (contentLength && Number.isSafeInteger(Number(contentLength))) {
@@ -84,7 +87,9 @@ export class AttachmentManager {
84
87
  }
85
88
  createFromFile(input, options = {}) {
86
89
  if (!input.tmpPath) {
87
- throw new AttachmentSourceError('Multipart attachment file has no temporary path');
90
+ throw new AttachmentSourceError('Multipart attachment file has no temporary path', {
91
+ code: 'E_MULTIPART_SOURCE_PATH_MISSING',
92
+ });
88
93
  }
89
94
  return this.createFromPath(input.tmpPath, {
90
95
  ...options,
@@ -106,7 +111,9 @@ export class AttachmentManager {
106
111
  }
107
112
  #assertSize(size, override) {
108
113
  if (override !== undefined && (!Number.isSafeInteger(override) || override < 1)) {
109
- throw new Error('Attachment source maxBytes must be a positive integer');
114
+ throw new AttachmentSourceError('Attachment source maxBytes must be a positive integer', {
115
+ code: 'E_INVALID_ATTACHMENT_SOURCE_OPTIONS',
116
+ });
110
117
  }
111
118
  const maxBytes = override === undefined
112
119
  ? this.#maxBytes
@@ -114,7 +121,10 @@ export class AttachmentManager {
114
121
  ? override
115
122
  : Math.min(override, this.#maxBytes);
116
123
  if (maxBytes !== undefined && size > maxBytes) {
117
- throw new AttachmentSourceError(`Attachment source exceeds the ${maxBytes}-byte limit`);
124
+ throw new AttachmentSourceError(`Attachment source exceeds the ${maxBytes}-byte limit`, {
125
+ code: 'E_ATTACHMENT_SOURCE_TOO_LARGE',
126
+ status: 413,
127
+ });
118
128
  }
119
129
  }
120
130
  }
@@ -128,18 +138,15 @@ function toPersistenceOptions(options) {
128
138
  ...(options.variants !== undefined ? { variants: options.variants } : {}),
129
139
  };
130
140
  }
131
- export class AttachmentSourceError extends Error {
132
- constructor(message) {
133
- super(message);
134
- this.name = 'AttachmentSourceError';
135
- }
136
- }
141
+ export { AttachmentSourceError } from '../errors.js';
137
142
  function parseBase64(input) {
138
143
  const dataUri = /^data:([^;,]+)?;base64,([A-Za-z0-9+/\s]*={0,2})$/i.exec(input);
139
144
  const mimeType = dataUri?.[1];
140
145
  const value = (dataUri?.[2] ?? input).replaceAll(/\s/g, '');
141
146
  if (!isBase64(value)) {
142
- throw new AttachmentSourceError('Attachment source must be valid Base64 data');
147
+ throw new AttachmentSourceError('Attachment source must be valid Base64 data', {
148
+ code: 'E_ISNOT_BASE64',
149
+ });
143
150
  }
144
151
  return { body: Buffer.from(value, 'base64'), ...(mimeType ? { mimeType } : {}) };
145
152
  }