fumadocs-core 16.7.12 → 16.7.13

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 (118) hide show
  1. package/dist/{advanced-B6xijHpk.js → advanced-Bv_qi9IC.js} +1 -1
  2. package/dist/{algolia-CV1p_BGs.d.ts → algolia-DphIPKrc.d.ts} +1 -1
  3. package/dist/breadcrumb.d.ts +1 -1
  4. package/dist/{build-doc-CRrL6r30.js → build-doc-DKBeOVIN.js} +1 -1
  5. package/dist/{client-DwXJpdzf.d.ts → client-D3PZ2z2N.d.ts} +3 -3
  6. package/dist/content/mdx/preset-bundler.d.ts +7 -7
  7. package/dist/content/mdx/preset-bundler.js +1 -1
  8. package/dist/content/mdx/preset-runtime.d.ts +7 -7
  9. package/dist/content/mdx/preset-runtime.js +1 -1
  10. package/dist/content/toc.d.ts +1 -1
  11. package/dist/dist-BvsXWCqT.js +808 -0
  12. package/dist/fromFile-rjAsJGw3.js +845 -0
  13. package/dist/highlight/shiki/full.d.ts +1 -1
  14. package/dist/highlight/shiki/index.d.ts +1 -1
  15. package/dist/highlight/shiki/react.d.ts +2 -2
  16. package/dist/i18n/index.d.ts +1 -1
  17. package/dist/i18n/middleware.d.ts +1 -1
  18. package/dist/i18n/middleware.js +3763 -2
  19. package/dist/{index-DkqXqEn8.d.ts → index-9M3g3SDy.d.ts} +3 -3
  20. package/dist/{index-D-UKvVrz.d.ts → index-Bm0msojm.d.ts} +1 -1
  21. package/dist/{index-D2XxhP9t.d.ts → index-C4kyQCbj.d.ts} +1 -1
  22. package/dist/{index-Ca0YkTYK2.d.ts → index-CDOu1Gxx2.d.ts} +1 -1
  23. package/dist/mdx-plugins/codeblock-utils.d.ts +1 -1
  24. package/dist/mdx-plugins/index.d.ts +17 -17
  25. package/dist/mdx-plugins/index.js +2 -2
  26. package/dist/mdx-plugins/rehype-code.core.d.ts +1 -1
  27. package/dist/mdx-plugins/rehype-code.core.js +1 -1
  28. package/dist/mdx-plugins/rehype-code.d.ts +2 -2
  29. package/dist/mdx-plugins/rehype-code.js +1 -1
  30. package/dist/mdx-plugins/rehype-toc.d.ts +1 -1
  31. package/dist/mdx-plugins/remark-admonition.d.ts +1 -1
  32. package/dist/mdx-plugins/remark-code-tab.d.ts +1 -1
  33. package/dist/mdx-plugins/remark-directive-admonition.d.ts +1 -1
  34. package/dist/mdx-plugins/remark-feedback-block.d.ts +1 -1
  35. package/dist/mdx-plugins/remark-gfm.d.ts +1 -1
  36. package/dist/mdx-plugins/remark-heading.d.ts +1 -1
  37. package/dist/mdx-plugins/remark-image.d.ts +1 -1
  38. package/dist/mdx-plugins/remark-image.js +2 -2
  39. package/dist/mdx-plugins/remark-llms.d.ts +1 -1
  40. package/dist/mdx-plugins/remark-llms.runtime.d.ts +1 -1
  41. package/dist/mdx-plugins/remark-mdx-files.d.ts +1 -1
  42. package/dist/mdx-plugins/remark-mdx-mermaid.d.ts +1 -1
  43. package/dist/mdx-plugins/remark-npm.d.ts +1 -1
  44. package/dist/mdx-plugins/remark-npm.js +1 -64
  45. package/dist/mdx-plugins/remark-steps.d.ts +1 -1
  46. package/dist/mdx-plugins/remark-structure.d.ts +1 -1
  47. package/dist/mdx-plugins/stringifier.d.ts +1 -1
  48. package/dist/negotiation/index.js +1 -37
  49. package/dist/negotiation-CMIpYwJJ.js +1021 -0
  50. package/dist/page-tree/index.d.ts +2 -2
  51. package/dist/{rehype-code-CMrTh9Lu.d.ts → rehype-code-BceXtwzN.d.ts} +1 -1
  52. package/dist/{rehype-code.core-AAMsXdqJ.d.ts → rehype-code.core-DfJelVqH.d.ts} +2 -2
  53. package/dist/{remark-heading-95OQNNoH.d.ts → remark-heading-C3ZesmHL.d.ts} +1 -1
  54. package/dist/{remark-llms-Bjyq1jdk.d.ts → remark-llms-4bK9f_wN.d.ts} +1 -1
  55. package/dist/remark-npm-DIGXA7E3.js +593 -0
  56. package/dist/{remark-structure-c-gm2PCy.d.ts → remark-structure-DLKk-p9t.d.ts} +1 -1
  57. package/dist/search/algolia.d.ts +1 -1
  58. package/dist/search/client/algolia.d.ts +1 -1
  59. package/dist/search/client/fetch.d.ts +1 -1
  60. package/dist/search/client/flexsearch-static.d.ts +1 -1
  61. package/dist/search/client/flexsearch-static.js +1 -1
  62. package/dist/search/client/mixedbread.d.ts +1 -1
  63. package/dist/search/client/mixedbread.js +1 -1
  64. package/dist/search/client/orama-cloud-legacy.d.ts +1 -1
  65. package/dist/search/client/orama-cloud-legacy.js +1 -1
  66. package/dist/search/client/orama-cloud.d.ts +1 -1
  67. package/dist/search/client/orama-cloud.js +1 -1
  68. package/dist/search/client/orama-static.d.ts +1 -1
  69. package/dist/search/client/orama-static.js +1 -1
  70. package/dist/search/client.d.ts +1 -1
  71. package/dist/search/flexsearch.d.ts +4 -4
  72. package/dist/search/flexsearch.js +3 -3
  73. package/dist/search/index.d.ts +1 -1
  74. package/dist/search/mixedbread.d.ts +2 -2
  75. package/dist/search/mixedbread.js +2 -2
  76. package/dist/search/orama-cloud-legacy.d.ts +1 -1
  77. package/dist/search/orama-cloud.d.ts +1 -1
  78. package/dist/search/server.d.ts +1 -1
  79. package/dist/search/server.js +3 -3
  80. package/dist/{server-B89IM_4v.d.ts → server-D74cMtck.d.ts} +5 -5
  81. package/dist/source/client/index.d.ts +1 -1
  82. package/dist/source/index.d.ts +1 -1
  83. package/dist/source/index.js +2 -2
  84. package/dist/source/plugins/lucide-icons.d.ts +1 -1
  85. package/dist/source/plugins/lucide-icons.js +1 -1
  86. package/dist/source/plugins/slugs.d.ts +1 -1
  87. package/dist/source/plugins/slugs.js +1 -1
  88. package/dist/source/plugins/status-badges.d.ts +2 -2
  89. package/dist/toc.d.ts +1 -1
  90. package/dist/toc.js +12 -26
  91. package/package.json +87 -103
  92. /package/dist/{codeblock-utils-DuhKfwET.d.ts → codeblock-utils-BMoNeXUb.d.ts} +0 -0
  93. /package/dist/{definitions-j1YD3oZE.d.ts → definitions-DH0vdUJV.d.ts} +0 -0
  94. /package/dist/{endpoint-Bs6bqGYq.js → endpoint-BWgZs3LL.js} +0 -0
  95. /package/dist/{icon-CfEtMzdP.js → icon-DXrdIp2K.js} +0 -0
  96. /package/dist/{index-DAzunKMp.d.ts → index-B_5tvyCk.d.ts} +0 -0
  97. /package/dist/{index-CQ5TBOzH.d.ts → index-WhA-NTMB.d.ts} +0 -0
  98. /package/dist/{path-CL7hf0GY.js → path-ClKaiDuq.js} +0 -0
  99. /package/dist/{rehype-code.core-23F1yz08.js → rehype-code.core-B9asBGBz.js} +0 -0
  100. /package/dist/{rehype-toc-iWxg6ELI.d.ts → rehype-toc-Dk5ozAin.d.ts} +0 -0
  101. /package/dist/{remark-admonition-0gZM40ZU.d.ts → remark-admonition-D6mMI676.d.ts} +0 -0
  102. /package/dist/{remark-code-tab-Dk79zZwn.d.ts → remark-code-tab-Cl4XxpJ9.d.ts} +0 -0
  103. /package/dist/{remark-directive-admonition-CxFIkQ_i.d.ts → remark-directive-admonition-BJwUZuIt.d.ts} +0 -0
  104. /package/dist/{remark-feedback-block-CehhnqT0.d.ts → remark-feedback-block-PeBl_Fvl.d.ts} +0 -0
  105. /package/dist/{remark-gfm-DIHBRjLx.d.ts → remark-gfm-IilhXQUz.d.ts} +0 -0
  106. /package/dist/{remark-image-DQlJevNY.d.ts → remark-image-Co-rKW87.d.ts} +0 -0
  107. /package/dist/{remark-mdx-files-C50nFvnY.d.ts → remark-mdx-files-Ba1Yf3sk.d.ts} +0 -0
  108. /package/dist/{remark-mdx-mermaid-BkA2vurg.d.ts → remark-mdx-mermaid-DPDDbIZJ.d.ts} +0 -0
  109. /package/dist/{remark-npm-7SDuqMc6.d.ts → remark-npm-B7OPb7Ze.d.ts} +0 -0
  110. /package/dist/{remark-steps-DsnXM6Xj.d.ts → remark-steps-PxfBg8ws.d.ts} +0 -0
  111. /package/dist/{remove-markdown-Cte6pwYx.js → remove-markdown-CQ--9YPQ.js} +0 -0
  112. /package/dist/{remove-undefined-PK1FA5gc.js → remove-undefined-DLE4y6II.js} +0 -0
  113. /package/dist/{stringifier-l_KdmdPb.d.ts → stringifier-D6T4zhkn.d.ts} +0 -0
  114. /package/dist/{toc-CgnJPi4Q.d.ts → toc-DXlLlbv_.d.ts} +0 -0
  115. /package/dist/{types-Dr0HqbXP.d.ts → types-D8S_yMgI.d.ts} +0 -0
  116. /package/dist/{util-D2LMvKsn.d.ts → util-CZD_oO6N.d.ts} +0 -0
  117. /package/dist/{util-BnfE-P1F.js → util-D3lJGMcv.js} +0 -0
  118. /package/dist/{utils-D_KDPEof.js → utils-CEyx3kFf.js} +0 -0
@@ -0,0 +1,845 @@
1
+ import * as path$1 from "node:path";
2
+ import * as fs from "node:fs";
3
+ //#region ../../node_modules/.pnpm/image-size@2.0.2/node_modules/image-size/dist/fromFile.mjs
4
+ var decoder = new TextDecoder();
5
+ var toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));
6
+ var toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), "");
7
+ var getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);
8
+ var readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);
9
+ var readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);
10
+ var readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);
11
+ var readUInt24LE = (input, offset = 0) => {
12
+ const view = getView(input, offset);
13
+ return view.getUint16(0, true) + (view.getUint8(2) << 16);
14
+ };
15
+ var readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);
16
+ var readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);
17
+ var readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);
18
+ var readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);
19
+ var methods = {
20
+ readUInt16BE,
21
+ readUInt16LE,
22
+ readUInt32BE,
23
+ readUInt32LE
24
+ };
25
+ function readUInt(input, bits, offset = 0, isBigEndian = false) {
26
+ return methods[`readUInt${bits}${isBigEndian ? "BE" : "LE"}`](input, offset);
27
+ }
28
+ function readBox(input, offset) {
29
+ if (input.length - offset < 4) return;
30
+ const boxSize = readUInt32BE(input, offset);
31
+ if (input.length - offset < boxSize) return;
32
+ return {
33
+ name: toUTF8String(input, 4 + offset, 8 + offset),
34
+ offset,
35
+ size: boxSize
36
+ };
37
+ }
38
+ function findBox(input, boxName, currentOffset) {
39
+ while (currentOffset < input.length) {
40
+ const box = readBox(input, currentOffset);
41
+ if (!box) break;
42
+ if (box.name === boxName) return box;
43
+ currentOffset += box.size > 0 ? box.size : 8;
44
+ }
45
+ }
46
+ var BMP = {
47
+ validate: (input) => toUTF8String(input, 0, 2) === "BM",
48
+ calculate: (input) => ({
49
+ height: Math.abs(readInt32LE(input, 22)),
50
+ width: readUInt32LE(input, 18)
51
+ })
52
+ };
53
+ var TYPE_ICON = 1;
54
+ var SIZE_HEADER = 6;
55
+ var SIZE_IMAGE_ENTRY = 16;
56
+ function getSizeFromOffset(input, offset) {
57
+ const value = input[offset];
58
+ return value === 0 ? 256 : value;
59
+ }
60
+ function getImageSize(input, imageIndex) {
61
+ const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;
62
+ return {
63
+ height: getSizeFromOffset(input, offset + 1),
64
+ width: getSizeFromOffset(input, offset)
65
+ };
66
+ }
67
+ var ICO = {
68
+ validate(input) {
69
+ const reserved = readUInt16LE(input, 0);
70
+ const imageCount = readUInt16LE(input, 4);
71
+ if (reserved !== 0 || imageCount === 0) return false;
72
+ return readUInt16LE(input, 2) === TYPE_ICON;
73
+ },
74
+ calculate(input) {
75
+ const nbImages = readUInt16LE(input, 4);
76
+ const imageSize2 = getImageSize(input, 0);
77
+ if (nbImages === 1) return imageSize2;
78
+ const images = [];
79
+ for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) images.push(getImageSize(input, imageIndex));
80
+ return {
81
+ width: imageSize2.width,
82
+ height: imageSize2.height,
83
+ images
84
+ };
85
+ }
86
+ };
87
+ var TYPE_CURSOR = 2;
88
+ var CUR = {
89
+ validate(input) {
90
+ const reserved = readUInt16LE(input, 0);
91
+ const imageCount = readUInt16LE(input, 4);
92
+ if (reserved !== 0 || imageCount === 0) return false;
93
+ return readUInt16LE(input, 2) === TYPE_CURSOR;
94
+ },
95
+ calculate: (input) => ICO.calculate(input)
96
+ };
97
+ var DDS = {
98
+ validate: (input) => readUInt32LE(input, 0) === 542327876,
99
+ calculate: (input) => ({
100
+ height: readUInt32LE(input, 12),
101
+ width: readUInt32LE(input, 16)
102
+ })
103
+ };
104
+ var gifRegexp = /^GIF8[79]a/;
105
+ var GIF = {
106
+ validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),
107
+ calculate: (input) => ({
108
+ height: readUInt16LE(input, 8),
109
+ width: readUInt16LE(input, 6)
110
+ })
111
+ };
112
+ var brandMap = {
113
+ avif: "avif",
114
+ mif1: "heif",
115
+ msf1: "heif",
116
+ heic: "heic",
117
+ heix: "heic",
118
+ hevc: "heic",
119
+ hevx: "heic"
120
+ };
121
+ var HEIF = {
122
+ validate(input) {
123
+ if (toUTF8String(input, 4, 8) !== "ftyp") return false;
124
+ const ftypBox = findBox(input, "ftyp", 0);
125
+ if (!ftypBox) return false;
126
+ return toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12) in brandMap;
127
+ },
128
+ calculate(input) {
129
+ const metaBox = findBox(input, "meta", 0);
130
+ const iprpBox = metaBox && findBox(input, "iprp", metaBox.offset + 12);
131
+ const ipcoBox = iprpBox && findBox(input, "ipco", iprpBox.offset + 8);
132
+ if (!ipcoBox) throw new TypeError("Invalid HEIF, no ipco box found");
133
+ const type = toUTF8String(input, 8, 12);
134
+ const images = [];
135
+ let currentOffset = ipcoBox.offset + 8;
136
+ while (currentOffset < ipcoBox.offset + ipcoBox.size) {
137
+ const ispeBox = findBox(input, "ispe", currentOffset);
138
+ if (!ispeBox) break;
139
+ const rawWidth = readUInt32BE(input, ispeBox.offset + 12);
140
+ const rawHeight = readUInt32BE(input, ispeBox.offset + 16);
141
+ const clapBox = findBox(input, "clap", currentOffset);
142
+ let width = rawWidth;
143
+ let height = rawHeight;
144
+ if (clapBox && clapBox.offset < ipcoBox.offset + ipcoBox.size) width = rawWidth - readUInt32BE(input, clapBox.offset + 12);
145
+ images.push({
146
+ height,
147
+ width
148
+ });
149
+ currentOffset = ispeBox.offset + ispeBox.size;
150
+ }
151
+ if (images.length === 0) throw new TypeError("Invalid HEIF, no sizes found");
152
+ return {
153
+ width: images[0].width,
154
+ height: images[0].height,
155
+ type,
156
+ ...images.length > 1 ? { images } : {}
157
+ };
158
+ }
159
+ };
160
+ var SIZE_HEADER2 = 8;
161
+ var FILE_LENGTH_OFFSET = 4;
162
+ var ENTRY_LENGTH_OFFSET = 4;
163
+ var ICON_TYPE_SIZE = {
164
+ ICON: 32,
165
+ "ICN#": 32,
166
+ "icm#": 16,
167
+ icm4: 16,
168
+ icm8: 16,
169
+ "ics#": 16,
170
+ ics4: 16,
171
+ ics8: 16,
172
+ is32: 16,
173
+ s8mk: 16,
174
+ icp4: 16,
175
+ icl4: 32,
176
+ icl8: 32,
177
+ il32: 32,
178
+ l8mk: 32,
179
+ icp5: 32,
180
+ ic11: 32,
181
+ ich4: 48,
182
+ ich8: 48,
183
+ ih32: 48,
184
+ h8mk: 48,
185
+ icp6: 64,
186
+ ic12: 32,
187
+ it32: 128,
188
+ t8mk: 128,
189
+ ic07: 128,
190
+ ic08: 256,
191
+ ic13: 256,
192
+ ic09: 512,
193
+ ic14: 512,
194
+ ic10: 1024
195
+ };
196
+ function readImageHeader(input, imageOffset) {
197
+ const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;
198
+ return [toUTF8String(input, imageOffset, imageLengthOffset), readUInt32BE(input, imageLengthOffset)];
199
+ }
200
+ function getImageSize2(type) {
201
+ const size = ICON_TYPE_SIZE[type];
202
+ return {
203
+ width: size,
204
+ height: size,
205
+ type
206
+ };
207
+ }
208
+ var ICNS = {
209
+ validate: (input) => toUTF8String(input, 0, 4) === "icns",
210
+ calculate(input) {
211
+ const inputLength = input.length;
212
+ const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);
213
+ let imageOffset = SIZE_HEADER2;
214
+ const images = [];
215
+ while (imageOffset < fileLength && imageOffset < inputLength) {
216
+ const imageHeader = readImageHeader(input, imageOffset);
217
+ const imageSize2 = getImageSize2(imageHeader[0]);
218
+ images.push(imageSize2);
219
+ imageOffset += imageHeader[1];
220
+ }
221
+ if (images.length === 0) throw new TypeError("Invalid ICNS, no sizes found");
222
+ return {
223
+ width: images[0].width,
224
+ height: images[0].height,
225
+ ...images.length > 1 ? { images } : {}
226
+ };
227
+ }
228
+ };
229
+ var J2C = {
230
+ validate: (input) => readUInt32BE(input, 0) === 4283432785,
231
+ calculate: (input) => ({
232
+ height: readUInt32BE(input, 12),
233
+ width: readUInt32BE(input, 8)
234
+ })
235
+ };
236
+ var JP2 = {
237
+ validate(input) {
238
+ if (toUTF8String(input, 4, 8) !== "jP ") return false;
239
+ const ftypBox = findBox(input, "ftyp", 0);
240
+ if (!ftypBox) return false;
241
+ return toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12) === "jp2 ";
242
+ },
243
+ calculate(input) {
244
+ const jp2hBox = findBox(input, "jp2h", 0);
245
+ const ihdrBox = jp2hBox && findBox(input, "ihdr", jp2hBox.offset + 8);
246
+ if (ihdrBox) return {
247
+ height: readUInt32BE(input, ihdrBox.offset + 8),
248
+ width: readUInt32BE(input, ihdrBox.offset + 12)
249
+ };
250
+ throw new TypeError("Unsupported JPEG 2000 format");
251
+ }
252
+ };
253
+ var EXIF_MARKER = "45786966";
254
+ var APP1_DATA_SIZE_BYTES = 2;
255
+ var EXIF_HEADER_BYTES = 6;
256
+ var TIFF_BYTE_ALIGN_BYTES = 2;
257
+ var BIG_ENDIAN_BYTE_ALIGN = "4d4d";
258
+ var LITTLE_ENDIAN_BYTE_ALIGN = "4949";
259
+ var IDF_ENTRY_BYTES = 12;
260
+ var NUM_DIRECTORY_ENTRIES_BYTES = 2;
261
+ function isEXIF(input) {
262
+ return toHexString(input, 2, 6) === EXIF_MARKER;
263
+ }
264
+ function extractSize(input, index) {
265
+ return {
266
+ height: readUInt16BE(input, index),
267
+ width: readUInt16BE(input, index + 2)
268
+ };
269
+ }
270
+ function extractOrientation(exifBlock, isBigEndian) {
271
+ const offset = EXIF_HEADER_BYTES + 8;
272
+ const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);
273
+ for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {
274
+ const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES;
275
+ const end = start + IDF_ENTRY_BYTES;
276
+ if (start > exifBlock.length) return;
277
+ const block = exifBlock.slice(start, end);
278
+ if (readUInt(block, 16, 0, isBigEndian) === 274) {
279
+ if (readUInt(block, 16, 2, isBigEndian) !== 3) return;
280
+ if (readUInt(block, 32, 4, isBigEndian) !== 1) return;
281
+ return readUInt(block, 16, 8, isBigEndian);
282
+ }
283
+ }
284
+ }
285
+ function validateExifBlock(input, index) {
286
+ const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);
287
+ const byteAlign = toHexString(exifBlock, EXIF_HEADER_BYTES, EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES);
288
+ const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;
289
+ if (isBigEndian || byteAlign === LITTLE_ENDIAN_BYTE_ALIGN) return extractOrientation(exifBlock, isBigEndian);
290
+ }
291
+ function validateInput(input, index) {
292
+ if (index > input.length) throw new TypeError("Corrupt JPG, exceeded buffer limits");
293
+ }
294
+ var JPG = {
295
+ validate: (input) => toHexString(input, 0, 2) === "ffd8",
296
+ calculate(_input) {
297
+ let input = _input.slice(4);
298
+ let orientation;
299
+ let next;
300
+ while (input.length) {
301
+ const i = readUInt16BE(input, 0);
302
+ validateInput(input, i);
303
+ if (input[i] !== 255) {
304
+ input = input.slice(1);
305
+ continue;
306
+ }
307
+ if (isEXIF(input)) orientation = validateExifBlock(input, i);
308
+ next = input[i + 1];
309
+ if (next === 192 || next === 193 || next === 194) {
310
+ const size = extractSize(input, i + 5);
311
+ if (!orientation) return size;
312
+ return {
313
+ height: size.height,
314
+ orientation,
315
+ width: size.width
316
+ };
317
+ }
318
+ input = input.slice(i + 2);
319
+ }
320
+ throw new TypeError("Invalid JPG, no size found");
321
+ }
322
+ };
323
+ var BitReader = class {
324
+ constructor(input, endianness) {
325
+ this.input = input;
326
+ this.endianness = endianness;
327
+ this.byteOffset = 2;
328
+ this.bitOffset = 0;
329
+ }
330
+ /** Reads a specified number of bits, and move the offset */
331
+ getBits(length = 1) {
332
+ let result = 0;
333
+ let bitsRead = 0;
334
+ while (bitsRead < length) {
335
+ if (this.byteOffset >= this.input.length) throw new Error("Reached end of input");
336
+ const currentByte = this.input[this.byteOffset];
337
+ const bitsLeft = 8 - this.bitOffset;
338
+ const bitsToRead = Math.min(length - bitsRead, bitsLeft);
339
+ if (this.endianness === "little-endian") {
340
+ const mask = (1 << bitsToRead) - 1;
341
+ const bits = currentByte >> this.bitOffset & mask;
342
+ result |= bits << bitsRead;
343
+ } else {
344
+ const bits = (currentByte & (1 << bitsToRead) - 1 << 8 - this.bitOffset - bitsToRead) >> 8 - this.bitOffset - bitsToRead;
345
+ result = result << bitsToRead | bits;
346
+ }
347
+ bitsRead += bitsToRead;
348
+ this.bitOffset += bitsToRead;
349
+ if (this.bitOffset === 8) {
350
+ this.byteOffset++;
351
+ this.bitOffset = 0;
352
+ }
353
+ }
354
+ return result;
355
+ }
356
+ };
357
+ function calculateImageDimension(reader, isSmallImage) {
358
+ if (isSmallImage) return 8 * (1 + reader.getBits(5));
359
+ const extraBits = [
360
+ 9,
361
+ 13,
362
+ 18,
363
+ 30
364
+ ][reader.getBits(2)];
365
+ return 1 + reader.getBits(extraBits);
366
+ }
367
+ function calculateImageWidth(reader, isSmallImage, widthMode, height) {
368
+ if (isSmallImage && widthMode === 0) return 8 * (1 + reader.getBits(5));
369
+ if (widthMode === 0) return calculateImageDimension(reader, false);
370
+ return Math.floor(height * [
371
+ 1,
372
+ 1.2,
373
+ 4 / 3,
374
+ 1.5,
375
+ 16 / 9,
376
+ 5 / 4,
377
+ 2
378
+ ][widthMode - 1]);
379
+ }
380
+ var JXLStream = {
381
+ validate: (input) => {
382
+ return toHexString(input, 0, 2) === "ff0a";
383
+ },
384
+ calculate(input) {
385
+ const reader = new BitReader(input, "little-endian");
386
+ const isSmallImage = reader.getBits(1) === 1;
387
+ const height = calculateImageDimension(reader, isSmallImage);
388
+ return {
389
+ width: calculateImageWidth(reader, isSmallImage, reader.getBits(3), height),
390
+ height
391
+ };
392
+ }
393
+ };
394
+ function extractCodestream(input) {
395
+ const jxlcBox = findBox(input, "jxlc", 0);
396
+ if (jxlcBox) return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);
397
+ const partialStreams = extractPartialStreams(input);
398
+ if (partialStreams.length > 0) return concatenateCodestreams(partialStreams);
399
+ }
400
+ function extractPartialStreams(input) {
401
+ const partialStreams = [];
402
+ let offset = 0;
403
+ while (offset < input.length) {
404
+ const jxlpBox = findBox(input, "jxlp", offset);
405
+ if (!jxlpBox) break;
406
+ partialStreams.push(input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size));
407
+ offset = jxlpBox.offset + jxlpBox.size;
408
+ }
409
+ return partialStreams;
410
+ }
411
+ function concatenateCodestreams(partialCodestreams) {
412
+ const totalLength = partialCodestreams.reduce((acc, curr) => acc + curr.length, 0);
413
+ const codestream = new Uint8Array(totalLength);
414
+ let position = 0;
415
+ for (const partial of partialCodestreams) {
416
+ codestream.set(partial, position);
417
+ position += partial.length;
418
+ }
419
+ return codestream;
420
+ }
421
+ var JXL = {
422
+ validate: (input) => {
423
+ if (toUTF8String(input, 4, 8) !== "JXL ") return false;
424
+ const ftypBox = findBox(input, "ftyp", 0);
425
+ if (!ftypBox) return false;
426
+ return toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12) === "jxl ";
427
+ },
428
+ calculate(input) {
429
+ const codestream = extractCodestream(input);
430
+ if (codestream) return JXLStream.calculate(codestream);
431
+ throw new Error("No codestream found in JXL container");
432
+ }
433
+ };
434
+ var KTX = {
435
+ validate: (input) => {
436
+ const signature = toUTF8String(input, 1, 7);
437
+ return ["KTX 11", "KTX 20"].includes(signature);
438
+ },
439
+ calculate: (input) => {
440
+ const type = input[5] === 49 ? "ktx" : "ktx2";
441
+ const offset = type === "ktx" ? 36 : 20;
442
+ return {
443
+ height: readUInt32LE(input, offset + 4),
444
+ width: readUInt32LE(input, offset),
445
+ type
446
+ };
447
+ }
448
+ };
449
+ var pngSignature = "PNG\r\n\n";
450
+ var pngImageHeaderChunkName = "IHDR";
451
+ var pngFriedChunkName = "CgBI";
452
+ var PNG = {
453
+ validate(input) {
454
+ if (pngSignature === toUTF8String(input, 1, 8)) {
455
+ let chunkName = toUTF8String(input, 12, 16);
456
+ if (chunkName === pngFriedChunkName) chunkName = toUTF8String(input, 28, 32);
457
+ if (chunkName !== pngImageHeaderChunkName) throw new TypeError("Invalid PNG");
458
+ return true;
459
+ }
460
+ return false;
461
+ },
462
+ calculate(input) {
463
+ if (toUTF8String(input, 12, 16) === pngFriedChunkName) return {
464
+ height: readUInt32BE(input, 36),
465
+ width: readUInt32BE(input, 32)
466
+ };
467
+ return {
468
+ height: readUInt32BE(input, 20),
469
+ width: readUInt32BE(input, 16)
470
+ };
471
+ }
472
+ };
473
+ var PNMTypes = {
474
+ P1: "pbm/ascii",
475
+ P2: "pgm/ascii",
476
+ P3: "ppm/ascii",
477
+ P4: "pbm",
478
+ P5: "pgm",
479
+ P6: "ppm",
480
+ P7: "pam",
481
+ PF: "pfm"
482
+ };
483
+ var handlers = {
484
+ default: (lines) => {
485
+ let dimensions = [];
486
+ while (lines.length > 0) {
487
+ const line = lines.shift();
488
+ if (line[0] === "#") continue;
489
+ dimensions = line.split(" ");
490
+ break;
491
+ }
492
+ if (dimensions.length === 2) return {
493
+ height: Number.parseInt(dimensions[1], 10),
494
+ width: Number.parseInt(dimensions[0], 10)
495
+ };
496
+ throw new TypeError("Invalid PNM");
497
+ },
498
+ pam: (lines) => {
499
+ const size = {};
500
+ while (lines.length > 0) {
501
+ const line = lines.shift();
502
+ if (line.length > 16 || line.charCodeAt(0) > 128) continue;
503
+ const [key, value] = line.split(" ");
504
+ if (key && value) size[key.toLowerCase()] = Number.parseInt(value, 10);
505
+ if (size.height && size.width) break;
506
+ }
507
+ if (size.height && size.width) return {
508
+ height: size.height,
509
+ width: size.width
510
+ };
511
+ throw new TypeError("Invalid PAM");
512
+ }
513
+ };
514
+ var PNM = {
515
+ validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,
516
+ calculate(input) {
517
+ const type = PNMTypes[toUTF8String(input, 0, 2)];
518
+ const lines = toUTF8String(input, 3).split(/[\r\n]+/);
519
+ return (handlers[type] || handlers.default)(lines);
520
+ }
521
+ };
522
+ var PSD = {
523
+ validate: (input) => toUTF8String(input, 0, 4) === "8BPS",
524
+ calculate: (input) => ({
525
+ height: readUInt32BE(input, 14),
526
+ width: readUInt32BE(input, 18)
527
+ })
528
+ };
529
+ var svgReg = /<svg\s([^>"']|"[^"]*"|'[^']*')*>/;
530
+ var extractorRegExps = {
531
+ height: /\sheight=(['"])([^%]+?)\1/,
532
+ root: svgReg,
533
+ viewbox: /\sviewBox=(['"])(.+?)\1/i,
534
+ width: /\swidth=(['"])([^%]+?)\1/
535
+ };
536
+ var INCH_CM = 2.54;
537
+ var units = {
538
+ in: 96,
539
+ cm: 96 / INCH_CM,
540
+ em: 16,
541
+ ex: 8,
542
+ m: 96 / INCH_CM * 100,
543
+ mm: 96 / INCH_CM / 10,
544
+ pc: 96 / 72 / 12,
545
+ pt: 96 / 72,
546
+ px: 1
547
+ };
548
+ var unitsReg = new RegExp(`^([0-9.]+(?:e\\d+)?)(${Object.keys(units).join("|")})?$`);
549
+ function parseLength(len) {
550
+ const m = unitsReg.exec(len);
551
+ if (!m) return;
552
+ return Math.round(Number(m[1]) * (units[m[2]] || 1));
553
+ }
554
+ function parseViewbox(viewbox) {
555
+ const bounds = viewbox.split(" ");
556
+ return {
557
+ height: parseLength(bounds[3]),
558
+ width: parseLength(bounds[2])
559
+ };
560
+ }
561
+ function parseAttributes(root) {
562
+ const width = root.match(extractorRegExps.width);
563
+ const height = root.match(extractorRegExps.height);
564
+ const viewbox = root.match(extractorRegExps.viewbox);
565
+ return {
566
+ height: height && parseLength(height[2]),
567
+ viewbox: viewbox && parseViewbox(viewbox[2]),
568
+ width: width && parseLength(width[2])
569
+ };
570
+ }
571
+ function calculateByDimensions(attrs) {
572
+ return {
573
+ height: attrs.height,
574
+ width: attrs.width
575
+ };
576
+ }
577
+ function calculateByViewbox(attrs, viewbox) {
578
+ const ratio = viewbox.width / viewbox.height;
579
+ if (attrs.width) return {
580
+ height: Math.floor(attrs.width / ratio),
581
+ width: attrs.width
582
+ };
583
+ if (attrs.height) return {
584
+ height: attrs.height,
585
+ width: Math.floor(attrs.height * ratio)
586
+ };
587
+ return {
588
+ height: viewbox.height,
589
+ width: viewbox.width
590
+ };
591
+ }
592
+ var SVG = {
593
+ validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)),
594
+ calculate(input) {
595
+ const root = toUTF8String(input).match(extractorRegExps.root);
596
+ if (root) {
597
+ const attrs = parseAttributes(root[0]);
598
+ if (attrs.width && attrs.height) return calculateByDimensions(attrs);
599
+ if (attrs.viewbox) return calculateByViewbox(attrs, attrs.viewbox);
600
+ }
601
+ throw new TypeError("Invalid SVG");
602
+ }
603
+ };
604
+ var TGA = {
605
+ validate(input) {
606
+ return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;
607
+ },
608
+ calculate(input) {
609
+ return {
610
+ height: readUInt16LE(input, 14),
611
+ width: readUInt16LE(input, 12)
612
+ };
613
+ }
614
+ };
615
+ var CONSTANTS = {
616
+ TAG: {
617
+ WIDTH: 256,
618
+ HEIGHT: 257,
619
+ COMPRESSION: 259
620
+ },
621
+ TYPE: {
622
+ SHORT: 3,
623
+ LONG: 4,
624
+ LONG8: 16
625
+ },
626
+ ENTRY_SIZE: {
627
+ STANDARD: 12,
628
+ BIG: 20
629
+ },
630
+ COUNT_SIZE: {
631
+ STANDARD: 2,
632
+ BIG: 8
633
+ }
634
+ };
635
+ function readIFD(input, { isBigEndian, isBigTiff }) {
636
+ const ifdOffset = isBigTiff ? Number(readUInt64(input, 8, isBigEndian)) : readUInt(input, 32, 4, isBigEndian);
637
+ const entryCountSize = isBigTiff ? CONSTANTS.COUNT_SIZE.BIG : CONSTANTS.COUNT_SIZE.STANDARD;
638
+ return input.slice(ifdOffset + entryCountSize);
639
+ }
640
+ function readTagValue(input, type, offset, isBigEndian) {
641
+ switch (type) {
642
+ case CONSTANTS.TYPE.SHORT: return readUInt(input, 16, offset, isBigEndian);
643
+ case CONSTANTS.TYPE.LONG: return readUInt(input, 32, offset, isBigEndian);
644
+ case CONSTANTS.TYPE.LONG8: {
645
+ const value = Number(readUInt64(input, offset, isBigEndian));
646
+ if (value > Number.MAX_SAFE_INTEGER) throw new TypeError("Value too large");
647
+ return value;
648
+ }
649
+ default: return 0;
650
+ }
651
+ }
652
+ function nextTag(input, isBigTiff) {
653
+ const entrySize = isBigTiff ? CONSTANTS.ENTRY_SIZE.BIG : CONSTANTS.ENTRY_SIZE.STANDARD;
654
+ if (input.length > entrySize) return input.slice(entrySize);
655
+ }
656
+ function extractTags(input, { isBigEndian, isBigTiff }) {
657
+ const tags = {};
658
+ let temp = input;
659
+ while (temp?.length) {
660
+ const code = readUInt(temp, 16, 0, isBigEndian);
661
+ const type = readUInt(temp, 16, 2, isBigEndian);
662
+ const length = isBigTiff ? Number(readUInt64(temp, 4, isBigEndian)) : readUInt(temp, 32, 4, isBigEndian);
663
+ if (code === 0) break;
664
+ if (length === 1 && (type === CONSTANTS.TYPE.SHORT || type === CONSTANTS.TYPE.LONG || isBigTiff && type === CONSTANTS.TYPE.LONG8)) tags[code] = readTagValue(temp, type, isBigTiff ? 12 : 8, isBigEndian);
665
+ temp = nextTag(temp, isBigTiff);
666
+ }
667
+ return tags;
668
+ }
669
+ function determineFormat(input) {
670
+ const signature = toUTF8String(input, 0, 2);
671
+ const version = readUInt(input, 16, 2, signature === "MM");
672
+ return {
673
+ isBigEndian: signature === "MM",
674
+ isBigTiff: version === 43
675
+ };
676
+ }
677
+ function validateBigTIFFHeader(input, isBigEndian) {
678
+ const byteSize = readUInt(input, 16, 4, isBigEndian);
679
+ const reserved = readUInt(input, 16, 6, isBigEndian);
680
+ if (byteSize !== 8 || reserved !== 0) throw new TypeError("Invalid BigTIFF header");
681
+ }
682
+ var signatures = /* @__PURE__ */ new Set([
683
+ "49492a00",
684
+ "4d4d002a",
685
+ "49492b00",
686
+ "4d4d002b"
687
+ ]);
688
+ var TIFF = {
689
+ validate: (input) => {
690
+ const signature = toHexString(input, 0, 4);
691
+ return signatures.has(signature);
692
+ },
693
+ calculate(input) {
694
+ const format = determineFormat(input);
695
+ if (format.isBigTiff) validateBigTIFFHeader(input, format.isBigEndian);
696
+ const tags = extractTags(readIFD(input, format), format);
697
+ const info = {
698
+ height: tags[CONSTANTS.TAG.HEIGHT],
699
+ width: tags[CONSTANTS.TAG.WIDTH],
700
+ type: format.isBigTiff ? "bigtiff" : "tiff"
701
+ };
702
+ if (tags[CONSTANTS.TAG.COMPRESSION]) info.compression = tags[CONSTANTS.TAG.COMPRESSION];
703
+ if (!info.width || !info.height) throw new TypeError("Invalid Tiff. Missing tags");
704
+ return info;
705
+ }
706
+ };
707
+ function calculateExtended(input) {
708
+ return {
709
+ height: 1 + readUInt24LE(input, 7),
710
+ width: 1 + readUInt24LE(input, 4)
711
+ };
712
+ }
713
+ function calculateLossless(input) {
714
+ return {
715
+ height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6),
716
+ width: 1 + ((input[2] & 63) << 8 | input[1])
717
+ };
718
+ }
719
+ function calculateLossy(input) {
720
+ return {
721
+ height: readInt16LE(input, 8) & 16383,
722
+ width: readInt16LE(input, 6) & 16383
723
+ };
724
+ }
725
+ var typeHandlers = /* @__PURE__ */ new Map([
726
+ ["bmp", BMP],
727
+ ["cur", CUR],
728
+ ["dds", DDS],
729
+ ["gif", GIF],
730
+ ["heif", HEIF],
731
+ ["icns", ICNS],
732
+ ["ico", ICO],
733
+ ["j2c", J2C],
734
+ ["jp2", JP2],
735
+ ["jpg", JPG],
736
+ ["jxl", JXL],
737
+ ["jxl-stream", JXLStream],
738
+ ["ktx", KTX],
739
+ ["png", PNG],
740
+ ["pnm", PNM],
741
+ ["psd", PSD],
742
+ ["svg", SVG],
743
+ ["tga", TGA],
744
+ ["tiff", TIFF],
745
+ ["webp", {
746
+ validate(input) {
747
+ const riffHeader = "RIFF" === toUTF8String(input, 0, 4);
748
+ const webpHeader = "WEBP" === toUTF8String(input, 8, 12);
749
+ const vp8Header = "VP8" === toUTF8String(input, 12, 15);
750
+ return riffHeader && webpHeader && vp8Header;
751
+ },
752
+ calculate(_input) {
753
+ const chunkHeader = toUTF8String(_input, 12, 16);
754
+ const input = _input.slice(20, 30);
755
+ if (chunkHeader === "VP8X") {
756
+ const extendedHeader = input[0];
757
+ const validStart = (extendedHeader & 192) === 0;
758
+ const validEnd = (extendedHeader & 1) === 0;
759
+ if (validStart && validEnd) return calculateExtended(input);
760
+ throw new TypeError("Invalid WebP");
761
+ }
762
+ if (chunkHeader === "VP8 " && input[0] !== 47) return calculateLossy(input);
763
+ const signature = toHexString(input, 3, 6);
764
+ if (chunkHeader === "VP8L" && signature !== "9d012a") return calculateLossless(input);
765
+ throw new TypeError("Invalid WebP");
766
+ }
767
+ }]
768
+ ]);
769
+ var types = Array.from(typeHandlers.keys());
770
+ var firstBytes = /* @__PURE__ */ new Map([
771
+ [0, "heif"],
772
+ [56, "psd"],
773
+ [66, "bmp"],
774
+ [68, "dds"],
775
+ [71, "gif"],
776
+ [73, "tiff"],
777
+ [77, "tiff"],
778
+ [82, "webp"],
779
+ [105, "icns"],
780
+ [137, "png"],
781
+ [255, "jpg"]
782
+ ]);
783
+ function detector(input) {
784
+ const byte = input[0];
785
+ const type = firstBytes.get(byte);
786
+ if (type && typeHandlers.get(type).validate(input)) return type;
787
+ return types.find((type2) => typeHandlers.get(type2).validate(input));
788
+ }
789
+ var globalOptions = { disabledTypes: [] };
790
+ function imageSize(input) {
791
+ const type = detector(input);
792
+ if (typeof type !== "undefined") {
793
+ if (globalOptions.disabledTypes.indexOf(type) > -1) throw new TypeError(`disabled file type: ${type}`);
794
+ const size = typeHandlers.get(type).calculate(input);
795
+ if (size !== void 0) {
796
+ size.type = size.type ?? type;
797
+ if (size.images && size.images.length > 1) {
798
+ const largestImage = size.images.reduce((largest, current) => {
799
+ return current.width * current.height > largest.width * largest.height ? current : largest;
800
+ }, size.images[0]);
801
+ size.width = largestImage.width;
802
+ size.height = largestImage.height;
803
+ }
804
+ return size;
805
+ }
806
+ }
807
+ throw new TypeError(`unsupported file type: ${type}`);
808
+ }
809
+ var MaxInputSize = 512 * 1024;
810
+ var queue = [];
811
+ var concurrency = 100;
812
+ var processQueue = async () => {
813
+ const promises2 = queue.splice(0, concurrency).map(async ({ filePath, resolve: resolve2, reject }) => {
814
+ let handle;
815
+ try {
816
+ handle = await fs.promises.open(path$1.resolve(filePath), "r");
817
+ } catch (err) {
818
+ return reject(err);
819
+ }
820
+ try {
821
+ const { size } = await handle.stat();
822
+ if (size <= 0) throw new Error("Empty file");
823
+ const inputSize = Math.min(size, MaxInputSize);
824
+ const input = new Uint8Array(inputSize);
825
+ await handle.read(input, 0, inputSize, 0);
826
+ resolve2(imageSize(input));
827
+ } catch (err) {
828
+ reject(err);
829
+ } finally {
830
+ await handle.close();
831
+ }
832
+ });
833
+ await Promise.allSettled(promises2);
834
+ if (queue.length) setTimeout(processQueue, 100);
835
+ };
836
+ var imageSizeFromFile = async (filePath) => new Promise((resolve2, reject) => {
837
+ queue.push({
838
+ filePath,
839
+ resolve: resolve2,
840
+ reject
841
+ });
842
+ processQueue();
843
+ });
844
+ //#endregion
845
+ export { imageSizeFromFile };