@herowcode/utils 1.5.0 → 1.5.2

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 (49) hide show
  1. package/dist/chunk-6IYD4APX.js +28 -0
  2. package/dist/chunk-6IYD4APX.js.map +1 -0
  3. package/dist/chunk-7X4LRL26.js +103 -0
  4. package/dist/chunk-7X4LRL26.js.map +1 -0
  5. package/dist/chunk-D3RLXVKJ.cjs +30 -0
  6. package/dist/chunk-D3RLXVKJ.cjs.map +1 -0
  7. package/dist/{chunk-AQZBHMTO.js → chunk-DVHDU327.js} +16 -26
  8. package/dist/chunk-DVHDU327.js.map +1 -0
  9. package/dist/chunk-KWMJV4VK.cjs +110 -0
  10. package/dist/chunk-KWMJV4VK.cjs.map +1 -0
  11. package/dist/{chunk-SLYUARZG.cjs → chunk-SLDBIYI4.cjs} +16 -26
  12. package/dist/chunk-SLDBIYI4.cjs.map +1 -0
  13. package/dist/files/index.browser.cjs +7 -7
  14. package/dist/files/index.browser.d.mts +2 -11
  15. package/dist/files/index.browser.d.ts +2 -11
  16. package/dist/files/index.browser.js +2 -2
  17. package/dist/files/index.cjs +8 -8
  18. package/dist/files/index.d.mts +2 -2
  19. package/dist/files/index.d.ts +2 -2
  20. package/dist/files/index.js +2 -2
  21. package/dist/files/index.node.cjs +6 -2
  22. package/dist/files/index.node.d.mts +1 -1
  23. package/dist/files/index.node.d.ts +1 -1
  24. package/dist/files/index.node.js +1 -1
  25. package/dist/format-bytes-B0QeE7As.d.mts +12 -0
  26. package/dist/format-bytes-B0QeE7As.d.ts +12 -0
  27. package/dist/index.cjs +8 -8
  28. package/dist/index.d.mts +2 -2
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.js +2 -2
  31. package/dist/nextjs/index.browser.cjs +5 -103
  32. package/dist/nextjs/index.browser.cjs.map +1 -1
  33. package/dist/nextjs/index.browser.js +1 -101
  34. package/dist/nextjs/index.browser.js.map +1 -1
  35. package/dist/nextjs/index.cjs +12 -0
  36. package/dist/nextjs/index.cjs.map +1 -0
  37. package/dist/nextjs/index.d.mts +3 -0
  38. package/dist/nextjs/index.d.ts +3 -0
  39. package/dist/nextjs/index.js +3 -0
  40. package/dist/nextjs/index.js.map +1 -0
  41. package/package.json +9 -3
  42. package/dist/chunk-AQZBHMTO.js.map +0 -1
  43. package/dist/chunk-GRSF4RY2.cjs +0 -20
  44. package/dist/chunk-GRSF4RY2.cjs.map +0 -1
  45. package/dist/chunk-O7SH3E3T.js +0 -18
  46. package/dist/chunk-O7SH3E3T.js.map +0 -1
  47. package/dist/chunk-SLYUARZG.cjs.map +0 -1
  48. package/dist/format-bytes-BGjeDnvM.d.mts +0 -3
  49. package/dist/format-bytes-BGjeDnvM.d.ts +0 -3
@@ -0,0 +1,28 @@
1
+ // src/files/download-url.ts
2
+ var downloadUrl = async (url) => {
3
+ try {
4
+ const urlObj = new URL(url);
5
+ const pathname = urlObj.pathname;
6
+ const segments = pathname.split("/").filter((segment) => segment.length > 0);
7
+ const filename = segments.length > 0 ? segments[segments.length - 1] : null;
8
+ if (!filename || !filename.includes(".")) {
9
+ throw new Error("URL does not contain a valid filename");
10
+ }
11
+ const response = await fetch(url, { mode: "cors" });
12
+ const blob = await response.blob();
13
+ const link = document.createElement("a");
14
+ link.href = window.URL.createObjectURL(blob);
15
+ link.download = filename;
16
+ document.body.appendChild(link);
17
+ link.click();
18
+ document.body.removeChild(link);
19
+ return true;
20
+ } catch (error) {
21
+ console.error("Error downloading the file", error);
22
+ return false;
23
+ }
24
+ };
25
+
26
+ export { downloadUrl };
27
+ //# sourceMappingURL=chunk-6IYD4APX.js.map
28
+ //# sourceMappingURL=chunk-6IYD4APX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/download-url.ts"],"names":[],"mappings":";AAAO,IAAM,WAAA,GAAc,OAAO,GAAA,KAAkC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3E,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAEvE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"chunk-6IYD4APX.js","sourcesContent":["export const downloadUrl = async (url: string): Promise<boolean> => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0)\n const filename = segments.length > 0 ? segments[segments.length - 1] : null\n\n if (!filename || !filename.includes(\".\")) {\n throw new Error(\"URL does not contain a valid filename\")\n }\n\n const response = await fetch(url, { mode: \"cors\" })\n const blob = await response.blob()\n\n const link = document.createElement(\"a\")\n link.href = window.URL.createObjectURL(blob)\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n return true\n } catch (error) {\n console.error(\"Error downloading the file\", error)\n return false\n }\n}\n"]}
@@ -0,0 +1,103 @@
1
+ import clsx from 'clsx';
2
+ import Image from 'next/image';
3
+ import { forwardRef, useRef, useState, useEffect } from 'react';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ // src/nextjs/optimized-image.tsx
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var OptimizedImage = forwardRef(
12
+ function OptimizedImage2({
13
+ src,
14
+ alt,
15
+ width,
16
+ height,
17
+ className,
18
+ fallbackText = "Falha ao carregar a imagem",
19
+ lazyLoad = true,
20
+ onLoad,
21
+ sizes,
22
+ ...props
23
+ }, ref) {
24
+ const containerRef = useRef(null);
25
+ const [isLoading, setIsLoading] = useState(true);
26
+ const [hasError, setHasError] = useState(false);
27
+ const [isInView, setIsInView] = useState(!lazyLoad);
28
+ useEffect(() => {
29
+ if (!lazyLoad || !containerRef.current) {
30
+ setIsInView(true);
31
+ return;
32
+ }
33
+ const observer = new IntersectionObserver(
34
+ ([entry]) => {
35
+ if (entry.isIntersecting) {
36
+ setIsInView(true);
37
+ observer.disconnect();
38
+ }
39
+ },
40
+ { rootMargin: "200px" }
41
+ );
42
+ observer.observe(containerRef.current);
43
+ return () => {
44
+ observer.disconnect();
45
+ };
46
+ }, [lazyLoad]);
47
+ const handleLoad = (ev) => {
48
+ setIsLoading(false);
49
+ onLoad == null ? void 0 : onLoad(ev);
50
+ };
51
+ const handleError = () => {
52
+ setIsLoading(false);
53
+ setHasError(true);
54
+ };
55
+ return /* @__PURE__ */ jsxs(
56
+ "div",
57
+ {
58
+ ref: containerRef,
59
+ className: "relative overflow-hidden",
60
+ style: {
61
+ width: width != null ? `${Number(width)}px` : "100%",
62
+ height: height != null ? `${Number(height)}px` : "100%"
63
+ },
64
+ children: [
65
+ isLoading && /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ className: "bg-muted absolute inset-0 animate-pulse rounded-md",
69
+ style: { width: "100%", height: "100%" }
70
+ }
71
+ ),
72
+ hasError ? /* @__PURE__ */ jsx("div", { className: "bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm", children: fallbackText }) : isInView && /* @__PURE__ */ jsx(
73
+ Image,
74
+ {
75
+ ref,
76
+ src: src || "/placeholder.svg",
77
+ alt,
78
+ width: width ? Number(width) : void 0,
79
+ height: height ? Number(height) : void 0,
80
+ sizes: sizes || "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
81
+ quality: 80,
82
+ loading: props.priority ? "eager" : "lazy",
83
+ className: cn(
84
+ "rounded-md object-cover transition-opacity duration-300",
85
+ isLoading ? "opacity-0" : "opacity-100",
86
+ className
87
+ ),
88
+ onLoad: handleLoad,
89
+ onError: handleError,
90
+ placeholder: "blur",
91
+ blurDataURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==",
92
+ ...props
93
+ }
94
+ )
95
+ ]
96
+ }
97
+ );
98
+ }
99
+ );
100
+
101
+ export { OptimizedImage };
102
+ //# sourceMappingURL=chunk-7X4LRL26.js.map
103
+ //# sourceMappingURL=chunk-7X4LRL26.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nextjs/optimized-image.tsx"],"names":["OptimizedImage"],"mappings":"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","file":"chunk-7X4LRL26.js","sourcesContent":["\"use client\"\n\nimport clsx, { type ClassValue } from \"clsx\"\nimport Image from \"next/image\"\nimport type React from \"react\"\nimport { forwardRef, useEffect, useRef, useState } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\ninterface OptimizedImageProps\n extends React.ComponentPropsWithoutRef<typeof Image> {\n fallbackText?: string\n lazyLoad?: boolean\n}\n\nexport const OptimizedImage = forwardRef<HTMLImageElement, OptimizedImageProps>(\n function OptimizedImage(\n {\n src,\n alt,\n width,\n height,\n className,\n fallbackText = \"Falha ao carregar a imagem\",\n lazyLoad = true,\n onLoad,\n sizes,\n ...props\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [hasError, setHasError] = useState(false)\n const [isInView, setIsInView] = useState(!lazyLoad)\n\n useEffect(() => {\n if (!lazyLoad || !containerRef.current) {\n setIsInView(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: \"200px\" },\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [lazyLoad])\n\n const handleLoad = (ev: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false)\n onLoad?.(ev)\n }\n\n const handleError = () => {\n setIsLoading(false)\n setHasError(true)\n }\n\n return (\n <div\n ref={containerRef}\n className=\"relative overflow-hidden\"\n style={{\n width: width != null ? `${Number(width)}px` : \"100%\",\n height: height != null ? `${Number(height)}px` : \"100%\",\n }}\n >\n {isLoading && (\n <div\n className=\"bg-muted absolute inset-0 animate-pulse rounded-md\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n\n {hasError ? (\n <div className=\"bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm\">\n {fallbackText}\n </div>\n ) : (\n isInView && (\n <Image\n ref={ref}\n src={src || \"/placeholder.svg\"}\n alt={alt}\n width={width ? Number(width) : undefined}\n height={height ? Number(height) : undefined}\n sizes={\n sizes ||\n \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n }\n quality={80}\n loading={props.priority ? \"eager\" : \"lazy\"}\n className={cn(\n \"rounded-md object-cover transition-opacity duration-300\",\n isLoading ? \"opacity-0\" : \"opacity-100\",\n className,\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder=\"blur\"\n blurDataURL=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==\"\n {...props}\n />\n )\n )}\n </div>\n )\n },\n)\n"]}
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ // src/files/download-url.ts
4
+ var downloadUrl = async (url) => {
5
+ try {
6
+ const urlObj = new URL(url);
7
+ const pathname = urlObj.pathname;
8
+ const segments = pathname.split("/").filter((segment) => segment.length > 0);
9
+ const filename = segments.length > 0 ? segments[segments.length - 1] : null;
10
+ if (!filename || !filename.includes(".")) {
11
+ throw new Error("URL does not contain a valid filename");
12
+ }
13
+ const response = await fetch(url, { mode: "cors" });
14
+ const blob = await response.blob();
15
+ const link = document.createElement("a");
16
+ link.href = window.URL.createObjectURL(blob);
17
+ link.download = filename;
18
+ document.body.appendChild(link);
19
+ link.click();
20
+ document.body.removeChild(link);
21
+ return true;
22
+ } catch (error) {
23
+ console.error("Error downloading the file", error);
24
+ return false;
25
+ }
26
+ };
27
+
28
+ exports.downloadUrl = downloadUrl;
29
+ //# sourceMappingURL=chunk-D3RLXVKJ.cjs.map
30
+ //# sourceMappingURL=chunk-D3RLXVKJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/download-url.ts"],"names":[],"mappings":";;;AAAO,IAAM,WAAA,GAAc,OAAO,GAAA,KAAkC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3E,IAAA,MAAM,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAEvE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,QAAQ,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,EAAM;AACX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"chunk-D3RLXVKJ.cjs","sourcesContent":["export const downloadUrl = async (url: string): Promise<boolean> => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0)\n const filename = segments.length > 0 ? segments[segments.length - 1] : null\n\n if (!filename || !filename.includes(\".\")) {\n throw new Error(\"URL does not contain a valid filename\")\n }\n\n const response = await fetch(url, { mode: \"cors\" })\n const blob = await response.blob()\n\n const link = document.createElement(\"a\")\n link.href = window.URL.createObjectURL(blob)\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n return true\n } catch (error) {\n console.error(\"Error downloading the file\", error)\n return false\n }\n}\n"]}
@@ -66,31 +66,21 @@ function compressImage({
66
66
  });
67
67
  }
68
68
 
69
- // src/files/download-url.ts
70
- var downloadUrl = async (url) => {
71
- try {
72
- const urlObj = new URL(url);
73
- const pathname = urlObj.pathname;
74
- const segments = pathname.split("/").filter((segment) => segment.length > 0);
75
- const filename = segments.length > 0 ? segments[segments.length - 1] : null;
76
- if (!filename || !filename.includes(".")) {
77
- throw new Error("URL does not contain a valid filename");
78
- }
79
- const response = await fetch(url, { mode: "cors" });
80
- const blob = await response.blob();
81
- const link = document.createElement("a");
82
- link.href = window.URL.createObjectURL(blob);
83
- link.download = filename;
84
- document.body.appendChild(link);
85
- link.click();
86
- document.body.removeChild(link);
87
- return true;
88
- } catch (error) {
89
- console.error("Error downloading the file", error);
90
- return false;
69
+ // src/files/format-bytes.ts
70
+ function formatBytes(bytes) {
71
+ if (bytes < 0) {
72
+ throw new Error("Size in bytes cannot be negative");
91
73
  }
92
- };
74
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
75
+ let size = bytes;
76
+ let index = 0;
77
+ while (size >= 1024 && index < units.length - 1) {
78
+ size /= 1024;
79
+ index++;
80
+ }
81
+ return `${size.toFixed(2)} ${units[index]}`;
82
+ }
93
83
 
94
- export { compressImage, downloadUrl };
95
- //# sourceMappingURL=chunk-AQZBHMTO.js.map
96
- //# sourceMappingURL=chunk-AQZBHMTO.js.map
84
+ export { compressImage, formatBytes };
85
+ //# sourceMappingURL=chunk-DVHDU327.js.map
86
+ //# sourceMappingURL=chunk-DVHDU327.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/compress-image.ts","../src/files/format-bytes.ts"],"names":[],"mappings":"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","file":"chunk-DVHDU327.js","sourcesContent":["interface ICompressImageParams {\n file: File\n maxWidth?: number\n maxHeight?: number\n quality?: number\n allowedFileTypes?: string[]\n}\n\nfunction convertToWebp(filename: string): string {\n const lastDotIndex = filename.lastIndexOf(\".\")\n\n if (lastDotIndex === -1) {\n return `${filename}.webp`\n }\n\n return `${filename.substring(0, lastDotIndex)}.webp`\n}\n\nexport function compressImage({\n file,\n maxWidth = Number.POSITIVE_INFINITY,\n maxHeight = Number.POSITIVE_INFINITY,\n quality = 1,\n allowedFileTypes = [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/webp\"],\n}: ICompressImageParams) {\n if (!allowedFileTypes.includes(file.type)) {\n throw new Error(\"Image format not supported\")\n }\n\n return new Promise<File>((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = (event) => {\n const compressed = new Image()\n\n compressed.onload = () => {\n const canvas = document.createElement(\"canvas\")\n\n let width = compressed.width\n let height = compressed.height\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width\n width = maxWidth\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height\n height = maxHeight\n }\n }\n\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext(\"2d\")\n\n if (!context) {\n reject(new Error(\"Failed to get canvas context\"))\n return\n }\n\n context.drawImage(compressed, 0, 0, width, height)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to compress image.\"))\n return\n }\n\n const compressedFile = new File([blob], convertToWebp(file.name), {\n type: \"image/webp\",\n lastModified: Date.now(),\n })\n\n resolve(compressedFile)\n },\n \"image/webp\",\n quality,\n )\n }\n\n compressed.src = event.target?.result as string\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export function formatBytes(bytes: number): string {\n if (bytes < 0) {\n throw new Error(\"Size in bytes cannot be negative\")\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n let size = bytes\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n return `${size.toFixed(2)} ${units[index]}`\n}\n"]}
@@ -0,0 +1,110 @@
1
+ 'use strict';
2
+
3
+ var clsx = require('clsx');
4
+ var Image = require('next/image');
5
+ var react = require('react');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
12
+ var Image__default = /*#__PURE__*/_interopDefault(Image);
13
+
14
+ // src/nextjs/optimized-image.tsx
15
+ function cn(...inputs) {
16
+ return tailwindMerge.twMerge(clsx__default.default(inputs));
17
+ }
18
+ var OptimizedImage = react.forwardRef(
19
+ function OptimizedImage2({
20
+ src,
21
+ alt,
22
+ width,
23
+ height,
24
+ className,
25
+ fallbackText = "Falha ao carregar a imagem",
26
+ lazyLoad = true,
27
+ onLoad,
28
+ sizes,
29
+ ...props
30
+ }, ref) {
31
+ const containerRef = react.useRef(null);
32
+ const [isLoading, setIsLoading] = react.useState(true);
33
+ const [hasError, setHasError] = react.useState(false);
34
+ const [isInView, setIsInView] = react.useState(!lazyLoad);
35
+ react.useEffect(() => {
36
+ if (!lazyLoad || !containerRef.current) {
37
+ setIsInView(true);
38
+ return;
39
+ }
40
+ const observer = new IntersectionObserver(
41
+ ([entry]) => {
42
+ if (entry.isIntersecting) {
43
+ setIsInView(true);
44
+ observer.disconnect();
45
+ }
46
+ },
47
+ { rootMargin: "200px" }
48
+ );
49
+ observer.observe(containerRef.current);
50
+ return () => {
51
+ observer.disconnect();
52
+ };
53
+ }, [lazyLoad]);
54
+ const handleLoad = (ev) => {
55
+ setIsLoading(false);
56
+ onLoad == null ? void 0 : onLoad(ev);
57
+ };
58
+ const handleError = () => {
59
+ setIsLoading(false);
60
+ setHasError(true);
61
+ };
62
+ return /* @__PURE__ */ jsxRuntime.jsxs(
63
+ "div",
64
+ {
65
+ ref: containerRef,
66
+ className: "relative overflow-hidden",
67
+ style: {
68
+ width: width != null ? `${Number(width)}px` : "100%",
69
+ height: height != null ? `${Number(height)}px` : "100%"
70
+ },
71
+ children: [
72
+ isLoading && /* @__PURE__ */ jsxRuntime.jsx(
73
+ "div",
74
+ {
75
+ className: "bg-muted absolute inset-0 animate-pulse rounded-md",
76
+ style: { width: "100%", height: "100%" }
77
+ }
78
+ ),
79
+ hasError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm", children: fallbackText }) : isInView && /* @__PURE__ */ jsxRuntime.jsx(
80
+ Image__default.default,
81
+ {
82
+ ref,
83
+ src: src || "/placeholder.svg",
84
+ alt,
85
+ width: width ? Number(width) : void 0,
86
+ height: height ? Number(height) : void 0,
87
+ sizes: sizes || "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
88
+ quality: 80,
89
+ loading: props.priority ? "eager" : "lazy",
90
+ className: cn(
91
+ "rounded-md object-cover transition-opacity duration-300",
92
+ isLoading ? "opacity-0" : "opacity-100",
93
+ className
94
+ ),
95
+ onLoad: handleLoad,
96
+ onError: handleError,
97
+ placeholder: "blur",
98
+ blurDataURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==",
99
+ ...props
100
+ }
101
+ )
102
+ ]
103
+ }
104
+ );
105
+ }
106
+ );
107
+
108
+ exports.OptimizedImage = OptimizedImage;
109
+ //# sourceMappingURL=chunk-KWMJV4VK.cjs.map
110
+ //# sourceMappingURL=chunk-KWMJV4VK.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nextjs/optimized-image.tsx"],"names":["twMerge","clsx","forwardRef","OptimizedImage","useRef","useState","useEffect","jsxs","jsx","Image"],"mappings":"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","file":"chunk-KWMJV4VK.cjs","sourcesContent":["\"use client\"\n\nimport clsx, { type ClassValue } from \"clsx\"\nimport Image from \"next/image\"\nimport type React from \"react\"\nimport { forwardRef, useEffect, useRef, useState } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\ninterface OptimizedImageProps\n extends React.ComponentPropsWithoutRef<typeof Image> {\n fallbackText?: string\n lazyLoad?: boolean\n}\n\nexport const OptimizedImage = forwardRef<HTMLImageElement, OptimizedImageProps>(\n function OptimizedImage(\n {\n src,\n alt,\n width,\n height,\n className,\n fallbackText = \"Falha ao carregar a imagem\",\n lazyLoad = true,\n onLoad,\n sizes,\n ...props\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [hasError, setHasError] = useState(false)\n const [isInView, setIsInView] = useState(!lazyLoad)\n\n useEffect(() => {\n if (!lazyLoad || !containerRef.current) {\n setIsInView(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: \"200px\" },\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [lazyLoad])\n\n const handleLoad = (ev: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false)\n onLoad?.(ev)\n }\n\n const handleError = () => {\n setIsLoading(false)\n setHasError(true)\n }\n\n return (\n <div\n ref={containerRef}\n className=\"relative overflow-hidden\"\n style={{\n width: width != null ? `${Number(width)}px` : \"100%\",\n height: height != null ? `${Number(height)}px` : \"100%\",\n }}\n >\n {isLoading && (\n <div\n className=\"bg-muted absolute inset-0 animate-pulse rounded-md\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n\n {hasError ? (\n <div className=\"bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm\">\n {fallbackText}\n </div>\n ) : (\n isInView && (\n <Image\n ref={ref}\n src={src || \"/placeholder.svg\"}\n alt={alt}\n width={width ? Number(width) : undefined}\n height={height ? Number(height) : undefined}\n sizes={\n sizes ||\n \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n }\n quality={80}\n loading={props.priority ? \"eager\" : \"lazy\"}\n className={cn(\n \"rounded-md object-cover transition-opacity duration-300\",\n isLoading ? \"opacity-0\" : \"opacity-100\",\n className,\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder=\"blur\"\n blurDataURL=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==\"\n {...props}\n />\n )\n )}\n </div>\n )\n },\n)\n"]}
@@ -68,32 +68,22 @@ function compressImage({
68
68
  });
69
69
  }
70
70
 
71
- // src/files/download-url.ts
72
- var downloadUrl = async (url) => {
73
- try {
74
- const urlObj = new URL(url);
75
- const pathname = urlObj.pathname;
76
- const segments = pathname.split("/").filter((segment) => segment.length > 0);
77
- const filename = segments.length > 0 ? segments[segments.length - 1] : null;
78
- if (!filename || !filename.includes(".")) {
79
- throw new Error("URL does not contain a valid filename");
80
- }
81
- const response = await fetch(url, { mode: "cors" });
82
- const blob = await response.blob();
83
- const link = document.createElement("a");
84
- link.href = window.URL.createObjectURL(blob);
85
- link.download = filename;
86
- document.body.appendChild(link);
87
- link.click();
88
- document.body.removeChild(link);
89
- return true;
90
- } catch (error) {
91
- console.error("Error downloading the file", error);
92
- return false;
71
+ // src/files/format-bytes.ts
72
+ function formatBytes(bytes) {
73
+ if (bytes < 0) {
74
+ throw new Error("Size in bytes cannot be negative");
93
75
  }
94
- };
76
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
77
+ let size = bytes;
78
+ let index = 0;
79
+ while (size >= 1024 && index < units.length - 1) {
80
+ size /= 1024;
81
+ index++;
82
+ }
83
+ return `${size.toFixed(2)} ${units[index]}`;
84
+ }
95
85
 
96
86
  exports.compressImage = compressImage;
97
- exports.downloadUrl = downloadUrl;
98
- //# sourceMappingURL=chunk-SLYUARZG.cjs.map
99
- //# sourceMappingURL=chunk-SLYUARZG.cjs.map
87
+ exports.formatBytes = formatBytes;
88
+ //# sourceMappingURL=chunk-SLDBIYI4.cjs.map
89
+ //# sourceMappingURL=chunk-SLDBIYI4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/compress-image.ts","../src/files/format-bytes.ts"],"names":[],"mappings":"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","file":"chunk-SLDBIYI4.cjs","sourcesContent":["interface ICompressImageParams {\n file: File\n maxWidth?: number\n maxHeight?: number\n quality?: number\n allowedFileTypes?: string[]\n}\n\nfunction convertToWebp(filename: string): string {\n const lastDotIndex = filename.lastIndexOf(\".\")\n\n if (lastDotIndex === -1) {\n return `${filename}.webp`\n }\n\n return `${filename.substring(0, lastDotIndex)}.webp`\n}\n\nexport function compressImage({\n file,\n maxWidth = Number.POSITIVE_INFINITY,\n maxHeight = Number.POSITIVE_INFINITY,\n quality = 1,\n allowedFileTypes = [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/webp\"],\n}: ICompressImageParams) {\n if (!allowedFileTypes.includes(file.type)) {\n throw new Error(\"Image format not supported\")\n }\n\n return new Promise<File>((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = (event) => {\n const compressed = new Image()\n\n compressed.onload = () => {\n const canvas = document.createElement(\"canvas\")\n\n let width = compressed.width\n let height = compressed.height\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width\n width = maxWidth\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height\n height = maxHeight\n }\n }\n\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext(\"2d\")\n\n if (!context) {\n reject(new Error(\"Failed to get canvas context\"))\n return\n }\n\n context.drawImage(compressed, 0, 0, width, height)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to compress image.\"))\n return\n }\n\n const compressedFile = new File([blob], convertToWebp(file.name), {\n type: \"image/webp\",\n lastModified: Date.now(),\n })\n\n resolve(compressedFile)\n },\n \"image/webp\",\n quality,\n )\n }\n\n compressed.src = event.target?.result as string\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export function formatBytes(bytes: number): string {\n if (bytes < 0) {\n throw new Error(\"Size in bytes cannot be negative\")\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n let size = bytes\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n return `${size.toFixed(2)} ${units[index]}`\n}\n"]}
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkSLYUARZG_cjs = require('../chunk-SLYUARZG.cjs');
4
- var chunkGRSF4RY2_cjs = require('../chunk-GRSF4RY2.cjs');
3
+ var chunkD3RLXVKJ_cjs = require('../chunk-D3RLXVKJ.cjs');
4
+ var chunkSLDBIYI4_cjs = require('../chunk-SLDBIYI4.cjs');
5
5
 
6
6
 
7
7
 
8
- Object.defineProperty(exports, "compressImage", {
8
+ Object.defineProperty(exports, "downloadUrl", {
9
9
  enumerable: true,
10
- get: function () { return chunkSLYUARZG_cjs.compressImage; }
10
+ get: function () { return chunkD3RLXVKJ_cjs.downloadUrl; }
11
11
  });
12
- Object.defineProperty(exports, "downloadUrl", {
12
+ Object.defineProperty(exports, "compressImage", {
13
13
  enumerable: true,
14
- get: function () { return chunkSLYUARZG_cjs.downloadUrl; }
14
+ get: function () { return chunkSLDBIYI4_cjs.compressImage; }
15
15
  });
16
16
  Object.defineProperty(exports, "formatBytes", {
17
17
  enumerable: true,
18
- get: function () { return chunkGRSF4RY2_cjs.formatBytes; }
18
+ get: function () { return chunkSLDBIYI4_cjs.formatBytes; }
19
19
  });
20
20
  //# sourceMappingURL=index.browser.cjs.map
21
21
  //# sourceMappingURL=index.browser.cjs.map
@@ -1,14 +1,5 @@
1
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.mjs';
2
-
3
- interface ICompressImageParams {
4
- file: File;
5
- maxWidth?: number;
6
- maxHeight?: number;
7
- quality?: number;
8
- allowedFileTypes?: string[];
9
- }
10
- declare function compressImage({ file, maxWidth, maxHeight, quality, allowedFileTypes, }: ICompressImageParams): Promise<File>;
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.mjs';
11
2
 
12
3
  declare const downloadUrl: (url: string) => Promise<boolean>;
13
4
 
14
- export { compressImage, downloadUrl };
5
+ export { downloadUrl };
@@ -1,14 +1,5 @@
1
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.js';
2
-
3
- interface ICompressImageParams {
4
- file: File;
5
- maxWidth?: number;
6
- maxHeight?: number;
7
- quality?: number;
8
- allowedFileTypes?: string[];
9
- }
10
- declare function compressImage({ file, maxWidth, maxHeight, quality, allowedFileTypes, }: ICompressImageParams): Promise<File>;
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.js';
11
2
 
12
3
  declare const downloadUrl: (url: string) => Promise<boolean>;
13
4
 
14
- export { compressImage, downloadUrl };
5
+ export { downloadUrl };
@@ -1,4 +1,4 @@
1
- export { compressImage, downloadUrl } from '../chunk-AQZBHMTO.js';
2
- export { formatBytes } from '../chunk-O7SH3E3T.js';
1
+ export { downloadUrl } from '../chunk-6IYD4APX.js';
2
+ export { compressImage, formatBytes } from '../chunk-DVHDU327.js';
3
3
  //# sourceMappingURL=index.browser.js.map
4
4
  //# sourceMappingURL=index.browser.js.map
@@ -1,19 +1,15 @@
1
1
  'use strict';
2
2
 
3
3
  require('../chunk-6TWPZ6LL.cjs');
4
- var chunkSLYUARZG_cjs = require('../chunk-SLYUARZG.cjs');
4
+ var chunkD3RLXVKJ_cjs = require('../chunk-D3RLXVKJ.cjs');
5
5
  var chunkN2DRAZ3A_cjs = require('../chunk-N2DRAZ3A.cjs');
6
- var chunkGRSF4RY2_cjs = require('../chunk-GRSF4RY2.cjs');
6
+ var chunkSLDBIYI4_cjs = require('../chunk-SLDBIYI4.cjs');
7
7
 
8
8
 
9
9
 
10
- Object.defineProperty(exports, "compressImage", {
11
- enumerable: true,
12
- get: function () { return chunkSLYUARZG_cjs.compressImage; }
13
- });
14
10
  Object.defineProperty(exports, "downloadUrl", {
15
11
  enumerable: true,
16
- get: function () { return chunkSLYUARZG_cjs.downloadUrl; }
12
+ get: function () { return chunkD3RLXVKJ_cjs.downloadUrl; }
17
13
  });
18
14
  Object.defineProperty(exports, "fileDelete", {
19
15
  enumerable: true,
@@ -23,9 +19,13 @@ Object.defineProperty(exports, "fileExists", {
23
19
  enumerable: true,
24
20
  get: function () { return chunkN2DRAZ3A_cjs.fileExists; }
25
21
  });
22
+ Object.defineProperty(exports, "compressImage", {
23
+ enumerable: true,
24
+ get: function () { return chunkSLDBIYI4_cjs.compressImage; }
25
+ });
26
26
  Object.defineProperty(exports, "formatBytes", {
27
27
  enumerable: true,
28
- get: function () { return chunkGRSF4RY2_cjs.formatBytes; }
28
+ get: function () { return chunkSLDBIYI4_cjs.formatBytes; }
29
29
  });
30
30
  //# sourceMappingURL=index.cjs.map
31
31
  //# sourceMappingURL=index.cjs.map
@@ -1,3 +1,3 @@
1
- export { compressImage, downloadUrl } from './index.browser.mjs';
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.mjs';
2
+ export { downloadUrl } from './index.browser.mjs';
2
3
  export { fileDelete, fileExists } from './index.node.mjs';
3
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.mjs';
@@ -1,3 +1,3 @@
1
- export { compressImage, downloadUrl } from './index.browser.js';
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.js';
2
+ export { downloadUrl } from './index.browser.js';
2
3
  export { fileDelete, fileExists } from './index.node.js';
3
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.js';
@@ -1,6 +1,6 @@
1
1
  import '../chunk-3JUB2OJL.js';
2
- export { compressImage, downloadUrl } from '../chunk-AQZBHMTO.js';
2
+ export { downloadUrl } from '../chunk-6IYD4APX.js';
3
3
  export { fileDelete, fileExists } from '../chunk-V6OKXUBQ.js';
4
- export { formatBytes } from '../chunk-O7SH3E3T.js';
4
+ export { compressImage, formatBytes } from '../chunk-DVHDU327.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkN2DRAZ3A_cjs = require('../chunk-N2DRAZ3A.cjs');
4
- var chunkGRSF4RY2_cjs = require('../chunk-GRSF4RY2.cjs');
4
+ var chunkSLDBIYI4_cjs = require('../chunk-SLDBIYI4.cjs');
5
5
 
6
6
 
7
7
 
@@ -13,9 +13,13 @@ Object.defineProperty(exports, "fileExists", {
13
13
  enumerable: true,
14
14
  get: function () { return chunkN2DRAZ3A_cjs.fileExists; }
15
15
  });
16
+ Object.defineProperty(exports, "compressImage", {
17
+ enumerable: true,
18
+ get: function () { return chunkSLDBIYI4_cjs.compressImage; }
19
+ });
16
20
  Object.defineProperty(exports, "formatBytes", {
17
21
  enumerable: true,
18
- get: function () { return chunkGRSF4RY2_cjs.formatBytes; }
22
+ get: function () { return chunkSLDBIYI4_cjs.formatBytes; }
19
23
  });
20
24
  //# sourceMappingURL=index.node.cjs.map
21
25
  //# sourceMappingURL=index.node.cjs.map
@@ -1,4 +1,4 @@
1
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.mjs';
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.mjs';
2
2
 
3
3
  declare const fileDelete: (filePath: string) => Promise<void>;
4
4
 
@@ -1,4 +1,4 @@
1
- export { f as formatBytes } from '../format-bytes-BGjeDnvM.js';
1
+ export { c as compressImage, f as formatBytes } from '../format-bytes-B0QeE7As.js';
2
2
 
3
3
  declare const fileDelete: (filePath: string) => Promise<void>;
4
4
 
@@ -1,4 +1,4 @@
1
1
  export { fileDelete, fileExists } from '../chunk-V6OKXUBQ.js';
2
- export { formatBytes } from '../chunk-O7SH3E3T.js';
2
+ export { compressImage, formatBytes } from '../chunk-DVHDU327.js';
3
3
  //# sourceMappingURL=index.node.js.map
4
4
  //# sourceMappingURL=index.node.js.map
@@ -0,0 +1,12 @@
1
+ interface ICompressImageParams {
2
+ file: File;
3
+ maxWidth?: number;
4
+ maxHeight?: number;
5
+ quality?: number;
6
+ allowedFileTypes?: string[];
7
+ }
8
+ declare function compressImage({ file, maxWidth, maxHeight, quality, allowedFileTypes, }: ICompressImageParams): Promise<File>;
9
+
10
+ declare function formatBytes(bytes: number): string;
11
+
12
+ export { compressImage as c, formatBytes as f };
@@ -0,0 +1,12 @@
1
+ interface ICompressImageParams {
2
+ file: File;
3
+ maxWidth?: number;
4
+ maxHeight?: number;
5
+ quality?: number;
6
+ allowedFileTypes?: string[];
7
+ }
8
+ declare function compressImage({ file, maxWidth, maxHeight, quality, allowedFileTypes, }: ICompressImageParams): Promise<File>;
9
+
10
+ declare function formatBytes(bytes: number): string;
11
+
12
+ export { compressImage as c, formatBytes as f };
package/dist/index.cjs CHANGED
@@ -9,9 +9,9 @@ var chunkWGSFRFRO_cjs = require('./chunk-WGSFRFRO.cjs');
9
9
  var chunk2MANLCNG_cjs = require('./chunk-2MANLCNG.cjs');
10
10
  var chunkUXEUYHBD_cjs = require('./chunk-UXEUYHBD.cjs');
11
11
  require('./chunk-6TWPZ6LL.cjs');
12
- var chunkSLYUARZG_cjs = require('./chunk-SLYUARZG.cjs');
12
+ var chunkD3RLXVKJ_cjs = require('./chunk-D3RLXVKJ.cjs');
13
13
  var chunkN2DRAZ3A_cjs = require('./chunk-N2DRAZ3A.cjs');
14
- var chunkGRSF4RY2_cjs = require('./chunk-GRSF4RY2.cjs');
14
+ var chunkSLDBIYI4_cjs = require('./chunk-SLDBIYI4.cjs');
15
15
  var chunkGX5E5B4L_cjs = require('./chunk-GX5E5B4L.cjs');
16
16
 
17
17
 
@@ -152,13 +152,9 @@ Object.defineProperty(exports, "withDayjsGlobalIntl", {
152
152
  enumerable: true,
153
153
  get: function () { return chunkUXEUYHBD_cjs.withDayjsGlobalIntl; }
154
154
  });
155
- Object.defineProperty(exports, "compressImage", {
156
- enumerable: true,
157
- get: function () { return chunkSLYUARZG_cjs.compressImage; }
158
- });
159
155
  Object.defineProperty(exports, "downloadUrl", {
160
156
  enumerable: true,
161
- get: function () { return chunkSLYUARZG_cjs.downloadUrl; }
157
+ get: function () { return chunkD3RLXVKJ_cjs.downloadUrl; }
162
158
  });
163
159
  Object.defineProperty(exports, "fileDelete", {
164
160
  enumerable: true,
@@ -168,9 +164,13 @@ Object.defineProperty(exports, "fileExists", {
168
164
  enumerable: true,
169
165
  get: function () { return chunkN2DRAZ3A_cjs.fileExists; }
170
166
  });
167
+ Object.defineProperty(exports, "compressImage", {
168
+ enumerable: true,
169
+ get: function () { return chunkSLDBIYI4_cjs.compressImage; }
170
+ });
171
171
  Object.defineProperty(exports, "formatBytes", {
172
172
  enumerable: true,
173
- get: function () { return chunkGRSF4RY2_cjs.formatBytes; }
173
+ get: function () { return chunkSLDBIYI4_cjs.formatBytes; }
174
174
  });
175
175
  Object.defineProperty(exports, "debounce", {
176
176
  enumerable: true,
package/dist/index.d.mts CHANGED
@@ -1,9 +1,9 @@
1
1
  export { IApiError, apiClient } from './api/index.mjs';
2
2
  export { shuffle, unique } from './array/index.mjs';
3
3
  export { IDayjsIntlConfig, IDayjsIntlResolvedConfig, IFormatDateConfig, ITimeSpent, dayjs, fixTimezoneOffset, formatDate, getCurrentDateInUTC, getDateInUTC, getDayjsGlobalIntl, getRelativeTime, parseTimeSpent, resetDayjsGlobalIntl, resolveDayjsIntlConfig, setDayjsGlobalIntl, withDayjsGlobalIntl } from './date/index.mjs';
4
- export { compressImage, downloadUrl } from './files/index.browser.mjs';
4
+ export { c as compressImage, f as formatBytes } from './format-bytes-B0QeE7As.mjs';
5
+ export { downloadUrl } from './files/index.browser.mjs';
5
6
  export { fileDelete, fileExists } from './files/index.node.mjs';
6
- export { f as formatBytes } from './format-bytes-BGjeDnvM.mjs';
7
7
  export { debounce, throttle } from './function/index.mjs';
8
8
  export { T as TTryCatchResult, t as tryCatch } from './try-catch-B7WzqcPU.mjs';
9
9
  export { camelCase, capitalize, formatHMSToSeconds, formatSecondsToFragment, formatSecondsToHMS, formatStringToTime, kebabCase, markdownToText, removeHtmlTags, slugify, snakeCase, toSentenceCase, truncate } from './string/index.mjs';
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export { IApiError, apiClient } from './api/index.js';
2
2
  export { shuffle, unique } from './array/index.js';
3
3
  export { IDayjsIntlConfig, IDayjsIntlResolvedConfig, IFormatDateConfig, ITimeSpent, dayjs, fixTimezoneOffset, formatDate, getCurrentDateInUTC, getDateInUTC, getDayjsGlobalIntl, getRelativeTime, parseTimeSpent, resetDayjsGlobalIntl, resolveDayjsIntlConfig, setDayjsGlobalIntl, withDayjsGlobalIntl } from './date/index.js';
4
- export { compressImage, downloadUrl } from './files/index.browser.js';
4
+ export { c as compressImage, f as formatBytes } from './format-bytes-B0QeE7As.js';
5
+ export { downloadUrl } from './files/index.browser.js';
5
6
  export { fileDelete, fileExists } from './files/index.node.js';
6
- export { f as formatBytes } from './format-bytes-BGjeDnvM.js';
7
7
  export { debounce, throttle } from './function/index.js';
8
8
  export { T as TTryCatchResult, t as tryCatch } from './try-catch-B7WzqcPU.js';
9
9
  export { camelCase, capitalize, formatHMSToSeconds, formatSecondsToFragment, formatSecondsToHMS, formatStringToTime, kebabCase, markdownToText, removeHtmlTags, slugify, snakeCase, toSentenceCase, truncate } from './string/index.js';
package/dist/index.js CHANGED
@@ -7,9 +7,9 @@ export { apiClient } from './chunk-2Y6M7IOG.js';
7
7
  export { shuffle, unique } from './chunk-2RTW37WD.js';
8
8
  export { dayjs, fixTimezoneOffset, formatDate, getCurrentDateInUTC, getDateInUTC, getDayjsGlobalIntl, getRelativeTime, parseTimeSpent, resetDayjsGlobalIntl, resolveDayjsIntlConfig, setDayjsGlobalIntl, withDayjsGlobalIntl } from './chunk-QRXVUXGJ.js';
9
9
  import './chunk-3JUB2OJL.js';
10
- export { compressImage, downloadUrl } from './chunk-AQZBHMTO.js';
10
+ export { downloadUrl } from './chunk-6IYD4APX.js';
11
11
  export { fileDelete, fileExists } from './chunk-V6OKXUBQ.js';
12
- export { formatBytes } from './chunk-O7SH3E3T.js';
12
+ export { compressImage, formatBytes } from './chunk-DVHDU327.js';
13
13
  export { debounce, throttle, tryCatch } from './chunk-5OLQJUNS.js';
14
14
  //# sourceMappingURL=index.js.map
15
15
  //# sourceMappingURL=index.js.map
@@ -1,110 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var clsx = require('clsx');
4
- var Image = require('next/image');
5
- var react = require('react');
6
- var tailwindMerge = require('tailwind-merge');
7
- var jsxRuntime = require('react/jsx-runtime');
3
+ var chunkKWMJV4VK_cjs = require('../chunk-KWMJV4VK.cjs');
8
4
 
9
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
5
 
11
- var clsx__default = /*#__PURE__*/_interopDefault(clsx);
12
- var Image__default = /*#__PURE__*/_interopDefault(Image);
13
6
 
14
- // src/nextjs/optimized-image.tsx
15
- function cn(...inputs) {
16
- return tailwindMerge.twMerge(clsx__default.default(inputs));
17
- }
18
- var OptimizedImage = react.forwardRef(
19
- function OptimizedImage2({
20
- src,
21
- alt,
22
- width,
23
- height,
24
- className,
25
- fallbackText = "Falha ao carregar a imagem",
26
- lazyLoad = true,
27
- onLoad,
28
- sizes,
29
- ...props
30
- }, ref) {
31
- const containerRef = react.useRef(null);
32
- const [isLoading, setIsLoading] = react.useState(true);
33
- const [hasError, setHasError] = react.useState(false);
34
- const [isInView, setIsInView] = react.useState(!lazyLoad);
35
- react.useEffect(() => {
36
- if (!lazyLoad || !containerRef.current) {
37
- setIsInView(true);
38
- return;
39
- }
40
- const observer = new IntersectionObserver(
41
- ([entry]) => {
42
- if (entry.isIntersecting) {
43
- setIsInView(true);
44
- observer.disconnect();
45
- }
46
- },
47
- { rootMargin: "200px" }
48
- );
49
- observer.observe(containerRef.current);
50
- return () => {
51
- observer.disconnect();
52
- };
53
- }, [lazyLoad]);
54
- const handleLoad = (ev) => {
55
- setIsLoading(false);
56
- onLoad == null ? void 0 : onLoad(ev);
57
- };
58
- const handleError = () => {
59
- setIsLoading(false);
60
- setHasError(true);
61
- };
62
- return /* @__PURE__ */ jsxRuntime.jsxs(
63
- "div",
64
- {
65
- ref: containerRef,
66
- className: "relative overflow-hidden",
67
- style: {
68
- width: width != null ? `${Number(width)}px` : "100%",
69
- height: height != null ? `${Number(height)}px` : "100%"
70
- },
71
- children: [
72
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(
73
- "div",
74
- {
75
- className: "bg-muted absolute inset-0 animate-pulse rounded-md",
76
- style: { width: "100%", height: "100%" }
77
- }
78
- ),
79
- hasError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm", children: fallbackText }) : isInView && /* @__PURE__ */ jsxRuntime.jsx(
80
- Image__default.default,
81
- {
82
- ref,
83
- src: src || "/placeholder.svg",
84
- alt,
85
- width: width ? Number(width) : void 0,
86
- height: height ? Number(height) : void 0,
87
- sizes: sizes || "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
88
- quality: 80,
89
- loading: props.priority ? "eager" : "lazy",
90
- className: cn(
91
- "rounded-md object-cover transition-opacity duration-300",
92
- isLoading ? "opacity-0" : "opacity-100",
93
- className
94
- ),
95
- onLoad: handleLoad,
96
- onError: handleError,
97
- placeholder: "blur",
98
- blurDataURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==",
99
- ...props
100
- }
101
- )
102
- ]
103
- }
104
- );
105
- }
106
- );
107
-
108
- exports.OptimizedImage = OptimizedImage;
7
+ Object.defineProperty(exports, "OptimizedImage", {
8
+ enumerable: true,
9
+ get: function () { return chunkKWMJV4VK_cjs.OptimizedImage; }
10
+ });
109
11
  //# sourceMappingURL=index.browser.cjs.map
110
12
  //# sourceMappingURL=index.browser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nextjs/optimized-image.tsx"],"names":["twMerge","clsx","forwardRef","OptimizedImage","useRef","useState","useEffect","jsxs","jsx","Image"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["\"use client\"\n\nimport clsx, { type ClassValue } from \"clsx\"\nimport Image from \"next/image\"\nimport type React from \"react\"\nimport { forwardRef, useEffect, useRef, useState } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\ninterface OptimizedImageProps\n extends React.ComponentPropsWithoutRef<typeof Image> {\n fallbackText?: string\n lazyLoad?: boolean\n}\n\nexport const OptimizedImage = forwardRef<HTMLImageElement, OptimizedImageProps>(\n function OptimizedImage(\n {\n src,\n alt,\n width,\n height,\n className,\n fallbackText = \"Falha ao carregar a imagem\",\n lazyLoad = true,\n onLoad,\n sizes,\n ...props\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [hasError, setHasError] = useState(false)\n const [isInView, setIsInView] = useState(!lazyLoad)\n\n useEffect(() => {\n if (!lazyLoad || !containerRef.current) {\n setIsInView(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: \"200px\" },\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [lazyLoad])\n\n const handleLoad = (ev: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false)\n onLoad?.(ev)\n }\n\n const handleError = () => {\n setIsLoading(false)\n setHasError(true)\n }\n\n return (\n <div\n ref={containerRef}\n className=\"relative overflow-hidden\"\n style={{\n width: width != null ? `${Number(width)}px` : \"100%\",\n height: height != null ? `${Number(height)}px` : \"100%\",\n }}\n >\n {isLoading && (\n <div\n className=\"bg-muted absolute inset-0 animate-pulse rounded-md\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n\n {hasError ? (\n <div className=\"bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm\">\n {fallbackText}\n </div>\n ) : (\n isInView && (\n <Image\n ref={ref}\n src={src || \"/placeholder.svg\"}\n alt={alt}\n width={width ? Number(width) : undefined}\n height={height ? Number(height) : undefined}\n sizes={\n sizes ||\n \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n }\n quality={80}\n loading={props.priority ? \"eager\" : \"lazy\"}\n className={cn(\n \"rounded-md object-cover transition-opacity duration-300\",\n isLoading ? \"opacity-0\" : \"opacity-100\",\n className,\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder=\"blur\"\n blurDataURL=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==\"\n {...props}\n />\n )\n )}\n </div>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.browser.cjs"}
@@ -1,103 +1,3 @@
1
- import clsx from 'clsx';
2
- import Image from 'next/image';
3
- import { forwardRef, useRef, useState, useEffect } from 'react';
4
- import { twMerge } from 'tailwind-merge';
5
- import { jsxs, jsx } from 'react/jsx-runtime';
6
-
7
- // src/nextjs/optimized-image.tsx
8
- function cn(...inputs) {
9
- return twMerge(clsx(inputs));
10
- }
11
- var OptimizedImage = forwardRef(
12
- function OptimizedImage2({
13
- src,
14
- alt,
15
- width,
16
- height,
17
- className,
18
- fallbackText = "Falha ao carregar a imagem",
19
- lazyLoad = true,
20
- onLoad,
21
- sizes,
22
- ...props
23
- }, ref) {
24
- const containerRef = useRef(null);
25
- const [isLoading, setIsLoading] = useState(true);
26
- const [hasError, setHasError] = useState(false);
27
- const [isInView, setIsInView] = useState(!lazyLoad);
28
- useEffect(() => {
29
- if (!lazyLoad || !containerRef.current) {
30
- setIsInView(true);
31
- return;
32
- }
33
- const observer = new IntersectionObserver(
34
- ([entry]) => {
35
- if (entry.isIntersecting) {
36
- setIsInView(true);
37
- observer.disconnect();
38
- }
39
- },
40
- { rootMargin: "200px" }
41
- );
42
- observer.observe(containerRef.current);
43
- return () => {
44
- observer.disconnect();
45
- };
46
- }, [lazyLoad]);
47
- const handleLoad = (ev) => {
48
- setIsLoading(false);
49
- onLoad == null ? void 0 : onLoad(ev);
50
- };
51
- const handleError = () => {
52
- setIsLoading(false);
53
- setHasError(true);
54
- };
55
- return /* @__PURE__ */ jsxs(
56
- "div",
57
- {
58
- ref: containerRef,
59
- className: "relative overflow-hidden",
60
- style: {
61
- width: width != null ? `${Number(width)}px` : "100%",
62
- height: height != null ? `${Number(height)}px` : "100%"
63
- },
64
- children: [
65
- isLoading && /* @__PURE__ */ jsx(
66
- "div",
67
- {
68
- className: "bg-muted absolute inset-0 animate-pulse rounded-md",
69
- style: { width: "100%", height: "100%" }
70
- }
71
- ),
72
- hasError ? /* @__PURE__ */ jsx("div", { className: "bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm", children: fallbackText }) : isInView && /* @__PURE__ */ jsx(
73
- Image,
74
- {
75
- ref,
76
- src: src || "/placeholder.svg",
77
- alt,
78
- width: width ? Number(width) : void 0,
79
- height: height ? Number(height) : void 0,
80
- sizes: sizes || "(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw",
81
- quality: 80,
82
- loading: props.priority ? "eager" : "lazy",
83
- className: cn(
84
- "rounded-md object-cover transition-opacity duration-300",
85
- isLoading ? "opacity-0" : "opacity-100",
86
- className
87
- ),
88
- onLoad: handleLoad,
89
- onError: handleError,
90
- placeholder: "blur",
91
- blurDataURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==",
92
- ...props
93
- }
94
- )
95
- ]
96
- }
97
- );
98
- }
99
- );
100
-
101
- export { OptimizedImage };
1
+ export { OptimizedImage } from '../chunk-7X4LRL26.js';
102
2
  //# sourceMappingURL=index.browser.js.map
103
3
  //# sourceMappingURL=index.browser.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/nextjs/optimized-image.tsx"],"names":["OptimizedImage"],"mappings":"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","file":"index.browser.js","sourcesContent":["\"use client\"\n\nimport clsx, { type ClassValue } from \"clsx\"\nimport Image from \"next/image\"\nimport type React from \"react\"\nimport { forwardRef, useEffect, useRef, useState } from \"react\"\nimport { twMerge } from \"tailwind-merge\"\n\nfunction cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\ninterface OptimizedImageProps\n extends React.ComponentPropsWithoutRef<typeof Image> {\n fallbackText?: string\n lazyLoad?: boolean\n}\n\nexport const OptimizedImage = forwardRef<HTMLImageElement, OptimizedImageProps>(\n function OptimizedImage(\n {\n src,\n alt,\n width,\n height,\n className,\n fallbackText = \"Falha ao carregar a imagem\",\n lazyLoad = true,\n onLoad,\n sizes,\n ...props\n },\n ref,\n ) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [hasError, setHasError] = useState(false)\n const [isInView, setIsInView] = useState(!lazyLoad)\n\n useEffect(() => {\n if (!lazyLoad || !containerRef.current) {\n setIsInView(true)\n return\n }\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setIsInView(true)\n observer.disconnect()\n }\n },\n { rootMargin: \"200px\" },\n )\n\n observer.observe(containerRef.current)\n\n return () => {\n observer.disconnect()\n }\n }, [lazyLoad])\n\n const handleLoad = (ev: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setIsLoading(false)\n onLoad?.(ev)\n }\n\n const handleError = () => {\n setIsLoading(false)\n setHasError(true)\n }\n\n return (\n <div\n ref={containerRef}\n className=\"relative overflow-hidden\"\n style={{\n width: width != null ? `${Number(width)}px` : \"100%\",\n height: height != null ? `${Number(height)}px` : \"100%\",\n }}\n >\n {isLoading && (\n <div\n className=\"bg-muted absolute inset-0 animate-pulse rounded-md\"\n style={{ width: \"100%\", height: \"100%\" }}\n />\n )}\n\n {hasError ? (\n <div className=\"bg-muted text-muted-foreground absolute inset-0 flex items-center justify-center rounded-md text-center text-sm\">\n {fallbackText}\n </div>\n ) : (\n isInView && (\n <Image\n ref={ref}\n src={src || \"/placeholder.svg\"}\n alt={alt}\n width={width ? Number(width) : undefined}\n height={height ? Number(height) : undefined}\n sizes={\n sizes ||\n \"(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw\"\n }\n quality={80}\n loading={props.priority ? \"eager\" : \"lazy\"}\n className={cn(\n \"rounded-md object-cover transition-opacity duration-300\",\n isLoading ? \"opacity-0\" : \"opacity-100\",\n className,\n )}\n onLoad={handleLoad}\n onError={handleError}\n placeholder=\"blur\"\n blurDataURL=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAEtAI8V7yQCgAAAABJRU5ErkJggg==\"\n {...props}\n />\n )\n )}\n </div>\n )\n },\n)\n"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.browser.js"}
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var chunkKWMJV4VK_cjs = require('../chunk-KWMJV4VK.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "OptimizedImage", {
8
+ enumerable: true,
9
+ get: function () { return chunkKWMJV4VK_cjs.OptimizedImage; }
10
+ });
11
+ //# sourceMappingURL=index.cjs.map
12
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,3 @@
1
+ export { OptimizedImage } from './index.browser.mjs';
2
+ import 'next/image';
3
+ import 'react';
@@ -0,0 +1,3 @@
1
+ export { OptimizedImage } from './index.browser.js';
2
+ import 'next/image';
3
+ import 'react';
@@ -0,0 +1,3 @@
1
+ export { OptimizedImage } from '../chunk-7X4LRL26.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@herowcode/utils",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "A lightweight collection of utility functions for everyday JavaScript/TypeScript development",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -96,6 +96,14 @@
96
96
  "types": "./dist/nextjs/index.browser.d.ts",
97
97
  "default": "./dist/nextjs/index.browser.cjs"
98
98
  }
99
+ },
100
+ "import": {
101
+ "types": "./dist/nextjs/index.d.mts",
102
+ "default": "./dist/nextjs/index.js"
103
+ },
104
+ "require": {
105
+ "types": "./dist/nextjs/index.d.ts",
106
+ "default": "./dist/nextjs/index.cjs"
99
107
  }
100
108
  },
101
109
  "./string": {
@@ -143,14 +151,12 @@
143
151
  "dist"
144
152
  ],
145
153
  "scripts": {
146
- "prebuild": "node scripts/sync-exports.cjs",
147
154
  "build": "tsup --config tsup.config.ts",
148
155
  "lint": "biome check --write --unsafe && tsc --noEmit",
149
156
  "test": "vitest",
150
157
  "test:ui": "vitest --ui",
151
158
  "test:run": "vitest run",
152
159
  "test:coverage": "vitest run --coverage",
153
- "prepare": "pnpm build",
154
160
  "prepublishOnly": "pnpm lint && pnpm test:run && pnpm build",
155
161
  "version:patch": "pnpm lint && pnpm test:run && pnpm build && npm version patch && git push && git push --tags",
156
162
  "version:minor": "pnpm lint && pnpm test:run && pnpm build && npm version minor && git push && git push --tags",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/files/compress-image.ts","../src/files/download-url.ts"],"names":[],"mappings":"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","file":"chunk-AQZBHMTO.js","sourcesContent":["interface ICompressImageParams {\n file: File\n maxWidth?: number\n maxHeight?: number\n quality?: number\n allowedFileTypes?: string[]\n}\n\nfunction convertToWebp(filename: string): string {\n const lastDotIndex = filename.lastIndexOf(\".\")\n\n if (lastDotIndex === -1) {\n return `${filename}.webp`\n }\n\n return `${filename.substring(0, lastDotIndex)}.webp`\n}\n\nexport function compressImage({\n file,\n maxWidth = Number.POSITIVE_INFINITY,\n maxHeight = Number.POSITIVE_INFINITY,\n quality = 1,\n allowedFileTypes = [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/webp\"],\n}: ICompressImageParams) {\n if (!allowedFileTypes.includes(file.type)) {\n throw new Error(\"Image format not supported\")\n }\n\n return new Promise<File>((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = (event) => {\n const compressed = new Image()\n\n compressed.onload = () => {\n const canvas = document.createElement(\"canvas\")\n\n let width = compressed.width\n let height = compressed.height\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width\n width = maxWidth\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height\n height = maxHeight\n }\n }\n\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext(\"2d\")\n\n if (!context) {\n reject(new Error(\"Failed to get canvas context\"))\n return\n }\n\n context.drawImage(compressed, 0, 0, width, height)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to compress image.\"))\n return\n }\n\n const compressedFile = new File([blob], convertToWebp(file.name), {\n type: \"image/webp\",\n lastModified: Date.now(),\n })\n\n resolve(compressedFile)\n },\n \"image/webp\",\n quality,\n )\n }\n\n compressed.src = event.target?.result as string\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const downloadUrl = async (url: string): Promise<boolean> => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0)\n const filename = segments.length > 0 ? segments[segments.length - 1] : null\n\n if (!filename || !filename.includes(\".\")) {\n throw new Error(\"URL does not contain a valid filename\")\n }\n\n const response = await fetch(url, { mode: \"cors\" })\n const blob = await response.blob()\n\n const link = document.createElement(\"a\")\n link.href = window.URL.createObjectURL(blob)\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n return true\n } catch (error) {\n console.error(\"Error downloading the file\", error)\n return false\n }\n}\n"]}
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- // src/files/format-bytes.ts
4
- function formatBytes(bytes) {
5
- if (bytes < 0) {
6
- throw new Error("Size in bytes cannot be negative");
7
- }
8
- const units = ["B", "KB", "MB", "GB", "TB", "PB"];
9
- let size = bytes;
10
- let index = 0;
11
- while (size >= 1024 && index < units.length - 1) {
12
- size /= 1024;
13
- index++;
14
- }
15
- return `${size.toFixed(2)} ${units[index]}`;
16
- }
17
-
18
- exports.formatBytes = formatBytes;
19
- //# sourceMappingURL=chunk-GRSF4RY2.cjs.map
20
- //# sourceMappingURL=chunk-GRSF4RY2.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/files/format-bytes.ts"],"names":[],"mappings":";;;AAAO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,KAAA,GAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/C,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,KAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC3C","file":"chunk-GRSF4RY2.cjs","sourcesContent":["export function formatBytes(bytes: number): string {\n if (bytes < 0) {\n throw new Error(\"Size in bytes cannot be negative\")\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n let size = bytes\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n return `${size.toFixed(2)} ${units[index]}`\n}\n"]}
@@ -1,18 +0,0 @@
1
- // src/files/format-bytes.ts
2
- function formatBytes(bytes) {
3
- if (bytes < 0) {
4
- throw new Error("Size in bytes cannot be negative");
5
- }
6
- const units = ["B", "KB", "MB", "GB", "TB", "PB"];
7
- let size = bytes;
8
- let index = 0;
9
- while (size >= 1024 && index < units.length - 1) {
10
- size /= 1024;
11
- index++;
12
- }
13
- return `${size.toFixed(2)} ${units[index]}`;
14
- }
15
-
16
- export { formatBytes };
17
- //# sourceMappingURL=chunk-O7SH3E3T.js.map
18
- //# sourceMappingURL=chunk-O7SH3E3T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/files/format-bytes.ts"],"names":[],"mappings":";AAAO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,KAAA,GAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/C,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,KAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC3C","file":"chunk-O7SH3E3T.js","sourcesContent":["export function formatBytes(bytes: number): string {\n if (bytes < 0) {\n throw new Error(\"Size in bytes cannot be negative\")\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n let size = bytes\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n return `${size.toFixed(2)} ${units[index]}`\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/files/compress-image.ts","../src/files/download-url.ts"],"names":[],"mappings":"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","file":"chunk-SLYUARZG.cjs","sourcesContent":["interface ICompressImageParams {\n file: File\n maxWidth?: number\n maxHeight?: number\n quality?: number\n allowedFileTypes?: string[]\n}\n\nfunction convertToWebp(filename: string): string {\n const lastDotIndex = filename.lastIndexOf(\".\")\n\n if (lastDotIndex === -1) {\n return `${filename}.webp`\n }\n\n return `${filename.substring(0, lastDotIndex)}.webp`\n}\n\nexport function compressImage({\n file,\n maxWidth = Number.POSITIVE_INFINITY,\n maxHeight = Number.POSITIVE_INFINITY,\n quality = 1,\n allowedFileTypes = [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/webp\"],\n}: ICompressImageParams) {\n if (!allowedFileTypes.includes(file.type)) {\n throw new Error(\"Image format not supported\")\n }\n\n return new Promise<File>((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = (event) => {\n const compressed = new Image()\n\n compressed.onload = () => {\n const canvas = document.createElement(\"canvas\")\n\n let width = compressed.width\n let height = compressed.height\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width\n width = maxWidth\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height\n height = maxHeight\n }\n }\n\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext(\"2d\")\n\n if (!context) {\n reject(new Error(\"Failed to get canvas context\"))\n return\n }\n\n context.drawImage(compressed, 0, 0, width, height)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to compress image.\"))\n return\n }\n\n const compressedFile = new File([blob], convertToWebp(file.name), {\n type: \"image/webp\",\n lastModified: Date.now(),\n })\n\n resolve(compressedFile)\n },\n \"image/webp\",\n quality,\n )\n }\n\n compressed.src = event.target?.result as string\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const downloadUrl = async (url: string): Promise<boolean> => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0)\n const filename = segments.length > 0 ? segments[segments.length - 1] : null\n\n if (!filename || !filename.includes(\".\")) {\n throw new Error(\"URL does not contain a valid filename\")\n }\n\n const response = await fetch(url, { mode: \"cors\" })\n const blob = await response.blob()\n\n const link = document.createElement(\"a\")\n link.href = window.URL.createObjectURL(blob)\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n return true\n } catch (error) {\n console.error(\"Error downloading the file\", error)\n return false\n }\n}\n"]}
@@ -1,3 +0,0 @@
1
- declare function formatBytes(bytes: number): string;
2
-
3
- export { formatBytes as f };
@@ -1,3 +0,0 @@
1
- declare function formatBytes(bytes: number): string;
2
-
3
- export { formatBytes as f };