@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,435 @@
1
+ /**
2
+ * Container sniffing: format and dimensions straight from the file header.
3
+ *
4
+ * This is deliberately dependency-free and decode-free. It exists so Lens can
5
+ * reject a 40,000 x 40,000 PNG *before* handing 1.6 gigapixels to a codec -
6
+ * the classic decompression-bomb footgun. It also means validation works
7
+ * identically whether or not sharp is installed.
8
+ *
9
+ * Supported: JPEG, PNG, GIF, WebP, AVIF/HEIC, TIFF, BMP, ICO, SVG.
10
+ */
11
+ /** Bytes we need before a decision can be made for any supported format. */
12
+ export const SNIFF_HEADER_BYTES = 4096;
13
+ const ascii = (bytes, start, length) => {
14
+ let out = '';
15
+ for (let i = start; i < start + length && i < bytes.length; i++) {
16
+ out += String.fromCharCode(bytes[i]);
17
+ }
18
+ return out;
19
+ };
20
+ const u16be = (b, i) => (b[i] << 8) | b[i + 1];
21
+ const u16le = (b, i) => b[i] | (b[i + 1] << 8);
22
+ const u32be = (b, i) => ((b[i] << 24) >>> 0) +
23
+ ((b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3]);
24
+ const u32le = (b, i) => (b[i] |
25
+ (b[i + 1] << 8) |
26
+ (b[i + 2] << 16) |
27
+ (b[i + 3] << 24)) >>>
28
+ 0;
29
+ const u24le = (b, i) => b[i] | (b[i + 1] << 8) | (b[i + 2] << 16);
30
+ const startsWith = (b, sig, offset = 0) => {
31
+ if (b.length < offset + sig.length)
32
+ return false;
33
+ for (let i = 0; i < sig.length; i++)
34
+ if (b[offset + i] !== sig[i])
35
+ return false;
36
+ return true;
37
+ };
38
+ /**
39
+ * Identifies an image and reads its intrinsic size from the header alone.
40
+ *
41
+ * Never throws: an unrecognised buffer comes back as
42
+ * `{ format: 'unknown', width: 0, height: 0 }` and the caller decides whether
43
+ * that is fatal.
44
+ *
45
+ * @param bytes - The full file, or at least the first {@link SNIFF_HEADER_BYTES}.
46
+ * @param totalSize - Real byte length, when `bytes` is only a prefix.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * const meta = sniff(await readFile('photo.jpg'));
51
+ * // { format: 'jpeg', width: 4032, height: 3024, size: 2118431, orientation: 6 }
52
+ * ```
53
+ */
54
+ export function sniff(bytes, totalSize = bytes.byteLength) {
55
+ const base = { size: totalSize };
56
+ if (isPng(bytes))
57
+ return { ...base, ...readPng(bytes) };
58
+ if (isJpeg(bytes))
59
+ return { ...base, ...readJpeg(bytes) };
60
+ if (isGif(bytes))
61
+ return { ...base, ...readGif(bytes) };
62
+ if (isWebp(bytes))
63
+ return { ...base, ...readWebp(bytes) };
64
+ if (isIsoBmff(bytes))
65
+ return { ...base, ...readIsoBmff(bytes) };
66
+ if (isTiff(bytes))
67
+ return { ...base, ...readTiff(bytes) };
68
+ if (isBmp(bytes))
69
+ return { ...base, ...readBmp(bytes) };
70
+ if (isIco(bytes))
71
+ return { ...base, ...readIco(bytes) };
72
+ if (isSvg(bytes))
73
+ return { ...base, ...readSvg(bytes) };
74
+ return { ...base, format: 'unknown', width: 0, height: 0 };
75
+ }
76
+ /** Just the format, when dimensions are not needed. */
77
+ export function sniffFormat(bytes) {
78
+ return sniff(bytes, bytes.byteLength).format;
79
+ }
80
+ /** Canonical MIME type for a detected format. */
81
+ export function mimeTypeFor(format) {
82
+ switch (format) {
83
+ case 'jpeg':
84
+ return 'image/jpeg';
85
+ case 'png':
86
+ return 'image/png';
87
+ case 'webp':
88
+ return 'image/webp';
89
+ case 'avif':
90
+ return 'image/avif';
91
+ case 'gif':
92
+ return 'image/gif';
93
+ case 'tiff':
94
+ return 'image/tiff';
95
+ case 'svg':
96
+ return 'image/svg+xml';
97
+ case 'bmp':
98
+ return 'image/bmp';
99
+ case 'ico':
100
+ return 'image/x-icon';
101
+ case 'heic':
102
+ return 'image/heic';
103
+ default:
104
+ return 'application/octet-stream';
105
+ }
106
+ }
107
+ /** File extension (no dot) for a format. `jpeg` becomes `jpg`, as it should. */
108
+ export function extensionFor(format) {
109
+ switch (format) {
110
+ case 'jpeg':
111
+ return 'jpg';
112
+ case 'tiff':
113
+ return 'tif';
114
+ case 'ico':
115
+ return 'ico';
116
+ default:
117
+ return format;
118
+ }
119
+ }
120
+ // ---------------------------------------------------------------------------
121
+ // PNG
122
+ // ---------------------------------------------------------------------------
123
+ const PNG_SIG = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
124
+ const isPng = (b) => startsWith(b, PNG_SIG);
125
+ function readPng(b) {
126
+ // IHDR is mandated to be the first chunk: 8 sig + 4 length + 4 type.
127
+ const width = b.length >= 24 ? u32be(b, 16) : 0;
128
+ const height = b.length >= 24 ? u32be(b, 20) : 0;
129
+ const colorType = b[25];
130
+ // Colour types 4 (grey+alpha) and 6 (truecolour+alpha) carry an alpha channel;
131
+ // type 3 (palette) can too, via a tRNS chunk.
132
+ const hasAlpha = colorType === 4 || colorType === 6 || hasChunk(b, 'tRNS');
133
+ // "acTL" before the first IDAT means APNG.
134
+ const isAnimated = hasChunk(b, 'acTL');
135
+ return { format: 'png', width, height, hasAlpha, isAnimated };
136
+ }
137
+ function hasChunk(b, type) {
138
+ let offset = 8;
139
+ while (offset + 8 <= b.length) {
140
+ const length = u32be(b, offset);
141
+ const name = ascii(b, offset + 4, 4);
142
+ if (name === type)
143
+ return true;
144
+ if (name === 'IDAT' || name === 'IEND')
145
+ return false;
146
+ // Guard against a corrupt length walking us off the end or backwards.
147
+ if (length > b.length)
148
+ return false;
149
+ offset += 12 + length;
150
+ }
151
+ return false;
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // JPEG
155
+ // ---------------------------------------------------------------------------
156
+ const isJpeg = (b) => startsWith(b, [0xff, 0xd8, 0xff]);
157
+ /** Start-of-frame markers that carry dimensions. Excludes DHT/DAC/RST/SOS. */
158
+ const SOF_MARKERS = new Set([
159
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc5, 0xc6, 0xc7, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf,
160
+ ]);
161
+ function readJpeg(b) {
162
+ let offset = 2;
163
+ let orientation;
164
+ let width = 0;
165
+ let height = 0;
166
+ let progressive = false;
167
+ while (offset + 4 <= b.length) {
168
+ if (b[offset] !== 0xff) {
169
+ offset++; // Resynchronise across padding bytes.
170
+ continue;
171
+ }
172
+ const marker = b[offset + 1];
173
+ // Standalone markers carry no length payload.
174
+ if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {
175
+ offset += 2;
176
+ continue;
177
+ }
178
+ if (marker === 0xd9 || marker === 0xda)
179
+ break; // EOI or start of scan.
180
+ const length = u16be(b, offset + 2);
181
+ if (length < 2)
182
+ break;
183
+ if (SOF_MARKERS.has(marker) && offset + 9 <= b.length) {
184
+ height = u16be(b, offset + 5);
185
+ width = u16be(b, offset + 7);
186
+ progressive = marker === 0xc2 || marker === 0xc6 || marker === 0xca;
187
+ if (orientation !== undefined)
188
+ break;
189
+ }
190
+ else if (marker === 0xe1 && ascii(b, offset + 4, 4) === 'Exif') {
191
+ orientation = readExifOrientation(b, offset + 10, length - 8);
192
+ if (width !== 0)
193
+ break;
194
+ }
195
+ offset += 2 + length;
196
+ }
197
+ return {
198
+ format: 'jpeg',
199
+ width,
200
+ height,
201
+ hasAlpha: false,
202
+ isAnimated: false,
203
+ ...(orientation !== undefined ? { orientation } : {}),
204
+ ...(progressive ? { space: 'progressive' } : {}),
205
+ };
206
+ }
207
+ /**
208
+ * Pulls tag 0x0112 (Orientation) out of an EXIF TIFF header.
209
+ * Returns undefined rather than throwing on anything malformed.
210
+ */
211
+ function readExifOrientation(b, start, length) {
212
+ if (start + 8 > b.length)
213
+ return undefined;
214
+ const byteOrder = ascii(b, start, 2);
215
+ const little = byteOrder === 'II';
216
+ if (!little && byteOrder !== 'MM')
217
+ return undefined;
218
+ const u16 = (i) => (little ? u16le(b, i) : u16be(b, i));
219
+ const u32 = (i) => (little ? u32le(b, i) : u32be(b, i));
220
+ const ifdOffset = u32(start + 4);
221
+ const ifd = start + ifdOffset;
222
+ if (ifd + 2 > b.length || ifdOffset > length)
223
+ return undefined;
224
+ const entries = u16(ifd);
225
+ for (let i = 0; i < entries; i++) {
226
+ const entry = ifd + 2 + i * 12;
227
+ if (entry + 12 > b.length)
228
+ return undefined;
229
+ if (u16(entry) === 0x0112) {
230
+ const value = u16(entry + 8);
231
+ return value >= 1 && value <= 8 ? value : undefined;
232
+ }
233
+ }
234
+ return undefined;
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // GIF
238
+ // ---------------------------------------------------------------------------
239
+ const isGif = (b) => ascii(b, 0, 6) === 'GIF87a' || ascii(b, 0, 6) === 'GIF89a';
240
+ function readGif(b) {
241
+ return {
242
+ format: 'gif',
243
+ width: b.length >= 10 ? u16le(b, 6) : 0,
244
+ height: b.length >= 10 ? u16le(b, 8) : 0,
245
+ hasAlpha: true,
246
+ // More than one Graphic Control Extension means more than one frame. A
247
+ // single-frame GIF with a GCE exists, so this counts occurrences.
248
+ isAnimated: countGifFrames(b) > 1,
249
+ };
250
+ }
251
+ function countGifFrames(b) {
252
+ let count = 0;
253
+ for (let i = 0; i + 2 < b.length && count < 2; i++) {
254
+ if (b[i] === 0x00 && b[i + 1] === 0x21 && b[i + 2] === 0xf9)
255
+ count++;
256
+ }
257
+ return count;
258
+ }
259
+ // ---------------------------------------------------------------------------
260
+ // WebP
261
+ // ---------------------------------------------------------------------------
262
+ const isWebp = (b) => ascii(b, 0, 4) === 'RIFF' && ascii(b, 8, 4) === 'WEBP';
263
+ function readWebp(b) {
264
+ const chunk = ascii(b, 12, 4);
265
+ const base = { format: 'webp', hasAlpha: false, isAnimated: false };
266
+ if (chunk === 'VP8X' && b.length >= 30) {
267
+ const flags = b[20];
268
+ return {
269
+ ...base,
270
+ // VP8X stores canvas dimensions minus one, as 24-bit little-endian.
271
+ width: u24le(b, 24) + 1,
272
+ height: u24le(b, 27) + 1,
273
+ hasAlpha: (flags & 0x10) !== 0,
274
+ isAnimated: (flags & 0x02) !== 0,
275
+ };
276
+ }
277
+ if (chunk === 'VP8 ' && b.length >= 30) {
278
+ // Lossy: 3-byte frame tag, then the 0x9d012a start code.
279
+ if (b[23] === 0x9d && b[24] === 0x01 && b[25] === 0x2a) {
280
+ return { ...base, width: u16le(b, 26) & 0x3fff, height: u16le(b, 28) & 0x3fff };
281
+ }
282
+ }
283
+ if (chunk === 'VP8L' && b.length >= 25 && b[20] === 0x2f) {
284
+ // Lossless: 14 bits width-1 then 14 bits height-1, packed little-endian.
285
+ const bits = u32le(b, 21);
286
+ return {
287
+ ...base,
288
+ width: (bits & 0x3fff) + 1,
289
+ height: ((bits >> 14) & 0x3fff) + 1,
290
+ hasAlpha: ((bits >> 28) & 0x01) !== 0,
291
+ };
292
+ }
293
+ return { ...base, width: 0, height: 0 };
294
+ }
295
+ // ---------------------------------------------------------------------------
296
+ // AVIF / HEIC (ISO base media file format)
297
+ // ---------------------------------------------------------------------------
298
+ const isIsoBmff = (b) => b.length >= 12 && ascii(b, 4, 4) === 'ftyp';
299
+ const AVIF_BRANDS = new Set(['avif', 'avis']);
300
+ const HEIC_BRANDS = new Set(['heic', 'heix', 'hevc', 'hevx', 'mif1', 'msf1', 'heim', 'heis']);
301
+ function readIsoBmff(b) {
302
+ const major = ascii(b, 8, 4);
303
+ const brands = new Set([major]);
304
+ const ftypSize = u32be(b, 0);
305
+ for (let i = 16; i + 4 <= Math.min(ftypSize, b.length); i += 4)
306
+ brands.add(ascii(b, i, 4));
307
+ let format = 'unknown';
308
+ for (const brand of brands) {
309
+ if (AVIF_BRANDS.has(brand)) {
310
+ format = 'avif';
311
+ break;
312
+ }
313
+ if (HEIC_BRANDS.has(brand))
314
+ format = 'heic';
315
+ }
316
+ if (format === 'unknown')
317
+ return { format, width: 0, height: 0 };
318
+ const ispe = findBox(b, ['meta', 'iprp', 'ipco', 'ispe'], 0, b.length);
319
+ const dims = ispe ? { width: u32be(b, ispe + 4), height: u32be(b, ispe + 8) } : { width: 0, height: 0 };
320
+ return {
321
+ format,
322
+ ...dims,
323
+ hasAlpha: findBox(b, ['meta', 'iprp', 'ipco', 'auxC'], 0, b.length) !== undefined,
324
+ isAnimated: brands.has('avis') || brands.has('msf1'),
325
+ };
326
+ }
327
+ /** Container boxes whose payload starts with a 4-byte version/flags field. */
328
+ const FULL_BOXES = new Set(['meta']);
329
+ /**
330
+ * Walks an ISO-BMFF box path and returns the payload offset of the final box.
331
+ * Returns undefined when any segment of the path is missing or malformed.
332
+ */
333
+ function findBox(b, path, start, end) {
334
+ const [target, ...rest] = path;
335
+ if (target === undefined)
336
+ return start;
337
+ let offset = start;
338
+ while (offset + 8 <= end) {
339
+ let size = u32be(b, offset);
340
+ const type = ascii(b, offset + 4, 4);
341
+ let headerSize = 8;
342
+ if (size === 1) {
343
+ // 64-bit extended size. We only care about the low word; images this
344
+ // large are rejected by validation long before we get here.
345
+ if (offset + 16 > end)
346
+ return undefined;
347
+ size = u32be(b, offset + 12);
348
+ headerSize = 16;
349
+ }
350
+ else if (size === 0) {
351
+ size = end - offset; // Box runs to the end of the container.
352
+ }
353
+ if (size < headerSize || offset + size > end)
354
+ return undefined;
355
+ if (type === target) {
356
+ const payload = offset + headerSize + (FULL_BOXES.has(type) ? 4 : 0);
357
+ return rest.length === 0 ? payload : findBox(b, rest, payload, offset + size);
358
+ }
359
+ offset += size;
360
+ }
361
+ return undefined;
362
+ }
363
+ // ---------------------------------------------------------------------------
364
+ // TIFF
365
+ // ---------------------------------------------------------------------------
366
+ const isTiff = (b) => (startsWith(b, [0x49, 0x49, 0x2a, 0x00]) || startsWith(b, [0x4d, 0x4d, 0x00, 0x2a])) &&
367
+ b.length >= 8;
368
+ function readTiff(b) {
369
+ const little = b[0] === 0x49;
370
+ const u16 = (i) => (little ? u16le(b, i) : u16be(b, i));
371
+ const u32 = (i) => (little ? u32le(b, i) : u32be(b, i));
372
+ const ifd = u32(4);
373
+ let width = 0;
374
+ let height = 0;
375
+ if (ifd + 2 <= b.length) {
376
+ const entries = u16(ifd);
377
+ for (let i = 0; i < entries; i++) {
378
+ const entry = ifd + 2 + i * 12;
379
+ if (entry + 12 > b.length)
380
+ break;
381
+ const tag = u16(entry);
382
+ const type = u16(entry + 2);
383
+ // Tag values are SHORT (3) or LONG (4); both fit inline in the value field.
384
+ const value = type === 3 ? u16(entry + 8) : u32(entry + 8);
385
+ if (tag === 0x0100)
386
+ width = value;
387
+ else if (tag === 0x0101)
388
+ height = value;
389
+ if (width && height)
390
+ break;
391
+ }
392
+ }
393
+ return { format: 'tiff', width, height };
394
+ }
395
+ // ---------------------------------------------------------------------------
396
+ // BMP / ICO / SVG
397
+ // ---------------------------------------------------------------------------
398
+ const isBmp = (b) => startsWith(b, [0x42, 0x4d]);
399
+ function readBmp(b) {
400
+ return {
401
+ format: 'bmp',
402
+ width: b.length >= 26 ? u32le(b, 18) : 0,
403
+ height: b.length >= 26 ? Math.abs(u32le(b, 22) | 0) : 0,
404
+ };
405
+ }
406
+ const isIco = (b) => startsWith(b, [0x00, 0x00, 0x01, 0x00]);
407
+ function readIco(b) {
408
+ // A zero in the width/height byte means 256.
409
+ const w = b[6] ?? 0;
410
+ const h = b[7] ?? 0;
411
+ return { format: 'ico', width: w === 0 ? 256 : w, height: h === 0 ? 256 : h };
412
+ }
413
+ function isSvg(b) {
414
+ const head = ascii(b, 0, Math.min(1024, b.length)).trimStart().toLowerCase();
415
+ return head.startsWith('<svg') || (head.startsWith('<?xml') && head.includes('<svg'));
416
+ }
417
+ function readSvg(b) {
418
+ const head = ascii(b, 0, Math.min(2048, b.length));
419
+ const width = parseSvgLength(head, 'width');
420
+ const height = parseSvgLength(head, 'height');
421
+ if (width && height)
422
+ return { format: 'svg', width, height, hasAlpha: true };
423
+ const viewBox = /viewBox\s*=\s*["']\s*[-\d.eE]+[\s,]+[-\d.eE]+[\s,]+([\d.eE]+)[\s,]+([\d.eE]+)/.exec(head);
424
+ return {
425
+ format: 'svg',
426
+ width: viewBox ? Math.round(Number(viewBox[1])) || 0 : 0,
427
+ height: viewBox ? Math.round(Number(viewBox[2])) || 0 : 0,
428
+ hasAlpha: true,
429
+ };
430
+ }
431
+ function parseSvgLength(head, attr) {
432
+ const match = new RegExp(`\\b${attr}\\s*=\\s*["']\\s*([\\d.]+)\\s*(px)?\\s*["']`).exec(head);
433
+ return match ? Math.round(Number(match[1])) || 0 : 0;
434
+ }
435
+ //# sourceMappingURL=sniff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sniff.js","sourceRoot":"","sources":["../../src/sniff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Turning the many shapes of "an image" into bytes plus a filename.
3
+ *
4
+ * Node builtins only - `node:fs/promises` for paths, global `fetch` for remote
5
+ * URLs (Node 18+), and manual concatenation for async iterables.
6
+ */
7
+ import { formatBytes } from './bytes.js';
8
+ import type { ImageSource } from './types.js';
9
+ /** Bytes plus whatever we learned about where they came from. */
10
+ export interface ResolvedSource {
11
+ readonly data: Uint8Array;
12
+ /** Basename including extension, or `'image'` when nothing better is known. */
13
+ readonly filename: string;
14
+ /** MIME type declared by the transport, if any. Never trusted for validation. */
15
+ readonly contentType?: string;
16
+ /** Where the bytes came from, for error messages. */
17
+ readonly origin: 'path' | 'buffer' | 'stream' | 'url';
18
+ }
19
+ export interface ResolveOptions {
20
+ /** Overrides any filename derived from the source. */
21
+ readonly filename?: string;
22
+ /** Permit `http:` / `https:` sources. Off by default. */
23
+ readonly allowRemote?: boolean;
24
+ /** Hard ceiling applied while reading, so a huge stream cannot exhaust memory. */
25
+ readonly maxBytes?: number;
26
+ readonly signal?: AbortSignal;
27
+ }
28
+ /**
29
+ * Normalises any {@link ImageSource} into a buffer.
30
+ *
31
+ * @throws {LensError} `INVALID_SOURCE` for an unrecognised shape,
32
+ * `SOURCE_UNREADABLE` when the read itself fails,
33
+ * `VALIDATION_FAILED` when `maxBytes` is exceeded mid-read.
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * await resolveSource('./photo.jpg');
38
+ * await resolveSource(request.body, { filename: 'upload.png', maxBytes: 5_000_000 });
39
+ * ```
40
+ */
41
+ export declare function resolveSource(source: ImageSource, options?: ResolveOptions): Promise<ResolvedSource>;
42
+ /** Filename without its extension. */
43
+ export declare function stem(filename: string): string;
44
+ export { formatBytes };
45
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvD;AAED,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAsDzB;AAwID,sCAAsC;AACtC,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7C;AAQD,OAAO,EAAE,WAAW,EAAE,CAAC"}