@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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/async.cjs +134 -0
  4. package/dist/async.d.cts +81 -0
  5. package/dist/async.d.ts +81 -0
  6. package/dist/async.js +1 -0
  7. package/dist/chunk-63IWZEOC.js +51 -0
  8. package/dist/chunk-6P4YWHCJ.js +47 -0
  9. package/dist/chunk-BMNZVRFN.js +25 -0
  10. package/dist/chunk-DKWI2AZG.js +128 -0
  11. package/dist/chunk-DY6WSWXH.js +60 -0
  12. package/dist/chunk-ETJDEEF5.js +129 -0
  13. package/dist/chunk-FX7K6FKW.js +57 -0
  14. package/dist/chunk-JHYMIU2G.js +121 -0
  15. package/dist/chunk-L4BLBOLO.js +93 -0
  16. package/dist/chunk-PTNHOSWH.js +40 -0
  17. package/dist/chunk-QMPHN3LG.js +78 -0
  18. package/dist/chunk-RIFUQ7JM.js +47 -0
  19. package/dist/chunk-YU5NRSDP.js +11 -0
  20. package/dist/classname.cjs +28 -0
  21. package/dist/classname.d.cts +15 -0
  22. package/dist/classname.d.ts +15 -0
  23. package/dist/classname.js +1 -0
  24. package/dist/clipboard.cjs +51 -0
  25. package/dist/clipboard.d.cts +16 -0
  26. package/dist/clipboard.d.ts +16 -0
  27. package/dist/clipboard.js +1 -0
  28. package/dist/collection.cjs +109 -0
  29. package/dist/collection.d.cts +44 -0
  30. package/dist/collection.d.ts +44 -0
  31. package/dist/collection.js +1 -0
  32. package/dist/currency.cjs +64 -0
  33. package/dist/currency.d.cts +16 -0
  34. package/dist/currency.d.ts +16 -0
  35. package/dist/currency.js +1 -0
  36. package/dist/date.cjs +140 -0
  37. package/dist/date.d.cts +32 -0
  38. package/dist/date.d.ts +32 -0
  39. package/dist/date.js +1 -0
  40. package/dist/events.cjs +13 -0
  41. package/dist/events.d.cts +10 -0
  42. package/dist/events.d.ts +10 -0
  43. package/dist/events.js +1 -0
  44. package/dist/file.cjs +141 -0
  45. package/dist/file.d.cts +58 -0
  46. package/dist/file.d.ts +58 -0
  47. package/dist/file.js +1 -0
  48. package/dist/index.cjs +977 -0
  49. package/dist/index.d.cts +13 -0
  50. package/dist/index.d.ts +13 -0
  51. package/dist/index.js +13 -0
  52. package/dist/locale.cjs +58 -0
  53. package/dist/locale.d.cts +51 -0
  54. package/dist/locale.d.ts +51 -0
  55. package/dist/locale.js +1 -0
  56. package/dist/number.cjs +61 -0
  57. package/dist/number.d.cts +14 -0
  58. package/dist/number.d.ts +14 -0
  59. package/dist/number.js +1 -0
  60. package/dist/object.cjs +87 -0
  61. package/dist/object.d.cts +48 -0
  62. package/dist/object.d.ts +48 -0
  63. package/dist/object.js +1 -0
  64. package/dist/query.cjs +65 -0
  65. package/dist/query.d.cts +48 -0
  66. package/dist/query.d.ts +48 -0
  67. package/dist/query.js +1 -0
  68. package/dist/string.cjs +50 -0
  69. package/dist/string.d.cts +15 -0
  70. package/dist/string.d.ts +15 -0
  71. package/dist/string.js +1 -0
  72. package/dist/validation.cjs +123 -0
  73. package/dist/validation.d.cts +77 -0
  74. package/dist/validation.d.ts +77 -0
  75. package/dist/validation.js +102 -0
  76. 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;
@@ -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';