@zag-js/file-utils 0.38.0 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -7
- package/dist/index.d.ts +1 -7
- package/dist/index.js +0 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +0 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -25,12 +25,6 @@ interface DownloadFileOptions {
|
|
|
25
25
|
}
|
|
26
26
|
declare function downloadFile(options: DownloadFileOptions): void;
|
|
27
27
|
|
|
28
|
-
interface FormatBytesOptions {
|
|
29
|
-
unit?: "bit" | "byte";
|
|
30
|
-
unitDisplay?: "long" | "short" | "narrow";
|
|
31
|
-
}
|
|
32
|
-
declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
|
|
33
|
-
|
|
34
28
|
declare function getAcceptAttrString(accept: Record<string, string[]> | string | undefined): string | undefined;
|
|
35
29
|
|
|
36
30
|
declare const getFileDataUrl: (file: File | Blob) => Promise<string | undefined>;
|
|
@@ -45,4 +39,4 @@ declare function isValidFileSize(file: File, minSize?: number, maxSize?: number)
|
|
|
45
39
|
|
|
46
40
|
declare function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null];
|
|
47
41
|
|
|
48
|
-
export { type FileError, dataURItoBlob, downloadFile,
|
|
42
|
+
export { type FileError, dataURItoBlob, downloadFile, getAcceptAttrString, getFileDataUrl, getTotalFileSize, isFileEqual, isMSEdge, isValidFileSize, isValidFileType };
|
package/dist/index.d.ts
CHANGED
|
@@ -25,12 +25,6 @@ interface DownloadFileOptions {
|
|
|
25
25
|
}
|
|
26
26
|
declare function downloadFile(options: DownloadFileOptions): void;
|
|
27
27
|
|
|
28
|
-
interface FormatBytesOptions {
|
|
29
|
-
unit?: "bit" | "byte";
|
|
30
|
-
unitDisplay?: "long" | "short" | "narrow";
|
|
31
|
-
}
|
|
32
|
-
declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
|
|
33
|
-
|
|
34
28
|
declare function getAcceptAttrString(accept: Record<string, string[]> | string | undefined): string | undefined;
|
|
35
29
|
|
|
36
30
|
declare const getFileDataUrl: (file: File | Blob) => Promise<string | undefined>;
|
|
@@ -45,4 +39,4 @@ declare function isValidFileSize(file: File, minSize?: number, maxSize?: number)
|
|
|
45
39
|
|
|
46
40
|
declare function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null];
|
|
47
41
|
|
|
48
|
-
export { type FileError, dataURItoBlob, downloadFile,
|
|
42
|
+
export { type FileError, dataURItoBlob, downloadFile, getAcceptAttrString, getFileDataUrl, getTotalFileSize, isFileEqual, isMSEdge, isValidFileSize, isValidFileType };
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,6 @@ var src_exports = {};
|
|
|
22
22
|
__export(src_exports, {
|
|
23
23
|
dataURItoBlob: () => dataURItoBlob,
|
|
24
24
|
downloadFile: () => downloadFile,
|
|
25
|
-
formatBytes: () => formatBytes,
|
|
26
25
|
getAcceptAttrString: () => getAcceptAttrString,
|
|
27
26
|
getFileDataUrl: () => getFileDataUrl,
|
|
28
27
|
getTotalFileSize: () => getTotalFileSize,
|
|
@@ -72,28 +71,6 @@ function downloadFile(options) {
|
|
|
72
71
|
}, 0);
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
// src/format-bytes.ts
|
|
76
|
-
var import_i18n_utils = require("@zag-js/i18n-utils");
|
|
77
|
-
var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
|
|
78
|
-
var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
|
|
79
|
-
var formatBytes = (bytes, locale = "en-US", options = {}) => {
|
|
80
|
-
if (isNaN(bytes))
|
|
81
|
-
return "";
|
|
82
|
-
if (bytes === 0)
|
|
83
|
-
return "0 B";
|
|
84
|
-
const { unit = "byte", unitDisplay = "short" } = options;
|
|
85
|
-
const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
|
|
86
|
-
const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
|
|
87
|
-
const _unit = prefix[index] + unit;
|
|
88
|
-
const _unitDisplay = unitDisplay || "short";
|
|
89
|
-
const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
|
|
90
|
-
return (0, import_i18n_utils.formatNumber)(v, locale, {
|
|
91
|
-
style: "unit",
|
|
92
|
-
unit: _unit,
|
|
93
|
-
unitDisplay: _unitDisplay
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
74
|
// src/get-accept-attr.ts
|
|
98
75
|
function isMIMEType(v) {
|
|
99
76
|
return v === "audio/*" || v === "video/*" || v === "image/*" || v === "text/*" || /\w+\/[-+.\w]+/g.test(v);
|
|
@@ -185,7 +162,6 @@ function isValidFileType(file, accept) {
|
|
|
185
162
|
0 && (module.exports = {
|
|
186
163
|
dataURItoBlob,
|
|
187
164
|
downloadFile,
|
|
188
|
-
formatBytes,
|
|
189
165
|
getAcceptAttrString,
|
|
190
166
|
getFileDataUrl,
|
|
191
167
|
getTotalFileSize,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/data-url-to-blob.ts","../src/download-file.ts","../src/format-bytes.ts","../src/get-accept-attr.ts","../src/get-file-data-url.ts","../src/get-total-file-size.ts","../src/is-file-equal.ts","../src/is-valid-file-size.ts","../src/is-valid-file-type.ts"],"sourcesContent":["export * from \"./data-url-to-blob\"\nexport * from \"./download-file\"\nexport * from \"./format-bytes\"\nexport * from \"./get-accept-attr\"\nexport * from \"./get-file-data-url\"\nexport * from \"./get-total-file-size\"\nexport * from \"./is-file-equal\"\nexport * from \"./is-valid-file-size\"\nexport * from \"./is-valid-file-type\"\nexport type * from \"./types.ts\"\n","export function dataURItoBlob(uri: string): Blob {\n const binary = atob(uri.split(\",\")[1])\n\n // separate out the mime component\n const mimeString = uri.split(\",\")[0].split(\":\")[1].split(\";\")[0]\n\n // write the bytes of the string to an ArrayBuffer\n const buffer = new ArrayBuffer(binary.length)\n\n // create a view into the buffer\n const intArray = new Uint8Array(buffer)\n\n for (let i = 0; i < binary.length; i++) {\n intArray[i] = binary.charCodeAt(i)\n }\n\n return new Blob([buffer], { type: mimeString })\n}\n","export function isMSEdge(win: Window): win is Window & { navigator: { msSaveOrOpenBlob: Function } } {\n // @ts-ignore\n return Boolean(win.navigator && win.navigator.msSaveOrOpenBlob)\n}\n\ninterface DownloadFileOptions {\n /**\n * The name of the file\n */\n name?: string\n /**\n * The MIME type of the file\n */\n type?: string\n /**\n * The file contents\n */\n file: File | Blob | string\n /**\n * The window environment\n */\n win: typeof window\n}\n\nexport function downloadFile(options: DownloadFileOptions) {\n const { file, win, type, name } = options\n\n const doc = win.document\n\n const obj = typeof file === \"string\" ? new Blob([file], { type }) : file\n const fileName = typeof file === \"string\" ? name : file instanceof File ? file.name : undefined\n\n if (isMSEdge(win)) {\n win.navigator.msSaveOrOpenBlob(obj, fileName || \"file-download\")\n return\n }\n\n const url = win.URL.createObjectURL(obj)\n\n const anchor = doc.createElement(\"a\")\n anchor.style.display = \"none\"\n anchor.href = url\n anchor.rel = \"noopener\"\n anchor.download = fileName || \"file-download\"\n\n doc.documentElement.appendChild(anchor)\n anchor.click()\n\n setTimeout(() => {\n win.URL.revokeObjectURL(url)\n anchor.remove()\n }, 0)\n}\n","import { formatNumber } from \"@zag-js/i18n-utils\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\ninterface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","function isMIMEType(v: string) {\n return v === \"audio/*\" || v === \"video/*\" || v === \"image/*\" || v === \"text/*\" || /\\w+\\/[-+.\\w]+/g.test(v)\n}\n\nfunction isExt(v: string) {\n return /^.*\\.[\\w]+$/.test(v)\n}\n\nexport function getAcceptAttrString(accept: Record<string, string[]> | string | undefined) {\n if (!accept) return\n if (typeof accept === \"string\") return accept\n return Object.entries(accept)\n .reduce((a, [mimeType, ext]) => [...a, mimeType, ...ext], [] as string[])\n .filter((v) => isMIMEType(v) || isExt(v))\n .join(\",\")\n}\n","export const getFileDataUrl = async (file: File | Blob) => {\n const reader = new FileReader()\n return new Promise<string | undefined>((resolve, reject) => {\n reader.onerror = () => {\n reader.abort()\n reject(new Error(\"There was an error reading a file\"))\n }\n\n reader.onloadend = () => {\n const { result } = reader\n if (result instanceof ArrayBuffer) {\n reject(new Error(\"Expected DataURL as string from Blob/File, got ArrayBuffer\"))\n } else {\n resolve(result || undefined)\n }\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const getTotalFileSize = (files: File[]) => {\n return files.reduce((acc, file) => acc + file.size, 0)\n}\n","export const isFileEqual = (file1: File, file2: File) => {\n return file1.name === file2.name && file1.size === file2.size && file1.type === file2.type\n}\n","import type { FileError } from \"./types\"\n\nconst isDefined = <T>(v: T | undefined): v is T => v !== undefined && v !== null\n\nexport function isValidFileSize(file: File, minSize?: number, maxSize?: number): [boolean, FileError | null] {\n if (isDefined(file.size)) {\n if (isDefined(minSize) && isDefined(maxSize)) {\n if (file.size > maxSize) return [false, \"FILE_TOO_LARGE\"]\n if (file.size < minSize) return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(minSize) && file.size < minSize) {\n return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(maxSize) && file.size > maxSize) {\n return [false, \"FILE_TOO_LARGE\"]\n }\n }\n return [true, null]\n}\n","import type { FileError } from \"./types\"\n\nfunction isFileAccepted(file: File | null, accept: string[] | string | undefined) {\n if (file && accept) {\n const types = Array.isArray(accept) ? accept : accept.split(\",\")\n\n const fileName = file.name || \"\"\n const mimeType = (file.type || \"\").toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, \"\")\n\n return types.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === \".\") {\n return fileName.toLowerCase().endsWith(validType)\n }\n\n if (validType.endsWith(\"/*\")) {\n return baseMimeType === validType.replace(/\\/.*$/, \"\")\n }\n\n return mimeType === validType\n })\n }\n return true\n}\n\nexport function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null] {\n const isAcceptable = file.type === \"application/x-moz-file\" || isFileAccepted(file, accept)\n return [isAcceptable, isAcceptable ? null : \"FILE_INVALID_TYPE\"]\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data-url-to-blob.ts","../src/download-file.ts","../src/get-accept-attr.ts","../src/get-file-data-url.ts","../src/get-total-file-size.ts","../src/is-file-equal.ts","../src/is-valid-file-size.ts","../src/is-valid-file-type.ts"],"sourcesContent":["export * from \"./data-url-to-blob\"\nexport * from \"./download-file\"\nexport * from \"./get-accept-attr\"\nexport * from \"./get-file-data-url\"\nexport * from \"./get-total-file-size\"\nexport * from \"./is-file-equal\"\nexport * from \"./is-valid-file-size\"\nexport * from \"./is-valid-file-type\"\nexport type * from \"./types.ts\"\n","export function dataURItoBlob(uri: string): Blob {\n const binary = atob(uri.split(\",\")[1])\n\n // separate out the mime component\n const mimeString = uri.split(\",\")[0].split(\":\")[1].split(\";\")[0]\n\n // write the bytes of the string to an ArrayBuffer\n const buffer = new ArrayBuffer(binary.length)\n\n // create a view into the buffer\n const intArray = new Uint8Array(buffer)\n\n for (let i = 0; i < binary.length; i++) {\n intArray[i] = binary.charCodeAt(i)\n }\n\n return new Blob([buffer], { type: mimeString })\n}\n","export function isMSEdge(win: Window): win is Window & { navigator: { msSaveOrOpenBlob: Function } } {\n // @ts-ignore\n return Boolean(win.navigator && win.navigator.msSaveOrOpenBlob)\n}\n\ninterface DownloadFileOptions {\n /**\n * The name of the file\n */\n name?: string\n /**\n * The MIME type of the file\n */\n type?: string\n /**\n * The file contents\n */\n file: File | Blob | string\n /**\n * The window environment\n */\n win: typeof window\n}\n\nexport function downloadFile(options: DownloadFileOptions) {\n const { file, win, type, name } = options\n\n const doc = win.document\n\n const obj = typeof file === \"string\" ? new Blob([file], { type }) : file\n const fileName = typeof file === \"string\" ? name : file instanceof File ? file.name : undefined\n\n if (isMSEdge(win)) {\n win.navigator.msSaveOrOpenBlob(obj, fileName || \"file-download\")\n return\n }\n\n const url = win.URL.createObjectURL(obj)\n\n const anchor = doc.createElement(\"a\")\n anchor.style.display = \"none\"\n anchor.href = url\n anchor.rel = \"noopener\"\n anchor.download = fileName || \"file-download\"\n\n doc.documentElement.appendChild(anchor)\n anchor.click()\n\n setTimeout(() => {\n win.URL.revokeObjectURL(url)\n anchor.remove()\n }, 0)\n}\n","function isMIMEType(v: string) {\n return v === \"audio/*\" || v === \"video/*\" || v === \"image/*\" || v === \"text/*\" || /\\w+\\/[-+.\\w]+/g.test(v)\n}\n\nfunction isExt(v: string) {\n return /^.*\\.[\\w]+$/.test(v)\n}\n\nexport function getAcceptAttrString(accept: Record<string, string[]> | string | undefined) {\n if (!accept) return\n if (typeof accept === \"string\") return accept\n return Object.entries(accept)\n .reduce((a, [mimeType, ext]) => [...a, mimeType, ...ext], [] as string[])\n .filter((v) => isMIMEType(v) || isExt(v))\n .join(\",\")\n}\n","export const getFileDataUrl = async (file: File | Blob) => {\n const reader = new FileReader()\n return new Promise<string | undefined>((resolve, reject) => {\n reader.onerror = () => {\n reader.abort()\n reject(new Error(\"There was an error reading a file\"))\n }\n\n reader.onloadend = () => {\n const { result } = reader\n if (result instanceof ArrayBuffer) {\n reject(new Error(\"Expected DataURL as string from Blob/File, got ArrayBuffer\"))\n } else {\n resolve(result || undefined)\n }\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const getTotalFileSize = (files: File[]) => {\n return files.reduce((acc, file) => acc + file.size, 0)\n}\n","export const isFileEqual = (file1: File, file2: File) => {\n return file1.name === file2.name && file1.size === file2.size && file1.type === file2.type\n}\n","import type { FileError } from \"./types\"\n\nconst isDefined = <T>(v: T | undefined): v is T => v !== undefined && v !== null\n\nexport function isValidFileSize(file: File, minSize?: number, maxSize?: number): [boolean, FileError | null] {\n if (isDefined(file.size)) {\n if (isDefined(minSize) && isDefined(maxSize)) {\n if (file.size > maxSize) return [false, \"FILE_TOO_LARGE\"]\n if (file.size < minSize) return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(minSize) && file.size < minSize) {\n return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(maxSize) && file.size > maxSize) {\n return [false, \"FILE_TOO_LARGE\"]\n }\n }\n return [true, null]\n}\n","import type { FileError } from \"./types\"\n\nfunction isFileAccepted(file: File | null, accept: string[] | string | undefined) {\n if (file && accept) {\n const types = Array.isArray(accept) ? accept : accept.split(\",\")\n\n const fileName = file.name || \"\"\n const mimeType = (file.type || \"\").toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, \"\")\n\n return types.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === \".\") {\n return fileName.toLowerCase().endsWith(validType)\n }\n\n if (validType.endsWith(\"/*\")) {\n return baseMimeType === validType.replace(/\\/.*$/, \"\")\n }\n\n return mimeType === validType\n })\n }\n return true\n}\n\nexport function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null] {\n const isAcceptable = file.type === \"application/x-moz-file\" || isFileAccepted(file, accept)\n return [isAcceptable, isAcceptable ? null : \"FILE_INVALID_TYPE\"]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,SAAS,cAAc,KAAmB;AAC/C,QAAM,SAAS,KAAK,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;AAGrC,QAAM,aAAa,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAG/D,QAAM,SAAS,IAAI,YAAY,OAAO,MAAM;AAG5C,QAAM,WAAW,IAAI,WAAW,MAAM;AAEtC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,aAAS,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EACnC;AAEA,SAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,WAAW,CAAC;AAChD;;;ACjBO,SAAS,SAAS,KAA4E;AAEnG,SAAO,QAAQ,IAAI,aAAa,IAAI,UAAU,gBAAgB;AAChE;AAqBO,SAAS,aAAa,SAA8B;AACzD,QAAM,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI;AAElC,QAAM,MAAM,IAAI;AAEhB,QAAM,MAAM,OAAO,SAAS,WAAW,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,IAAI;AACpE,QAAM,WAAW,OAAO,SAAS,WAAW,OAAO,gBAAgB,OAAO,KAAK,OAAO;AAEtF,MAAI,SAAS,GAAG,GAAG;AACjB,QAAI,UAAU,iBAAiB,KAAK,YAAY,eAAe;AAC/D;AAAA,EACF;AAEA,QAAM,MAAM,IAAI,IAAI,gBAAgB,GAAG;AAEvC,QAAM,SAAS,IAAI,cAAc,GAAG;AACpC,SAAO,MAAM,UAAU;AACvB,SAAO,OAAO;AACd,SAAO,MAAM;AACb,SAAO,WAAW,YAAY;AAE9B,MAAI,gBAAgB,YAAY,MAAM;AACtC,SAAO,MAAM;AAEb,aAAW,MAAM;AACf,QAAI,IAAI,gBAAgB,GAAG;AAC3B,WAAO,OAAO;AAAA,EAChB,GAAG,CAAC;AACN;;;ACpDA,SAAS,WAAW,GAAW;AAC7B,SAAO,MAAM,aAAa,MAAM,aAAa,MAAM,aAAa,MAAM,YAAY,iBAAiB,KAAK,CAAC;AAC3G;AAEA,SAAS,MAAM,GAAW;AACxB,SAAO,cAAc,KAAK,CAAC;AAC7B;AAEO,SAAS,oBAAoB,QAAuD;AACzF,MAAI,CAAC;AAAQ;AACb,MAAI,OAAO,WAAW;AAAU,WAAO;AACvC,SAAO,OAAO,QAAQ,MAAM,EACzB,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,GAAG,UAAU,GAAG,GAAG,GAAG,CAAC,CAAa,EACvE,OAAO,CAAC,MAAM,WAAW,CAAC,KAAK,MAAM,CAAC,CAAC,EACvC,KAAK,GAAG;AACb;;;ACfO,IAAM,iBAAiB,OAAO,SAAsB;AACzD,QAAM,SAAS,IAAI,WAAW;AAC9B,SAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,WAAO,UAAU,MAAM;AACrB,aAAO,MAAM;AACb,aAAO,IAAI,MAAM,mCAAmC,CAAC;AAAA,IACvD;AAEA,WAAO,YAAY,MAAM;AACvB,YAAM,EAAE,OAAO,IAAI;AACnB,UAAI,kBAAkB,aAAa;AACjC,eAAO,IAAI,MAAM,4DAA4D,CAAC;AAAA,MAChF,OAAO;AACL,gBAAQ,UAAU,MAAS;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;;;ACnBO,IAAM,mBAAmB,CAAC,UAAkB;AACjD,SAAO,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,MAAM,CAAC;AACvD;;;ACFO,IAAM,cAAc,CAAC,OAAa,UAAgB;AACvD,SAAO,MAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM;AACxF;;;ACAA,IAAM,YAAY,CAAI,MAA6B,MAAM,UAAa,MAAM;AAErE,SAAS,gBAAgB,MAAY,SAAkB,SAA+C;AAC3G,MAAI,UAAU,KAAK,IAAI,GAAG;AACxB,QAAI,UAAU,OAAO,KAAK,UAAU,OAAO,GAAG;AAC5C,UAAI,KAAK,OAAO;AAAS,eAAO,CAAC,OAAO,gBAAgB;AACxD,UAAI,KAAK,OAAO;AAAS,eAAO,CAAC,OAAO,gBAAgB;AAAA,IAC1D,WAAW,UAAU,OAAO,KAAK,KAAK,OAAO,SAAS;AACpD,aAAO,CAAC,OAAO,gBAAgB;AAAA,IACjC,WAAW,UAAU,OAAO,KAAK,KAAK,OAAO,SAAS;AACpD,aAAO,CAAC,OAAO,gBAAgB;AAAA,IACjC;AAAA,EACF;AACA,SAAO,CAAC,MAAM,IAAI;AACpB;;;ACdA,SAAS,eAAe,MAAmB,QAAuC;AAChF,MAAI,QAAQ,QAAQ;AAClB,UAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,OAAO,MAAM,GAAG;AAE/D,UAAM,WAAW,KAAK,QAAQ;AAC9B,UAAM,YAAY,KAAK,QAAQ,IAAI,YAAY;AAC/C,UAAM,eAAe,SAAS,QAAQ,SAAS,EAAE;AAEjD,WAAO,MAAM,KAAK,CAAC,SAAS;AAC1B,YAAM,YAAY,KAAK,KAAK,EAAE,YAAY;AAE1C,UAAI,UAAU,OAAO,CAAC,MAAM,KAAK;AAC/B,eAAO,SAAS,YAAY,EAAE,SAAS,SAAS;AAAA,MAClD;AAEA,UAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,eAAO,iBAAiB,UAAU,QAAQ,SAAS,EAAE;AAAA,MACvD;AAEA,aAAO,aAAa;AAAA,IACtB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAY,QAAyD;AACnG,QAAM,eAAe,KAAK,SAAS,4BAA4B,eAAe,MAAM,MAAM;AAC1F,SAAO,CAAC,cAAc,eAAe,OAAO,mBAAmB;AACjE;","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -37,28 +37,6 @@ function downloadFile(options) {
|
|
|
37
37
|
}, 0);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
// src/format-bytes.ts
|
|
41
|
-
import { formatNumber } from "@zag-js/i18n-utils";
|
|
42
|
-
var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
|
|
43
|
-
var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
|
|
44
|
-
var formatBytes = (bytes, locale = "en-US", options = {}) => {
|
|
45
|
-
if (isNaN(bytes))
|
|
46
|
-
return "";
|
|
47
|
-
if (bytes === 0)
|
|
48
|
-
return "0 B";
|
|
49
|
-
const { unit = "byte", unitDisplay = "short" } = options;
|
|
50
|
-
const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
|
|
51
|
-
const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
|
|
52
|
-
const _unit = prefix[index] + unit;
|
|
53
|
-
const _unitDisplay = unitDisplay || "short";
|
|
54
|
-
const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
|
|
55
|
-
return formatNumber(v, locale, {
|
|
56
|
-
style: "unit",
|
|
57
|
-
unit: _unit,
|
|
58
|
-
unitDisplay: _unitDisplay
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
|
|
62
40
|
// src/get-accept-attr.ts
|
|
63
41
|
function isMIMEType(v) {
|
|
64
42
|
return v === "audio/*" || v === "video/*" || v === "image/*" || v === "text/*" || /\w+\/[-+.\w]+/g.test(v);
|
|
@@ -149,7 +127,6 @@ function isValidFileType(file, accept) {
|
|
|
149
127
|
export {
|
|
150
128
|
dataURItoBlob,
|
|
151
129
|
downloadFile,
|
|
152
|
-
formatBytes,
|
|
153
130
|
getAcceptAttrString,
|
|
154
131
|
getFileDataUrl,
|
|
155
132
|
getTotalFileSize,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-url-to-blob.ts","../src/download-file.ts","../src/format-bytes.ts","../src/get-accept-attr.ts","../src/get-file-data-url.ts","../src/get-total-file-size.ts","../src/is-file-equal.ts","../src/is-valid-file-size.ts","../src/is-valid-file-type.ts"],"sourcesContent":["export function dataURItoBlob(uri: string): Blob {\n const binary = atob(uri.split(\",\")[1])\n\n // separate out the mime component\n const mimeString = uri.split(\",\")[0].split(\":\")[1].split(\";\")[0]\n\n // write the bytes of the string to an ArrayBuffer\n const buffer = new ArrayBuffer(binary.length)\n\n // create a view into the buffer\n const intArray = new Uint8Array(buffer)\n\n for (let i = 0; i < binary.length; i++) {\n intArray[i] = binary.charCodeAt(i)\n }\n\n return new Blob([buffer], { type: mimeString })\n}\n","export function isMSEdge(win: Window): win is Window & { navigator: { msSaveOrOpenBlob: Function } } {\n // @ts-ignore\n return Boolean(win.navigator && win.navigator.msSaveOrOpenBlob)\n}\n\ninterface DownloadFileOptions {\n /**\n * The name of the file\n */\n name?: string\n /**\n * The MIME type of the file\n */\n type?: string\n /**\n * The file contents\n */\n file: File | Blob | string\n /**\n * The window environment\n */\n win: typeof window\n}\n\nexport function downloadFile(options: DownloadFileOptions) {\n const { file, win, type, name } = options\n\n const doc = win.document\n\n const obj = typeof file === \"string\" ? new Blob([file], { type }) : file\n const fileName = typeof file === \"string\" ? name : file instanceof File ? file.name : undefined\n\n if (isMSEdge(win)) {\n win.navigator.msSaveOrOpenBlob(obj, fileName || \"file-download\")\n return\n }\n\n const url = win.URL.createObjectURL(obj)\n\n const anchor = doc.createElement(\"a\")\n anchor.style.display = \"none\"\n anchor.href = url\n anchor.rel = \"noopener\"\n anchor.download = fileName || \"file-download\"\n\n doc.documentElement.appendChild(anchor)\n anchor.click()\n\n setTimeout(() => {\n win.URL.revokeObjectURL(url)\n anchor.remove()\n }, 0)\n}\n","import { formatNumber } from \"@zag-js/i18n-utils\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\ninterface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","function isMIMEType(v: string) {\n return v === \"audio/*\" || v === \"video/*\" || v === \"image/*\" || v === \"text/*\" || /\\w+\\/[-+.\\w]+/g.test(v)\n}\n\nfunction isExt(v: string) {\n return /^.*\\.[\\w]+$/.test(v)\n}\n\nexport function getAcceptAttrString(accept: Record<string, string[]> | string | undefined) {\n if (!accept) return\n if (typeof accept === \"string\") return accept\n return Object.entries(accept)\n .reduce((a, [mimeType, ext]) => [...a, mimeType, ...ext], [] as string[])\n .filter((v) => isMIMEType(v) || isExt(v))\n .join(\",\")\n}\n","export const getFileDataUrl = async (file: File | Blob) => {\n const reader = new FileReader()\n return new Promise<string | undefined>((resolve, reject) => {\n reader.onerror = () => {\n reader.abort()\n reject(new Error(\"There was an error reading a file\"))\n }\n\n reader.onloadend = () => {\n const { result } = reader\n if (result instanceof ArrayBuffer) {\n reject(new Error(\"Expected DataURL as string from Blob/File, got ArrayBuffer\"))\n } else {\n resolve(result || undefined)\n }\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const getTotalFileSize = (files: File[]) => {\n return files.reduce((acc, file) => acc + file.size, 0)\n}\n","export const isFileEqual = (file1: File, file2: File) => {\n return file1.name === file2.name && file1.size === file2.size && file1.type === file2.type\n}\n","import type { FileError } from \"./types\"\n\nconst isDefined = <T>(v: T | undefined): v is T => v !== undefined && v !== null\n\nexport function isValidFileSize(file: File, minSize?: number, maxSize?: number): [boolean, FileError | null] {\n if (isDefined(file.size)) {\n if (isDefined(minSize) && isDefined(maxSize)) {\n if (file.size > maxSize) return [false, \"FILE_TOO_LARGE\"]\n if (file.size < minSize) return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(minSize) && file.size < minSize) {\n return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(maxSize) && file.size > maxSize) {\n return [false, \"FILE_TOO_LARGE\"]\n }\n }\n return [true, null]\n}\n","import type { FileError } from \"./types\"\n\nfunction isFileAccepted(file: File | null, accept: string[] | string | undefined) {\n if (file && accept) {\n const types = Array.isArray(accept) ? accept : accept.split(\",\")\n\n const fileName = file.name || \"\"\n const mimeType = (file.type || \"\").toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, \"\")\n\n return types.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === \".\") {\n return fileName.toLowerCase().endsWith(validType)\n }\n\n if (validType.endsWith(\"/*\")) {\n return baseMimeType === validType.replace(/\\/.*$/, \"\")\n }\n\n return mimeType === validType\n })\n }\n return true\n}\n\nexport function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null] {\n const isAcceptable = file.type === \"application/x-moz-file\" || isFileAccepted(file, accept)\n return [isAcceptable, isAcceptable ? null : \"FILE_INVALID_TYPE\"]\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/data-url-to-blob.ts","../src/download-file.ts","../src/get-accept-attr.ts","../src/get-file-data-url.ts","../src/get-total-file-size.ts","../src/is-file-equal.ts","../src/is-valid-file-size.ts","../src/is-valid-file-type.ts"],"sourcesContent":["export function dataURItoBlob(uri: string): Blob {\n const binary = atob(uri.split(\",\")[1])\n\n // separate out the mime component\n const mimeString = uri.split(\",\")[0].split(\":\")[1].split(\";\")[0]\n\n // write the bytes of the string to an ArrayBuffer\n const buffer = new ArrayBuffer(binary.length)\n\n // create a view into the buffer\n const intArray = new Uint8Array(buffer)\n\n for (let i = 0; i < binary.length; i++) {\n intArray[i] = binary.charCodeAt(i)\n }\n\n return new Blob([buffer], { type: mimeString })\n}\n","export function isMSEdge(win: Window): win is Window & { navigator: { msSaveOrOpenBlob: Function } } {\n // @ts-ignore\n return Boolean(win.navigator && win.navigator.msSaveOrOpenBlob)\n}\n\ninterface DownloadFileOptions {\n /**\n * The name of the file\n */\n name?: string\n /**\n * The MIME type of the file\n */\n type?: string\n /**\n * The file contents\n */\n file: File | Blob | string\n /**\n * The window environment\n */\n win: typeof window\n}\n\nexport function downloadFile(options: DownloadFileOptions) {\n const { file, win, type, name } = options\n\n const doc = win.document\n\n const obj = typeof file === \"string\" ? new Blob([file], { type }) : file\n const fileName = typeof file === \"string\" ? name : file instanceof File ? file.name : undefined\n\n if (isMSEdge(win)) {\n win.navigator.msSaveOrOpenBlob(obj, fileName || \"file-download\")\n return\n }\n\n const url = win.URL.createObjectURL(obj)\n\n const anchor = doc.createElement(\"a\")\n anchor.style.display = \"none\"\n anchor.href = url\n anchor.rel = \"noopener\"\n anchor.download = fileName || \"file-download\"\n\n doc.documentElement.appendChild(anchor)\n anchor.click()\n\n setTimeout(() => {\n win.URL.revokeObjectURL(url)\n anchor.remove()\n }, 0)\n}\n","function isMIMEType(v: string) {\n return v === \"audio/*\" || v === \"video/*\" || v === \"image/*\" || v === \"text/*\" || /\\w+\\/[-+.\\w]+/g.test(v)\n}\n\nfunction isExt(v: string) {\n return /^.*\\.[\\w]+$/.test(v)\n}\n\nexport function getAcceptAttrString(accept: Record<string, string[]> | string | undefined) {\n if (!accept) return\n if (typeof accept === \"string\") return accept\n return Object.entries(accept)\n .reduce((a, [mimeType, ext]) => [...a, mimeType, ...ext], [] as string[])\n .filter((v) => isMIMEType(v) || isExt(v))\n .join(\",\")\n}\n","export const getFileDataUrl = async (file: File | Blob) => {\n const reader = new FileReader()\n return new Promise<string | undefined>((resolve, reject) => {\n reader.onerror = () => {\n reader.abort()\n reject(new Error(\"There was an error reading a file\"))\n }\n\n reader.onloadend = () => {\n const { result } = reader\n if (result instanceof ArrayBuffer) {\n reject(new Error(\"Expected DataURL as string from Blob/File, got ArrayBuffer\"))\n } else {\n resolve(result || undefined)\n }\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const getTotalFileSize = (files: File[]) => {\n return files.reduce((acc, file) => acc + file.size, 0)\n}\n","export const isFileEqual = (file1: File, file2: File) => {\n return file1.name === file2.name && file1.size === file2.size && file1.type === file2.type\n}\n","import type { FileError } from \"./types\"\n\nconst isDefined = <T>(v: T | undefined): v is T => v !== undefined && v !== null\n\nexport function isValidFileSize(file: File, minSize?: number, maxSize?: number): [boolean, FileError | null] {\n if (isDefined(file.size)) {\n if (isDefined(minSize) && isDefined(maxSize)) {\n if (file.size > maxSize) return [false, \"FILE_TOO_LARGE\"]\n if (file.size < minSize) return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(minSize) && file.size < minSize) {\n return [false, \"FILE_TOO_SMALL\"]\n } else if (isDefined(maxSize) && file.size > maxSize) {\n return [false, \"FILE_TOO_LARGE\"]\n }\n }\n return [true, null]\n}\n","import type { FileError } from \"./types\"\n\nfunction isFileAccepted(file: File | null, accept: string[] | string | undefined) {\n if (file && accept) {\n const types = Array.isArray(accept) ? accept : accept.split(\",\")\n\n const fileName = file.name || \"\"\n const mimeType = (file.type || \"\").toLowerCase()\n const baseMimeType = mimeType.replace(/\\/.*$/, \"\")\n\n return types.some((type) => {\n const validType = type.trim().toLowerCase()\n\n if (validType.charAt(0) === \".\") {\n return fileName.toLowerCase().endsWith(validType)\n }\n\n if (validType.endsWith(\"/*\")) {\n return baseMimeType === validType.replace(/\\/.*$/, \"\")\n }\n\n return mimeType === validType\n })\n }\n return true\n}\n\nexport function isValidFileType(file: File, accept: string | undefined): [boolean, FileError | null] {\n const isAcceptable = file.type === \"application/x-moz-file\" || isFileAccepted(file, accept)\n return [isAcceptable, isAcceptable ? null : \"FILE_INVALID_TYPE\"]\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/file-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.0",
|
|
4
4
|
"description": "JS File API utilities",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"clean-package": "../../../clean-package.config.json",
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@zag-js/i18n-utils": "0.
|
|
27
|
+
"@zag-js/i18n-utils": "0.39.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"clean-package": "2.2.0"
|