@bgord/bun 0.21.7 → 0.22.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 (143) hide show
  1. package/dist/image-alpha-noop.adapter.d.ts +5 -0
  2. package/dist/image-alpha-noop.adapter.d.ts.map +1 -0
  3. package/dist/image-alpha-noop.adapter.js +6 -0
  4. package/dist/image-alpha-noop.adapter.js.map +1 -0
  5. package/dist/image-alpha-sharp.adapter.d.ts +5 -0
  6. package/dist/image-alpha-sharp.adapter.d.ts.map +1 -0
  7. package/dist/image-alpha-sharp.adapter.js +83 -0
  8. package/dist/image-alpha-sharp.adapter.js.map +1 -0
  9. package/dist/image-alpha.port.d.ts +24 -0
  10. package/dist/image-alpha.port.d.ts.map +1 -0
  11. package/dist/image-alpha.port.js +2 -0
  12. package/dist/image-alpha.port.js.map +1 -0
  13. package/dist/image-blur-noop.adapter.d.ts +5 -0
  14. package/dist/image-blur-noop.adapter.d.ts.map +1 -0
  15. package/dist/image-blur-noop.adapter.js +6 -0
  16. package/dist/image-blur-noop.adapter.js.map +1 -0
  17. package/dist/image-blur-sharp.adapter.d.ts +5 -0
  18. package/dist/image-blur-sharp.adapter.d.ts.map +1 -0
  19. package/dist/image-blur-sharp.adapter.js +79 -0
  20. package/dist/image-blur-sharp.adapter.js.map +1 -0
  21. package/dist/image-blur.port.d.ts +18 -0
  22. package/dist/image-blur.port.d.ts.map +1 -0
  23. package/dist/image-blur.port.js +2 -0
  24. package/dist/image-blur.port.js.map +1 -0
  25. package/dist/image-compressor-noop.adapter.d.ts +5 -0
  26. package/dist/image-compressor-noop.adapter.d.ts.map +1 -0
  27. package/dist/image-compressor-noop.adapter.js +6 -0
  28. package/dist/image-compressor-noop.adapter.js.map +1 -0
  29. package/dist/image-compressor-sharp.adapter.d.ts +6 -0
  30. package/dist/image-compressor-sharp.adapter.d.ts.map +1 -0
  31. package/dist/image-compressor-sharp.adapter.js +81 -0
  32. package/dist/image-compressor-sharp.adapter.js.map +1 -0
  33. package/dist/image-compressor.port.d.ts +18 -0
  34. package/dist/image-compressor.port.d.ts.map +1 -0
  35. package/dist/image-compressor.port.js +2 -0
  36. package/dist/image-compressor.port.js.map +1 -0
  37. package/dist/image-exif-clear-noop.adapter.d.ts +5 -0
  38. package/dist/image-exif-clear-noop.adapter.d.ts.map +1 -0
  39. package/dist/image-exif-clear-noop.adapter.js +6 -0
  40. package/dist/image-exif-clear-noop.adapter.js.map +1 -0
  41. package/dist/image-exif-clear-sharp.adapter.d.ts +5 -0
  42. package/dist/image-exif-clear-sharp.adapter.d.ts.map +1 -0
  43. package/dist/image-exif-clear-sharp.adapter.js +77 -0
  44. package/dist/image-exif-clear-sharp.adapter.js.map +1 -0
  45. package/dist/image-exif-clear.port.d.ts +16 -0
  46. package/dist/image-exif-clear.port.d.ts.map +1 -0
  47. package/dist/image-exif-clear.port.js +2 -0
  48. package/dist/image-exif-clear.port.js.map +1 -0
  49. package/dist/image-formatter-noop.adapter.d.ts +6 -0
  50. package/dist/image-formatter-noop.adapter.d.ts.map +1 -0
  51. package/dist/image-formatter-noop.adapter.js +8 -0
  52. package/dist/image-formatter-noop.adapter.js.map +1 -0
  53. package/dist/image-formatter-sharp.adapter.d.ts +5 -0
  54. package/dist/image-formatter-sharp.adapter.d.ts.map +1 -0
  55. package/dist/image-formatter-sharp.adapter.js +83 -0
  56. package/dist/image-formatter-sharp.adapter.js.map +1 -0
  57. package/dist/image-formatter.port.d.ts +17 -0
  58. package/dist/image-formatter.port.d.ts.map +1 -0
  59. package/dist/image-formatter.port.js +2 -0
  60. package/dist/image-formatter.port.js.map +1 -0
  61. package/dist/image-info-noop.adapter.d.ts +13 -0
  62. package/dist/image-info-noop.adapter.d.ts.map +1 -0
  63. package/dist/image-info-noop.adapter.js +16 -0
  64. package/dist/image-info-noop.adapter.js.map +1 -0
  65. package/dist/image-info-sharp.adapter.d.ts +11 -0
  66. package/dist/image-info-sharp.adapter.d.ts.map +1 -0
  67. package/dist/image-info-sharp.adapter.js +83 -0
  68. package/dist/image-info-sharp.adapter.js.map +1 -0
  69. package/dist/image-info.port.d.ts +12 -0
  70. package/dist/image-info.port.d.ts.map +1 -0
  71. package/dist/image-info.port.js +2 -0
  72. package/dist/image-info.port.js.map +1 -0
  73. package/dist/image-processor-noop.adapter.d.ts +6 -0
  74. package/dist/image-processor-noop.adapter.d.ts.map +1 -0
  75. package/dist/image-processor-noop.adapter.js +8 -0
  76. package/dist/image-processor-noop.adapter.js.map +1 -0
  77. package/dist/image-processor-sharp.adapter.d.ts +7 -0
  78. package/dist/image-processor-sharp.adapter.d.ts.map +1 -0
  79. package/dist/image-processor-sharp.adapter.js +96 -0
  80. package/dist/image-processor-sharp.adapter.js.map +1 -0
  81. package/dist/image-processor.port.d.ts +30 -0
  82. package/dist/image-processor.port.d.ts.map +1 -0
  83. package/dist/image-processor.port.js +2 -0
  84. package/dist/image-processor.port.js.map +1 -0
  85. package/dist/image-resizer-noop.adapter.d.ts +5 -0
  86. package/dist/image-resizer-noop.adapter.d.ts.map +1 -0
  87. package/dist/image-resizer-noop.adapter.js +6 -0
  88. package/dist/image-resizer-noop.adapter.js.map +1 -0
  89. package/dist/image-resizer-sharp.adapter.d.ts +5 -0
  90. package/dist/image-resizer-sharp.adapter.d.ts.map +1 -0
  91. package/dist/image-resizer-sharp.adapter.js +88 -0
  92. package/dist/image-resizer-sharp.adapter.js.map +1 -0
  93. package/dist/image-resizer.port.d.ts +18 -0
  94. package/dist/image-resizer.port.d.ts.map +1 -0
  95. package/dist/image-resizer.port.js +2 -0
  96. package/dist/image-resizer.port.js.map +1 -0
  97. package/dist/index.d.ts +24 -2
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +24 -2
  100. package/dist/index.js.map +1 -1
  101. package/dist/open-graph.service.d.ts +0 -5
  102. package/dist/open-graph.service.d.ts.map +1 -1
  103. package/dist/open-graph.service.js +2 -10
  104. package/dist/open-graph.service.js.map +1 -1
  105. package/dist/tsconfig.tsbuildinfo +1 -1
  106. package/package.json +1 -1
  107. package/readme.md +24 -2
  108. package/src/image-alpha-noop.adapter.ts +7 -0
  109. package/src/image-alpha-sharp.adapter.ts +28 -0
  110. package/src/image-alpha.port.ts +22 -0
  111. package/src/image-blur-noop.adapter.ts +7 -0
  112. package/src/image-blur-sharp.adapter.ts +24 -0
  113. package/src/image-blur.port.ts +20 -0
  114. package/src/image-compressor-noop.adapter.ts +7 -0
  115. package/src/image-compressor-sharp.adapter.ts +26 -0
  116. package/src/image-compressor.port.ts +20 -0
  117. package/src/image-exif-clear-noop.adapter.ts +7 -0
  118. package/src/image-exif-clear-sharp.adapter.ts +20 -0
  119. package/src/image-exif-clear.port.ts +18 -0
  120. package/src/image-formatter-noop.adapter.ts +10 -0
  121. package/src/image-formatter-sharp.adapter.ts +29 -0
  122. package/src/image-formatter.port.ts +19 -0
  123. package/src/image-info-noop.adapter.ts +15 -0
  124. package/src/image-info-sharp.adapter.ts +27 -0
  125. package/src/image-info.port.ts +7 -0
  126. package/src/image-processor-noop.adapter.ts +10 -0
  127. package/src/image-processor-sharp.adapter.ts +49 -0
  128. package/src/image-processor.port.ts +28 -0
  129. package/src/image-resizer-noop.adapter.ts +7 -0
  130. package/src/image-resizer-sharp.adapter.ts +32 -0
  131. package/src/image-resizer.port.ts +20 -0
  132. package/src/index.ts +24 -2
  133. package/src/open-graph.service.ts +12 -12
  134. package/dist/image-compressor.service.d.ts +0 -14
  135. package/dist/image-compressor.service.d.ts.map +0 -1
  136. package/dist/image-compressor.service.js +0 -19
  137. package/dist/image-compressor.service.js.map +0 -1
  138. package/dist/image-exif.service.d.ts +0 -18
  139. package/dist/image-exif.service.d.ts.map +0 -1
  140. package/dist/image-exif.service.js +0 -21
  141. package/dist/image-exif.service.js.map +0 -1
  142. package/src/image-compressor.service.ts +0 -30
  143. package/src/image-exif.service.ts +0 -36
@@ -0,0 +1,8 @@
1
+ export class ImageFormatterNoopAdapter {
2
+ async format(recipe) {
3
+ return recipe.strategy === "output_path"
4
+ ? recipe.output
5
+ : recipe.input.withFilename(recipe.input.getFilename().withExtension(recipe.to));
6
+ }
7
+ }
8
+ //# sourceMappingURL=image-formatter-noop.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-formatter-noop.adapter.js","sourceRoot":"","sources":["../src/image-formatter-noop.adapter.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,yBAAyB;IACpC,KAAK,CAAC,MAAM,CAAC,MAA8B;QACzC,OAAO,MAAM,CAAC,QAAQ,KAAK,aAAa;YACtC,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { ImageFormatterPort, ImageFormatterStrategy } from "./image-formatter.port";
2
+ export declare class ImageFormatterSharpAdapter implements ImageFormatterPort {
3
+ format(recipe: ImageFormatterStrategy): Promise<import("@bgord/tools").FilePathRelative | import("@bgord/tools").FilePathAbsolute>;
4
+ }
5
+ //# sourceMappingURL=image-formatter-sharp.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-formatter-sharp.adapter.d.ts","sourceRoot":"","sources":["../src/image-formatter-sharp.adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,qBAAa,0BAA2B,YAAW,kBAAkB;IAC7D,MAAM,CAAC,MAAM,EAAE,sBAAsB;CAuB5C"}
@@ -0,0 +1,83 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import fs from "node:fs/promises";
54
+ import sharp from "sharp";
55
+ export class ImageFormatterSharpAdapter {
56
+ async format(recipe) {
57
+ const env_1 = { stack: [], error: void 0, hasError: false };
58
+ try {
59
+ const final = recipe.strategy === "output_path"
60
+ ? recipe.output
61
+ : recipe.input.withFilename(recipe.input.getFilename().withExtension(recipe.to));
62
+ const temporary = final.withFilename(final.getFilename().withSuffix("-formatted"));
63
+ const finalExtension = String(final.getFilename().getExtension());
64
+ const encoder = (finalExtension === "jpg" ? "jpeg" : finalExtension);
65
+ const pipeline = sharp((recipe.strategy === "output_path" ? recipe.input : recipe.input).get());
66
+ const _sharp_ = __addDisposableResource(env_1, { [Symbol.dispose]: () => pipeline.destroy() }, false);
67
+ await pipeline.toFormat(encoder).toFile(temporary.get());
68
+ await fs.rename(temporary.get(), final.get());
69
+ if (recipe.strategy === "in_place" && final.get() !== recipe.input.get()) {
70
+ await fs.unlink(recipe.input.get());
71
+ }
72
+ return final;
73
+ }
74
+ catch (e_1) {
75
+ env_1.error = e_1;
76
+ env_1.hasError = true;
77
+ }
78
+ finally {
79
+ __disposeResources(env_1);
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=image-formatter-sharp.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-formatter-sharp.adapter.js","sourceRoot":"","sources":["../src/image-formatter-sharp.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,0BAA0B;IACrC,KAAK,CAAC,MAAM,CAAC,MAA8B;;;YACzC,MAAM,KAAK,GACT,MAAM,CAAC,QAAQ,KAAK,aAAa;gBAC/B,CAAC,CAAC,MAAM,CAAC,MAAM;gBACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAErF,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;YAEnF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAA2B,CAAC;YAE/F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAChG,MAAM,OAAO,kCAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAA,CAAC;YAE/D,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAE9C,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,OAAO,KAAK,CAAC;;;;;;;;;KACd;CACF"}
@@ -0,0 +1,17 @@
1
+ import type * as tools from "@bgord/tools";
2
+ type ImageFormatterOutputPathStrategy = {
3
+ strategy: "output_path";
4
+ input: tools.FilePathRelative | tools.FilePathAbsolute;
5
+ output: tools.FilePathRelative | tools.FilePathAbsolute;
6
+ };
7
+ type ImageFormatterInPlaceStrategy = {
8
+ strategy: "in_place";
9
+ input: tools.FilePathRelative | tools.FilePathAbsolute;
10
+ to: tools.ExtensionType;
11
+ };
12
+ export type ImageFormatterStrategy = ImageFormatterInPlaceStrategy | ImageFormatterOutputPathStrategy;
13
+ export interface ImageFormatterPort {
14
+ format(recipe: ImageFormatterStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=image-formatter.port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-formatter.port.d.ts","sourceRoot":"","sources":["../src/image-formatter.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,KAAK,gCAAgC,GAAG;IACtC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CACzD,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACnC,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,6BAA6B,GAAG,gCAAgC,CAAC;AAEtG,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;CAClG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=image-formatter.port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-formatter.port.js","sourceRoot":"","sources":["../src/image-formatter.port.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { ImageInfoPort } from "./image-info.port";
3
+ export declare class ImageInfoNoopAdapter implements ImageInfoPort {
4
+ private readonly mime;
5
+ constructor(mime: tools.Mime);
6
+ inspect(_filePath: tools.FilePathRelative | tools.FilePathAbsolute): Promise<{
7
+ width: number & import("zod/v4").$brand<"Width">;
8
+ height: number & import("zod/v4").$brand<"Height">;
9
+ mime: tools.Mime;
10
+ size: tools.Size;
11
+ }>;
12
+ }
13
+ //# sourceMappingURL=image-info-noop.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info-noop.adapter.d.ts","sourceRoot":"","sources":["../src/image-info-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,oBAAqB,YAAW,aAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,KAAK,CAAC,IAAI;IAEvC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;;;;;;CAQzE"}
@@ -0,0 +1,16 @@
1
+ import * as tools from "@bgord/tools";
2
+ export class ImageInfoNoopAdapter {
3
+ mime;
4
+ constructor(mime) {
5
+ this.mime = mime;
6
+ }
7
+ async inspect(_filePath) {
8
+ return {
9
+ width: tools.Width.parse(400),
10
+ height: tools.Height.parse(400),
11
+ mime: this.mime,
12
+ size: tools.Size.fromBytes(0),
13
+ };
14
+ }
15
+ }
16
+ //# sourceMappingURL=image-info-noop.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info-noop.adapter.js","sourceRoot":"","sources":["../src/image-info-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD,KAAK,CAAC,OAAO,CAAC,SAA0D;QACtE,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAC9B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import * as tools from "@bgord/tools";
2
+ import type { ImageInfoPort } from "./image-info.port";
3
+ export declare class ImageInfoSharpAdapter implements ImageInfoPort {
4
+ inspect(filePath: tools.FilePathRelative | tools.FilePathAbsolute): Promise<{
5
+ width: number & import("zod/v4").$brand<"Width">;
6
+ height: number & import("zod/v4").$brand<"Height">;
7
+ mime: tools.Mime;
8
+ size: tools.Size;
9
+ }>;
10
+ }
11
+ //# sourceMappingURL=image-info-sharp.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info-sharp.adapter.d.ts","sourceRoot":"","sources":["../src/image-info-sharp.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,qBAAsB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB;;;;;;CAqBxE"}
@@ -0,0 +1,83 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import * as tools from "@bgord/tools";
54
+ import sharp from "sharp";
55
+ export class ImageInfoSharpAdapter {
56
+ async inspect(filePath) {
57
+ const env_1 = { stack: [], error: void 0, hasError: false };
58
+ try {
59
+ const path = filePath.get();
60
+ const image = sharp(path);
61
+ const _sharp_ = __addDisposableResource(env_1, {
62
+ [Symbol.dispose]: () => image.destroy(),
63
+ }, false);
64
+ const metadata = await image.metadata();
65
+ const extension = tools.ExtensionSchema.parse(metadata.format);
66
+ const sizeBytes = Bun.file(path).size;
67
+ return {
68
+ width: tools.Width.parse(metadata.width),
69
+ height: tools.Height.parse(metadata.height),
70
+ mime: tools.Mime.fromExtension(extension),
71
+ size: tools.Size.fromBytes(sizeBytes),
72
+ };
73
+ }
74
+ catch (e_1) {
75
+ env_1.error = e_1;
76
+ env_1.hasError = true;
77
+ }
78
+ finally {
79
+ __disposeResources(env_1);
80
+ }
81
+ }
82
+ }
83
+ //# sourceMappingURL=image-info-sharp.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info-sharp.adapter.js","sourceRoot":"","sources":["../src/image-info-sharp.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,qBAAqB;IAChC,KAAK,CAAC,OAAO,CAAC,QAAyD;;;YACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;YAE5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;YAE1B,MAAM,OAAO,kCAAG;gBACd,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;aACxC,QAAA,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE/D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YAEtC,OAAO;gBACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;gBACzC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;aACtC,CAAC;;;;;;;;;KACH;CACF"}
@@ -0,0 +1,12 @@
1
+ import type * as tools from "@bgord/tools";
2
+ type ImageInfoType = {
3
+ height: tools.HeightType;
4
+ width: tools.WidthType;
5
+ mime: tools.Mime;
6
+ size: tools.Size;
7
+ };
8
+ export interface ImageInfoPort {
9
+ inspect(filePath: tools.FilePathRelative | tools.FilePathAbsolute): Promise<ImageInfoType>;
10
+ }
11
+ export {};
12
+ //# sourceMappingURL=image-info.port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info.port.d.ts","sourceRoot":"","sources":["../src/image-info.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,KAAK,aAAa,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAA;CAAE,CAAC;AAE9G,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=image-info.port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-info.port.js","sourceRoot":"","sources":["../src/image-info.port.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageProcessorPort, ImageProcessorStrategy } from "./image-processor.port";
3
+ export declare class ImageProcessorNoopAdapter implements ImageProcessorPort {
4
+ process(recipe: ImageProcessorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
5
+ }
6
+ //# sourceMappingURL=image-processor-noop.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor-noop.adapter.d.ts","sourceRoot":"","sources":["../src/image-processor-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,qBAAa,yBAA0B,YAAW,kBAAkB;IAC5D,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CAKxG"}
@@ -0,0 +1,8 @@
1
+ export class ImageProcessorNoopAdapter {
2
+ async process(recipe) {
3
+ return recipe.strategy === "output_path"
4
+ ? recipe.output
5
+ : recipe.input.withFilename(recipe.input.getFilename().withExtension(recipe.to));
6
+ }
7
+ }
8
+ //# sourceMappingURL=image-processor-noop.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor-noop.adapter.js","sourceRoot":"","sources":["../src/image-processor-noop.adapter.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,yBAAyB;IACpC,KAAK,CAAC,OAAO,CAAC,MAA8B;QAC1C,OAAO,MAAM,CAAC,QAAQ,KAAK,aAAa;YACtC,CAAC,CAAC,MAAM,CAAC,MAAM;YACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type * as tools from "@bgord/tools";
2
+ import type { ImageProcessorPort, ImageProcessorStrategy } from "./image-processor.port";
3
+ export declare class ImageProcessorSharpAdapter implements ImageProcessorPort {
4
+ private static readonly DEFAULT_QUALITY;
5
+ process(recipe: ImageProcessorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
6
+ }
7
+ //# sourceMappingURL=image-processor-sharp.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor-sharp.adapter.d.ts","sourceRoot":"","sources":["../src/image-processor-sharp.adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAEvC,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;CAwCxG"}
@@ -0,0 +1,96 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import fs from "node:fs/promises";
54
+ import sharp from "sharp";
55
+ export class ImageProcessorSharpAdapter {
56
+ static DEFAULT_QUALITY = 85;
57
+ async process(recipe) {
58
+ const env_1 = { stack: [], error: void 0, hasError: false };
59
+ try {
60
+ const final = recipe.strategy === "output_path"
61
+ ? recipe.output
62
+ : recipe.input.withFilename(recipe.input.getFilename().withExtension(recipe.to));
63
+ const temporary = final.withFilename(final.getFilename().withSuffix("-processed"));
64
+ const finalExtension = final.getFilename().getExtension();
65
+ const encoder = (finalExtension === "jpg" ? "jpeg" : finalExtension);
66
+ const quality = recipe.quality ?? ImageProcessorSharpAdapter.DEFAULT_QUALITY;
67
+ const pipeline = sharp(recipe.input.get());
68
+ const _sharp_ = __addDisposableResource(env_1, { [Symbol.dispose]: () => pipeline.destroy() }, false);
69
+ let processor = pipeline.rotate();
70
+ if (recipe.background) {
71
+ processor = processor.flatten({ background: recipe.background });
72
+ }
73
+ processor = processor.resize({
74
+ width: recipe.maxSide,
75
+ height: recipe.maxSide,
76
+ fit: "inside",
77
+ withoutEnlargement: true,
78
+ });
79
+ processor = processor.toFormat(encoder, { quality });
80
+ await processor.toFile(temporary.get());
81
+ await fs.rename(temporary.get(), final.get());
82
+ if (recipe.strategy === "in_place" && final.get() !== recipe.input.get()) {
83
+ await fs.unlink(recipe.input.get());
84
+ }
85
+ return final;
86
+ }
87
+ catch (e_1) {
88
+ env_1.error = e_1;
89
+ env_1.hasError = true;
90
+ }
91
+ finally {
92
+ __disposeResources(env_1);
93
+ }
94
+ }
95
+ }
96
+ //# sourceMappingURL=image-processor-sharp.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor-sharp.adapter.js","sourceRoot":"","sources":["../src/image-processor-sharp.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,0BAA0B;IAC7B,MAAM,CAAU,eAAe,GAAG,EAAE,CAAC;IAE7C,KAAK,CAAC,OAAO,CAAC,MAA8B;;;YAC1C,MAAM,KAAK,GACT,MAAM,CAAC,QAAQ,KAAK,aAAa;gBAC/B,CAAC,CAAC,MAAM,CAAC,MAAM;gBACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YAErF,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;YAEnF,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAA2B,CAAC;YAE/F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,0BAA0B,CAAC,eAAe,CAAC;YAE7E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM,OAAO,kCAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAA,CAAC;YAE/D,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAiB,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC3B,KAAK,EAAE,MAAM,CAAC,OAAO;gBACrB,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,GAAG,EAAE,QAAQ;gBACb,kBAAkB,EAAE,IAAI;aACzB,CAAC,CAAC;YAEH,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAErD,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAE9C,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzE,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,OAAO,KAAK,CAAC;;;;;;;;;KACd"}
@@ -0,0 +1,30 @@
1
+ import type * as tools from "@bgord/tools";
2
+ type ImageBackground = string | {
3
+ r: number;
4
+ g: number;
5
+ b: number;
6
+ alpha?: number;
7
+ };
8
+ type ImageProcessorOutputPathStrategy = {
9
+ strategy: "output_path";
10
+ input: tools.FilePathRelative | tools.FilePathAbsolute;
11
+ output: tools.FilePathRelative | tools.FilePathAbsolute;
12
+ maxSide: number;
13
+ to: tools.ExtensionType;
14
+ quality?: number;
15
+ background?: ImageBackground;
16
+ };
17
+ type ImageProcessorInPlaceStrategy = {
18
+ strategy: "in_place";
19
+ input: tools.FilePathRelative | tools.FilePathAbsolute;
20
+ maxSide: number;
21
+ to: tools.ExtensionType;
22
+ quality?: number;
23
+ background?: ImageBackground;
24
+ };
25
+ export type ImageProcessorStrategy = ImageProcessorInPlaceStrategy | ImageProcessorOutputPathStrategy;
26
+ export interface ImageProcessorPort {
27
+ process(recipe: ImageProcessorStrategy): Promise<tools.FilePathRelative | tools.FilePathAbsolute>;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=image-processor.port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor.port.d.ts","sourceRoot":"","sources":["../src/image-processor.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,KAAK,eAAe,GAAG,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF,KAAK,gCAAgC,GAAG;IACtC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,MAAM,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B,CAAC;AAEF,KAAK,6BAA6B,GAAG;IACnC,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,KAAK,CAAC,aAAa,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,6BAA6B,GAAG,gCAAgC,CAAC;AAEtG,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACnG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=image-processor.port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-processor.port.js","sourceRoot":"","sources":["../src/image-processor.port.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { ImageResizerPort, ImageResizerStrategy } from "./image-resizer.port";
2
+ export declare class ImageResizerNoopAdapter implements ImageResizerPort {
3
+ resize(recipe: ImageResizerStrategy): Promise<import("@bgord/tools").FilePathRelative | import("@bgord/tools").FilePathAbsolute>;
4
+ }
5
+ //# sourceMappingURL=image-resizer-noop.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-resizer-noop.adapter.d.ts","sourceRoot":"","sources":["../src/image-resizer-noop.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,uBAAwB,YAAW,gBAAgB;IACxD,MAAM,CAAC,MAAM,EAAE,oBAAoB;CAG1C"}
@@ -0,0 +1,6 @@
1
+ export class ImageResizerNoopAdapter {
2
+ async resize(recipe) {
3
+ return recipe.strategy === "output_path" ? recipe.output : recipe.input;
4
+ }
5
+ }
6
+ //# sourceMappingURL=image-resizer-noop.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-resizer-noop.adapter.js","sourceRoot":"","sources":["../src/image-resizer-noop.adapter.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,uBAAuB;IAClC,KAAK,CAAC,MAAM,CAAC,MAA4B;QACvC,OAAO,MAAM,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { ImageResizerPort, ImageResizerStrategy } from "./image-resizer.port";
2
+ export declare class ImageResizerSharpAdapter implements ImageResizerPort {
3
+ resize(recipe: ImageResizerStrategy): Promise<import("@bgord/tools").FilePathRelative | import("@bgord/tools").FilePathAbsolute>;
4
+ }
5
+ //# sourceMappingURL=image-resizer-sharp.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-resizer-sharp.adapter.d.ts","sourceRoot":"","sources":["../src/image-resizer-sharp.adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEnF,qBAAa,wBAAyB,YAAW,gBAAgB;IACzD,MAAM,CAAC,MAAM,EAAE,oBAAoB;CA0B1C"}
@@ -0,0 +1,88 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import fs from "node:fs/promises";
54
+ import sharp from "sharp";
55
+ export class ImageResizerSharpAdapter {
56
+ async resize(recipe) {
57
+ const env_1 = { stack: [], error: void 0, hasError: false };
58
+ try {
59
+ const final = recipe.strategy === "output_path" ? recipe.output : recipe.input;
60
+ const filename = final.getFilename();
61
+ const temporary = final.withFilename(filename.withSuffix("-resized"));
62
+ const extension = final.getFilename().getExtension();
63
+ const format = (extension === "jpg" ? "jpeg" : extension);
64
+ const pipeline = sharp(recipe.input.get());
65
+ const _sharp_ = __addDisposableResource(env_1, { [Symbol.dispose]: () => pipeline.destroy() }, false);
66
+ await pipeline
67
+ .rotate()
68
+ .resize({
69
+ width: recipe.maxSide,
70
+ height: recipe.maxSide,
71
+ fit: "inside",
72
+ withoutEnlargement: true,
73
+ })
74
+ .toFormat(format)
75
+ .toFile(temporary.get());
76
+ await fs.rename(temporary.get(), final.get());
77
+ return final;
78
+ }
79
+ catch (e_1) {
80
+ env_1.error = e_1;
81
+ env_1.hasError = true;
82
+ }
83
+ finally {
84
+ __disposeResources(env_1);
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=image-resizer-sharp.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-resizer-sharp.adapter.js","sourceRoot":"","sources":["../src/image-resizer-sharp.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,OAAO,wBAAwB;IACnC,KAAK,CAAC,MAAM,CAAC,MAA4B;;;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAA2B,CAAC;YAEpF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM,OAAO,kCAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAA,CAAC;YAE/D,MAAM,QAAQ;iBACX,MAAM,EAAE;iBACR,MAAM,CAAC;gBACN,KAAK,EAAE,MAAM,CAAC,OAAO;gBACrB,MAAM,EAAE,MAAM,CAAC,OAAO;gBACtB,GAAG,EAAE,QAAQ;gBACb,kBAAkB,EAAE,IAAI;aACzB,CAAC;iBACD,QAAQ,CAAC,MAAM,CAAC;iBAChB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAE3B,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAE9C,OAAO,KAAK,CAAC;;;;;;;;;KACd;CACF"}