@herowcode/utils 1.5.1 → 1.5.3

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 (87) hide show
  1. package/dist/api/{index.d.mts → index.d.cts} +1 -1
  2. package/dist/chunk-6IYD4APX.js +28 -0
  3. package/dist/chunk-6IYD4APX.js.map +1 -0
  4. package/dist/chunk-7X4LRL26.js +103 -0
  5. package/dist/chunk-7X4LRL26.js.map +1 -0
  6. package/dist/chunk-D3RLXVKJ.cjs +30 -0
  7. package/dist/chunk-D3RLXVKJ.cjs.map +1 -0
  8. package/dist/{chunk-AQZBHMTO.js → chunk-DVHDU327.js} +16 -26
  9. package/dist/chunk-DVHDU327.js.map +1 -0
  10. package/dist/chunk-KWMJV4VK.cjs +110 -0
  11. package/dist/chunk-KWMJV4VK.cjs.map +1 -0
  12. package/dist/{chunk-UXEUYHBD.cjs → chunk-LN36GFUC.cjs} +12 -12
  13. package/dist/chunk-LN36GFUC.cjs.map +1 -0
  14. package/dist/{chunk-SLYUARZG.cjs → chunk-SLDBIYI4.cjs} +16 -26
  15. package/dist/chunk-SLDBIYI4.cjs.map +1 -0
  16. package/dist/{chunk-QRXVUXGJ.js → chunk-VQMAN6EZ.js} +12 -12
  17. package/dist/chunk-VQMAN6EZ.js.map +1 -0
  18. package/dist/date/index.cjs +13 -13
  19. package/dist/date/index.js +1 -1
  20. package/dist/download-url-BQ1RPHKW.d.cts +3 -0
  21. package/dist/download-url-BQ1RPHKW.d.ts +3 -0
  22. package/dist/{files/index.node.d.mts → file-exists-ZCP2yARf.d.cts} +1 -3
  23. package/dist/file-exists-ZCP2yARf.d.ts +5 -0
  24. package/dist/files/index.browser.cjs +16 -7
  25. package/dist/files/index.browser.cjs.map +1 -1
  26. package/dist/files/index.browser.d.cts +8 -0
  27. package/dist/files/index.browser.d.ts +5 -11
  28. package/dist/files/index.browser.js +13 -2
  29. package/dist/files/index.browser.js.map +1 -1
  30. package/dist/files/index.cjs +8 -8
  31. package/dist/files/index.d.cts +3 -0
  32. package/dist/files/index.d.ts +3 -3
  33. package/dist/files/index.js +2 -2
  34. package/dist/files/index.node.cjs +11 -3
  35. package/dist/files/index.node.cjs.map +1 -1
  36. package/dist/files/index.node.d.cts +6 -0
  37. package/dist/files/index.node.d.ts +4 -5
  38. package/dist/files/index.node.js +8 -1
  39. package/dist/files/index.node.js.map +1 -1
  40. package/dist/{files/index.browser.d.mts → format-bytes-B0QeE7As.d.cts} +2 -4
  41. package/dist/format-bytes-B0QeE7As.d.ts +12 -0
  42. package/dist/function/{index.d.mts → index.d.cts} +1 -1
  43. package/dist/index.cjs +21 -21
  44. package/dist/index.d.cts +12 -0
  45. package/dist/index.d.ts +4 -4
  46. package/dist/index.js +3 -3
  47. package/dist/nextjs/index.browser.cjs +5 -103
  48. package/dist/nextjs/index.browser.cjs.map +1 -1
  49. package/dist/nextjs/index.browser.js +1 -101
  50. package/dist/nextjs/index.browser.js.map +1 -1
  51. package/dist/nextjs/index.cjs +12 -0
  52. package/dist/nextjs/index.cjs.map +1 -0
  53. package/dist/nextjs/index.d.cts +3 -0
  54. package/dist/nextjs/index.d.ts +3 -0
  55. package/dist/nextjs/index.js +3 -0
  56. package/dist/nextjs/index.js.map +1 -0
  57. package/dist/{youtube/index.node.d.mts → validate-youtube-link-Bfr2jQY8.d.cts} +1 -1
  58. package/dist/validate-youtube-link-Bfr2jQY8.d.ts +49 -0
  59. package/dist/youtube/index.browser.d.cts +2 -0
  60. package/dist/youtube/index.browser.d.ts +1 -1
  61. package/dist/youtube/{index.d.mts → index.d.cts} +1 -1
  62. package/dist/youtube/index.d.ts +1 -1
  63. package/dist/youtube/index.node.cjs +10 -0
  64. package/dist/youtube/index.node.cjs.map +1 -1
  65. package/dist/youtube/index.node.d.cts +7 -0
  66. package/dist/youtube/index.node.d.ts +4 -46
  67. package/dist/youtube/index.node.js +12 -0
  68. package/dist/youtube/index.node.js.map +1 -1
  69. package/package.json +41 -31
  70. package/dist/chunk-AQZBHMTO.js.map +0 -1
  71. package/dist/chunk-GRSF4RY2.cjs +0 -20
  72. package/dist/chunk-GRSF4RY2.cjs.map +0 -1
  73. package/dist/chunk-O7SH3E3T.js +0 -18
  74. package/dist/chunk-O7SH3E3T.js.map +0 -1
  75. package/dist/chunk-QRXVUXGJ.js.map +0 -1
  76. package/dist/chunk-SLYUARZG.cjs.map +0 -1
  77. package/dist/chunk-UXEUYHBD.cjs.map +0 -1
  78. package/dist/files/index.d.mts +0 -3
  79. package/dist/format-bytes-BGjeDnvM.d.mts +0 -3
  80. package/dist/format-bytes-BGjeDnvM.d.ts +0 -3
  81. package/dist/index.d.mts +0 -12
  82. package/dist/youtube/index.browser.d.mts +0 -2
  83. /package/dist/array/{index.d.mts → index.d.cts} +0 -0
  84. /package/dist/date/{index.d.mts → index.d.cts} +0 -0
  85. /package/dist/nextjs/{index.browser.d.mts → index.browser.d.cts} +0 -0
  86. /package/dist/string/{index.d.mts → index.d.cts} +0 -0
  87. /package/dist/{try-catch-B7WzqcPU.d.mts → try-catch-B7WzqcPU.d.cts} +0 -0
@@ -1,4 +1,4 @@
1
- import { T as TTryCatchResult } from '../try-catch-B7WzqcPU.mjs';
1
+ import { T as TTryCatchResult } from '../try-catch-B7WzqcPU.cjs';
2
2
 
3
3
  interface IApiError {
4
4
  message: string;
@@ -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"]}
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
3
  var dayJs = require('dayjs');
4
- var advancedFormat = require('dayjs/plugin/advancedFormat');
5
- var customParseFormat = require('dayjs/plugin/customParseFormat');
6
- var localizedFormat = require('dayjs/plugin/localizedFormat');
7
- var relativeTime = require('dayjs/plugin/relativeTime');
8
- var timezone = require('dayjs/plugin/timezone');
9
- var utc = require('dayjs/plugin/utc');
10
- require('dayjs/locale/en');
11
- require('dayjs/locale/es');
12
- require('dayjs/locale/fr');
13
- require('dayjs/locale/pt-br');
4
+ var advancedFormat = require('dayjs/plugin/advancedFormat.js');
5
+ var customParseFormat = require('dayjs/plugin/customParseFormat.js');
6
+ var localizedFormat = require('dayjs/plugin/localizedFormat.js');
7
+ var relativeTime = require('dayjs/plugin/relativeTime.js');
8
+ var timezone = require('dayjs/plugin/timezone.js');
9
+ var utc = require('dayjs/plugin/utc.js');
10
+ require('dayjs/locale/en.js');
11
+ require('dayjs/locale/es.js');
12
+ require('dayjs/locale/fr.js');
13
+ require('dayjs/locale/pt-br.js');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
@@ -397,5 +397,5 @@ exports.resetDayjsGlobalIntl = resetDayjsGlobalIntl;
397
397
  exports.resolveDayjsIntlConfig = resolveDayjsIntlConfig;
398
398
  exports.setDayjsGlobalIntl = setDayjsGlobalIntl;
399
399
  exports.withDayjsGlobalIntl = withDayjsGlobalIntl;
400
- //# sourceMappingURL=chunk-UXEUYHBD.cjs.map
401
- //# sourceMappingURL=chunk-UXEUYHBD.cjs.map
400
+ //# sourceMappingURL=chunk-LN36GFUC.cjs.map
401
+ //# sourceMappingURL=chunk-LN36GFUC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/date/dayjs.ts","../src/date/fix-timezone-offset.ts","../src/date/format-date.ts","../src/date/get-current-date-in-utc.ts","../src/date/get-date-in-utc.ts","../src/date/get-relative-time.ts","../src/date/parse-time-spent.ts"],"names":["formatIntl","toIntlFormatter","dayJs","utc","customParseFormat","advancedFormat","timezone","localizedFormat","relativeTime","workingInstance","intlConfig"],"mappings":"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","file":"chunk-LN36GFUC.cjs","sourcesContent":["import type { Dayjs as DayjsInstance, PluginFunc } from \"dayjs\"\nimport dayJs from \"dayjs\"\nimport advancedFormat from \"dayjs/plugin/advancedFormat.js\"\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\"\nimport localizedFormat from \"dayjs/plugin/localizedFormat.js\"\nimport relativeTime from \"dayjs/plugin/relativeTime.js\"\nimport timezone from \"dayjs/plugin/timezone.js\"\nimport utc from \"dayjs/plugin/utc.js\"\nimport \"dayjs/locale/en.js\"\nimport \"dayjs/locale/es.js\"\nimport \"dayjs/locale/fr.js\"\nimport \"dayjs/locale/pt-br.js\"\n// Ensure TS sees Dayjs instance augmentation wherever this module is imported\nimport type {} from \"../types/dayjs-intl\"\n\nexport interface IDayjsIntlConfig {\n locale?: Intl.LocalesArgument\n options?: Intl.DateTimeFormatOptions\n}\n\nexport interface IDayjsIntlResolvedConfig {\n locale: Intl.LocalesArgument\n options: Intl.DateTimeFormatOptions\n}\n\nconst DEFAULT_INTL_CONFIG: IDayjsIntlResolvedConfig = {\n locale: \"pt-BR\",\n options: {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n },\n}\n\nlet globalIntlConfig: IDayjsIntlResolvedConfig = {\n locale: DEFAULT_INTL_CONFIG.locale,\n options: { ...DEFAULT_INTL_CONFIG.options },\n}\n\nfunction mergeIntlConfigs(\n base: IDayjsIntlResolvedConfig,\n override?: IDayjsIntlConfig,\n): IDayjsIntlResolvedConfig {\n if (!override) {\n return {\n locale: base.locale,\n options: { ...base.options },\n }\n }\n\n const mergedLocale = override.locale ?? base.locale\n const mergedOptions: Intl.DateTimeFormatOptions = { ...base.options }\n\n if (override.options) {\n for (const key of Object.keys(override.options) as Array<\n keyof Intl.DateTimeFormatOptions\n >) {\n const value = override.options[key]\n\n if (value === undefined || value === null) {\n delete mergedOptions[key]\n } else {\n mergedOptions[key] = value as never\n }\n }\n }\n\n return {\n locale: mergedLocale,\n options: mergedOptions,\n }\n}\n\nconst intlPlugin: PluginFunc<IDayjsIntlConfig | undefined> = (\n pluginConfig,\n DayjsClass,\n) => {\n if (pluginConfig) {\n globalIntlConfig = mergeIntlConfigs(globalIntlConfig, pluginConfig)\n }\n\n const formatIntl = function formatIntl(\n this: DayjsInstance,\n config?: IDayjsIntlConfig,\n ): string {\n const resolved = mergeIntlConfigs(globalIntlConfig, config)\n return new Intl.DateTimeFormat(resolved.locale, resolved.options).format(\n this.toDate(),\n )\n }\n\n const toIntlFormatter = function toIntlFormatter(\n this: DayjsInstance,\n config?: IDayjsIntlConfig,\n ): Intl.DateTimeFormat {\n const resolved = mergeIntlConfigs(globalIntlConfig, config)\n return new Intl.DateTimeFormat(resolved.locale, resolved.options)\n }\n\n Object.defineProperty(DayjsClass.prototype, \"formatIntl\", {\n value: formatIntl,\n configurable: true,\n })\n\n Object.defineProperty(DayjsClass.prototype, \"toIntlFormatter\", {\n value: toIntlFormatter,\n configurable: true,\n })\n}\n\nexport function getDayjsGlobalIntl(): IDayjsIntlResolvedConfig {\n return {\n locale: globalIntlConfig.locale,\n options: { ...globalIntlConfig.options },\n }\n}\n\nexport function setDayjsGlobalIntl(\n config: IDayjsIntlConfig,\n): IDayjsIntlResolvedConfig {\n globalIntlConfig = mergeIntlConfigs(globalIntlConfig, config)\n return getDayjsGlobalIntl()\n}\n\nexport function resetDayjsGlobalIntl(): IDayjsIntlResolvedConfig {\n globalIntlConfig = {\n locale: DEFAULT_INTL_CONFIG.locale,\n options: { ...DEFAULT_INTL_CONFIG.options },\n }\n return getDayjsGlobalIntl()\n}\n\nexport function withDayjsGlobalIntl<T>(\n config: IDayjsIntlConfig,\n callback: () => T,\n): T {\n const previous = getDayjsGlobalIntl()\n globalIntlConfig = mergeIntlConfigs(globalIntlConfig, config)\n\n try {\n return callback()\n } finally {\n globalIntlConfig = {\n locale: previous.locale,\n options: { ...previous.options },\n }\n }\n}\n\nexport function resolveDayjsIntlConfig(\n config?: IDayjsIntlConfig,\n): IDayjsIntlResolvedConfig {\n return mergeIntlConfigs(globalIntlConfig, config)\n}\n\ndayJs.extend(utc)\ndayJs.extend(customParseFormat)\ndayJs.extend(advancedFormat)\ndayJs.extend(timezone)\ndayJs.extend(localizedFormat)\ndayJs.extend(relativeTime)\ndayJs.extend(intlPlugin)\n\nexport const dayjs = dayJs\n","import type { Dayjs } from \"dayjs\"\n\nimport { dayjs } from \"./dayjs\"\n\nexport function fixTimezoneOffset(utcDate: Date | string): Dayjs {\n const offset = new Date(utcDate).getTimezoneOffset()\n return dayjs(utcDate).add(offset, \"minute\")\n}\n","import type { IDayjsIntlConfig } from \"./dayjs\"\nimport { dayjs, getDayjsGlobalIntl } from \"./dayjs\"\n\nexport interface IFormatDateConfig {\n /** Optional locale override applied to the underlying dayjs instance */\n locale?: string\n /**\n * When provided, format using dayjs tokens (e.g. \"DD/MM/YYYY\").\n * Unless `useIntl` is true, this takes precedence over Intl formatting.\n */\n format?: string\n /**\n * Intl configuration used when formatting through `Intl.DateTimeFormat`.\n * Values are merged on top of the global Intl configuration.\n */\n intl?: IDayjsIntlConfig\n /**\n * Forces the use of Intl formatting even if a format string is supplied.\n */\n useIntl?: boolean\n}\n\ntype TLocaleOrConfig = Intl.LocalesArgument | IFormatDateConfig\n\nfunction isFormatDateConfig(\n value: TLocaleOrConfig,\n): value is IFormatDateConfig {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isValidLocaleTag(value: string): boolean {\n if (\n typeof Intl !== \"undefined\" &&\n typeof Intl.getCanonicalLocales === \"function\"\n ) {\n try {\n Intl.getCanonicalLocales(value)\n return true\n } catch {\n return false\n }\n }\n\n return /^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$/.test(value)\n}\n\nfunction toDayjsLocale(\n locale?:\n | Intl.LocalesArgument\n | Intl.Locale\n | readonly (string | Intl.Locale)[],\n): string | undefined {\n if (!locale) return undefined\n const first = Array.isArray(locale)\n ? (locale[0] as string | Intl.Locale)\n : (locale as string | Intl.Locale)\n return typeof first === \"string\" ? first : String(first)\n}\n\nexport function formatDate(\n date: Date | string | number,\n localeOrConfig: TLocaleOrConfig = getDayjsGlobalIntl().locale,\n opts?: Intl.DateTimeFormatOptions,\n): string {\n const instance = dayjs(date)\n\n if (!instance.isValid()) {\n throw new RangeError(\"Invalid time value\")\n }\n\n if (isFormatDateConfig(localeOrConfig)) {\n const { format, locale, intl, useIntl } = localeOrConfig\n const baseLocale = locale ?? toDayjsLocale(intl?.locale)\n const workingInstance = baseLocale ? instance.locale(baseLocale) : instance\n\n if (format && !useIntl) {\n return workingInstance.format(format)\n }\n\n const intlConfig: IDayjsIntlConfig | undefined = intl\n ? {\n locale: intl.locale ?? baseLocale,\n options: intl.options,\n }\n : baseLocale\n ? {\n locale: baseLocale,\n }\n : undefined\n\n return workingInstance.formatIntl(intlConfig)\n }\n\n if (typeof localeOrConfig === \"string\" && opts === undefined) {\n if (!isValidLocaleTag(localeOrConfig)) {\n return instance.format(localeOrConfig)\n }\n }\n\n const localeForDayjs = toDayjsLocale(localeOrConfig)\n const workingInstance = localeForDayjs\n ? instance.locale(localeForDayjs)\n : instance\n\n const intlConfig: IDayjsIntlConfig | undefined =\n localeOrConfig !== undefined || opts !== undefined\n ? {\n locale: localeOrConfig,\n options: opts,\n }\n : undefined\n\n return workingInstance.formatIntl(intlConfig)\n}\n","import type { Dayjs } from \"dayjs\"\n\nimport { dayjs } from \"./dayjs\"\n\nexport function getCurrentDateInUTC(): Dayjs {\n return dayjs().utc()\n}\n","import type { Dayjs } from \"dayjs\"\n\nimport { dayjs } from \"./dayjs\"\n\nexport function getDateInUTC(date: Date): Dayjs {\n return dayjs(date).utc()\n}\n","import type { ConfigType } from \"dayjs\"\nimport { dayjs } from \"./dayjs\"\n\nexport function getRelativeTime(date: ConfigType, dateNow = dayjs()): string {\n return dayjs(date).from(dateNow)\n}\n","import { fixTimezoneOffset } from \"./fix-timezone-offset\"\n\ninterface IUnitTranslation {\n singular: string\n plural: string\n}\n\ninterface ILocaleTranslations {\n year: IUnitTranslation\n month: IUnitTranslation\n day: IUnitTranslation\n hour: IUnitTranslation\n minute: IUnitTranslation\n second: IUnitTranslation\n // function to format verbose list (e.g. \"1 ano, 2 meses e 3 dias\")\n formatList: (parts: string[]) => string\n // tokens used for compact formatting (e.g. \"1a2m3d\")\n compactTokens: {\n year: string\n month: string\n day: string\n hour: string\n minute: string\n second: string\n }\n}\n\n// Supported locales and their translations\nconst locales: Record<string, ILocaleTranslations> = {\n \"pt-BR\": {\n year: { singular: \"ano\", plural: \"anos\" },\n month: { singular: \"mês\", plural: \"meses\" },\n day: { singular: \"dia\", plural: \"dias\" },\n hour: { singular: \"hora\", plural: \"horas\" },\n minute: { singular: \"minuto\", plural: \"minutos\" },\n second: { singular: \"segundo\", plural: \"segundos\" },\n formatList: (parts) => {\n if (parts.length === 0) return \"\"\n if (parts.length === 1) return parts[0]\n const lastPart = parts[parts.length - 1]\n const otherParts = parts.slice(0, -1)\n return `${otherParts.join(\", \")} e ${lastPart}`\n },\n compactTokens: {\n year: \"a\",\n month: \"m\",\n day: \"d\",\n hour: \"h\",\n minute: \"min\",\n second: \"s\",\n },\n },\n \"en-US\": {\n year: { singular: \"year\", plural: \"years\" },\n month: { singular: \"month\", plural: \"months\" },\n day: { singular: \"day\", plural: \"days\" },\n hour: { singular: \"hour\", plural: \"hours\" },\n minute: { singular: \"minute\", plural: \"minutes\" },\n second: { singular: \"second\", plural: \"seconds\" },\n formatList: (parts) => {\n if (parts.length === 0) return \"\"\n if (parts.length === 1) return parts[0]\n if (parts.length === 2) return `${parts[0]} and ${parts[1]}`\n return `${parts.slice(0, -1).join(\", \")}, and ${parts[parts.length - 1]}`\n },\n compactTokens: {\n year: \"y\",\n month: \"mo\",\n day: \"d\",\n hour: \"h\",\n minute: \"m\",\n second: \"s\",\n },\n },\n \"es-ES\": {\n year: { singular: \"año\", plural: \"años\" },\n month: { singular: \"mes\", plural: \"meses\" },\n day: { singular: \"día\", plural: \"días\" },\n hour: { singular: \"hora\", plural: \"horas\" },\n minute: { singular: \"minuto\", plural: \"minutos\" },\n second: { singular: \"segundo\", plural: \"segundos\" },\n formatList: (parts) => {\n if (parts.length === 0) return \"\"\n if (parts.length === 1) return parts[0]\n const lastPart = parts[parts.length - 1]\n const otherParts = parts.slice(0, -1)\n return `${otherParts.join(\", \")} y ${lastPart}`\n },\n compactTokens: {\n year: \"a\",\n month: \"mes\",\n day: \"d\",\n hour: \"h\",\n minute: \"min\",\n second: \"s\",\n },\n },\n \"fr-FR\": {\n year: { singular: \"an\", plural: \"ans\" },\n month: { singular: \"mois\", plural: \"mois\" },\n day: { singular: \"jour\", plural: \"jours\" },\n hour: { singular: \"heure\", plural: \"heures\" },\n minute: { singular: \"minute\", plural: \"minutes\" },\n second: { singular: \"seconde\", plural: \"secondes\" },\n formatList: (parts) => {\n if (parts.length === 0) return \"\"\n if (parts.length === 1) return parts[0]\n const lastPart = parts[parts.length - 1]\n const otherParts = parts.slice(0, -1)\n return `${otherParts.join(\", \")} et ${lastPart}`\n },\n compactTokens: {\n year: \"a\",\n month: \"m\",\n day: \"j\",\n hour: \"h\",\n minute: \"min\",\n second: \"s\",\n },\n },\n}\n\n// Return shape\nexport interface ITimeSpent {\n years: number\n months: number\n days: number\n hours: number\n minutes: number\n seconds: number\n formatted: string\n}\n\n// options: format -> 'verbose' | 'compact', minimal -> show only largest non-zero unit\nexport function parseTimeSpent(\n initialDate: string | Date,\n finalDate: string | Date,\n locale = \"pt-BR\", // Default to Portuguese for backward compatibility\n options?: { format?: \"verbose\" | \"compact\"; minimal?: boolean },\n): ITimeSpent {\n const final = fixTimezoneOffset(finalDate)\n const initial = fixTimezoneOffset(initialDate)\n\n const years = final.diff(initial, \"year\")\n const months = final.diff(initial.add(years, \"year\"), \"month\")\n const days = final.diff(\n initial.add(years, \"year\").add(months, \"month\"),\n \"day\",\n )\n const hours = final.diff(\n initial.add(years, \"year\").add(months, \"month\").add(days, \"day\"),\n \"hour\",\n )\n const minutes = final.diff(\n initial\n .add(years, \"year\")\n .add(months, \"month\")\n .add(days, \"day\")\n .add(hours, \"hour\"),\n \"minute\",\n )\n const seconds = final.diff(\n initial\n .add(years, \"year\")\n .add(months, \"month\")\n .add(days, \"day\")\n .add(hours, \"hour\")\n .add(minutes, \"minute\"),\n \"second\",\n )\n\n // Use default locale if the requested one isn't supported\n const translations = locales[locale] || locales[\"pt-BR\"]\n\n // Build verbose parts (localized words)\n const verboseParts: string[] = []\n if (years > 0) {\n const unit =\n years === 1 ? translations.year.singular : translations.year.plural\n verboseParts.push(`${years} ${unit}`)\n }\n if (months > 0) {\n const unit =\n months === 1 ? translations.month.singular : translations.month.plural\n verboseParts.push(`${months} ${unit}`)\n }\n if (days > 0) {\n const unit =\n days === 1 ? translations.day.singular : translations.day.plural\n verboseParts.push(`${days} ${unit}`)\n }\n if (hours > 0) {\n const unit =\n hours === 1 ? translations.hour.singular : translations.hour.plural\n verboseParts.push(`${hours} ${unit}`)\n }\n if (minutes > 0) {\n const unit =\n minutes === 1 ? translations.minute.singular : translations.minute.plural\n verboseParts.push(`${minutes} ${unit}`)\n }\n if (seconds > 0) {\n const unit =\n seconds === 1 ? translations.second.singular : translations.second.plural\n verboseParts.push(`${seconds} ${unit}`)\n }\n\n // Build compact parts (e.g. \"1a2m3d\")\n const compactPieces: string[] = []\n if (years > 0)\n compactPieces.push(`${years}${translations.compactTokens.year}`)\n if (months > 0)\n compactPieces.push(`${months}${translations.compactTokens.month}`)\n if (days > 0) compactPieces.push(`${days}${translations.compactTokens.day}`)\n if (hours > 0)\n compactPieces.push(`${hours}${translations.compactTokens.hour}`)\n if (minutes > 0)\n compactPieces.push(`${minutes}${translations.compactTokens.minute}`)\n if (seconds > 0)\n compactPieces.push(`${seconds}${translations.compactTokens.second}`)\n\n const format = options?.format ?? \"verbose\"\n const minimal = options?.minimal ?? false\n\n let formatted = \"\"\n if (format === \"compact\") {\n if (compactPieces.length === 0) {\n formatted = \"\"\n } else if (minimal) {\n formatted = compactPieces[0]\n } else {\n formatted = compactPieces.join(\"\")\n }\n } else {\n // verbose\n if (verboseParts.length === 0) {\n formatted = \"\"\n } else if (minimal) {\n formatted = verboseParts[0]\n } else {\n formatted = translations.formatList(verboseParts)\n }\n }\n\n return {\n years,\n months,\n days,\n hours,\n minutes,\n seconds,\n formatted,\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,14 +1,14 @@
1
1
  import dayJs from 'dayjs';
2
- import advancedFormat from 'dayjs/plugin/advancedFormat';
3
- import customParseFormat from 'dayjs/plugin/customParseFormat';
4
- import localizedFormat from 'dayjs/plugin/localizedFormat';
5
- import relativeTime from 'dayjs/plugin/relativeTime';
6
- import timezone from 'dayjs/plugin/timezone';
7
- import utc from 'dayjs/plugin/utc';
8
- import 'dayjs/locale/en';
9
- import 'dayjs/locale/es';
10
- import 'dayjs/locale/fr';
11
- import 'dayjs/locale/pt-br';
2
+ import advancedFormat from 'dayjs/plugin/advancedFormat.js';
3
+ import customParseFormat from 'dayjs/plugin/customParseFormat.js';
4
+ import localizedFormat from 'dayjs/plugin/localizedFormat.js';
5
+ import relativeTime from 'dayjs/plugin/relativeTime.js';
6
+ import timezone from 'dayjs/plugin/timezone.js';
7
+ import utc from 'dayjs/plugin/utc.js';
8
+ import 'dayjs/locale/en.js';
9
+ import 'dayjs/locale/es.js';
10
+ import 'dayjs/locale/fr.js';
11
+ import 'dayjs/locale/pt-br.js';
12
12
 
13
13
  // src/date/dayjs.ts
14
14
  var DEFAULT_INTL_CONFIG = {
@@ -374,5 +374,5 @@ function parseTimeSpent(initialDate, finalDate, locale = "pt-BR", options) {
374
374
  }
375
375
 
376
376
  export { dayjs, fixTimezoneOffset, formatDate, getCurrentDateInUTC, getDateInUTC, getDayjsGlobalIntl, getRelativeTime, parseTimeSpent, resetDayjsGlobalIntl, resolveDayjsIntlConfig, setDayjsGlobalIntl, withDayjsGlobalIntl };
377
- //# sourceMappingURL=chunk-QRXVUXGJ.js.map
378
- //# sourceMappingURL=chunk-QRXVUXGJ.js.map
377
+ //# sourceMappingURL=chunk-VQMAN6EZ.js.map
378
+ //# sourceMappingURL=chunk-VQMAN6EZ.js.map