@lens-image/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -0
  3. package/dist/cjs/adapters/memory.d.ts +55 -0
  4. package/dist/cjs/adapters/memory.d.ts.map +1 -0
  5. package/dist/cjs/adapters/memory.js +84 -0
  6. package/dist/cjs/adapters/memory.js.map +1 -0
  7. package/dist/cjs/browser.d.ts +46 -0
  8. package/dist/cjs/browser.d.ts.map +1 -0
  9. package/dist/cjs/browser.js +79 -0
  10. package/dist/cjs/browser.js.map +1 -0
  11. package/dist/cjs/bytes.d.ts +18 -0
  12. package/dist/cjs/bytes.d.ts.map +1 -0
  13. package/dist/cjs/bytes.js +31 -0
  14. package/dist/cjs/bytes.js.map +1 -0
  15. package/dist/cjs/cache.d.ts +43 -0
  16. package/dist/cjs/cache.d.ts.map +1 -0
  17. package/dist/cjs/cache.js +77 -0
  18. package/dist/cjs/cache.js.map +1 -0
  19. package/dist/cjs/concurrency.d.ts +35 -0
  20. package/dist/cjs/concurrency.d.ts.map +1 -0
  21. package/dist/cjs/concurrency.js +82 -0
  22. package/dist/cjs/concurrency.js.map +1 -0
  23. package/dist/cjs/engines/index.d.ts +20 -0
  24. package/dist/cjs/engines/index.d.ts.map +1 -0
  25. package/dist/cjs/engines/index.js +38 -0
  26. package/dist/cjs/engines/index.js.map +1 -0
  27. package/dist/cjs/engines/passthrough.d.ts +41 -0
  28. package/dist/cjs/engines/passthrough.d.ts.map +1 -0
  29. package/dist/cjs/engines/passthrough.js +66 -0
  30. package/dist/cjs/engines/passthrough.js.map +1 -0
  31. package/dist/cjs/engines/sharp.d.ts +58 -0
  32. package/dist/cjs/engines/sharp.d.ts.map +1 -0
  33. package/dist/cjs/engines/sharp.js +243 -0
  34. package/dist/cjs/engines/sharp.js.map +1 -0
  35. package/dist/cjs/errors.d.ts +90 -0
  36. package/dist/cjs/errors.d.ts.map +1 -0
  37. package/dist/cjs/errors.js +97 -0
  38. package/dist/cjs/errors.js.map +1 -0
  39. package/dist/cjs/format.d.ts +33 -0
  40. package/dist/cjs/format.d.ts.map +1 -0
  41. package/dist/cjs/format.js +102 -0
  42. package/dist/cjs/format.js.map +1 -0
  43. package/dist/cjs/hash.d.ts +19 -0
  44. package/dist/cjs/hash.d.ts.map +1 -0
  45. package/dist/cjs/hash.js +43 -0
  46. package/dist/cjs/hash.js.map +1 -0
  47. package/dist/cjs/index.d.ts +56 -0
  48. package/dist/cjs/index.d.ts.map +1 -0
  49. package/dist/cjs/index.js +110 -0
  50. package/dist/cjs/index.js.map +1 -0
  51. package/dist/cjs/naming.d.ts +48 -0
  52. package/dist/cjs/naming.d.ts.map +1 -0
  53. package/dist/cjs/naming.js +95 -0
  54. package/dist/cjs/naming.js.map +1 -0
  55. package/dist/cjs/optimizer.d.ts +89 -0
  56. package/dist/cjs/optimizer.d.ts.map +1 -0
  57. package/dist/cjs/optimizer.js +667 -0
  58. package/dist/cjs/optimizer.js.map +1 -0
  59. package/dist/cjs/package.json +3 -0
  60. package/dist/cjs/retry.d.ts +55 -0
  61. package/dist/cjs/retry.d.ts.map +1 -0
  62. package/dist/cjs/retry.js +129 -0
  63. package/dist/cjs/retry.js.map +1 -0
  64. package/dist/cjs/server/handler.d.ts +80 -0
  65. package/dist/cjs/server/handler.d.ts.map +1 -0
  66. package/dist/cjs/server/handler.js +155 -0
  67. package/dist/cjs/server/handler.js.map +1 -0
  68. package/dist/cjs/sniff.d.ts +37 -0
  69. package/dist/cjs/sniff.d.ts.map +1 -0
  70. package/dist/cjs/sniff.js +442 -0
  71. package/dist/cjs/sniff.js.map +1 -0
  72. package/dist/cjs/source.d.ts +45 -0
  73. package/dist/cjs/source.d.ts.map +1 -0
  74. package/dist/cjs/source.js +221 -0
  75. package/dist/cjs/source.js.map +1 -0
  76. package/dist/cjs/srcset.d.ts +66 -0
  77. package/dist/cjs/srcset.d.ts.map +1 -0
  78. package/dist/cjs/srcset.js +81 -0
  79. package/dist/cjs/srcset.js.map +1 -0
  80. package/dist/cjs/types.d.ts +441 -0
  81. package/dist/cjs/types.d.ts.map +1 -0
  82. package/dist/cjs/types.js +12 -0
  83. package/dist/cjs/types.js.map +1 -0
  84. package/dist/cjs/validation.d.ts +38 -0
  85. package/dist/cjs/validation.d.ts.map +1 -0
  86. package/dist/cjs/validation.js +79 -0
  87. package/dist/cjs/validation.js.map +1 -0
  88. package/dist/esm/adapters/memory.d.ts +55 -0
  89. package/dist/esm/adapters/memory.d.ts.map +1 -0
  90. package/dist/esm/adapters/memory.js +80 -0
  91. package/dist/esm/adapters/memory.js.map +1 -0
  92. package/dist/esm/browser.d.ts +46 -0
  93. package/dist/esm/browser.d.ts.map +1 -0
  94. package/dist/esm/browser.js +49 -0
  95. package/dist/esm/browser.js.map +1 -0
  96. package/dist/esm/bytes.d.ts +18 -0
  97. package/dist/esm/bytes.d.ts.map +1 -0
  98. package/dist/esm/bytes.js +28 -0
  99. package/dist/esm/bytes.js.map +1 -0
  100. package/dist/esm/cache.d.ts +43 -0
  101. package/dist/esm/cache.d.ts.map +1 -0
  102. package/dist/esm/cache.js +73 -0
  103. package/dist/esm/cache.js.map +1 -0
  104. package/dist/esm/concurrency.d.ts +35 -0
  105. package/dist/esm/concurrency.d.ts.map +1 -0
  106. package/dist/esm/concurrency.js +78 -0
  107. package/dist/esm/concurrency.js.map +1 -0
  108. package/dist/esm/engines/index.d.ts +20 -0
  109. package/dist/esm/engines/index.d.ts.map +1 -0
  110. package/dist/esm/engines/index.js +30 -0
  111. package/dist/esm/engines/index.js.map +1 -0
  112. package/dist/esm/engines/passthrough.d.ts +41 -0
  113. package/dist/esm/engines/passthrough.d.ts.map +1 -0
  114. package/dist/esm/engines/passthrough.js +63 -0
  115. package/dist/esm/engines/passthrough.js.map +1 -0
  116. package/dist/esm/engines/sharp.d.ts +58 -0
  117. package/dist/esm/engines/sharp.d.ts.map +1 -0
  118. package/dist/esm/engines/sharp.js +206 -0
  119. package/dist/esm/engines/sharp.js.map +1 -0
  120. package/dist/esm/errors.d.ts +90 -0
  121. package/dist/esm/errors.d.ts.map +1 -0
  122. package/dist/esm/errors.js +91 -0
  123. package/dist/esm/errors.js.map +1 -0
  124. package/dist/esm/format.d.ts +33 -0
  125. package/dist/esm/format.d.ts.map +1 -0
  126. package/dist/esm/format.js +93 -0
  127. package/dist/esm/format.js.map +1 -0
  128. package/dist/esm/hash.d.ts +19 -0
  129. package/dist/esm/hash.d.ts.map +1 -0
  130. package/dist/esm/hash.js +38 -0
  131. package/dist/esm/hash.js.map +1 -0
  132. package/dist/esm/index.d.ts +56 -0
  133. package/dist/esm/index.d.ts.map +1 -0
  134. package/dist/esm/index.js +54 -0
  135. package/dist/esm/index.js.map +1 -0
  136. package/dist/esm/naming.d.ts +48 -0
  137. package/dist/esm/naming.d.ts.map +1 -0
  138. package/dist/esm/naming.js +88 -0
  139. package/dist/esm/naming.js.map +1 -0
  140. package/dist/esm/optimizer.d.ts +89 -0
  141. package/dist/esm/optimizer.d.ts.map +1 -0
  142. package/dist/esm/optimizer.js +663 -0
  143. package/dist/esm/optimizer.js.map +1 -0
  144. package/dist/esm/package.json +3 -0
  145. package/dist/esm/retry.d.ts +55 -0
  146. package/dist/esm/retry.d.ts.map +1 -0
  147. package/dist/esm/retry.js +123 -0
  148. package/dist/esm/retry.js.map +1 -0
  149. package/dist/esm/server/handler.d.ts +80 -0
  150. package/dist/esm/server/handler.d.ts.map +1 -0
  151. package/dist/esm/server/handler.js +151 -0
  152. package/dist/esm/server/handler.js.map +1 -0
  153. package/dist/esm/sniff.d.ts +37 -0
  154. package/dist/esm/sniff.d.ts.map +1 -0
  155. package/dist/esm/sniff.js +435 -0
  156. package/dist/esm/sniff.js.map +1 -0
  157. package/dist/esm/source.d.ts +45 -0
  158. package/dist/esm/source.d.ts.map +1 -0
  159. package/dist/esm/source.js +183 -0
  160. package/dist/esm/source.js.map +1 -0
  161. package/dist/esm/srcset.d.ts +66 -0
  162. package/dist/esm/srcset.d.ts.map +1 -0
  163. package/dist/esm/srcset.js +76 -0
  164. package/dist/esm/srcset.js.map +1 -0
  165. package/dist/esm/types.d.ts +441 -0
  166. package/dist/esm/types.d.ts.map +1 -0
  167. package/dist/esm/types.js +11 -0
  168. package/dist/esm/types.js.map +1 -0
  169. package/dist/esm/validation.d.ts +38 -0
  170. package/dist/esm/validation.d.ts.map +1 -0
  171. package/dist/esm/validation.js +74 -0
  172. package/dist/esm/validation.js.map +1 -0
  173. package/package.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/hash.ts"],"names":[],"mappings":";AAAA,oFAAoF;;AAKpF,wBAEC;AASD,8BAGC;AAQD,kCAEC;AA3BD,6CAAyC;AAEzC,gDAAgD;AAChD,SAAgB,MAAM,CAAC,IAAgB;IACrC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,IAAyB,EAAE,MAAM,GAAG,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,KAAc;IACxC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;IACxF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * `@lens-image/core` - composable image optimization for Node.js.
3
+ *
4
+ * Zero runtime dependencies. The codec (sharp) and the storage backend are both
5
+ * injected interfaces, so the core is testable, swappable and installs nothing
6
+ * you did not ask for.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { ImageOptimizer } from '@lens-image/core';
11
+ * import { LocalAdapter } from '@lens-image/adapter-local';
12
+ *
13
+ * const optimizer = new ImageOptimizer({
14
+ * adapter: new LocalAdapter({ root: './public/images', baseUrl: '/images' }),
15
+ * quality: 80,
16
+ * });
17
+ *
18
+ * const result = await optimizer.optimize({
19
+ * source: './photo.jpg',
20
+ * formats: ['webp', 'jpg'],
21
+ * sizes: [{ width: 1200 }, { width: 600 }, { width: 300 }],
22
+ * });
23
+ *
24
+ * console.log(result.formats.webp.srcset);
25
+ * ```
26
+ *
27
+ * @packageDocumentation
28
+ */
29
+ export { ImageOptimizer, DEFAULT_CACHE_CONTROL } from './optimizer.js';
30
+ export { LensError, throwIfAborted, wrapError } from './errors.js';
31
+ export type { LensErrorCode, LensErrorDetails } from './errors.js';
32
+ export { createSharpEngine, createPassthroughEngine, detectEngine, resetEngineDetection, resetSharpCache, } from './engines/index.js';
33
+ export type { SharpEngineOptions, PassthroughEngineOptions } from './engines/index.js';
34
+ export { MemoryAdapter } from './adapters/memory.js';
35
+ export type { MemoryAdapterOptions, MemoryEntry } from './adapters/memory.js';
36
+ export { MemoryCacheStore, nullCacheStore } from './cache.js';
37
+ export { createUploadHandler, serializeResult } from './server/handler.js';
38
+ export type { UploadHandlerOptions } from './server/handler.js';
39
+ export { buildSrcset, toPicture, pickVariant } from './srcset.js';
40
+ export type { PictureData, PictureSource } from './srcset.js';
41
+ export { sniff, sniffFormat, mimeTypeFor, extensionFor, SNIFF_HEADER_BYTES } from './sniff.js';
42
+ export { resolveSource, stem, formatBytes } from './source.js';
43
+ export type { ResolvedSource, ResolveOptions } from './source.js';
44
+ export { normalizeFormat, normalizeFormats, supportsAlpha, isLossy, defaultQuality, defaultEffort, ENCODABLE_FORMATS, } from './format.js';
45
+ export { buildKey, joinKey, slugify, defaultLabel, DEFAULT_KEY_TEMPLATE } from './naming.js';
46
+ export { validateImage, resolveValidation, DEFAULT_MAX_BYTES, DEFAULT_MAX_PIXELS, DEFAULT_ALLOWED_FORMATS, } from './validation.js';
47
+ export type { ResolvedValidation } from './validation.js';
48
+ export { withRetry, resolveRetry, backoffDelay, isRetryableError } from './retry.js';
49
+ export type { ResolvedRetry } from './retry.js';
50
+ export { mapLimit, delay } from './concurrency.js';
51
+ export type { Settled } from './concurrency.js';
52
+ export { sha256, shortHash, hashOptions } from './hash.js';
53
+ export type { CacheStore, DetectedFormat, EncodedImage, FitMode, FormatResult, ImageEngine, ImageFormat, ImageFormatInput, ImageMetadata, ImageOptimizerOptions, ImageSource, KeyContext, LensWarning, OptimizeOptions, OptimizeResult, Position, ResizeSpec, RetryOptions, SizeSpec, StorageAdapter, StorageContext, StorageFile, StorageObject, ThumbnailSpec, TransformOp, ValidationOptions, Variant, } from './types.js';
54
+ /** The version of `@lens-image/core`, useful in `User-Agent` strings and bug reports. */
55
+ export declare const VERSION = "0.1.0";
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,oBAAoB,EACpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGvF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACrF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3D,YAAY,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,UAAU,EACV,WAAW,EACX,eAAe,EACf,cAAc,EACd,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAC;AAEpB,yFAAyF;AACzF,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ /**
3
+ * `@lens-image/core` - composable image optimization for Node.js.
4
+ *
5
+ * Zero runtime dependencies. The codec (sharp) and the storage backend are both
6
+ * injected interfaces, so the core is testable, swappable and installs nothing
7
+ * you did not ask for.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { ImageOptimizer } from '@lens-image/core';
12
+ * import { LocalAdapter } from '@lens-image/adapter-local';
13
+ *
14
+ * const optimizer = new ImageOptimizer({
15
+ * adapter: new LocalAdapter({ root: './public/images', baseUrl: '/images' }),
16
+ * quality: 80,
17
+ * });
18
+ *
19
+ * const result = await optimizer.optimize({
20
+ * source: './photo.jpg',
21
+ * formats: ['webp', 'jpg'],
22
+ * sizes: [{ width: 1200 }, { width: 600 }, { width: 300 }],
23
+ * });
24
+ *
25
+ * console.log(result.formats.webp.srcset);
26
+ * ```
27
+ *
28
+ * @packageDocumentation
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.sha256 = exports.delay = exports.mapLimit = exports.isRetryableError = exports.backoffDelay = exports.resolveRetry = exports.withRetry = exports.DEFAULT_ALLOWED_FORMATS = exports.DEFAULT_MAX_PIXELS = exports.DEFAULT_MAX_BYTES = exports.resolveValidation = exports.validateImage = exports.DEFAULT_KEY_TEMPLATE = exports.defaultLabel = exports.slugify = exports.joinKey = exports.buildKey = exports.ENCODABLE_FORMATS = exports.defaultEffort = exports.defaultQuality = exports.isLossy = exports.supportsAlpha = exports.normalizeFormats = exports.normalizeFormat = exports.formatBytes = exports.stem = exports.resolveSource = exports.SNIFF_HEADER_BYTES = exports.extensionFor = exports.mimeTypeFor = exports.sniffFormat = exports.sniff = exports.pickVariant = exports.toPicture = exports.buildSrcset = exports.serializeResult = exports.createUploadHandler = exports.nullCacheStore = exports.MemoryCacheStore = exports.MemoryAdapter = exports.resetSharpCache = exports.resetEngineDetection = exports.detectEngine = exports.createPassthroughEngine = exports.createSharpEngine = exports.wrapError = exports.throwIfAborted = exports.LensError = exports.DEFAULT_CACHE_CONTROL = exports.ImageOptimizer = void 0;
32
+ exports.VERSION = exports.hashOptions = exports.shortHash = void 0;
33
+ // --- The main entry point ---------------------------------------------------
34
+ var optimizer_js_1 = require("./optimizer.js");
35
+ Object.defineProperty(exports, "ImageOptimizer", { enumerable: true, get: function () { return optimizer_js_1.ImageOptimizer; } });
36
+ Object.defineProperty(exports, "DEFAULT_CACHE_CONTROL", { enumerable: true, get: function () { return optimizer_js_1.DEFAULT_CACHE_CONTROL; } });
37
+ // --- Errors -----------------------------------------------------------------
38
+ var errors_js_1 = require("./errors.js");
39
+ Object.defineProperty(exports, "LensError", { enumerable: true, get: function () { return errors_js_1.LensError; } });
40
+ Object.defineProperty(exports, "throwIfAborted", { enumerable: true, get: function () { return errors_js_1.throwIfAborted; } });
41
+ Object.defineProperty(exports, "wrapError", { enumerable: true, get: function () { return errors_js_1.wrapError; } });
42
+ // --- Engines ----------------------------------------------------------------
43
+ var index_js_1 = require("./engines/index.js");
44
+ Object.defineProperty(exports, "createSharpEngine", { enumerable: true, get: function () { return index_js_1.createSharpEngine; } });
45
+ Object.defineProperty(exports, "createPassthroughEngine", { enumerable: true, get: function () { return index_js_1.createPassthroughEngine; } });
46
+ Object.defineProperty(exports, "detectEngine", { enumerable: true, get: function () { return index_js_1.detectEngine; } });
47
+ Object.defineProperty(exports, "resetEngineDetection", { enumerable: true, get: function () { return index_js_1.resetEngineDetection; } });
48
+ Object.defineProperty(exports, "resetSharpCache", { enumerable: true, get: function () { return index_js_1.resetSharpCache; } });
49
+ // --- Built-in adapters ------------------------------------------------------
50
+ var memory_js_1 = require("./adapters/memory.js");
51
+ Object.defineProperty(exports, "MemoryAdapter", { enumerable: true, get: function () { return memory_js_1.MemoryAdapter; } });
52
+ // --- Caching ----------------------------------------------------------------
53
+ var cache_js_1 = require("./cache.js");
54
+ Object.defineProperty(exports, "MemoryCacheStore", { enumerable: true, get: function () { return cache_js_1.MemoryCacheStore; } });
55
+ Object.defineProperty(exports, "nullCacheStore", { enumerable: true, get: function () { return cache_js_1.nullCacheStore; } });
56
+ // --- Server helpers ---------------------------------------------------------
57
+ var handler_js_1 = require("./server/handler.js");
58
+ Object.defineProperty(exports, "createUploadHandler", { enumerable: true, get: function () { return handler_js_1.createUploadHandler; } });
59
+ Object.defineProperty(exports, "serializeResult", { enumerable: true, get: function () { return handler_js_1.serializeResult; } });
60
+ // --- HTML helpers -----------------------------------------------------------
61
+ var srcset_js_1 = require("./srcset.js");
62
+ Object.defineProperty(exports, "buildSrcset", { enumerable: true, get: function () { return srcset_js_1.buildSrcset; } });
63
+ Object.defineProperty(exports, "toPicture", { enumerable: true, get: function () { return srcset_js_1.toPicture; } });
64
+ Object.defineProperty(exports, "pickVariant", { enumerable: true, get: function () { return srcset_js_1.pickVariant; } });
65
+ // --- Utilities, exported because adapter authors need them ------------------
66
+ var sniff_js_1 = require("./sniff.js");
67
+ Object.defineProperty(exports, "sniff", { enumerable: true, get: function () { return sniff_js_1.sniff; } });
68
+ Object.defineProperty(exports, "sniffFormat", { enumerable: true, get: function () { return sniff_js_1.sniffFormat; } });
69
+ Object.defineProperty(exports, "mimeTypeFor", { enumerable: true, get: function () { return sniff_js_1.mimeTypeFor; } });
70
+ Object.defineProperty(exports, "extensionFor", { enumerable: true, get: function () { return sniff_js_1.extensionFor; } });
71
+ Object.defineProperty(exports, "SNIFF_HEADER_BYTES", { enumerable: true, get: function () { return sniff_js_1.SNIFF_HEADER_BYTES; } });
72
+ var source_js_1 = require("./source.js");
73
+ Object.defineProperty(exports, "resolveSource", { enumerable: true, get: function () { return source_js_1.resolveSource; } });
74
+ Object.defineProperty(exports, "stem", { enumerable: true, get: function () { return source_js_1.stem; } });
75
+ Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return source_js_1.formatBytes; } });
76
+ var format_js_1 = require("./format.js");
77
+ Object.defineProperty(exports, "normalizeFormat", { enumerable: true, get: function () { return format_js_1.normalizeFormat; } });
78
+ Object.defineProperty(exports, "normalizeFormats", { enumerable: true, get: function () { return format_js_1.normalizeFormats; } });
79
+ Object.defineProperty(exports, "supportsAlpha", { enumerable: true, get: function () { return format_js_1.supportsAlpha; } });
80
+ Object.defineProperty(exports, "isLossy", { enumerable: true, get: function () { return format_js_1.isLossy; } });
81
+ Object.defineProperty(exports, "defaultQuality", { enumerable: true, get: function () { return format_js_1.defaultQuality; } });
82
+ Object.defineProperty(exports, "defaultEffort", { enumerable: true, get: function () { return format_js_1.defaultEffort; } });
83
+ Object.defineProperty(exports, "ENCODABLE_FORMATS", { enumerable: true, get: function () { return format_js_1.ENCODABLE_FORMATS; } });
84
+ var naming_js_1 = require("./naming.js");
85
+ Object.defineProperty(exports, "buildKey", { enumerable: true, get: function () { return naming_js_1.buildKey; } });
86
+ Object.defineProperty(exports, "joinKey", { enumerable: true, get: function () { return naming_js_1.joinKey; } });
87
+ Object.defineProperty(exports, "slugify", { enumerable: true, get: function () { return naming_js_1.slugify; } });
88
+ Object.defineProperty(exports, "defaultLabel", { enumerable: true, get: function () { return naming_js_1.defaultLabel; } });
89
+ Object.defineProperty(exports, "DEFAULT_KEY_TEMPLATE", { enumerable: true, get: function () { return naming_js_1.DEFAULT_KEY_TEMPLATE; } });
90
+ var validation_js_1 = require("./validation.js");
91
+ Object.defineProperty(exports, "validateImage", { enumerable: true, get: function () { return validation_js_1.validateImage; } });
92
+ Object.defineProperty(exports, "resolveValidation", { enumerable: true, get: function () { return validation_js_1.resolveValidation; } });
93
+ Object.defineProperty(exports, "DEFAULT_MAX_BYTES", { enumerable: true, get: function () { return validation_js_1.DEFAULT_MAX_BYTES; } });
94
+ Object.defineProperty(exports, "DEFAULT_MAX_PIXELS", { enumerable: true, get: function () { return validation_js_1.DEFAULT_MAX_PIXELS; } });
95
+ Object.defineProperty(exports, "DEFAULT_ALLOWED_FORMATS", { enumerable: true, get: function () { return validation_js_1.DEFAULT_ALLOWED_FORMATS; } });
96
+ var retry_js_1 = require("./retry.js");
97
+ Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_js_1.withRetry; } });
98
+ Object.defineProperty(exports, "resolveRetry", { enumerable: true, get: function () { return retry_js_1.resolveRetry; } });
99
+ Object.defineProperty(exports, "backoffDelay", { enumerable: true, get: function () { return retry_js_1.backoffDelay; } });
100
+ Object.defineProperty(exports, "isRetryableError", { enumerable: true, get: function () { return retry_js_1.isRetryableError; } });
101
+ var concurrency_js_1 = require("./concurrency.js");
102
+ Object.defineProperty(exports, "mapLimit", { enumerable: true, get: function () { return concurrency_js_1.mapLimit; } });
103
+ Object.defineProperty(exports, "delay", { enumerable: true, get: function () { return concurrency_js_1.delay; } });
104
+ var hash_js_1 = require("./hash.js");
105
+ Object.defineProperty(exports, "sha256", { enumerable: true, get: function () { return hash_js_1.sha256; } });
106
+ Object.defineProperty(exports, "shortHash", { enumerable: true, get: function () { return hash_js_1.shortHash; } });
107
+ Object.defineProperty(exports, "hashOptions", { enumerable: true, get: function () { return hash_js_1.hashOptions; } });
108
+ /** The version of `@lens-image/core`, useful in `User-Agent` strings and bug reports. */
109
+ exports.VERSION = '0.1.0';
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;;AAEH,+EAA+E;AAC/E,+CAAuE;AAA9D,8GAAA,cAAc,OAAA;AAAE,qHAAA,qBAAqB,OAAA;AAE9C,+EAA+E;AAC/E,yCAAmE;AAA1D,sGAAA,SAAS,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,sGAAA,SAAS,OAAA;AAG7C,+EAA+E;AAC/E,+CAM4B;AAL1B,6GAAA,iBAAiB,OAAA;AACjB,mHAAA,uBAAuB,OAAA;AACvB,wGAAA,YAAY,OAAA;AACZ,gHAAA,oBAAoB,OAAA;AACpB,2GAAA,eAAe,OAAA;AAIjB,+EAA+E;AAC/E,kDAAqD;AAA5C,0GAAA,aAAa,OAAA;AAGtB,+EAA+E;AAC/E,uCAA8D;AAArD,4GAAA,gBAAgB,OAAA;AAAE,0GAAA,cAAc,OAAA;AAEzC,+EAA+E;AAC/E,kDAA2E;AAAlE,iHAAA,mBAAmB,OAAA;AAAE,6GAAA,eAAe,OAAA;AAG7C,+EAA+E;AAC/E,yCAAkE;AAAzD,wGAAA,WAAW,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,wGAAA,WAAW,OAAA;AAG5C,+EAA+E;AAC/E,uCAA+F;AAAtF,iGAAA,KAAK,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,8GAAA,kBAAkB,OAAA;AAC1E,yCAA+D;AAAtD,0GAAA,aAAa,OAAA;AAAE,iGAAA,IAAI,OAAA;AAAE,wGAAA,WAAW,OAAA;AAEzC,yCAQqB;AAPnB,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,0GAAA,aAAa,OAAA;AACb,oGAAA,OAAO,OAAA;AACP,2GAAA,cAAc,OAAA;AACd,0GAAA,aAAa,OAAA;AACb,8GAAA,iBAAiB,OAAA;AAEnB,yCAA6F;AAApF,qGAAA,QAAQ,OAAA;AAAE,oGAAA,OAAO,OAAA;AAAE,oGAAA,OAAO,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AACvE,iDAMyB;AALvB,8GAAA,aAAa,OAAA;AACb,kHAAA,iBAAiB,OAAA;AACjB,kHAAA,iBAAiB,OAAA;AACjB,mHAAA,kBAAkB,OAAA;AAClB,wHAAA,uBAAuB,OAAA;AAGzB,uCAAqF;AAA5E,qGAAA,SAAS,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAEhE,mDAAmD;AAA1C,0GAAA,QAAQ,OAAA;AAAE,uGAAA,KAAK,OAAA;AAExB,qCAA2D;AAAlD,iGAAA,MAAM,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,sGAAA,WAAW,OAAA;AAiCvC,yFAAyF;AAC5E,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Output key templating.
3
+ *
4
+ * Keys are how everything downstream addresses a variant - the S3 object key,
5
+ * the path under a local root, the public URL. They must be deterministic
6
+ * (so caching works), URL-safe (so nobody has to think about encoding), and
7
+ * predictable enough that a developer can eyeball a bucket listing.
8
+ */
9
+ import type { KeyContext } from './types.js';
10
+ /** `{hash}/{name}-{label}.{ext}` - content-addressed and cacheable forever. */
11
+ export declare const DEFAULT_KEY_TEMPLATE = "{hash}/{name}-{label}.{ext}";
12
+ /**
13
+ * Makes a string safe for a URL path segment.
14
+ *
15
+ * Lowercases, strips diacritics, collapses anything non-alphanumeric to a
16
+ * single dash. Empty input becomes `'image'` so a key is never malformed.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * slugify('Café Photo (2).JPG'); // 'cafe-photo-2-jpg'
21
+ * ```
22
+ */
23
+ export declare function slugify(input: string): string;
24
+ /**
25
+ * Renders a key template, or calls a key function.
26
+ *
27
+ * Tokens: `{name} {hash} {fullHash} {format} {ext} {width} {height}
28
+ * {quality} {label}`.
29
+ *
30
+ * @throws {LensError} `INVALID_OPTIONS` when the template references an unknown
31
+ * token, or a key function returns something unusable. Failing loudly here
32
+ * beats silently uploading a file called `undefined.webp`.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * buildKey('{name}/{width}x{height}.{ext}', ctx); // 'hero/1200x800.webp'
37
+ * buildKey((c) => `${c.format}/${c.hash}.${c.ext}`, ctx);
38
+ * ```
39
+ */
40
+ export declare function buildKey(template: string | ((ctx: KeyContext) => string), ctx: KeyContext, prefix?: string): string;
41
+ /** Joins a prefix and a key, normalising slashes and stripping `..` segments. */
42
+ export declare function joinKey(prefix: string, key: string): string;
43
+ /**
44
+ * Default label for a size spec: `1200w`, `800h`, or `1200x800` when both
45
+ * dimensions are pinned.
46
+ */
47
+ export declare function defaultLabel(width?: number, height?: number): string;
48
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAIlE;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS7C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,CAAC,EAChD,GAAG,EAAE,UAAU,EACf,MAAM,SAAK,GACV,MAAM,CAWR;AAeD,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpE"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Output key templating.
4
+ *
5
+ * Keys are how everything downstream addresses a variant - the S3 object key,
6
+ * the path under a local root, the public URL. They must be deterministic
7
+ * (so caching works), URL-safe (so nobody has to think about encoding), and
8
+ * predictable enough that a developer can eyeball a bucket listing.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DEFAULT_KEY_TEMPLATE = void 0;
12
+ exports.slugify = slugify;
13
+ exports.buildKey = buildKey;
14
+ exports.joinKey = joinKey;
15
+ exports.defaultLabel = defaultLabel;
16
+ const errors_js_1 = require("./errors.js");
17
+ /** `{hash}/{name}-{label}.{ext}` - content-addressed and cacheable forever. */
18
+ exports.DEFAULT_KEY_TEMPLATE = '{hash}/{name}-{label}.{ext}';
19
+ const TOKEN = /\{(\w+)\}/g;
20
+ /**
21
+ * Makes a string safe for a URL path segment.
22
+ *
23
+ * Lowercases, strips diacritics, collapses anything non-alphanumeric to a
24
+ * single dash. Empty input becomes `'image'` so a key is never malformed.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * slugify('Café Photo (2).JPG'); // 'cafe-photo-2-jpg'
29
+ * ```
30
+ */
31
+ function slugify(input) {
32
+ const slug = input
33
+ .normalize('NFKD')
34
+ .replace(/[̀-ͯ]/g, '')
35
+ .toLowerCase()
36
+ .replace(/[^a-z0-9]+/g, '-')
37
+ .replace(/^-+|-+$/g, '')
38
+ .slice(0, 100);
39
+ return slug.length > 0 ? slug : 'image';
40
+ }
41
+ /**
42
+ * Renders a key template, or calls a key function.
43
+ *
44
+ * Tokens: `{name} {hash} {fullHash} {format} {ext} {width} {height}
45
+ * {quality} {label}`.
46
+ *
47
+ * @throws {LensError} `INVALID_OPTIONS` when the template references an unknown
48
+ * token, or a key function returns something unusable. Failing loudly here
49
+ * beats silently uploading a file called `undefined.webp`.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * buildKey('{name}/{width}x{height}.{ext}', ctx); // 'hero/1200x800.webp'
54
+ * buildKey((c) => `${c.format}/${c.hash}.${c.ext}`, ctx);
55
+ * ```
56
+ */
57
+ function buildKey(template, ctx, prefix = '') {
58
+ const raw = typeof template === 'function' ? template(ctx) : renderTemplate(template, ctx);
59
+ if (typeof raw !== 'string' || raw.trim().length === 0) {
60
+ throw new errors_js_1.LensError('INVALID_OPTIONS', 'The key function must return a non-empty string. ' +
61
+ `Received ${raw === undefined ? 'undefined' : JSON.stringify(raw)}.`);
62
+ }
63
+ return joinKey(prefix, raw);
64
+ }
65
+ function renderTemplate(template, ctx) {
66
+ return template.replace(TOKEN, (_match, token) => {
67
+ if (!(token in ctx)) {
68
+ throw new errors_js_1.LensError('INVALID_OPTIONS', `Unknown token "{${token}}" in key template "${template}". ` +
69
+ `Available: ${Object.keys(ctx).map((k) => `{${k}}`).join(' ')}.`);
70
+ }
71
+ return String(ctx[token]);
72
+ });
73
+ }
74
+ /** Joins a prefix and a key, normalising slashes and stripping `..` segments. */
75
+ function joinKey(prefix, key) {
76
+ const parts = `${prefix}/${key}`
77
+ .split('/')
78
+ .map((segment) => segment.trim())
79
+ .filter((segment) => segment.length > 0 && segment !== '.' && segment !== '..');
80
+ return parts.join('/');
81
+ }
82
+ /**
83
+ * Default label for a size spec: `1200w`, `800h`, or `1200x800` when both
84
+ * dimensions are pinned.
85
+ */
86
+ function defaultLabel(width, height) {
87
+ if (width && height)
88
+ return `${width}x${height}`;
89
+ if (width)
90
+ return `${width}w`;
91
+ if (height)
92
+ return `${height}h`;
93
+ return 'original';
94
+ }
95
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * The orchestrator: validate, plan, encode, upload, assemble.
3
+ *
4
+ * Deliberately the only stateful class in the library. Everything it calls -
5
+ * sniffing, validation, key building, retry, the engine, the adapter - is a
6
+ * pure function or an injected interface, which is what makes the whole thing
7
+ * testable without a codec or a network.
8
+ */
9
+ import type { ImageEngine, ImageMetadata, ImageOptimizerOptions, OptimizeOptions, OptimizeResult, StorageAdapter } from './types.js';
10
+ /** `public, max-age=31536000, immutable` - safe because keys are content-addressed. */
11
+ export declare const DEFAULT_CACHE_CONTROL = "public, max-age=31536000, immutable";
12
+ /**
13
+ * Optimizes images and hands them to a storage backend.
14
+ *
15
+ * Construct one per configuration and reuse it - it memoises engine detection
16
+ * and owns the result cache, so a fresh instance per request throws both away.
17
+ *
18
+ * @example Upload responsive WebP + JPEG to S3
19
+ * ```ts
20
+ * import { ImageOptimizer } from '@lens-image/core';
21
+ * import { S3Adapter } from '@lens-image/adapter-s3';
22
+ *
23
+ * const optimizer = new ImageOptimizer({
24
+ * adapter: new S3Adapter({ bucket: 'my-images', region: 'us-east-1' }),
25
+ * quality: 80,
26
+ * });
27
+ *
28
+ * const result = await optimizer.optimize({
29
+ * source: '/path/to/image.jpg',
30
+ * formats: ['webp', 'jpg'],
31
+ * sizes: [{ width: 1200 }, { width: 600 }, { width: 300 }],
32
+ * });
33
+ *
34
+ * result.formats.webp.urls['600w']; // 'https://my-images.s3.amazonaws.com/…-600w.webp'
35
+ * result.formats.webp.srcset; // ready for <source srcset={…}>
36
+ * ```
37
+ *
38
+ * @example Process without storing
39
+ * ```ts
40
+ * const optimizer = new ImageOptimizer(); // no adapter
41
+ * const { variants } = await optimizer.optimize({ source: bytes, formats: ['webp'] });
42
+ * await writeFile('out.webp', variants[0].data!); // bytes come back on the variant
43
+ * ```
44
+ */
45
+ export declare class ImageOptimizer {
46
+ #private;
47
+ constructor(options?: ImageOptimizerOptions);
48
+ /** The storage backend, or `null` in process-only mode. */
49
+ get adapter(): StorageAdapter | null;
50
+ /** Resolves the codec backend, running detection on first use. */
51
+ engine(): Promise<ImageEngine>;
52
+ /**
53
+ * Processes one image into every requested format and size.
54
+ *
55
+ * Formats are independent: if AVIF encoding fails, the WebP and JPEG outputs
56
+ * still resolve and the failure is reported on `result.warnings` rather than
57
+ * thrown. Only a total failure - nothing at all was produced - rejects.
58
+ *
59
+ * @throws {LensError} `VALIDATION_FAILED`, `UNSUPPORTED_INPUT`,
60
+ * `ALL_FORMATS_FAILED`, `UPLOAD_FAILED`, `ABORTED`.
61
+ */
62
+ optimize(options: OptimizeOptions): Promise<OptimizeResult>;
63
+ /**
64
+ * Optimizes several images with the same options.
65
+ *
66
+ * Runs sequentially by design. Each `optimize` call already parallelises its
67
+ * own variants, so overlapping whole images multiplies peak memory by the
68
+ * number of images - and decoded bitmaps, not encoded files, are what fills
69
+ * the heap. Wrap in your own queue if you have the headroom.
70
+ */
71
+ optimizeMany(sources: readonly OptimizeOptions['source'][], options?: Omit<OptimizeOptions, 'source'>): Promise<OptimizeResult[]>;
72
+ /**
73
+ * Reads an image's metadata without producing anything.
74
+ *
75
+ * Uses the engine when one is available and falls back to header sniffing,
76
+ * so it works with or without sharp installed.
77
+ */
78
+ inspect(source: OptimizeOptions['source']): Promise<ImageMetadata>;
79
+ /**
80
+ * Deletes every variant of a previous result from storage.
81
+ *
82
+ * @throws {LensError} `ADAPTER_REQUIRED` with no adapter configured,
83
+ * `ADAPTER_UNSUPPORTED` when the adapter cannot delete.
84
+ */
85
+ delete(result: OptimizeResult): Promise<void>;
86
+ /** Releases adapter resources. Safe to call more than once. */
87
+ dispose(): Promise<void>;
88
+ }
89
+ //# sourceMappingURL=optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../src/optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAGV,WAAW,EAEX,aAAa,EACb,qBAAqB,EAGrB,eAAe,EACf,cAAc,EAGd,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,wCAAwC,CAAC;AAW3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,cAAc;;gBAMb,OAAO,GAAE,qBAA0B;IAkB/C,2DAA2D;IAC3D,IAAI,OAAO,IAAI,cAAc,GAAG,IAAI,CAEnC;IAED,kEAAkE;IAC5D,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC;IAKpC;;;;;;;;;OASG;IACG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAmJjE;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,SAAS,eAAe,CAAC,QAAQ,CAAC,EAAE,EAC7C,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAM,GAC5C,OAAO,CAAC,cAAc,EAAE,CAAC;IAQ5B;;;;;OAKG;IACG,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAOxE;;;;;OAKG;IACG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD,+DAA+D;IACzD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAqa/B"}