@sia-ui/utils 0.1.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/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/async.cjs +134 -0
- package/dist/async.d.cts +81 -0
- package/dist/async.d.ts +81 -0
- package/dist/async.js +1 -0
- package/dist/chunk-63IWZEOC.js +51 -0
- package/dist/chunk-6P4YWHCJ.js +47 -0
- package/dist/chunk-BMNZVRFN.js +25 -0
- package/dist/chunk-DKWI2AZG.js +128 -0
- package/dist/chunk-DY6WSWXH.js +60 -0
- package/dist/chunk-ETJDEEF5.js +129 -0
- package/dist/chunk-FX7K6FKW.js +57 -0
- package/dist/chunk-JHYMIU2G.js +121 -0
- package/dist/chunk-L4BLBOLO.js +93 -0
- package/dist/chunk-PTNHOSWH.js +40 -0
- package/dist/chunk-QMPHN3LG.js +78 -0
- package/dist/chunk-RIFUQ7JM.js +47 -0
- package/dist/chunk-YU5NRSDP.js +11 -0
- package/dist/classname.cjs +28 -0
- package/dist/classname.d.cts +15 -0
- package/dist/classname.d.ts +15 -0
- package/dist/classname.js +1 -0
- package/dist/clipboard.cjs +51 -0
- package/dist/clipboard.d.cts +16 -0
- package/dist/clipboard.d.ts +16 -0
- package/dist/clipboard.js +1 -0
- package/dist/collection.cjs +109 -0
- package/dist/collection.d.cts +44 -0
- package/dist/collection.d.ts +44 -0
- package/dist/collection.js +1 -0
- package/dist/currency.cjs +64 -0
- package/dist/currency.d.cts +16 -0
- package/dist/currency.d.ts +16 -0
- package/dist/currency.js +1 -0
- package/dist/date.cjs +140 -0
- package/dist/date.d.cts +32 -0
- package/dist/date.d.ts +32 -0
- package/dist/date.js +1 -0
- package/dist/events.cjs +13 -0
- package/dist/events.d.cts +10 -0
- package/dist/events.d.ts +10 -0
- package/dist/events.js +1 -0
- package/dist/file.cjs +141 -0
- package/dist/file.d.cts +58 -0
- package/dist/file.d.ts +58 -0
- package/dist/file.js +1 -0
- package/dist/index.cjs +977 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +13 -0
- package/dist/locale.cjs +58 -0
- package/dist/locale.d.cts +51 -0
- package/dist/locale.d.ts +51 -0
- package/dist/locale.js +1 -0
- package/dist/number.cjs +61 -0
- package/dist/number.d.cts +14 -0
- package/dist/number.d.ts +14 -0
- package/dist/number.js +1 -0
- package/dist/object.cjs +87 -0
- package/dist/object.d.cts +48 -0
- package/dist/object.d.ts +48 -0
- package/dist/object.js +1 -0
- package/dist/query.cjs +65 -0
- package/dist/query.d.cts +48 -0
- package/dist/query.d.ts +48 -0
- package/dist/query.js +1 -0
- package/dist/string.cjs +50 -0
- package/dist/string.d.cts +15 -0
- package/dist/string.d.ts +15 -0
- package/dist/string.js +1 -0
- package/dist/validation.cjs +123 -0
- package/dist/validation.d.cts +77 -0
- package/dist/validation.d.ts +77 -0
- package/dist/validation.js +102 -0
- package/package.json +127 -0
package/dist/file.cjs
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/file.ts
|
|
4
|
+
var UNITS = ["o", "ko", "Mo", "Go", "To"];
|
|
5
|
+
function formatBytes(bytes, options = {}) {
|
|
6
|
+
const { decimals = 1, locale = "fr-FR" } = options;
|
|
7
|
+
if (!Number.isFinite(bytes) || bytes <= 0) return "0 o";
|
|
8
|
+
const exponent = Math.min(
|
|
9
|
+
Math.floor(Math.log(bytes) / Math.log(1024)),
|
|
10
|
+
UNITS.length - 1
|
|
11
|
+
);
|
|
12
|
+
const value = bytes / 1024 ** exponent;
|
|
13
|
+
return `${value.toLocaleString(locale, {
|
|
14
|
+
// Les octets n'ont pas de décimale : « 1 024,0 o » n'a pas de sens.
|
|
15
|
+
maximumFractionDigits: exponent === 0 ? 0 : decimals
|
|
16
|
+
})} ${UNITS[exponent]}`;
|
|
17
|
+
}
|
|
18
|
+
function extension(name) {
|
|
19
|
+
const index = name.lastIndexOf(".");
|
|
20
|
+
if (index <= 0 || index === name.length - 1) return "";
|
|
21
|
+
return name.slice(index + 1).toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
function baseName(name) {
|
|
24
|
+
const index = name.lastIndexOf(".");
|
|
25
|
+
return index <= 0 ? name : name.slice(0, index);
|
|
26
|
+
}
|
|
27
|
+
var BY_EXTENSION = {
|
|
28
|
+
jpg: "image",
|
|
29
|
+
jpeg: "image",
|
|
30
|
+
png: "image",
|
|
31
|
+
gif: "image",
|
|
32
|
+
webp: "image",
|
|
33
|
+
avif: "image",
|
|
34
|
+
svg: "image",
|
|
35
|
+
bmp: "image",
|
|
36
|
+
heic: "image",
|
|
37
|
+
mp4: "video",
|
|
38
|
+
webm: "video",
|
|
39
|
+
mov: "video",
|
|
40
|
+
avi: "video",
|
|
41
|
+
mkv: "video",
|
|
42
|
+
mp3: "audio",
|
|
43
|
+
wav: "audio",
|
|
44
|
+
ogg: "audio",
|
|
45
|
+
m4a: "audio",
|
|
46
|
+
flac: "audio",
|
|
47
|
+
pdf: "pdf",
|
|
48
|
+
zip: "archive",
|
|
49
|
+
rar: "archive",
|
|
50
|
+
"7z": "archive",
|
|
51
|
+
tar: "archive",
|
|
52
|
+
gz: "archive",
|
|
53
|
+
xls: "spreadsheet",
|
|
54
|
+
xlsx: "spreadsheet",
|
|
55
|
+
csv: "spreadsheet",
|
|
56
|
+
ods: "spreadsheet",
|
|
57
|
+
doc: "document",
|
|
58
|
+
docx: "document",
|
|
59
|
+
odt: "document",
|
|
60
|
+
txt: "document",
|
|
61
|
+
rtf: "document",
|
|
62
|
+
md: "document"
|
|
63
|
+
};
|
|
64
|
+
function fileKind(file) {
|
|
65
|
+
if (typeof file !== "string" && file.type) {
|
|
66
|
+
const [group] = file.type.split("/");
|
|
67
|
+
if (group === "image") return "image";
|
|
68
|
+
if (group === "video") return "video";
|
|
69
|
+
if (group === "audio") return "audio";
|
|
70
|
+
if (file.type === "application/pdf") return "pdf";
|
|
71
|
+
}
|
|
72
|
+
const name = typeof file === "string" ? file : file.name;
|
|
73
|
+
return BY_EXTENSION[extension(name)] ?? "other";
|
|
74
|
+
}
|
|
75
|
+
function isImage(file) {
|
|
76
|
+
return fileKind(file) === "image";
|
|
77
|
+
}
|
|
78
|
+
function exceedsSize(file, maxMegabytes) {
|
|
79
|
+
return file.size > maxMegabytes * 1024 * 1024;
|
|
80
|
+
}
|
|
81
|
+
function matchesAccept(file, accept) {
|
|
82
|
+
const rules = accept.split(",").map((rule) => rule.trim().toLowerCase()).filter(Boolean);
|
|
83
|
+
if (rules.length === 0) return true;
|
|
84
|
+
const type = file.type.toLowerCase();
|
|
85
|
+
const ext = `.${extension(file.name)}`;
|
|
86
|
+
return rules.some((rule) => {
|
|
87
|
+
if (rule.startsWith(".")) return rule === ext;
|
|
88
|
+
if (rule.endsWith("/*")) return type.startsWith(rule.slice(0, -1));
|
|
89
|
+
return rule === type;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function requireBrowser(what) {
|
|
93
|
+
if (typeof window === "undefined") {
|
|
94
|
+
throw new Error(`${what} n'est disponible que dans un navigateur.`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function readAsDataUrl(file) {
|
|
98
|
+
requireBrowser("readAsDataUrl");
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const reader = new FileReader();
|
|
101
|
+
reader.onload = () => resolve(String(reader.result));
|
|
102
|
+
reader.onerror = () => reject(reader.error ?? new Error("Lecture \xE9chou\xE9e"));
|
|
103
|
+
reader.readAsDataURL(file);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function readAsText(file, encoding = "utf-8") {
|
|
107
|
+
requireBrowser("readAsText");
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
const reader = new FileReader();
|
|
110
|
+
reader.onload = () => resolve(String(reader.result));
|
|
111
|
+
reader.onerror = () => reject(reader.error ?? new Error("Lecture \xE9chou\xE9e"));
|
|
112
|
+
reader.readAsText(file, encoding);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function downloadBlob(blob, filename) {
|
|
116
|
+
requireBrowser("downloadBlob");
|
|
117
|
+
const url = URL.createObjectURL(blob);
|
|
118
|
+
const link = document.createElement("a");
|
|
119
|
+
link.href = url;
|
|
120
|
+
link.download = filename;
|
|
121
|
+
document.body.appendChild(link);
|
|
122
|
+
link.click();
|
|
123
|
+
link.remove();
|
|
124
|
+
URL.revokeObjectURL(url);
|
|
125
|
+
}
|
|
126
|
+
function downloadText(content, filename, type = "text/plain;charset=utf-8") {
|
|
127
|
+
const prefix = type.startsWith("text/csv") ? "\uFEFF" : "";
|
|
128
|
+
downloadBlob(new Blob([prefix + content], { type }), filename);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
exports.baseName = baseName;
|
|
132
|
+
exports.downloadBlob = downloadBlob;
|
|
133
|
+
exports.downloadText = downloadText;
|
|
134
|
+
exports.exceedsSize = exceedsSize;
|
|
135
|
+
exports.extension = extension;
|
|
136
|
+
exports.fileKind = fileKind;
|
|
137
|
+
exports.formatBytes = formatBytes;
|
|
138
|
+
exports.isImage = isImage;
|
|
139
|
+
exports.matchesAccept = matchesAccept;
|
|
140
|
+
exports.readAsDataUrl = readAsDataUrl;
|
|
141
|
+
exports.readAsText = readAsText;
|
package/dist/file.d.cts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fichiers.
|
|
3
|
+
*
|
|
4
|
+
* Trois de ces fonctions touchent le navigateur — `FileReader`, `document`.
|
|
5
|
+
* Elles lèvent une erreur explicite côté serveur plutôt que de planter sur un
|
|
6
|
+
* `document is not defined` incompréhensible dans une trace de rendu serveur.
|
|
7
|
+
*/
|
|
8
|
+
interface FormatBytesOptions {
|
|
9
|
+
decimals?: number;
|
|
10
|
+
locale?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Une taille lisible : `1,4 Mo`.
|
|
14
|
+
*
|
|
15
|
+
* Base 1024, unités décimales — la convention de tous les systèmes de
|
|
16
|
+
* fichiers grand public. Les puristes écrivent `Mio`; personne ne le lit.
|
|
17
|
+
*/
|
|
18
|
+
declare function formatBytes(bytes: number, options?: FormatBytesOptions): string;
|
|
19
|
+
/** L'extension, en minuscules, sans le point. Vide s'il n'y en a pas. */
|
|
20
|
+
declare function extension(name: string): string;
|
|
21
|
+
/** Le nom sans son extension. */
|
|
22
|
+
declare function baseName(name: string): string;
|
|
23
|
+
type FileKind = "image" | "video" | "audio" | "pdf" | "archive" | "spreadsheet" | "document" | "other";
|
|
24
|
+
/**
|
|
25
|
+
* Le genre d'un fichier.
|
|
26
|
+
*
|
|
27
|
+
* Le type MIME est consulté en premier quand il est là — il vient du système
|
|
28
|
+
* —, l'extension sert de repli. Un `.csv` arrive régulièrement en
|
|
29
|
+
* `application/vnd.ms-excel`, d'où la double lecture.
|
|
30
|
+
*/
|
|
31
|
+
declare function fileKind(file: File | string): FileKind;
|
|
32
|
+
declare function isImage(file: File | string): boolean;
|
|
33
|
+
/** Vrai si le fichier dépasse la limite, exprimée en mégaoctets. */
|
|
34
|
+
declare function exceedsSize(file: File, maxMegabytes: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Vrai si le fichier correspond à la liste d'acceptation d'un `<input>`.
|
|
37
|
+
*
|
|
38
|
+
* Même grammaire que l'attribut `accept` : `image/*`, `.pdf`,
|
|
39
|
+
* `application/pdf`. Le navigateur filtre déjà à la sélection, mais pas au
|
|
40
|
+
* glisser-déposer — c'est là que cette fonction sert.
|
|
41
|
+
*/
|
|
42
|
+
declare function matchesAccept(file: File, accept: string): boolean;
|
|
43
|
+
/** Lit un fichier en `data:` URL — un aperçu d'image avant téléversement. */
|
|
44
|
+
declare function readAsDataUrl(file: Blob): Promise<string>;
|
|
45
|
+
/** Lit un fichier en texte — un CSV, un JSON déposé. */
|
|
46
|
+
declare function readAsText(file: Blob, encoding?: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Propose un téléchargement.
|
|
49
|
+
*
|
|
50
|
+
* L'URL objet est révoquée après coup : sans cela, le contenu reste en
|
|
51
|
+
* mémoire jusqu'au rechargement de la page — ce qui se voit sur un export de
|
|
52
|
+
* plusieurs mégaoctets répété.
|
|
53
|
+
*/
|
|
54
|
+
declare function downloadBlob(blob: Blob, filename: string): void;
|
|
55
|
+
/** Télécharge du texte — un CSV construit côté client. */
|
|
56
|
+
declare function downloadText(content: string, filename: string, type?: string): void;
|
|
57
|
+
|
|
58
|
+
export { type FileKind, type FormatBytesOptions, baseName, downloadBlob, downloadText, exceedsSize, extension, fileKind, formatBytes, isImage, matchesAccept, readAsDataUrl, readAsText };
|
package/dist/file.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fichiers.
|
|
3
|
+
*
|
|
4
|
+
* Trois de ces fonctions touchent le navigateur — `FileReader`, `document`.
|
|
5
|
+
* Elles lèvent une erreur explicite côté serveur plutôt que de planter sur un
|
|
6
|
+
* `document is not defined` incompréhensible dans une trace de rendu serveur.
|
|
7
|
+
*/
|
|
8
|
+
interface FormatBytesOptions {
|
|
9
|
+
decimals?: number;
|
|
10
|
+
locale?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Une taille lisible : `1,4 Mo`.
|
|
14
|
+
*
|
|
15
|
+
* Base 1024, unités décimales — la convention de tous les systèmes de
|
|
16
|
+
* fichiers grand public. Les puristes écrivent `Mio`; personne ne le lit.
|
|
17
|
+
*/
|
|
18
|
+
declare function formatBytes(bytes: number, options?: FormatBytesOptions): string;
|
|
19
|
+
/** L'extension, en minuscules, sans le point. Vide s'il n'y en a pas. */
|
|
20
|
+
declare function extension(name: string): string;
|
|
21
|
+
/** Le nom sans son extension. */
|
|
22
|
+
declare function baseName(name: string): string;
|
|
23
|
+
type FileKind = "image" | "video" | "audio" | "pdf" | "archive" | "spreadsheet" | "document" | "other";
|
|
24
|
+
/**
|
|
25
|
+
* Le genre d'un fichier.
|
|
26
|
+
*
|
|
27
|
+
* Le type MIME est consulté en premier quand il est là — il vient du système
|
|
28
|
+
* —, l'extension sert de repli. Un `.csv` arrive régulièrement en
|
|
29
|
+
* `application/vnd.ms-excel`, d'où la double lecture.
|
|
30
|
+
*/
|
|
31
|
+
declare function fileKind(file: File | string): FileKind;
|
|
32
|
+
declare function isImage(file: File | string): boolean;
|
|
33
|
+
/** Vrai si le fichier dépasse la limite, exprimée en mégaoctets. */
|
|
34
|
+
declare function exceedsSize(file: File, maxMegabytes: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Vrai si le fichier correspond à la liste d'acceptation d'un `<input>`.
|
|
37
|
+
*
|
|
38
|
+
* Même grammaire que l'attribut `accept` : `image/*`, `.pdf`,
|
|
39
|
+
* `application/pdf`. Le navigateur filtre déjà à la sélection, mais pas au
|
|
40
|
+
* glisser-déposer — c'est là que cette fonction sert.
|
|
41
|
+
*/
|
|
42
|
+
declare function matchesAccept(file: File, accept: string): boolean;
|
|
43
|
+
/** Lit un fichier en `data:` URL — un aperçu d'image avant téléversement. */
|
|
44
|
+
declare function readAsDataUrl(file: Blob): Promise<string>;
|
|
45
|
+
/** Lit un fichier en texte — un CSV, un JSON déposé. */
|
|
46
|
+
declare function readAsText(file: Blob, encoding?: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Propose un téléchargement.
|
|
49
|
+
*
|
|
50
|
+
* L'URL objet est révoquée après coup : sans cela, le contenu reste en
|
|
51
|
+
* mémoire jusqu'au rechargement de la page — ce qui se voit sur un export de
|
|
52
|
+
* plusieurs mégaoctets répété.
|
|
53
|
+
*/
|
|
54
|
+
declare function downloadBlob(blob: Blob, filename: string): void;
|
|
55
|
+
/** Télécharge du texte — un CSV construit côté client. */
|
|
56
|
+
declare function downloadText(content: string, filename: string, type?: string): void;
|
|
57
|
+
|
|
58
|
+
export { type FileKind, type FormatBytesOptions, baseName, downloadBlob, downloadText, exceedsSize, extension, fileKind, formatBytes, isImage, matchesAccept, readAsDataUrl, readAsText };
|
package/dist/file.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { baseName, downloadBlob, downloadText, exceedsSize, extension, fileKind, formatBytes, isImage, matchesAccept, readAsDataUrl, readAsText } from './chunk-ETJDEEF5.js';
|