@adaptive-ds/solid-ui 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/dist/generate_image_list/generateImageList.d.ts +0 -3
- package/dist/generate_image_list/generateImageList.d.ts.map +0 -1
- package/dist/generate_image_list/generateImageList.js +0 -106
- package/dist/generate_image_list/generateImageList.js.map +0 -1
- package/dist/interactive/layout/SidebarLayout.d.ts +0 -14
- package/dist/interactive/layout/SidebarLayout.d.ts.map +0 -1
- package/dist/interactive/layout/SidebarLayout.js +0 -47
- package/dist/interactive/layout/SidebarLayout.js.map +0 -1
- package/dist/node_modules/image-size/dist/index.js +0 -942
- package/dist/node_modules/image-size/dist/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generateImageList.d.ts","sourceRoot":"","sources":["../../lib/generate_image_list/generateImageList.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AA8BzD,wBAAsB,iBAAiB,CACrC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACzC,UAAU,EAAE,MAAM,iBAMnB"}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import imageSize from "../node_modules/image-size/dist/index.js";
|
|
2
|
-
import { promises } from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
const IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".avif", ".tiff", ".svg"]);
|
|
5
|
-
async function runCmdAsync(cmd) {
|
|
6
|
-
const subprocess = Bun.spawn(cmd, { stdio: ["inherit", "inherit", "inherit"] });
|
|
7
|
-
await subprocess.exited;
|
|
8
|
-
}
|
|
9
|
-
function getMimeType(ext) {
|
|
10
|
-
switch (ext) {
|
|
11
|
-
case ".jpg":
|
|
12
|
-
case ".jpeg":
|
|
13
|
-
return "image/jpeg";
|
|
14
|
-
case ".png":
|
|
15
|
-
return "image/png";
|
|
16
|
-
case ".gif":
|
|
17
|
-
return "image/gif";
|
|
18
|
-
case ".webp":
|
|
19
|
-
return "image/webp";
|
|
20
|
-
case ".avif":
|
|
21
|
-
return "image/avif";
|
|
22
|
-
case ".tiff":
|
|
23
|
-
return "image/tiff";
|
|
24
|
-
case ".svg":
|
|
25
|
-
return "image/svg+xml";
|
|
26
|
-
default:
|
|
27
|
-
return "application/octet-stream";
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async function generateImageList(imageDirectory, existingImages, outputPath) {
|
|
31
|
-
const imageMap = await processImageFiles(imageDirectory, existingImages);
|
|
32
|
-
const sorted = sortImageMap(imageMap);
|
|
33
|
-
await writeGeneratedImagesFile(sorted, outputPath);
|
|
34
|
-
await formatGeneratedImagesCodeFile(outputPath);
|
|
35
|
-
}
|
|
36
|
-
async function writeGeneratedImagesFile(imageMap, outputPath) {
|
|
37
|
-
const outputContent = `
|
|
38
|
-
import type { ImageType } from "~ui/static/img/ImageType"
|
|
39
|
-
// Auto-generated, manual changes will be lost
|
|
40
|
-
export const imageList = ${JSON.stringify(imageMap, null, 2)} as const satisfies Record<string, ImageType>;
|
|
41
|
-
`;
|
|
42
|
-
await Bun.write(outputPath, outputContent);
|
|
43
|
-
console.log(`Generated ${Object.keys(imageMap).length} images to ${outputPath}`);
|
|
44
|
-
}
|
|
45
|
-
async function processImageFiles(directory, existingImages) {
|
|
46
|
-
const imageMap = {};
|
|
47
|
-
for await (const filePath of walkDirectory(directory)) {
|
|
48
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
49
|
-
if (!IMAGE_EXTENSIONS.has(ext)) {
|
|
50
|
-
console.log("ignoring " + ext, filePath);
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
try {
|
|
54
|
-
const buffer = await promises.readFile(filePath);
|
|
55
|
-
const dimensions = imageSize(buffer);
|
|
56
|
-
if (!dimensions.width || !dimensions.height) continue;
|
|
57
|
-
const relativePath = path.relative(directory, filePath);
|
|
58
|
-
const fileName = path.basename(filePath, ext);
|
|
59
|
-
let key = fileName.replace(/-/g, "_");
|
|
60
|
-
if (/^\d/.test(fileName)) {
|
|
61
|
-
key = "i" + key;
|
|
62
|
-
}
|
|
63
|
-
const prevAlt = existingImages[key]?.alt;
|
|
64
|
-
const alt = prevAlt || fileName.replace(/[-_]/g, " ");
|
|
65
|
-
const mimeType = getMimeType(ext);
|
|
66
|
-
imageMap[key] = {
|
|
67
|
-
path: relativePath,
|
|
68
|
-
width: dimensions.width,
|
|
69
|
-
height: dimensions.height,
|
|
70
|
-
alt,
|
|
71
|
-
mimeType
|
|
72
|
-
};
|
|
73
|
-
} catch (error) {
|
|
74
|
-
console.error(`Error processing ${filePath}:`, error);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return imageMap;
|
|
78
|
-
}
|
|
79
|
-
async function* walkDirectory(dir) {
|
|
80
|
-
const entries = await promises.readdir(dir, { withFileTypes: true });
|
|
81
|
-
for (const entry of entries) {
|
|
82
|
-
const fullPath = path.join(dir, entry.name);
|
|
83
|
-
if (entry.isDirectory()) {
|
|
84
|
-
yield* walkDirectory(fullPath);
|
|
85
|
-
} else if (entry.isFile()) {
|
|
86
|
-
yield fullPath;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
function sortImageMap(m) {
|
|
91
|
-
return Object.keys(m).sort().reduce(
|
|
92
|
-
(sorted, key) => {
|
|
93
|
-
sorted[key] = m[key];
|
|
94
|
-
return sorted;
|
|
95
|
-
},
|
|
96
|
-
{}
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
async function formatGeneratedImagesCodeFile(outputPath) {
|
|
100
|
-
const cmd = `bun run biome check --write ${outputPath}`.split(" ");
|
|
101
|
-
await runCmdAsync(cmd);
|
|
102
|
-
}
|
|
103
|
-
export {
|
|
104
|
-
generateImageList
|
|
105
|
-
};
|
|
106
|
-
//# sourceMappingURL=generateImageList.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generateImageList.js","sources":["../../lib/generate_image_list/generateImageList.ts"],"sourcesContent":["import imageSize from \"image-size\"\nimport { promises as fs } from \"node:fs\"\nimport path from \"node:path\"\nimport type { ImageType } from \"~ui/static/img/ImageType\"\nconst IMAGE_EXTENSIONS = new Set([\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".avif\", \".tiff\", \".svg\"])\n\nasync function runCmdAsync(cmd: string[]): Promise<void> {\n const subprocess = Bun.spawn(cmd, { stdio: [\"inherit\", \"inherit\", \"inherit\"] })\n await subprocess.exited\n}\n\nfunction getMimeType(ext: string): string {\n switch (ext) {\n case \".jpg\":\n case \".jpeg\":\n return \"image/jpeg\"\n case \".png\":\n return \"image/png\"\n case \".gif\":\n return \"image/gif\"\n case \".webp\":\n return \"image/webp\"\n case \".avif\":\n return \"image/avif\"\n case \".tiff\":\n return \"image/tiff\"\n case \".svg\":\n return \"image/svg+xml\"\n default:\n return \"application/octet-stream\"\n }\n}\n\nexport async function generateImageList(\n imageDirectory: string,\n existingImages: Record<string, ImageType>,\n outputPath: string,\n) {\n const imageMap = await processImageFiles(imageDirectory, existingImages)\n const sorted = sortImageMap(imageMap)\n await writeGeneratedImagesFile(sorted, outputPath)\n await formatGeneratedImagesCodeFile(outputPath)\n}\n\nasync function writeGeneratedImagesFile(imageMap: Record<string, ImageType>, outputPath: string): Promise<void> {\n const outputContent = `\n import type { ImageType } from \"~ui/static/img/ImageType\"\n // Auto-generated, manual changes will be lost\nexport const imageList = ${JSON.stringify(imageMap, null, 2)} as const satisfies Record<string, ImageType>;\n`\n await Bun.write(outputPath, outputContent)\n console.log(`Generated ${Object.keys(imageMap).length} images to ${outputPath}`)\n}\n\nasync function processImageFiles(\n directory: string,\n existingImages: Record<string, any>,\n): Promise<Record<string, ImageType>> {\n const imageMap: Record<string, ImageType> = {}\n\n for await (const filePath of walkDirectory(directory)) {\n const ext = path.extname(filePath).toLowerCase()\n if (!IMAGE_EXTENSIONS.has(ext)) {\n console.log(\"ignoring \" + ext, filePath)\n continue\n }\n\n try {\n const buffer = await fs.readFile(filePath)\n const dimensions = imageSize(buffer)\n if (!dimensions.width || !dimensions.height) continue\n\n const relativePath = path.relative(directory, filePath)\n const fileName = path.basename(filePath, ext)\n let key = fileName.replace(/-/g, \"_\")\n if (/^\\d/.test(fileName)) {\n key = \"i\" + key\n }\n\n const prevAlt = existingImages[key]?.alt\n const alt = prevAlt || fileName.replace(/[-_]/g, \" \")\n const mimeType = getMimeType(ext)\n\n imageMap[key] = {\n path: relativePath,\n width: dimensions.width,\n height: dimensions.height,\n alt,\n mimeType,\n }\n } catch (error) {\n console.error(`Error processing ${filePath}:`, error)\n }\n }\n\n return imageMap\n}\n\nasync function* walkDirectory(dir: string): AsyncGenerator<string> {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n yield* walkDirectory(fullPath)\n } else if (entry.isFile()) {\n yield fullPath\n }\n }\n}\n\nfunction sortImageMap(m: Record<string, ImageType>): Record<string, ImageType> {\n return Object.keys(m)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = m[key]!\n return sorted\n },\n {} as Record<string, ImageType>,\n )\n }\n\nasync function formatGeneratedImagesCodeFile(outputPath: string) {\n const cmd = `bun run biome check --write ${outputPath}`.split(\" \")\n await runCmdAsync(cmd)\n}\n"],"names":["fs"],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { JSX } from 'solid-js';
|
|
2
|
-
import { SignalObject } from '../../utils/createSignalObject';
|
|
3
|
-
import { MayHaveClassAndChildren } from '../../utils/MayHaveClassAndChildren';
|
|
4
|
-
export interface SidebarLayoutProps extends MayHaveClassAndChildren {
|
|
5
|
-
isOpenSignal?: SignalObject<boolean>;
|
|
6
|
-
isMobileSignal?: SignalObject<boolean>;
|
|
7
|
-
sidebar: JSX.Element;
|
|
8
|
-
navbar?: JSX.Element;
|
|
9
|
-
children: JSX.Element;
|
|
10
|
-
navbarClass?: string;
|
|
11
|
-
sidebarClass?: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function SidebarLayout(p: SidebarLayoutProps): JSX.Element;
|
|
14
|
-
//# sourceMappingURL=SidebarLayout.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SidebarLayout.d.ts","sourceRoot":"","sources":["../../../lib/interactive/layout/SidebarLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACpF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAEhF,MAAM,WAAW,kBAAmB,SAAQ,uBAAuB;IACjE,YAAY,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IACpC,cAAc,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAEtC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAA;IACrB,WAAW,CAAC,EAAC,MAAM,CAAA;IACnB,YAAY,CAAC,EAAC,MAAM,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,eAoFlD"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { delegateEvents, insert, createComponent, effect, className, setAttribute, template } from "solid-js/web";
|
|
2
|
-
import { Show } from "solid-js";
|
|
3
|
-
import { createSignalObject } from "../../utils/createSignalObject.js";
|
|
4
|
-
var _tmpl$ = /* @__PURE__ */ template(`<div class="fixed inset-0 z-50 lg:hidden"role=dialog aria-modal=true aria-labelledby=mobile-sidebar-title><button type=button class="fixed inset-0 bg-black bg-opacity-50"aria-label="Close sidebar"></button><aside class="fixed inset-y-0 left-0 w-64 bg-gray-800 text-white flex flex-col transform transition-transform duration-300 ease-in-out">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="flex h-screen bg-gray-100 dark:bg-gray-900"><aside></aside><div class="flex-1 flex flex-col"><header class="bg-white dark:bg-gray-800 shadow-sm p-4 flex items-center justify-between"><button type=button aria-label="Open main menu"class="lg:hidden p-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-400"><svg class="w-6 h-6"fill=none stroke=currentColor viewBox="0 0 24 24"><title>Menu</title><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M4 6h16M4 12h16M4 18h16"></path></svg></button><button type=button class="hidden lg:block p-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-400 cursor-pointer"><svg class="w-6 h-6"fill=none stroke=currentColor viewBox="0 0 24 24"><title>Toggle sidebar</title><path stroke-linecap=round stroke-linejoin=round stroke-width=2></path></svg></button></header><main class="flex-1 p-4 overflow-y-auto">`);
|
|
5
|
-
function SidebarLayout(p) {
|
|
6
|
-
const localOpen = p.isOpenSignal ?? createSignalObject(false);
|
|
7
|
-
const localMobile = p.isMobileSignal ?? createSignalObject(false);
|
|
8
|
-
const toggleMobile = () => localOpen.set(!localOpen.get());
|
|
9
|
-
return (() => {
|
|
10
|
-
var _el$ = _tmpl$2(), _el$2 = _el$.firstChild, _el$6 = _el$2.nextSibling, _el$7 = _el$6.firstChild, _el$8 = _el$7.firstChild, _el$9 = _el$8.nextSibling, _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling, _el$11 = _el$7.nextSibling;
|
|
11
|
-
insert(_el$2, () => p.sidebar);
|
|
12
|
-
insert(_el$, createComponent(Show, {
|
|
13
|
-
get when() {
|
|
14
|
-
return localMobile.get();
|
|
15
|
-
},
|
|
16
|
-
get children() {
|
|
17
|
-
var _el$3 = _tmpl$(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
|
|
18
|
-
_el$4.$$click = toggleMobile;
|
|
19
|
-
insert(_el$5, () => p.sidebar);
|
|
20
|
-
return _el$3;
|
|
21
|
-
}
|
|
22
|
-
}), _el$6);
|
|
23
|
-
_el$8.$$click = toggleMobile;
|
|
24
|
-
_el$9.$$click = () => localOpen.set(!localOpen.get());
|
|
25
|
-
insert(_el$7, () => p.navbar, null);
|
|
26
|
-
insert(_el$11, () => p.children);
|
|
27
|
-
effect((_p$) => {
|
|
28
|
-
var _v$ = `hidden lg:flex flex-col bg-gray-800 text-white transition-all duration-300 ease-in-out ${localOpen.get() ? "w-64" : "w-20"}`, _v$2 = localMobile.get(), _v$3 = localOpen.get() ? "Collapse sidebar" : "Expand sidebar", _v$4 = localOpen.get() ? "M11 19l-7-7 7-7m8 14l-7-7 7-7" : "M13 5l7 7-7 7M5 5l7 7-7 7";
|
|
29
|
-
_v$ !== _p$.e && className(_el$2, _p$.e = _v$);
|
|
30
|
-
_v$2 !== _p$.t && setAttribute(_el$8, "aria-expanded", _p$.t = _v$2);
|
|
31
|
-
_v$3 !== _p$.a && setAttribute(_el$9, "aria-label", _p$.a = _v$3);
|
|
32
|
-
_v$4 !== _p$.o && setAttribute(_el$10, "d", _p$.o = _v$4);
|
|
33
|
-
return _p$;
|
|
34
|
-
}, {
|
|
35
|
-
e: void 0,
|
|
36
|
-
t: void 0,
|
|
37
|
-
a: void 0,
|
|
38
|
-
o: void 0
|
|
39
|
-
});
|
|
40
|
-
return _el$;
|
|
41
|
-
})();
|
|
42
|
-
}
|
|
43
|
-
delegateEvents(["click"]);
|
|
44
|
-
export {
|
|
45
|
-
SidebarLayout
|
|
46
|
-
};
|
|
47
|
-
//# sourceMappingURL=SidebarLayout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SidebarLayout.js","sources":["../../../lib/interactive/layout/SidebarLayout.tsx"],"sourcesContent":["import { JSX, Show } from \"solid-js\"\nimport { createSignalObject, type SignalObject } from \"~ui/utils/createSignalObject\"\nimport type { MayHaveClassAndChildren } from \"~ui/utils/MayHaveClassAndChildren\"\n\nexport interface SidebarLayoutProps extends MayHaveClassAndChildren {\n isOpenSignal?: SignalObject<boolean>\n isMobileSignal?: SignalObject<boolean>\n\n sidebar: JSX.Element\n navbar?: JSX.Element\n children: JSX.Element\n navbarClass?:string\n sidebarClass?:string\n}\n\nexport function SidebarLayout(p: SidebarLayoutProps) {\n const localOpen = p.isOpenSignal ?? createSignalObject(false)\n const localMobile = p.isMobileSignal ?? createSignalObject(false)\n const toggleMobile = () => localOpen.set(!localOpen.get())\n\n return (\n <div class=\"flex h-screen bg-gray-100 dark:bg-gray-900\">\n {/* Desktop Sidebar - always present, collapsible on lg+ */}\n <aside\n class={`hidden lg:flex flex-col bg-gray-800 text-white transition-all duration-300 ease-in-out ${\n localOpen.get() ? \"w-64\" : \"w-20\"\n }`}\n >\n {p.sidebar}\n </aside>\n\n {/* Mobile Drawer */}\n <Show when={localMobile.get()}>\n <div\n class=\"fixed inset-0 z-50 lg:hidden\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mobile-sidebar-title\"\n >\n {/* Backdrop */}\n <button\n type=\"button\"\n class=\"fixed inset-0 bg-black bg-opacity-50\"\n onClick={toggleMobile}\n aria-label=\"Close sidebar\"\n />\n\n {/* Mobile Sidebar Panel */}\n <aside class=\"fixed inset-y-0 left-0 w-64 bg-gray-800 text-white flex flex-col transform transition-transform duration-300 ease-in-out\">\n {p.sidebar}\n </aside>\n </div>\n </Show>\n\n {/* Main Content Area */}\n <div class=\"flex-1 flex flex-col\">\n {/* Header/Navbar */}\n <header class=\"bg-white dark:bg-gray-800 shadow-sm p-4 flex items-center justify-between\">\n {/* Mobile Menu Button */}\n <button\n type=\"button\"\n onClick={toggleMobile}\n aria-label=\"Open main menu\"\n aria-expanded={localMobile.get()}\n class=\"lg:hidden p-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-400\"\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <title>Menu</title>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n\n {/* Desktop Sidebar Toggle */}\n <button\n type=\"button\"\n onClick={() => localOpen.set(!localOpen.get())}\n class=\"hidden lg:block p-2 rounded hover:bg-gray-200 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-400 cursor-pointer\"\n aria-label={localOpen.get() ? \"Collapse sidebar\" : \"Expand sidebar\"}\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <title>Toggle sidebar</title>\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d={localOpen.get() ? \"M11 19l-7-7 7-7m8 14l-7-7 7-7\" : \"M13 5l7 7-7 7M5 5l7 7-7 7\"}\n />\n </svg>\n </button>\n\n {/* Custom Navbar Content */}\n {p.navbar}\n </header>\n\n {/* Main Content */}\n <main class=\"flex-1 p-4 overflow-y-auto\">{p.children}</main>\n </div>\n </div>\n )\n}\n"],"names":["SidebarLayout","p","localOpen","isOpenSignal","createSignalObject","localMobile","isMobileSignal","toggleMobile","set","get","_el$","_tmpl$2","_el$2","firstChild","_el$6","nextSibling","_el$7","_el$8","_el$9","_el$0","_el$1","_el$10","_el$11","_$insert","sidebar","_$createComponent","Show","when","children","_el$3","_tmpl$","_el$4","_el$5","$$click","navbar","_$effect","_p$","_v$","_v$2","_v$3","_v$4","e","_$className","t","_$setAttribute","a","o","undefined","_$delegateEvents"],"mappings":";;;;AAeO,SAASA,cAAcC,GAAuB;AACnD,QAAMC,YAAYD,EAAEE,gBAAgBC,mBAAmB,KAAK;AAC5D,QAAMC,cAAcJ,EAAEK,kBAAkBF,mBAAmB,KAAK;AAChE,QAAMG,eAAeA,MAAML,UAAUM,IAAI,CAACN,UAAUO,KAAK;AAEzD,UAAA,MAAA;AAAA,QAAAC,OAAAC,QAAAA,GAAAC,QAAAF,KAAAG,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAD,YAAAI,QAAAD,MAAAH,YAAAK,QAAAD,MAAAF,aAAAI,QAAAD,MAAAL,YAAAO,QAAAD,MAAAN,YAAAQ,SAAAD,MAAAL,aAAAO,SAAAN,MAAAD;AAAAQ,WAAAX,OAAA,MAQOX,EAAEuB,OAAO;AAAAD,WAAAb,MAAAe,gBAIXC,MAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEtB,YAAYI,IAAAA;AAAAA,MAAK;AAAA,MAAA,IAAAmB,WAAA;AAAA,YAAAC,QAAAC,OAAAA,GAAAC,QAAAF,MAAAhB,YAAAmB,QAAAD,MAAAhB;AAAAgB,cAAAE,UAWd1B;AAAYgB,eAAAS,OAAA,MAMpB/B,EAAEuB,OAAO;AAAA,eAAAK;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,KAAA;AAAAG,UAAAgB,UAYD1B;AAAYW,UAAAe,UAcZ,MAAM/B,UAAUM,IAAI,CAACN,UAAUO,KAAK;AAACc,WAAAP,OAAA,MAgB/Cf,EAAEiC,QAAM,IAAA;AAAAX,WAAAD,QAAA,MAI+BrB,EAAE2B,QAAQ;AAAAO,WAAAC,CAAAA,QAAA;AAAA,UAAAC,MAvE7C,0FACLnC,UAAUO,IAAAA,IAAQ,SAAS,MAAM,IACjC6B,OAqCiBjC,YAAYI,OAAK8B,OAcpBrC,UAAUO,QAAQ,qBAAqB,kBAAgB+B,OAQ5DtC,UAAUO,QAAQ,kCAAkC;AAA2B4B,cAAAD,IAAAK,KAAAC,UAAA9B,OAAAwB,IAAAK,IAAAJ,GAAA;AAAAC,eAAAF,IAAAO,KAAAC,aAAA3B,OAAA,iBAAAmB,IAAAO,IAAAL,IAAA;AAAAC,eAAAH,IAAAS,KAAAD,aAAA1B,OAAA,cAAAkB,IAAAS,IAAAN,IAAA;AAAAC,eAAAJ,IAAAU,KAAAF,aAAAvB,QAAA,KAAAe,IAAAU,IAAAN,IAAA;AAAA,aAAAJ;AAAAA,IAAA,GAAA;AAAA,MAAAK,GAAAM;AAAAA,MAAAJ,GAAAI;AAAAA,MAAAF,GAAAE;AAAAA,MAAAD,GAAAC;AAAAA,IAAAA,CAAA;AAAA,WAAArC;AAAAA,EAAA,GAAA;AAclG;AAACsC,eAAA,CAAA,OAAA,CAAA;"}
|
|
@@ -1,942 +0,0 @@
|
|
|
1
|
-
var decoder = new TextDecoder();
|
|
2
|
-
var toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));
|
|
3
|
-
var toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), "");
|
|
4
|
-
var getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);
|
|
5
|
-
var readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);
|
|
6
|
-
var readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);
|
|
7
|
-
var readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);
|
|
8
|
-
var readUInt24LE = (input, offset = 0) => {
|
|
9
|
-
const view = getView(input, offset);
|
|
10
|
-
return view.getUint16(0, true) + (view.getUint8(2) << 16);
|
|
11
|
-
};
|
|
12
|
-
var readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);
|
|
13
|
-
var readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);
|
|
14
|
-
var readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);
|
|
15
|
-
var readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);
|
|
16
|
-
var methods = {
|
|
17
|
-
readUInt16BE,
|
|
18
|
-
readUInt16LE,
|
|
19
|
-
readUInt32BE,
|
|
20
|
-
readUInt32LE
|
|
21
|
-
};
|
|
22
|
-
function readUInt(input, bits, offset = 0, isBigEndian = false) {
|
|
23
|
-
const endian = isBigEndian ? "BE" : "LE";
|
|
24
|
-
const methodName = `readUInt${bits}${endian}`;
|
|
25
|
-
return methods[methodName](input, offset);
|
|
26
|
-
}
|
|
27
|
-
function readBox(input, offset) {
|
|
28
|
-
if (input.length - offset < 4) return;
|
|
29
|
-
const boxSize = readUInt32BE(input, offset);
|
|
30
|
-
if (input.length - offset < boxSize) return;
|
|
31
|
-
return {
|
|
32
|
-
name: toUTF8String(input, 4 + offset, 8 + offset),
|
|
33
|
-
offset,
|
|
34
|
-
size: boxSize
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function findBox(input, boxName, currentOffset) {
|
|
38
|
-
while (currentOffset < input.length) {
|
|
39
|
-
const box = readBox(input, currentOffset);
|
|
40
|
-
if (!box) break;
|
|
41
|
-
if (box.name === boxName) return box;
|
|
42
|
-
currentOffset += box.size > 0 ? box.size : 8;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
var BMP = {
|
|
46
|
-
validate: (input) => toUTF8String(input, 0, 2) === "BM",
|
|
47
|
-
calculate: (input) => ({
|
|
48
|
-
height: Math.abs(readInt32LE(input, 22)),
|
|
49
|
-
width: readUInt32LE(input, 18)
|
|
50
|
-
})
|
|
51
|
-
};
|
|
52
|
-
var TYPE_ICON = 1;
|
|
53
|
-
var SIZE_HEADER = 2 + 2 + 2;
|
|
54
|
-
var SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;
|
|
55
|
-
function getSizeFromOffset(input, offset) {
|
|
56
|
-
const value = input[offset];
|
|
57
|
-
return value === 0 ? 256 : value;
|
|
58
|
-
}
|
|
59
|
-
function getImageSize(input, imageIndex) {
|
|
60
|
-
const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;
|
|
61
|
-
return {
|
|
62
|
-
height: getSizeFromOffset(input, offset + 1),
|
|
63
|
-
width: getSizeFromOffset(input, offset)
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
var ICO = {
|
|
67
|
-
validate(input) {
|
|
68
|
-
const reserved = readUInt16LE(input, 0);
|
|
69
|
-
const imageCount = readUInt16LE(input, 4);
|
|
70
|
-
if (reserved !== 0 || imageCount === 0) return false;
|
|
71
|
-
const imageType = readUInt16LE(input, 2);
|
|
72
|
-
return imageType === 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) {
|
|
80
|
-
images.push(getImageSize(input, imageIndex));
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
width: imageSize2.width,
|
|
84
|
-
height: imageSize2.height,
|
|
85
|
-
images
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
var TYPE_CURSOR = 2;
|
|
90
|
-
var CUR = {
|
|
91
|
-
validate(input) {
|
|
92
|
-
const reserved = readUInt16LE(input, 0);
|
|
93
|
-
const imageCount = readUInt16LE(input, 4);
|
|
94
|
-
if (reserved !== 0 || imageCount === 0) return false;
|
|
95
|
-
const imageType = readUInt16LE(input, 2);
|
|
96
|
-
return imageType === TYPE_CURSOR;
|
|
97
|
-
},
|
|
98
|
-
calculate: (input) => ICO.calculate(input)
|
|
99
|
-
};
|
|
100
|
-
var DDS = {
|
|
101
|
-
validate: (input) => readUInt32LE(input, 0) === 542327876,
|
|
102
|
-
calculate: (input) => ({
|
|
103
|
-
height: readUInt32LE(input, 12),
|
|
104
|
-
width: readUInt32LE(input, 16)
|
|
105
|
-
})
|
|
106
|
-
};
|
|
107
|
-
var gifRegexp = /^GIF8[79]a/;
|
|
108
|
-
var GIF = {
|
|
109
|
-
validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),
|
|
110
|
-
calculate: (input) => ({
|
|
111
|
-
height: readUInt16LE(input, 8),
|
|
112
|
-
width: readUInt16LE(input, 6)
|
|
113
|
-
})
|
|
114
|
-
};
|
|
115
|
-
var brandMap = {
|
|
116
|
-
avif: "avif",
|
|
117
|
-
mif1: "heif",
|
|
118
|
-
msf1: "heif",
|
|
119
|
-
// heif-sequence
|
|
120
|
-
heic: "heic",
|
|
121
|
-
heix: "heic",
|
|
122
|
-
hevc: "heic",
|
|
123
|
-
// heic-sequence
|
|
124
|
-
hevx: "heic"
|
|
125
|
-
// heic-sequence
|
|
126
|
-
};
|
|
127
|
-
var HEIF = {
|
|
128
|
-
validate(input) {
|
|
129
|
-
const boxType = toUTF8String(input, 4, 8);
|
|
130
|
-
if (boxType !== "ftyp") return false;
|
|
131
|
-
const ftypBox = findBox(input, "ftyp", 0);
|
|
132
|
-
if (!ftypBox) return false;
|
|
133
|
-
const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);
|
|
134
|
-
return brand in brandMap;
|
|
135
|
-
},
|
|
136
|
-
calculate(input) {
|
|
137
|
-
const metaBox = findBox(input, "meta", 0);
|
|
138
|
-
const iprpBox = metaBox && findBox(input, "iprp", metaBox.offset + 12);
|
|
139
|
-
const ipcoBox = iprpBox && findBox(input, "ipco", iprpBox.offset + 8);
|
|
140
|
-
if (!ipcoBox) {
|
|
141
|
-
throw new TypeError("Invalid HEIF, no ipco box found");
|
|
142
|
-
}
|
|
143
|
-
const type = toUTF8String(input, 8, 12);
|
|
144
|
-
const images = [];
|
|
145
|
-
let currentOffset = ipcoBox.offset + 8;
|
|
146
|
-
while (currentOffset < ipcoBox.offset + ipcoBox.size) {
|
|
147
|
-
const ispeBox = findBox(input, "ispe", currentOffset);
|
|
148
|
-
if (!ispeBox) break;
|
|
149
|
-
const rawWidth = readUInt32BE(input, ispeBox.offset + 12);
|
|
150
|
-
const rawHeight = readUInt32BE(input, ispeBox.offset + 16);
|
|
151
|
-
const clapBox = findBox(input, "clap", currentOffset);
|
|
152
|
-
let width = rawWidth;
|
|
153
|
-
let height = rawHeight;
|
|
154
|
-
if (clapBox && clapBox.offset < ipcoBox.offset + ipcoBox.size) {
|
|
155
|
-
const cropRight = readUInt32BE(input, clapBox.offset + 12);
|
|
156
|
-
width = rawWidth - cropRight;
|
|
157
|
-
}
|
|
158
|
-
images.push({ height, width });
|
|
159
|
-
currentOffset = ispeBox.offset + ispeBox.size;
|
|
160
|
-
}
|
|
161
|
-
if (images.length === 0) {
|
|
162
|
-
throw new TypeError("Invalid HEIF, no sizes found");
|
|
163
|
-
}
|
|
164
|
-
return {
|
|
165
|
-
width: images[0].width,
|
|
166
|
-
height: images[0].height,
|
|
167
|
-
type,
|
|
168
|
-
...images.length > 1 ? { images } : {}
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
var SIZE_HEADER2 = 4 + 4;
|
|
173
|
-
var FILE_LENGTH_OFFSET = 4;
|
|
174
|
-
var ENTRY_LENGTH_OFFSET = 4;
|
|
175
|
-
var ICON_TYPE_SIZE = {
|
|
176
|
-
ICON: 32,
|
|
177
|
-
"ICN#": 32,
|
|
178
|
-
// m => 16 x 16
|
|
179
|
-
"icm#": 16,
|
|
180
|
-
icm4: 16,
|
|
181
|
-
icm8: 16,
|
|
182
|
-
// s => 16 x 16
|
|
183
|
-
"ics#": 16,
|
|
184
|
-
ics4: 16,
|
|
185
|
-
ics8: 16,
|
|
186
|
-
is32: 16,
|
|
187
|
-
s8mk: 16,
|
|
188
|
-
icp4: 16,
|
|
189
|
-
// l => 32 x 32
|
|
190
|
-
icl4: 32,
|
|
191
|
-
icl8: 32,
|
|
192
|
-
il32: 32,
|
|
193
|
-
l8mk: 32,
|
|
194
|
-
icp5: 32,
|
|
195
|
-
ic11: 32,
|
|
196
|
-
// h => 48 x 48
|
|
197
|
-
ich4: 48,
|
|
198
|
-
ich8: 48,
|
|
199
|
-
ih32: 48,
|
|
200
|
-
h8mk: 48,
|
|
201
|
-
// . => 64 x 64
|
|
202
|
-
icp6: 64,
|
|
203
|
-
ic12: 32,
|
|
204
|
-
// t => 128 x 128
|
|
205
|
-
it32: 128,
|
|
206
|
-
t8mk: 128,
|
|
207
|
-
ic07: 128,
|
|
208
|
-
// . => 256 x 256
|
|
209
|
-
ic08: 256,
|
|
210
|
-
ic13: 256,
|
|
211
|
-
// . => 512 x 512
|
|
212
|
-
ic09: 512,
|
|
213
|
-
ic14: 512,
|
|
214
|
-
// . => 1024 x 1024
|
|
215
|
-
ic10: 1024
|
|
216
|
-
};
|
|
217
|
-
function readImageHeader(input, imageOffset) {
|
|
218
|
-
const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;
|
|
219
|
-
return [
|
|
220
|
-
toUTF8String(input, imageOffset, imageLengthOffset),
|
|
221
|
-
readUInt32BE(input, imageLengthOffset)
|
|
222
|
-
];
|
|
223
|
-
}
|
|
224
|
-
function getImageSize2(type) {
|
|
225
|
-
const size = ICON_TYPE_SIZE[type];
|
|
226
|
-
return { width: size, height: size, type };
|
|
227
|
-
}
|
|
228
|
-
var ICNS = {
|
|
229
|
-
validate: (input) => toUTF8String(input, 0, 4) === "icns",
|
|
230
|
-
calculate(input) {
|
|
231
|
-
const inputLength = input.length;
|
|
232
|
-
const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);
|
|
233
|
-
let imageOffset = SIZE_HEADER2;
|
|
234
|
-
const images = [];
|
|
235
|
-
while (imageOffset < fileLength && imageOffset < inputLength) {
|
|
236
|
-
const imageHeader = readImageHeader(input, imageOffset);
|
|
237
|
-
const imageSize2 = getImageSize2(imageHeader[0]);
|
|
238
|
-
images.push(imageSize2);
|
|
239
|
-
imageOffset += imageHeader[1];
|
|
240
|
-
}
|
|
241
|
-
if (images.length === 0) {
|
|
242
|
-
throw new TypeError("Invalid ICNS, no sizes found");
|
|
243
|
-
}
|
|
244
|
-
return {
|
|
245
|
-
width: images[0].width,
|
|
246
|
-
height: images[0].height,
|
|
247
|
-
...images.length > 1 ? { images } : {}
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
var J2C = {
|
|
252
|
-
// TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC
|
|
253
|
-
validate: (input) => readUInt32BE(input, 0) === 4283432785,
|
|
254
|
-
calculate: (input) => ({
|
|
255
|
-
height: readUInt32BE(input, 12),
|
|
256
|
-
width: readUInt32BE(input, 8)
|
|
257
|
-
})
|
|
258
|
-
};
|
|
259
|
-
var JP2 = {
|
|
260
|
-
validate(input) {
|
|
261
|
-
const boxType = toUTF8String(input, 4, 8);
|
|
262
|
-
if (boxType !== "jP ") return false;
|
|
263
|
-
const ftypBox = findBox(input, "ftyp", 0);
|
|
264
|
-
if (!ftypBox) return false;
|
|
265
|
-
const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);
|
|
266
|
-
return brand === "jp2 ";
|
|
267
|
-
},
|
|
268
|
-
calculate(input) {
|
|
269
|
-
const jp2hBox = findBox(input, "jp2h", 0);
|
|
270
|
-
const ihdrBox = jp2hBox && findBox(input, "ihdr", jp2hBox.offset + 8);
|
|
271
|
-
if (ihdrBox) {
|
|
272
|
-
return {
|
|
273
|
-
height: readUInt32BE(input, ihdrBox.offset + 8),
|
|
274
|
-
width: readUInt32BE(input, ihdrBox.offset + 12)
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
throw new TypeError("Unsupported JPEG 2000 format");
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
var EXIF_MARKER = "45786966";
|
|
281
|
-
var APP1_DATA_SIZE_BYTES = 2;
|
|
282
|
-
var EXIF_HEADER_BYTES = 6;
|
|
283
|
-
var TIFF_BYTE_ALIGN_BYTES = 2;
|
|
284
|
-
var BIG_ENDIAN_BYTE_ALIGN = "4d4d";
|
|
285
|
-
var LITTLE_ENDIAN_BYTE_ALIGN = "4949";
|
|
286
|
-
var IDF_ENTRY_BYTES = 12;
|
|
287
|
-
var NUM_DIRECTORY_ENTRIES_BYTES = 2;
|
|
288
|
-
function isEXIF(input) {
|
|
289
|
-
return toHexString(input, 2, 6) === EXIF_MARKER;
|
|
290
|
-
}
|
|
291
|
-
function extractSize(input, index) {
|
|
292
|
-
return {
|
|
293
|
-
height: readUInt16BE(input, index),
|
|
294
|
-
width: readUInt16BE(input, index + 2)
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
function extractOrientation(exifBlock, isBigEndian) {
|
|
298
|
-
const idfOffset = 8;
|
|
299
|
-
const offset = EXIF_HEADER_BYTES + idfOffset;
|
|
300
|
-
const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);
|
|
301
|
-
for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {
|
|
302
|
-
const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES;
|
|
303
|
-
const end = start + IDF_ENTRY_BYTES;
|
|
304
|
-
if (start > exifBlock.length) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
const block = exifBlock.slice(start, end);
|
|
308
|
-
const tagNumber = readUInt(block, 16, 0, isBigEndian);
|
|
309
|
-
if (tagNumber === 274) {
|
|
310
|
-
const dataFormat = readUInt(block, 16, 2, isBigEndian);
|
|
311
|
-
if (dataFormat !== 3) {
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
const numberOfComponents = readUInt(block, 32, 4, isBigEndian);
|
|
315
|
-
if (numberOfComponents !== 1) {
|
|
316
|
-
return;
|
|
317
|
-
}
|
|
318
|
-
return readUInt(block, 16, 8, isBigEndian);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
function validateExifBlock(input, index) {
|
|
323
|
-
const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);
|
|
324
|
-
const byteAlign = toHexString(
|
|
325
|
-
exifBlock,
|
|
326
|
-
EXIF_HEADER_BYTES,
|
|
327
|
-
EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES
|
|
328
|
-
);
|
|
329
|
-
const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;
|
|
330
|
-
const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;
|
|
331
|
-
if (isBigEndian || isLittleEndian) {
|
|
332
|
-
return extractOrientation(exifBlock, isBigEndian);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
function validateInput(input, index) {
|
|
336
|
-
if (index > input.length) {
|
|
337
|
-
throw new TypeError("Corrupt JPG, exceeded buffer limits");
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
var JPG = {
|
|
341
|
-
validate: (input) => toHexString(input, 0, 2) === "ffd8",
|
|
342
|
-
calculate(_input) {
|
|
343
|
-
let input = _input.slice(4);
|
|
344
|
-
let orientation;
|
|
345
|
-
let next;
|
|
346
|
-
while (input.length) {
|
|
347
|
-
const i = readUInt16BE(input, 0);
|
|
348
|
-
validateInput(input, i);
|
|
349
|
-
if (input[i] !== 255) {
|
|
350
|
-
input = input.slice(1);
|
|
351
|
-
continue;
|
|
352
|
-
}
|
|
353
|
-
if (isEXIF(input)) {
|
|
354
|
-
orientation = validateExifBlock(input, i);
|
|
355
|
-
}
|
|
356
|
-
next = input[i + 1];
|
|
357
|
-
if (next === 192 || next === 193 || next === 194) {
|
|
358
|
-
const size = extractSize(input, i + 5);
|
|
359
|
-
if (!orientation) {
|
|
360
|
-
return size;
|
|
361
|
-
}
|
|
362
|
-
return {
|
|
363
|
-
height: size.height,
|
|
364
|
-
orientation,
|
|
365
|
-
width: size.width
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
input = input.slice(i + 2);
|
|
369
|
-
}
|
|
370
|
-
throw new TypeError("Invalid JPG, no size found");
|
|
371
|
-
}
|
|
372
|
-
};
|
|
373
|
-
var BitReader = class {
|
|
374
|
-
constructor(input, endianness) {
|
|
375
|
-
this.input = input;
|
|
376
|
-
this.endianness = endianness;
|
|
377
|
-
this.byteOffset = 2;
|
|
378
|
-
this.bitOffset = 0;
|
|
379
|
-
}
|
|
380
|
-
/** Reads a specified number of bits, and move the offset */
|
|
381
|
-
getBits(length = 1) {
|
|
382
|
-
let result = 0;
|
|
383
|
-
let bitsRead = 0;
|
|
384
|
-
while (bitsRead < length) {
|
|
385
|
-
if (this.byteOffset >= this.input.length) {
|
|
386
|
-
throw new Error("Reached end of input");
|
|
387
|
-
}
|
|
388
|
-
const currentByte = this.input[this.byteOffset];
|
|
389
|
-
const bitsLeft = 8 - this.bitOffset;
|
|
390
|
-
const bitsToRead = Math.min(length - bitsRead, bitsLeft);
|
|
391
|
-
if (this.endianness === "little-endian") {
|
|
392
|
-
const mask = (1 << bitsToRead) - 1;
|
|
393
|
-
const bits = currentByte >> this.bitOffset & mask;
|
|
394
|
-
result |= bits << bitsRead;
|
|
395
|
-
} else {
|
|
396
|
-
const mask = (1 << bitsToRead) - 1 << 8 - this.bitOffset - bitsToRead;
|
|
397
|
-
const bits = (currentByte & mask) >> 8 - this.bitOffset - bitsToRead;
|
|
398
|
-
result = result << bitsToRead | bits;
|
|
399
|
-
}
|
|
400
|
-
bitsRead += bitsToRead;
|
|
401
|
-
this.bitOffset += bitsToRead;
|
|
402
|
-
if (this.bitOffset === 8) {
|
|
403
|
-
this.byteOffset++;
|
|
404
|
-
this.bitOffset = 0;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
return result;
|
|
408
|
-
}
|
|
409
|
-
};
|
|
410
|
-
function calculateImageDimension(reader, isSmallImage) {
|
|
411
|
-
if (isSmallImage) {
|
|
412
|
-
return 8 * (1 + reader.getBits(5));
|
|
413
|
-
}
|
|
414
|
-
const sizeClass = reader.getBits(2);
|
|
415
|
-
const extraBits = [9, 13, 18, 30][sizeClass];
|
|
416
|
-
return 1 + reader.getBits(extraBits);
|
|
417
|
-
}
|
|
418
|
-
function calculateImageWidth(reader, isSmallImage, widthMode, height) {
|
|
419
|
-
if (isSmallImage && widthMode === 0) {
|
|
420
|
-
return 8 * (1 + reader.getBits(5));
|
|
421
|
-
}
|
|
422
|
-
if (widthMode === 0) {
|
|
423
|
-
return calculateImageDimension(reader, false);
|
|
424
|
-
}
|
|
425
|
-
const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];
|
|
426
|
-
return Math.floor(height * aspectRatios[widthMode - 1]);
|
|
427
|
-
}
|
|
428
|
-
var JXLStream = {
|
|
429
|
-
validate: (input) => {
|
|
430
|
-
return toHexString(input, 0, 2) === "ff0a";
|
|
431
|
-
},
|
|
432
|
-
calculate(input) {
|
|
433
|
-
const reader = new BitReader(input, "little-endian");
|
|
434
|
-
const isSmallImage = reader.getBits(1) === 1;
|
|
435
|
-
const height = calculateImageDimension(reader, isSmallImage);
|
|
436
|
-
const widthMode = reader.getBits(3);
|
|
437
|
-
const width = calculateImageWidth(reader, isSmallImage, widthMode, height);
|
|
438
|
-
return { width, height };
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
function extractCodestream(input) {
|
|
442
|
-
const jxlcBox = findBox(input, "jxlc", 0);
|
|
443
|
-
if (jxlcBox) {
|
|
444
|
-
return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);
|
|
445
|
-
}
|
|
446
|
-
const partialStreams = extractPartialStreams(input);
|
|
447
|
-
if (partialStreams.length > 0) {
|
|
448
|
-
return concatenateCodestreams(partialStreams);
|
|
449
|
-
}
|
|
450
|
-
return void 0;
|
|
451
|
-
}
|
|
452
|
-
function extractPartialStreams(input) {
|
|
453
|
-
const partialStreams = [];
|
|
454
|
-
let offset = 0;
|
|
455
|
-
while (offset < input.length) {
|
|
456
|
-
const jxlpBox = findBox(input, "jxlp", offset);
|
|
457
|
-
if (!jxlpBox) break;
|
|
458
|
-
partialStreams.push(
|
|
459
|
-
input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size)
|
|
460
|
-
);
|
|
461
|
-
offset = jxlpBox.offset + jxlpBox.size;
|
|
462
|
-
}
|
|
463
|
-
return partialStreams;
|
|
464
|
-
}
|
|
465
|
-
function concatenateCodestreams(partialCodestreams) {
|
|
466
|
-
const totalLength = partialCodestreams.reduce(
|
|
467
|
-
(acc, curr) => acc + curr.length,
|
|
468
|
-
0
|
|
469
|
-
);
|
|
470
|
-
const codestream = new Uint8Array(totalLength);
|
|
471
|
-
let position = 0;
|
|
472
|
-
for (const partial of partialCodestreams) {
|
|
473
|
-
codestream.set(partial, position);
|
|
474
|
-
position += partial.length;
|
|
475
|
-
}
|
|
476
|
-
return codestream;
|
|
477
|
-
}
|
|
478
|
-
var JXL = {
|
|
479
|
-
validate: (input) => {
|
|
480
|
-
const boxType = toUTF8String(input, 4, 8);
|
|
481
|
-
if (boxType !== "JXL ") return false;
|
|
482
|
-
const ftypBox = findBox(input, "ftyp", 0);
|
|
483
|
-
if (!ftypBox) return false;
|
|
484
|
-
const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);
|
|
485
|
-
return brand === "jxl ";
|
|
486
|
-
},
|
|
487
|
-
calculate(input) {
|
|
488
|
-
const codestream = extractCodestream(input);
|
|
489
|
-
if (codestream) return JXLStream.calculate(codestream);
|
|
490
|
-
throw new Error("No codestream found in JXL container");
|
|
491
|
-
}
|
|
492
|
-
};
|
|
493
|
-
var KTX = {
|
|
494
|
-
validate: (input) => {
|
|
495
|
-
const signature = toUTF8String(input, 1, 7);
|
|
496
|
-
return ["KTX 11", "KTX 20"].includes(signature);
|
|
497
|
-
},
|
|
498
|
-
calculate: (input) => {
|
|
499
|
-
const type = input[5] === 49 ? "ktx" : "ktx2";
|
|
500
|
-
const offset = type === "ktx" ? 36 : 20;
|
|
501
|
-
return {
|
|
502
|
-
height: readUInt32LE(input, offset + 4),
|
|
503
|
-
width: readUInt32LE(input, offset),
|
|
504
|
-
type
|
|
505
|
-
};
|
|
506
|
-
}
|
|
507
|
-
};
|
|
508
|
-
var pngSignature = "PNG\r\n\n";
|
|
509
|
-
var pngImageHeaderChunkName = "IHDR";
|
|
510
|
-
var pngFriedChunkName = "CgBI";
|
|
511
|
-
var PNG = {
|
|
512
|
-
validate(input) {
|
|
513
|
-
if (pngSignature === toUTF8String(input, 1, 8)) {
|
|
514
|
-
let chunkName = toUTF8String(input, 12, 16);
|
|
515
|
-
if (chunkName === pngFriedChunkName) {
|
|
516
|
-
chunkName = toUTF8String(input, 28, 32);
|
|
517
|
-
}
|
|
518
|
-
if (chunkName !== pngImageHeaderChunkName) {
|
|
519
|
-
throw new TypeError("Invalid PNG");
|
|
520
|
-
}
|
|
521
|
-
return true;
|
|
522
|
-
}
|
|
523
|
-
return false;
|
|
524
|
-
},
|
|
525
|
-
calculate(input) {
|
|
526
|
-
if (toUTF8String(input, 12, 16) === pngFriedChunkName) {
|
|
527
|
-
return {
|
|
528
|
-
height: readUInt32BE(input, 36),
|
|
529
|
-
width: readUInt32BE(input, 32)
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
return {
|
|
533
|
-
height: readUInt32BE(input, 20),
|
|
534
|
-
width: readUInt32BE(input, 16)
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
};
|
|
538
|
-
var PNMTypes = {
|
|
539
|
-
P1: "pbm/ascii",
|
|
540
|
-
P2: "pgm/ascii",
|
|
541
|
-
P3: "ppm/ascii",
|
|
542
|
-
P4: "pbm",
|
|
543
|
-
P5: "pgm",
|
|
544
|
-
P6: "ppm",
|
|
545
|
-
P7: "pam",
|
|
546
|
-
PF: "pfm"
|
|
547
|
-
};
|
|
548
|
-
var handlers = {
|
|
549
|
-
default: (lines) => {
|
|
550
|
-
let dimensions = [];
|
|
551
|
-
while (lines.length > 0) {
|
|
552
|
-
const line = lines.shift();
|
|
553
|
-
if (line[0] === "#") {
|
|
554
|
-
continue;
|
|
555
|
-
}
|
|
556
|
-
dimensions = line.split(" ");
|
|
557
|
-
break;
|
|
558
|
-
}
|
|
559
|
-
if (dimensions.length === 2) {
|
|
560
|
-
return {
|
|
561
|
-
height: Number.parseInt(dimensions[1], 10),
|
|
562
|
-
width: Number.parseInt(dimensions[0], 10)
|
|
563
|
-
};
|
|
564
|
-
}
|
|
565
|
-
throw new TypeError("Invalid PNM");
|
|
566
|
-
},
|
|
567
|
-
pam: (lines) => {
|
|
568
|
-
const size = {};
|
|
569
|
-
while (lines.length > 0) {
|
|
570
|
-
const line = lines.shift();
|
|
571
|
-
if (line.length > 16 || line.charCodeAt(0) > 128) {
|
|
572
|
-
continue;
|
|
573
|
-
}
|
|
574
|
-
const [key, value] = line.split(" ");
|
|
575
|
-
if (key && value) {
|
|
576
|
-
size[key.toLowerCase()] = Number.parseInt(value, 10);
|
|
577
|
-
}
|
|
578
|
-
if (size.height && size.width) {
|
|
579
|
-
break;
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
if (size.height && size.width) {
|
|
583
|
-
return {
|
|
584
|
-
height: size.height,
|
|
585
|
-
width: size.width
|
|
586
|
-
};
|
|
587
|
-
}
|
|
588
|
-
throw new TypeError("Invalid PAM");
|
|
589
|
-
}
|
|
590
|
-
};
|
|
591
|
-
var PNM = {
|
|
592
|
-
validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,
|
|
593
|
-
calculate(input) {
|
|
594
|
-
const signature = toUTF8String(input, 0, 2);
|
|
595
|
-
const type = PNMTypes[signature];
|
|
596
|
-
const lines = toUTF8String(input, 3).split(/[\r\n]+/);
|
|
597
|
-
const handler = handlers[type] || handlers.default;
|
|
598
|
-
return handler(lines);
|
|
599
|
-
}
|
|
600
|
-
};
|
|
601
|
-
var PSD = {
|
|
602
|
-
validate: (input) => toUTF8String(input, 0, 4) === "8BPS",
|
|
603
|
-
calculate: (input) => ({
|
|
604
|
-
height: readUInt32BE(input, 14),
|
|
605
|
-
width: readUInt32BE(input, 18)
|
|
606
|
-
})
|
|
607
|
-
};
|
|
608
|
-
var svgReg = /<svg\s([^>"']|"[^"]*"|'[^']*')*>/;
|
|
609
|
-
var extractorRegExps = {
|
|
610
|
-
height: /\sheight=(['"])([^%]+?)\1/,
|
|
611
|
-
root: svgReg,
|
|
612
|
-
viewbox: /\sviewBox=(['"])(.+?)\1/i,
|
|
613
|
-
width: /\swidth=(['"])([^%]+?)\1/
|
|
614
|
-
};
|
|
615
|
-
var INCH_CM = 2.54;
|
|
616
|
-
var units = {
|
|
617
|
-
in: 96,
|
|
618
|
-
cm: 96 / INCH_CM,
|
|
619
|
-
em: 16,
|
|
620
|
-
ex: 8,
|
|
621
|
-
m: 96 / INCH_CM * 100,
|
|
622
|
-
mm: 96 / INCH_CM / 10,
|
|
623
|
-
pc: 96 / 72 / 12,
|
|
624
|
-
pt: 96 / 72,
|
|
625
|
-
px: 1
|
|
626
|
-
};
|
|
627
|
-
var unitsReg = new RegExp(
|
|
628
|
-
`^([0-9.]+(?:e\\d+)?)(${Object.keys(units).join("|")})?$`
|
|
629
|
-
);
|
|
630
|
-
function parseLength(len) {
|
|
631
|
-
const m = unitsReg.exec(len);
|
|
632
|
-
if (!m) {
|
|
633
|
-
return void 0;
|
|
634
|
-
}
|
|
635
|
-
return Math.round(Number(m[1]) * (units[m[2]] || 1));
|
|
636
|
-
}
|
|
637
|
-
function parseViewbox(viewbox) {
|
|
638
|
-
const bounds = viewbox.split(" ");
|
|
639
|
-
return {
|
|
640
|
-
height: parseLength(bounds[3]),
|
|
641
|
-
width: parseLength(bounds[2])
|
|
642
|
-
};
|
|
643
|
-
}
|
|
644
|
-
function parseAttributes(root) {
|
|
645
|
-
const width = root.match(extractorRegExps.width);
|
|
646
|
-
const height = root.match(extractorRegExps.height);
|
|
647
|
-
const viewbox = root.match(extractorRegExps.viewbox);
|
|
648
|
-
return {
|
|
649
|
-
height: height && parseLength(height[2]),
|
|
650
|
-
viewbox: viewbox && parseViewbox(viewbox[2]),
|
|
651
|
-
width: width && parseLength(width[2])
|
|
652
|
-
};
|
|
653
|
-
}
|
|
654
|
-
function calculateByDimensions(attrs) {
|
|
655
|
-
return {
|
|
656
|
-
height: attrs.height,
|
|
657
|
-
width: attrs.width
|
|
658
|
-
};
|
|
659
|
-
}
|
|
660
|
-
function calculateByViewbox(attrs, viewbox) {
|
|
661
|
-
const ratio = viewbox.width / viewbox.height;
|
|
662
|
-
if (attrs.width) {
|
|
663
|
-
return {
|
|
664
|
-
height: Math.floor(attrs.width / ratio),
|
|
665
|
-
width: attrs.width
|
|
666
|
-
};
|
|
667
|
-
}
|
|
668
|
-
if (attrs.height) {
|
|
669
|
-
return {
|
|
670
|
-
height: attrs.height,
|
|
671
|
-
width: Math.floor(attrs.height * ratio)
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
return {
|
|
675
|
-
height: viewbox.height,
|
|
676
|
-
width: viewbox.width
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
var SVG = {
|
|
680
|
-
// Scan only the first kilo-byte to speed up the check on larger files
|
|
681
|
-
validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)),
|
|
682
|
-
calculate(input) {
|
|
683
|
-
const root = toUTF8String(input).match(extractorRegExps.root);
|
|
684
|
-
if (root) {
|
|
685
|
-
const attrs = parseAttributes(root[0]);
|
|
686
|
-
if (attrs.width && attrs.height) {
|
|
687
|
-
return calculateByDimensions(attrs);
|
|
688
|
-
}
|
|
689
|
-
if (attrs.viewbox) {
|
|
690
|
-
return calculateByViewbox(attrs, attrs.viewbox);
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
throw new TypeError("Invalid SVG");
|
|
694
|
-
}
|
|
695
|
-
};
|
|
696
|
-
var TGA = {
|
|
697
|
-
validate(input) {
|
|
698
|
-
return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;
|
|
699
|
-
},
|
|
700
|
-
calculate(input) {
|
|
701
|
-
return {
|
|
702
|
-
height: readUInt16LE(input, 14),
|
|
703
|
-
width: readUInt16LE(input, 12)
|
|
704
|
-
};
|
|
705
|
-
}
|
|
706
|
-
};
|
|
707
|
-
var CONSTANTS = {
|
|
708
|
-
TAG: {
|
|
709
|
-
WIDTH: 256,
|
|
710
|
-
HEIGHT: 257,
|
|
711
|
-
COMPRESSION: 259
|
|
712
|
-
},
|
|
713
|
-
TYPE: {
|
|
714
|
-
SHORT: 3,
|
|
715
|
-
LONG: 4,
|
|
716
|
-
LONG8: 16
|
|
717
|
-
},
|
|
718
|
-
ENTRY_SIZE: {
|
|
719
|
-
STANDARD: 12,
|
|
720
|
-
BIG: 20
|
|
721
|
-
},
|
|
722
|
-
COUNT_SIZE: {
|
|
723
|
-
STANDARD: 2,
|
|
724
|
-
BIG: 8
|
|
725
|
-
}
|
|
726
|
-
};
|
|
727
|
-
function readIFD(input, { isBigEndian, isBigTiff }) {
|
|
728
|
-
const ifdOffset = isBigTiff ? Number(readUInt64(input, 8, isBigEndian)) : readUInt(input, 32, 4, isBigEndian);
|
|
729
|
-
const entryCountSize = isBigTiff ? CONSTANTS.COUNT_SIZE.BIG : CONSTANTS.COUNT_SIZE.STANDARD;
|
|
730
|
-
return input.slice(ifdOffset + entryCountSize);
|
|
731
|
-
}
|
|
732
|
-
function readTagValue(input, type, offset, isBigEndian) {
|
|
733
|
-
switch (type) {
|
|
734
|
-
case CONSTANTS.TYPE.SHORT:
|
|
735
|
-
return readUInt(input, 16, offset, isBigEndian);
|
|
736
|
-
case CONSTANTS.TYPE.LONG:
|
|
737
|
-
return readUInt(input, 32, offset, isBigEndian);
|
|
738
|
-
case CONSTANTS.TYPE.LONG8: {
|
|
739
|
-
const value = Number(readUInt64(input, offset, isBigEndian));
|
|
740
|
-
if (value > Number.MAX_SAFE_INTEGER) {
|
|
741
|
-
throw new TypeError("Value too large");
|
|
742
|
-
}
|
|
743
|
-
return value;
|
|
744
|
-
}
|
|
745
|
-
default:
|
|
746
|
-
return 0;
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
function nextTag(input, isBigTiff) {
|
|
750
|
-
const entrySize = isBigTiff ? CONSTANTS.ENTRY_SIZE.BIG : CONSTANTS.ENTRY_SIZE.STANDARD;
|
|
751
|
-
if (input.length > entrySize) {
|
|
752
|
-
return input.slice(entrySize);
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
function extractTags(input, { isBigEndian, isBigTiff }) {
|
|
756
|
-
const tags = {};
|
|
757
|
-
let temp = input;
|
|
758
|
-
while (temp?.length) {
|
|
759
|
-
const code = readUInt(temp, 16, 0, isBigEndian);
|
|
760
|
-
const type = readUInt(temp, 16, 2, isBigEndian);
|
|
761
|
-
const length = isBigTiff ? Number(readUInt64(temp, 4, isBigEndian)) : readUInt(temp, 32, 4, isBigEndian);
|
|
762
|
-
if (code === 0) break;
|
|
763
|
-
if (length === 1 && (type === CONSTANTS.TYPE.SHORT || type === CONSTANTS.TYPE.LONG || isBigTiff && type === CONSTANTS.TYPE.LONG8)) {
|
|
764
|
-
const valueOffset = isBigTiff ? 12 : 8;
|
|
765
|
-
tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);
|
|
766
|
-
}
|
|
767
|
-
temp = nextTag(temp, isBigTiff);
|
|
768
|
-
}
|
|
769
|
-
return tags;
|
|
770
|
-
}
|
|
771
|
-
function determineFormat(input) {
|
|
772
|
-
const signature = toUTF8String(input, 0, 2);
|
|
773
|
-
const version = readUInt(input, 16, 2, signature === "MM");
|
|
774
|
-
return {
|
|
775
|
-
isBigEndian: signature === "MM",
|
|
776
|
-
isBigTiff: version === 43
|
|
777
|
-
};
|
|
778
|
-
}
|
|
779
|
-
function validateBigTIFFHeader(input, isBigEndian) {
|
|
780
|
-
const byteSize = readUInt(input, 16, 4, isBigEndian);
|
|
781
|
-
const reserved = readUInt(input, 16, 6, isBigEndian);
|
|
782
|
-
if (byteSize !== 8 || reserved !== 0) {
|
|
783
|
-
throw new TypeError("Invalid BigTIFF header");
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
var signatures = /* @__PURE__ */ new Set([
|
|
787
|
-
"49492a00",
|
|
788
|
-
// Little Endian
|
|
789
|
-
"4d4d002a",
|
|
790
|
-
// Big Endian
|
|
791
|
-
"49492b00",
|
|
792
|
-
// BigTIFF Little Endian
|
|
793
|
-
"4d4d002b"
|
|
794
|
-
// BigTIFF Big Endian
|
|
795
|
-
]);
|
|
796
|
-
var TIFF = {
|
|
797
|
-
validate: (input) => {
|
|
798
|
-
const signature = toHexString(input, 0, 4);
|
|
799
|
-
return signatures.has(signature);
|
|
800
|
-
},
|
|
801
|
-
calculate(input) {
|
|
802
|
-
const format = determineFormat(input);
|
|
803
|
-
if (format.isBigTiff) {
|
|
804
|
-
validateBigTIFFHeader(input, format.isBigEndian);
|
|
805
|
-
}
|
|
806
|
-
const ifdBuffer = readIFD(input, format);
|
|
807
|
-
const tags = extractTags(ifdBuffer, format);
|
|
808
|
-
const info = {
|
|
809
|
-
height: tags[CONSTANTS.TAG.HEIGHT],
|
|
810
|
-
width: tags[CONSTANTS.TAG.WIDTH],
|
|
811
|
-
type: format.isBigTiff ? "bigtiff" : "tiff"
|
|
812
|
-
};
|
|
813
|
-
if (tags[CONSTANTS.TAG.COMPRESSION]) {
|
|
814
|
-
info.compression = tags[CONSTANTS.TAG.COMPRESSION];
|
|
815
|
-
}
|
|
816
|
-
if (!info.width || !info.height) {
|
|
817
|
-
throw new TypeError("Invalid Tiff. Missing tags");
|
|
818
|
-
}
|
|
819
|
-
return info;
|
|
820
|
-
}
|
|
821
|
-
};
|
|
822
|
-
function calculateExtended(input) {
|
|
823
|
-
return {
|
|
824
|
-
height: 1 + readUInt24LE(input, 7),
|
|
825
|
-
width: 1 + readUInt24LE(input, 4)
|
|
826
|
-
};
|
|
827
|
-
}
|
|
828
|
-
function calculateLossless(input) {
|
|
829
|
-
return {
|
|
830
|
-
height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6),
|
|
831
|
-
width: 1 + ((input[2] & 63) << 8 | input[1])
|
|
832
|
-
};
|
|
833
|
-
}
|
|
834
|
-
function calculateLossy(input) {
|
|
835
|
-
return {
|
|
836
|
-
height: readInt16LE(input, 8) & 16383,
|
|
837
|
-
width: readInt16LE(input, 6) & 16383
|
|
838
|
-
};
|
|
839
|
-
}
|
|
840
|
-
var WEBP = {
|
|
841
|
-
validate(input) {
|
|
842
|
-
const riffHeader = "RIFF" === toUTF8String(input, 0, 4);
|
|
843
|
-
const webpHeader = "WEBP" === toUTF8String(input, 8, 12);
|
|
844
|
-
const vp8Header = "VP8" === toUTF8String(input, 12, 15);
|
|
845
|
-
return riffHeader && webpHeader && vp8Header;
|
|
846
|
-
},
|
|
847
|
-
calculate(_input) {
|
|
848
|
-
const chunkHeader = toUTF8String(_input, 12, 16);
|
|
849
|
-
const input = _input.slice(20, 30);
|
|
850
|
-
if (chunkHeader === "VP8X") {
|
|
851
|
-
const extendedHeader = input[0];
|
|
852
|
-
const validStart = (extendedHeader & 192) === 0;
|
|
853
|
-
const validEnd = (extendedHeader & 1) === 0;
|
|
854
|
-
if (validStart && validEnd) {
|
|
855
|
-
return calculateExtended(input);
|
|
856
|
-
}
|
|
857
|
-
throw new TypeError("Invalid WebP");
|
|
858
|
-
}
|
|
859
|
-
if (chunkHeader === "VP8 " && input[0] !== 47) {
|
|
860
|
-
return calculateLossy(input);
|
|
861
|
-
}
|
|
862
|
-
const signature = toHexString(input, 3, 6);
|
|
863
|
-
if (chunkHeader === "VP8L" && signature !== "9d012a") {
|
|
864
|
-
return calculateLossless(input);
|
|
865
|
-
}
|
|
866
|
-
throw new TypeError("Invalid WebP");
|
|
867
|
-
}
|
|
868
|
-
};
|
|
869
|
-
var typeHandlers = /* @__PURE__ */ new Map([
|
|
870
|
-
["bmp", BMP],
|
|
871
|
-
["cur", CUR],
|
|
872
|
-
["dds", DDS],
|
|
873
|
-
["gif", GIF],
|
|
874
|
-
["heif", HEIF],
|
|
875
|
-
["icns", ICNS],
|
|
876
|
-
["ico", ICO],
|
|
877
|
-
["j2c", J2C],
|
|
878
|
-
["jp2", JP2],
|
|
879
|
-
["jpg", JPG],
|
|
880
|
-
["jxl", JXL],
|
|
881
|
-
["jxl-stream", JXLStream],
|
|
882
|
-
["ktx", KTX],
|
|
883
|
-
["png", PNG],
|
|
884
|
-
["pnm", PNM],
|
|
885
|
-
["psd", PSD],
|
|
886
|
-
["svg", SVG],
|
|
887
|
-
["tga", TGA],
|
|
888
|
-
["tiff", TIFF],
|
|
889
|
-
["webp", WEBP]
|
|
890
|
-
]);
|
|
891
|
-
var types = Array.from(typeHandlers.keys());
|
|
892
|
-
var firstBytes = /* @__PURE__ */ new Map([
|
|
893
|
-
[0, "heif"],
|
|
894
|
-
[56, "psd"],
|
|
895
|
-
[66, "bmp"],
|
|
896
|
-
[68, "dds"],
|
|
897
|
-
[71, "gif"],
|
|
898
|
-
[73, "tiff"],
|
|
899
|
-
[77, "tiff"],
|
|
900
|
-
[82, "webp"],
|
|
901
|
-
[105, "icns"],
|
|
902
|
-
[137, "png"],
|
|
903
|
-
[255, "jpg"]
|
|
904
|
-
]);
|
|
905
|
-
function detector(input) {
|
|
906
|
-
const byte = input[0];
|
|
907
|
-
const type = firstBytes.get(byte);
|
|
908
|
-
if (type && typeHandlers.get(type).validate(input)) {
|
|
909
|
-
return type;
|
|
910
|
-
}
|
|
911
|
-
return types.find((type2) => typeHandlers.get(type2).validate(input));
|
|
912
|
-
}
|
|
913
|
-
var globalOptions = {
|
|
914
|
-
disabledTypes: []
|
|
915
|
-
};
|
|
916
|
-
function imageSize(input) {
|
|
917
|
-
const type = detector(input);
|
|
918
|
-
if (typeof type !== "undefined") {
|
|
919
|
-
if (globalOptions.disabledTypes.indexOf(type) > -1) {
|
|
920
|
-
throw new TypeError(`disabled file type: ${type}`);
|
|
921
|
-
}
|
|
922
|
-
const size = typeHandlers.get(type).calculate(input);
|
|
923
|
-
if (size !== void 0) {
|
|
924
|
-
size.type = size.type ?? type;
|
|
925
|
-
if (size.images && size.images.length > 1) {
|
|
926
|
-
const largestImage = size.images.reduce((largest, current) => {
|
|
927
|
-
return current.width * current.height > largest.width * largest.height ? current : largest;
|
|
928
|
-
}, size.images[0]);
|
|
929
|
-
size.width = largestImage.width;
|
|
930
|
-
size.height = largestImage.height;
|
|
931
|
-
}
|
|
932
|
-
return size;
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
throw new TypeError(`unsupported file type: ${type}`);
|
|
936
|
-
}
|
|
937
|
-
export {
|
|
938
|
-
imageSize as default,
|
|
939
|
-
imageSize,
|
|
940
|
-
types
|
|
941
|
-
};
|
|
942
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../node_modules/image-size/dist/index.mjs"],"sourcesContent":["// lib/types/utils.ts\nvar decoder = new TextDecoder();\nvar toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));\nvar toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), \"\");\nvar getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);\nvar readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);\nvar readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);\nvar readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);\nvar readUInt24LE = (input, offset = 0) => {\n const view = getView(input, offset);\n return view.getUint16(0, true) + (view.getUint8(2) << 16);\n};\nvar readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);\nvar readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);\nvar readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);\nvar readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);\nvar methods = {\n readUInt16BE,\n readUInt16LE,\n readUInt32BE,\n readUInt32LE\n};\nfunction readUInt(input, bits, offset = 0, isBigEndian = false) {\n const endian = isBigEndian ? \"BE\" : \"LE\";\n const methodName = `readUInt${bits}${endian}`;\n return methods[methodName](input, offset);\n}\nfunction readBox(input, offset) {\n if (input.length - offset < 4) return;\n const boxSize = readUInt32BE(input, offset);\n if (input.length - offset < boxSize) return;\n return {\n name: toUTF8String(input, 4 + offset, 8 + offset),\n offset,\n size: boxSize\n };\n}\nfunction findBox(input, boxName, currentOffset) {\n while (currentOffset < input.length) {\n const box = readBox(input, currentOffset);\n if (!box) break;\n if (box.name === boxName) return box;\n currentOffset += box.size > 0 ? box.size : 8;\n }\n}\n\n// lib/types/bmp.ts\nvar BMP = {\n validate: (input) => toUTF8String(input, 0, 2) === \"BM\",\n calculate: (input) => ({\n height: Math.abs(readInt32LE(input, 22)),\n width: readUInt32LE(input, 18)\n })\n};\n\n// lib/types/ico.ts\nvar TYPE_ICON = 1;\nvar SIZE_HEADER = 2 + 2 + 2;\nvar SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;\nfunction getSizeFromOffset(input, offset) {\n const value = input[offset];\n return value === 0 ? 256 : value;\n}\nfunction getImageSize(input, imageIndex) {\n const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;\n return {\n height: getSizeFromOffset(input, offset + 1),\n width: getSizeFromOffset(input, offset)\n };\n}\nvar ICO = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_ICON;\n },\n calculate(input) {\n const nbImages = readUInt16LE(input, 4);\n const imageSize2 = getImageSize(input, 0);\n if (nbImages === 1) return imageSize2;\n const images = [];\n for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) {\n images.push(getImageSize(input, imageIndex));\n }\n return {\n width: imageSize2.width,\n height: imageSize2.height,\n images\n };\n }\n};\n\n// lib/types/cur.ts\nvar TYPE_CURSOR = 2;\nvar CUR = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0) return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_CURSOR;\n },\n calculate: (input) => ICO.calculate(input)\n};\n\n// lib/types/dds.ts\nvar DDS = {\n validate: (input) => readUInt32LE(input, 0) === 542327876,\n calculate: (input) => ({\n height: readUInt32LE(input, 12),\n width: readUInt32LE(input, 16)\n })\n};\n\n// lib/types/gif.ts\nvar gifRegexp = /^GIF8[79]a/;\nvar GIF = {\n validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),\n calculate: (input) => ({\n height: readUInt16LE(input, 8),\n width: readUInt16LE(input, 6)\n })\n};\n\n// lib/types/heif.ts\nvar brandMap = {\n avif: \"avif\",\n mif1: \"heif\",\n msf1: \"heif\",\n // heif-sequence\n heic: \"heic\",\n heix: \"heic\",\n hevc: \"heic\",\n // heic-sequence\n hevx: \"heic\"\n // heic-sequence\n};\nvar HEIF = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"ftyp\") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand in brandMap;\n },\n calculate(input) {\n const metaBox = findBox(input, \"meta\", 0);\n const iprpBox = metaBox && findBox(input, \"iprp\", metaBox.offset + 12);\n const ipcoBox = iprpBox && findBox(input, \"ipco\", iprpBox.offset + 8);\n if (!ipcoBox) {\n throw new TypeError(\"Invalid HEIF, no ipco box found\");\n }\n const type = toUTF8String(input, 8, 12);\n const images = [];\n let currentOffset = ipcoBox.offset + 8;\n while (currentOffset < ipcoBox.offset + ipcoBox.size) {\n const ispeBox = findBox(input, \"ispe\", currentOffset);\n if (!ispeBox) break;\n const rawWidth = readUInt32BE(input, ispeBox.offset + 12);\n const rawHeight = readUInt32BE(input, ispeBox.offset + 16);\n const clapBox = findBox(input, \"clap\", currentOffset);\n let width = rawWidth;\n let height = rawHeight;\n if (clapBox && clapBox.offset < ipcoBox.offset + ipcoBox.size) {\n const cropRight = readUInt32BE(input, clapBox.offset + 12);\n width = rawWidth - cropRight;\n }\n images.push({ height, width });\n currentOffset = ispeBox.offset + ispeBox.size;\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid HEIF, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n type,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/icns.ts\nvar SIZE_HEADER2 = 4 + 4;\nvar FILE_LENGTH_OFFSET = 4;\nvar ENTRY_LENGTH_OFFSET = 4;\nvar ICON_TYPE_SIZE = {\n ICON: 32,\n \"ICN#\": 32,\n // m => 16 x 16\n \"icm#\": 16,\n icm4: 16,\n icm8: 16,\n // s => 16 x 16\n \"ics#\": 16,\n ics4: 16,\n ics8: 16,\n is32: 16,\n s8mk: 16,\n icp4: 16,\n // l => 32 x 32\n icl4: 32,\n icl8: 32,\n il32: 32,\n l8mk: 32,\n icp5: 32,\n ic11: 32,\n // h => 48 x 48\n ich4: 48,\n ich8: 48,\n ih32: 48,\n h8mk: 48,\n // . => 64 x 64\n icp6: 64,\n ic12: 32,\n // t => 128 x 128\n it32: 128,\n t8mk: 128,\n ic07: 128,\n // . => 256 x 256\n ic08: 256,\n ic13: 256,\n // . => 512 x 512\n ic09: 512,\n ic14: 512,\n // . => 1024 x 1024\n ic10: 1024\n};\nfunction readImageHeader(input, imageOffset) {\n const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;\n return [\n toUTF8String(input, imageOffset, imageLengthOffset),\n readUInt32BE(input, imageLengthOffset)\n ];\n}\nfunction getImageSize2(type) {\n const size = ICON_TYPE_SIZE[type];\n return { width: size, height: size, type };\n}\nvar ICNS = {\n validate: (input) => toUTF8String(input, 0, 4) === \"icns\",\n calculate(input) {\n const inputLength = input.length;\n const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);\n let imageOffset = SIZE_HEADER2;\n const images = [];\n while (imageOffset < fileLength && imageOffset < inputLength) {\n const imageHeader = readImageHeader(input, imageOffset);\n const imageSize2 = getImageSize2(imageHeader[0]);\n images.push(imageSize2);\n imageOffset += imageHeader[1];\n }\n if (images.length === 0) {\n throw new TypeError(\"Invalid ICNS, no sizes found\");\n }\n return {\n width: images[0].width,\n height: images[0].height,\n ...images.length > 1 ? { images } : {}\n };\n }\n};\n\n// lib/types/j2c.ts\nvar J2C = {\n // TODO: this doesn't seem right. SIZ marker doesn't have to be right after the SOC\n validate: (input) => readUInt32BE(input, 0) === 4283432785,\n calculate: (input) => ({\n height: readUInt32BE(input, 12),\n width: readUInt32BE(input, 8)\n })\n};\n\n// lib/types/jp2.ts\nvar JP2 = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"jP \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jp2 \";\n },\n calculate(input) {\n const jp2hBox = findBox(input, \"jp2h\", 0);\n const ihdrBox = jp2hBox && findBox(input, \"ihdr\", jp2hBox.offset + 8);\n if (ihdrBox) {\n return {\n height: readUInt32BE(input, ihdrBox.offset + 8),\n width: readUInt32BE(input, ihdrBox.offset + 12)\n };\n }\n throw new TypeError(\"Unsupported JPEG 2000 format\");\n }\n};\n\n// lib/types/jpg.ts\nvar EXIF_MARKER = \"45786966\";\nvar APP1_DATA_SIZE_BYTES = 2;\nvar EXIF_HEADER_BYTES = 6;\nvar TIFF_BYTE_ALIGN_BYTES = 2;\nvar BIG_ENDIAN_BYTE_ALIGN = \"4d4d\";\nvar LITTLE_ENDIAN_BYTE_ALIGN = \"4949\";\nvar IDF_ENTRY_BYTES = 12;\nvar NUM_DIRECTORY_ENTRIES_BYTES = 2;\nfunction isEXIF(input) {\n return toHexString(input, 2, 6) === EXIF_MARKER;\n}\nfunction extractSize(input, index) {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2)\n };\n}\nfunction extractOrientation(exifBlock, isBigEndian) {\n const idfOffset = 8;\n const offset = EXIF_HEADER_BYTES + idfOffset;\n const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);\n for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {\n const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES;\n const end = start + IDF_ENTRY_BYTES;\n if (start > exifBlock.length) {\n return;\n }\n const block = exifBlock.slice(start, end);\n const tagNumber = readUInt(block, 16, 0, isBigEndian);\n if (tagNumber === 274) {\n const dataFormat = readUInt(block, 16, 2, isBigEndian);\n if (dataFormat !== 3) {\n return;\n }\n const numberOfComponents = readUInt(block, 32, 4, isBigEndian);\n if (numberOfComponents !== 1) {\n return;\n }\n return readUInt(block, 16, 8, isBigEndian);\n }\n }\n}\nfunction validateExifBlock(input, index) {\n const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);\n const byteAlign = toHexString(\n exifBlock,\n EXIF_HEADER_BYTES,\n EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES\n );\n const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;\n const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;\n if (isBigEndian || isLittleEndian) {\n return extractOrientation(exifBlock, isBigEndian);\n }\n}\nfunction validateInput(input, index) {\n if (index > input.length) {\n throw new TypeError(\"Corrupt JPG, exceeded buffer limits\");\n }\n}\nvar JPG = {\n validate: (input) => toHexString(input, 0, 2) === \"ffd8\",\n calculate(_input) {\n let input = _input.slice(4);\n let orientation;\n let next;\n while (input.length) {\n const i = readUInt16BE(input, 0);\n validateInput(input, i);\n if (input[i] !== 255) {\n input = input.slice(1);\n continue;\n }\n if (isEXIF(input)) {\n orientation = validateExifBlock(input, i);\n }\n next = input[i + 1];\n if (next === 192 || next === 193 || next === 194) {\n const size = extractSize(input, i + 5);\n if (!orientation) {\n return size;\n }\n return {\n height: size.height,\n orientation,\n width: size.width\n };\n }\n input = input.slice(i + 2);\n }\n throw new TypeError(\"Invalid JPG, no size found\");\n }\n};\n\n// lib/utils/bit-reader.ts\nvar BitReader = class {\n constructor(input, endianness) {\n this.input = input;\n this.endianness = endianness;\n // Skip the first 16 bits (2 bytes) of signature\n this.byteOffset = 2;\n this.bitOffset = 0;\n }\n /** Reads a specified number of bits, and move the offset */\n getBits(length = 1) {\n let result = 0;\n let bitsRead = 0;\n while (bitsRead < length) {\n if (this.byteOffset >= this.input.length) {\n throw new Error(\"Reached end of input\");\n }\n const currentByte = this.input[this.byteOffset];\n const bitsLeft = 8 - this.bitOffset;\n const bitsToRead = Math.min(length - bitsRead, bitsLeft);\n if (this.endianness === \"little-endian\") {\n const mask = (1 << bitsToRead) - 1;\n const bits = currentByte >> this.bitOffset & mask;\n result |= bits << bitsRead;\n } else {\n const mask = (1 << bitsToRead) - 1 << 8 - this.bitOffset - bitsToRead;\n const bits = (currentByte & mask) >> 8 - this.bitOffset - bitsToRead;\n result = result << bitsToRead | bits;\n }\n bitsRead += bitsToRead;\n this.bitOffset += bitsToRead;\n if (this.bitOffset === 8) {\n this.byteOffset++;\n this.bitOffset = 0;\n }\n }\n return result;\n }\n};\n\n// lib/types/jxl-stream.ts\nfunction calculateImageDimension(reader, isSmallImage) {\n if (isSmallImage) {\n return 8 * (1 + reader.getBits(5));\n }\n const sizeClass = reader.getBits(2);\n const extraBits = [9, 13, 18, 30][sizeClass];\n return 1 + reader.getBits(extraBits);\n}\nfunction calculateImageWidth(reader, isSmallImage, widthMode, height) {\n if (isSmallImage && widthMode === 0) {\n return 8 * (1 + reader.getBits(5));\n }\n if (widthMode === 0) {\n return calculateImageDimension(reader, false);\n }\n const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];\n return Math.floor(height * aspectRatios[widthMode - 1]);\n}\nvar JXLStream = {\n validate: (input) => {\n return toHexString(input, 0, 2) === \"ff0a\";\n },\n calculate(input) {\n const reader = new BitReader(input, \"little-endian\");\n const isSmallImage = reader.getBits(1) === 1;\n const height = calculateImageDimension(reader, isSmallImage);\n const widthMode = reader.getBits(3);\n const width = calculateImageWidth(reader, isSmallImage, widthMode, height);\n return { width, height };\n }\n};\n\n// lib/types/jxl.ts\nfunction extractCodestream(input) {\n const jxlcBox = findBox(input, \"jxlc\", 0);\n if (jxlcBox) {\n return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);\n }\n const partialStreams = extractPartialStreams(input);\n if (partialStreams.length > 0) {\n return concatenateCodestreams(partialStreams);\n }\n return void 0;\n}\nfunction extractPartialStreams(input) {\n const partialStreams = [];\n let offset = 0;\n while (offset < input.length) {\n const jxlpBox = findBox(input, \"jxlp\", offset);\n if (!jxlpBox) break;\n partialStreams.push(\n input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size)\n );\n offset = jxlpBox.offset + jxlpBox.size;\n }\n return partialStreams;\n}\nfunction concatenateCodestreams(partialCodestreams) {\n const totalLength = partialCodestreams.reduce(\n (acc, curr) => acc + curr.length,\n 0\n );\n const codestream = new Uint8Array(totalLength);\n let position = 0;\n for (const partial of partialCodestreams) {\n codestream.set(partial, position);\n position += partial.length;\n }\n return codestream;\n}\nvar JXL = {\n validate: (input) => {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== \"JXL \") return false;\n const ftypBox = findBox(input, \"ftyp\", 0);\n if (!ftypBox) return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === \"jxl \";\n },\n calculate(input) {\n const codestream = extractCodestream(input);\n if (codestream) return JXLStream.calculate(codestream);\n throw new Error(\"No codestream found in JXL container\");\n }\n};\n\n// lib/types/ktx.ts\nvar KTX = {\n validate: (input) => {\n const signature = toUTF8String(input, 1, 7);\n return [\"KTX 11\", \"KTX 20\"].includes(signature);\n },\n calculate: (input) => {\n const type = input[5] === 49 ? \"ktx\" : \"ktx2\";\n const offset = type === \"ktx\" ? 36 : 20;\n return {\n height: readUInt32LE(input, offset + 4),\n width: readUInt32LE(input, offset),\n type\n };\n }\n};\n\n// lib/types/png.ts\nvar pngSignature = \"PNG\\r\\n\u001a\\n\";\nvar pngImageHeaderChunkName = \"IHDR\";\nvar pngFriedChunkName = \"CgBI\";\nvar PNG = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError(\"Invalid PNG\");\n }\n return true;\n }\n return false;\n },\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32)\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16)\n };\n }\n};\n\n// lib/types/pnm.ts\nvar PNMTypes = {\n P1: \"pbm/ascii\",\n P2: \"pgm/ascii\",\n P3: \"ppm/ascii\",\n P4: \"pbm\",\n P5: \"pgm\",\n P6: \"ppm\",\n P7: \"pam\",\n PF: \"pfm\"\n};\nvar handlers = {\n default: (lines) => {\n let dimensions = [];\n while (lines.length > 0) {\n const line = lines.shift();\n if (line[0] === \"#\") {\n continue;\n }\n dimensions = line.split(\" \");\n break;\n }\n if (dimensions.length === 2) {\n return {\n height: Number.parseInt(dimensions[1], 10),\n width: Number.parseInt(dimensions[0], 10)\n };\n }\n throw new TypeError(\"Invalid PNM\");\n },\n pam: (lines) => {\n const size = {};\n while (lines.length > 0) {\n const line = lines.shift();\n if (line.length > 16 || line.charCodeAt(0) > 128) {\n continue;\n }\n const [key, value] = line.split(\" \");\n if (key && value) {\n size[key.toLowerCase()] = Number.parseInt(value, 10);\n }\n if (size.height && size.width) {\n break;\n }\n }\n if (size.height && size.width) {\n return {\n height: size.height,\n width: size.width\n };\n }\n throw new TypeError(\"Invalid PAM\");\n }\n};\nvar PNM = {\n validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,\n calculate(input) {\n const signature = toUTF8String(input, 0, 2);\n const type = PNMTypes[signature];\n const lines = toUTF8String(input, 3).split(/[\\r\\n]+/);\n const handler = handlers[type] || handlers.default;\n return handler(lines);\n }\n};\n\n// lib/types/psd.ts\nvar PSD = {\n validate: (input) => toUTF8String(input, 0, 4) === \"8BPS\",\n calculate: (input) => ({\n height: readUInt32BE(input, 14),\n width: readUInt32BE(input, 18)\n })\n};\n\n// lib/types/svg.ts\nvar svgReg = /<svg\\s([^>\"']|\"[^\"]*\"|'[^']*')*>/;\nvar extractorRegExps = {\n height: /\\sheight=(['\"])([^%]+?)\\1/,\n root: svgReg,\n viewbox: /\\sviewBox=(['\"])(.+?)\\1/i,\n width: /\\swidth=(['\"])([^%]+?)\\1/\n};\nvar INCH_CM = 2.54;\nvar units = {\n in: 96,\n cm: 96 / INCH_CM,\n em: 16,\n ex: 8,\n m: 96 / INCH_CM * 100,\n mm: 96 / INCH_CM / 10,\n pc: 96 / 72 / 12,\n pt: 96 / 72,\n px: 1\n};\nvar unitsReg = new RegExp(\n `^([0-9.]+(?:e\\\\d+)?)(${Object.keys(units).join(\"|\")})?$`\n);\nfunction parseLength(len) {\n const m = unitsReg.exec(len);\n if (!m) {\n return void 0;\n }\n return Math.round(Number(m[1]) * (units[m[2]] || 1));\n}\nfunction parseViewbox(viewbox) {\n const bounds = viewbox.split(\" \");\n return {\n height: parseLength(bounds[3]),\n width: parseLength(bounds[2])\n };\n}\nfunction parseAttributes(root) {\n const width = root.match(extractorRegExps.width);\n const height = root.match(extractorRegExps.height);\n const viewbox = root.match(extractorRegExps.viewbox);\n return {\n height: height && parseLength(height[2]),\n viewbox: viewbox && parseViewbox(viewbox[2]),\n width: width && parseLength(width[2])\n };\n}\nfunction calculateByDimensions(attrs) {\n return {\n height: attrs.height,\n width: attrs.width\n };\n}\nfunction calculateByViewbox(attrs, viewbox) {\n const ratio = viewbox.width / viewbox.height;\n if (attrs.width) {\n return {\n height: Math.floor(attrs.width / ratio),\n width: attrs.width\n };\n }\n if (attrs.height) {\n return {\n height: attrs.height,\n width: Math.floor(attrs.height * ratio)\n };\n }\n return {\n height: viewbox.height,\n width: viewbox.width\n };\n}\nvar SVG = {\n // Scan only the first kilo-byte to speed up the check on larger files\n validate: (input) => svgReg.test(toUTF8String(input, 0, 1e3)),\n calculate(input) {\n const root = toUTF8String(input).match(extractorRegExps.root);\n if (root) {\n const attrs = parseAttributes(root[0]);\n if (attrs.width && attrs.height) {\n return calculateByDimensions(attrs);\n }\n if (attrs.viewbox) {\n return calculateByViewbox(attrs, attrs.viewbox);\n }\n }\n throw new TypeError(\"Invalid SVG\");\n }\n};\n\n// lib/types/tga.ts\nvar TGA = {\n validate(input) {\n return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;\n },\n calculate(input) {\n return {\n height: readUInt16LE(input, 14),\n width: readUInt16LE(input, 12)\n };\n }\n};\n\n// lib/types/tiff.ts\nvar CONSTANTS = {\n TAG: {\n WIDTH: 256,\n HEIGHT: 257,\n COMPRESSION: 259\n },\n TYPE: {\n SHORT: 3,\n LONG: 4,\n LONG8: 16\n },\n ENTRY_SIZE: {\n STANDARD: 12,\n BIG: 20\n },\n COUNT_SIZE: {\n STANDARD: 2,\n BIG: 8\n }\n};\nfunction readIFD(input, { isBigEndian, isBigTiff }) {\n const ifdOffset = isBigTiff ? Number(readUInt64(input, 8, isBigEndian)) : readUInt(input, 32, 4, isBigEndian);\n const entryCountSize = isBigTiff ? CONSTANTS.COUNT_SIZE.BIG : CONSTANTS.COUNT_SIZE.STANDARD;\n return input.slice(ifdOffset + entryCountSize);\n}\nfunction readTagValue(input, type, offset, isBigEndian) {\n switch (type) {\n case CONSTANTS.TYPE.SHORT:\n return readUInt(input, 16, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG:\n return readUInt(input, 32, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG8: {\n const value = Number(readUInt64(input, offset, isBigEndian));\n if (value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError(\"Value too large\");\n }\n return value;\n }\n default:\n return 0;\n }\n}\nfunction nextTag(input, isBigTiff) {\n const entrySize = isBigTiff ? CONSTANTS.ENTRY_SIZE.BIG : CONSTANTS.ENTRY_SIZE.STANDARD;\n if (input.length > entrySize) {\n return input.slice(entrySize);\n }\n}\nfunction extractTags(input, { isBigEndian, isBigTiff }) {\n const tags = {};\n let temp = input;\n while (temp?.length) {\n const code = readUInt(temp, 16, 0, isBigEndian);\n const type = readUInt(temp, 16, 2, isBigEndian);\n const length = isBigTiff ? Number(readUInt64(temp, 4, isBigEndian)) : readUInt(temp, 32, 4, isBigEndian);\n if (code === 0) break;\n if (length === 1 && (type === CONSTANTS.TYPE.SHORT || type === CONSTANTS.TYPE.LONG || isBigTiff && type === CONSTANTS.TYPE.LONG8)) {\n const valueOffset = isBigTiff ? 12 : 8;\n tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);\n }\n temp = nextTag(temp, isBigTiff);\n }\n return tags;\n}\nfunction determineFormat(input) {\n const signature = toUTF8String(input, 0, 2);\n const version = readUInt(input, 16, 2, signature === \"MM\");\n return {\n isBigEndian: signature === \"MM\",\n isBigTiff: version === 43\n };\n}\nfunction validateBigTIFFHeader(input, isBigEndian) {\n const byteSize = readUInt(input, 16, 4, isBigEndian);\n const reserved = readUInt(input, 16, 6, isBigEndian);\n if (byteSize !== 8 || reserved !== 0) {\n throw new TypeError(\"Invalid BigTIFF header\");\n }\n}\nvar signatures = /* @__PURE__ */ new Set([\n \"49492a00\",\n // Little Endian\n \"4d4d002a\",\n // Big Endian\n \"49492b00\",\n // BigTIFF Little Endian\n \"4d4d002b\"\n // BigTIFF Big Endian\n]);\nvar TIFF = {\n validate: (input) => {\n const signature = toHexString(input, 0, 4);\n return signatures.has(signature);\n },\n calculate(input) {\n const format = determineFormat(input);\n if (format.isBigTiff) {\n validateBigTIFFHeader(input, format.isBigEndian);\n }\n const ifdBuffer = readIFD(input, format);\n const tags = extractTags(ifdBuffer, format);\n const info = {\n height: tags[CONSTANTS.TAG.HEIGHT],\n width: tags[CONSTANTS.TAG.WIDTH],\n type: format.isBigTiff ? \"bigtiff\" : \"tiff\"\n };\n if (tags[CONSTANTS.TAG.COMPRESSION]) {\n info.compression = tags[CONSTANTS.TAG.COMPRESSION];\n }\n if (!info.width || !info.height) {\n throw new TypeError(\"Invalid Tiff. Missing tags\");\n }\n return info;\n }\n};\n\n// lib/types/webp.ts\nfunction calculateExtended(input) {\n return {\n height: 1 + readUInt24LE(input, 7),\n width: 1 + readUInt24LE(input, 4)\n };\n}\nfunction calculateLossless(input) {\n return {\n height: 1 + ((input[4] & 15) << 10 | input[3] << 2 | (input[2] & 192) >> 6),\n width: 1 + ((input[2] & 63) << 8 | input[1])\n };\n}\nfunction calculateLossy(input) {\n return {\n height: readInt16LE(input, 8) & 16383,\n width: readInt16LE(input, 6) & 16383\n };\n}\nvar WEBP = {\n validate(input) {\n const riffHeader = \"RIFF\" === toUTF8String(input, 0, 4);\n const webpHeader = \"WEBP\" === toUTF8String(input, 8, 12);\n const vp8Header = \"VP8\" === toUTF8String(input, 12, 15);\n return riffHeader && webpHeader && vp8Header;\n },\n calculate(_input) {\n const chunkHeader = toUTF8String(_input, 12, 16);\n const input = _input.slice(20, 30);\n if (chunkHeader === \"VP8X\") {\n const extendedHeader = input[0];\n const validStart = (extendedHeader & 192) === 0;\n const validEnd = (extendedHeader & 1) === 0;\n if (validStart && validEnd) {\n return calculateExtended(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n if (chunkHeader === \"VP8 \" && input[0] !== 47) {\n return calculateLossy(input);\n }\n const signature = toHexString(input, 3, 6);\n if (chunkHeader === \"VP8L\" && signature !== \"9d012a\") {\n return calculateLossless(input);\n }\n throw new TypeError(\"Invalid WebP\");\n }\n};\n\n// lib/types/index.ts\nvar typeHandlers = /* @__PURE__ */ new Map([\n [\"bmp\", BMP],\n [\"cur\", CUR],\n [\"dds\", DDS],\n [\"gif\", GIF],\n [\"heif\", HEIF],\n [\"icns\", ICNS],\n [\"ico\", ICO],\n [\"j2c\", J2C],\n [\"jp2\", JP2],\n [\"jpg\", JPG],\n [\"jxl\", JXL],\n [\"jxl-stream\", JXLStream],\n [\"ktx\", KTX],\n [\"png\", PNG],\n [\"pnm\", PNM],\n [\"psd\", PSD],\n [\"svg\", SVG],\n [\"tga\", TGA],\n [\"tiff\", TIFF],\n [\"webp\", WEBP]\n]);\nvar types = Array.from(typeHandlers.keys());\n\n// lib/detector.ts\nvar firstBytes = /* @__PURE__ */ new Map([\n [0, \"heif\"],\n [56, \"psd\"],\n [66, \"bmp\"],\n [68, \"dds\"],\n [71, \"gif\"],\n [73, \"tiff\"],\n [77, \"tiff\"],\n [82, \"webp\"],\n [105, \"icns\"],\n [137, \"png\"],\n [255, \"jpg\"]\n]);\nfunction detector(input) {\n const byte = input[0];\n const type = firstBytes.get(byte);\n if (type && typeHandlers.get(type).validate(input)) {\n return type;\n }\n return types.find((type2) => typeHandlers.get(type2).validate(input));\n}\n\n// lib/lookup.ts\nvar globalOptions = {\n disabledTypes: []\n};\nfunction imageSize(input) {\n const type = detector(input);\n if (typeof type !== \"undefined\") {\n if (globalOptions.disabledTypes.indexOf(type) > -1) {\n throw new TypeError(`disabled file type: ${type}`);\n }\n const size = typeHandlers.get(type).calculate(input);\n if (size !== void 0) {\n size.type = size.type ?? type;\n if (size.images && size.images.length > 1) {\n const largestImage = size.images.reduce((largest, current) => {\n return current.width * current.height > largest.width * largest.height ? current : largest;\n }, size.images[0]);\n size.width = largestImage.width;\n size.height = largestImage.height;\n }\n return size;\n }\n }\n throw new TypeError(`unsupported file type: ${type}`);\n}\nvar disableTypes = (types2) => {\n globalOptions.disabledTypes = types2;\n};\n\nexport { imageSize as default, disableTypes, imageSize, types };\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|