dropcap 1.4.0 → 1.6.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 (104) hide show
  1. package/dist/{idb/idb.d.ts → idb.d.ts} +11 -15
  2. package/dist/idb.js +232 -0
  3. package/dist/idb.js.map +1 -0
  4. package/dist/types-global.d.ts +8 -0
  5. package/dist/types-global.js +2 -0
  6. package/dist/types-global.js.map +1 -0
  7. package/dist/types.d.ts +5 -0
  8. package/dist/types.js +2 -0
  9. package/dist/types.js.map +1 -0
  10. package/dist/utils-color-hash.d.ts +2 -0
  11. package/dist/utils-color-hash.js +47 -0
  12. package/dist/utils-color-hash.js.map +1 -0
  13. package/dist/utils-create-log.d.ts +6 -0
  14. package/dist/utils-create-log.js +12 -0
  15. package/dist/utils-create-log.js.map +1 -0
  16. package/dist/utils-enqueue.d.ts +2 -0
  17. package/dist/utils-enqueue.js +5 -0
  18. package/dist/utils-enqueue.js.map +1 -0
  19. package/dist/utils-ensure-array.d.ts +1 -0
  20. package/dist/utils-ensure-array.js +4 -0
  21. package/dist/utils-ensure-array.js.map +1 -0
  22. package/dist/{utils/utils-is.d.ts → utils-is.d.ts} +3 -6
  23. package/dist/utils-is.js +30 -0
  24. package/dist/utils-is.js.map +1 -0
  25. package/dist/utils-link.d.ts +1 -0
  26. package/dist/utils-link.js +7 -0
  27. package/dist/utils-link.js.map +1 -0
  28. package/dist/{utils/utils-queue.d.ts → utils-queue.d.ts} +5 -8
  29. package/dist/utils-queue.js +50 -0
  30. package/dist/utils-queue.js.map +1 -0
  31. package/dist/utils-safe.d.ts +2 -0
  32. package/dist/utils-safe.js +22 -0
  33. package/dist/utils-safe.js.map +1 -0
  34. package/dist/utils-unique.d.ts +1 -0
  35. package/dist/utils-unique.js +13 -0
  36. package/dist/utils-unique.js.map +1 -0
  37. package/dist/utils-unit.d.ts +9 -0
  38. package/dist/utils-unit.js +26 -0
  39. package/dist/utils-unit.js.map +1 -0
  40. package/dist/utils-wait.d.ts +1 -0
  41. package/dist/utils-wait.js +4 -0
  42. package/dist/utils-wait.js.map +1 -0
  43. package/dist/utils.d.ts +13 -0
  44. package/dist/utils.js +13 -0
  45. package/dist/utils.js.map +1 -0
  46. package/package.json +8 -7
  47. package/dist/chunk-5N6O5FSZ.js +0 -53
  48. package/dist/chunk-5N6O5FSZ.js.map +0 -1
  49. package/dist/chunk-6X6FFIZN.js +0 -9
  50. package/dist/chunk-6X6FFIZN.js.map +0 -1
  51. package/dist/chunk-IEKJYSB2.js +0 -38
  52. package/dist/chunk-IEKJYSB2.js.map +0 -1
  53. package/dist/chunk-IL3H2YKT.js +0 -20
  54. package/dist/chunk-IL3H2YKT.js.map +0 -1
  55. package/dist/chunk-IQMQQI6W.js +0 -35
  56. package/dist/chunk-IQMQQI6W.js.map +0 -1
  57. package/dist/chunk-NIQOLOOJ.js +0 -44
  58. package/dist/chunk-NIQOLOOJ.js.map +0 -1
  59. package/dist/chunk-OURJLKNI.js +0 -16
  60. package/dist/chunk-OURJLKNI.js.map +0 -1
  61. package/dist/chunk-RXAMNVZW.js +0 -9
  62. package/dist/chunk-RXAMNVZW.js.map +0 -1
  63. package/dist/chunk-SDOWUYJK.js +0 -1
  64. package/dist/chunk-SDOWUYJK.js.map +0 -1
  65. package/dist/chunk-WBZCJMFI.js +0 -14
  66. package/dist/chunk-WBZCJMFI.js.map +0 -1
  67. package/dist/chunk-YPFVC6GE.js +0 -29
  68. package/dist/chunk-YPFVC6GE.js.map +0 -1
  69. package/dist/idb/idb.js +0 -200
  70. package/dist/idb/idb.js.map +0 -1
  71. package/dist/types/types.d.ts +0 -7
  72. package/dist/types/types.js +0 -1
  73. package/dist/types/types.js.map +0 -1
  74. package/dist/utils/utils-color-hash.d.ts +0 -4
  75. package/dist/utils/utils-color-hash.js +0 -7
  76. package/dist/utils/utils-color-hash.js.map +0 -1
  77. package/dist/utils/utils-create-log.d.ts +0 -9
  78. package/dist/utils/utils-create-log.js +0 -8
  79. package/dist/utils/utils-create-log.js.map +0 -1
  80. package/dist/utils/utils-ensure-array.d.ts +0 -3
  81. package/dist/utils/utils-ensure-array.js +0 -7
  82. package/dist/utils/utils-ensure-array.js.map +0 -1
  83. package/dist/utils/utils-is.js +0 -7
  84. package/dist/utils/utils-is.js.map +0 -1
  85. package/dist/utils/utils-link.d.ts +0 -3
  86. package/dist/utils/utils-link.js +0 -8
  87. package/dist/utils/utils-link.js.map +0 -1
  88. package/dist/utils/utils-queue.js +0 -9
  89. package/dist/utils/utils-queue.js.map +0 -1
  90. package/dist/utils/utils-safe.d.ts +0 -4
  91. package/dist/utils/utils-safe.js +0 -10
  92. package/dist/utils/utils-safe.js.map +0 -1
  93. package/dist/utils/utils-unique.d.ts +0 -3
  94. package/dist/utils/utils-unique.js +0 -7
  95. package/dist/utils/utils-unique.js.map +0 -1
  96. package/dist/utils/utils-unit.d.ts +0 -14
  97. package/dist/utils/utils-unit.js +0 -9
  98. package/dist/utils/utils-unit.js.map +0 -1
  99. package/dist/utils/utils-wait.d.ts +0 -3
  100. package/dist/utils/utils-wait.js +0 -7
  101. package/dist/utils/utils-wait.js.map +0 -1
  102. package/dist/utils/utils.d.ts +0 -11
  103. package/dist/utils/utils.js +0 -46
  104. package/dist/utils/utils.js.map +0 -1
@@ -1,21 +1,21 @@
1
- declare const _dispose_: unique symbol;
2
- type Db = IDBDatabase & {
1
+ export declare const _dispose_: unique symbol;
2
+ export type Db = IDBDatabase & {
3
3
  [_dispose_]?: () => void;
4
4
  };
5
- type DbName = string;
6
- type DbStoreName = string;
7
- type DbStoreKey = string;
8
- declare class Idb {
5
+ export type DbName = string;
6
+ export type DbStoreName = string;
7
+ export type DbStoreKey = string;
8
+ export declare class Idb {
9
9
  private dbs;
10
10
  private queues;
11
11
  static _dispose_: symbol;
12
12
  constructor();
13
13
  /** Get a value from the store. */
14
- get<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey): Promise<T | null>;
14
+ get<T>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey): Promise<T | null>;
15
15
  /** Check if a key exists in the store. */
16
16
  has(dbName: DbName, storeName: DbStoreName, key: DbStoreKey): Promise<boolean>;
17
17
  /** Set a value in the store. */
18
- set<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey, value: T): Promise<void>;
18
+ set<T>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey, value: T): Promise<void>;
19
19
  /** Get a list of all keys in the store of the database. */
20
20
  keys(dbName: DbName, storeName: DbStoreName): Promise<string[]>;
21
21
  /** Delete a key from the store. */
@@ -24,22 +24,18 @@ declare class Idb {
24
24
  listStores(dbName: DbName): Promise<string[]>;
25
25
  /** Get a list of all database names. */
26
26
  listDatabases(): Promise<string[]>;
27
- /** Delete the store from the database. */
27
+ /** Removes the store from the database. */
28
28
  deleteStore(dbName: DbName, storeName: DbStoreName): Promise<void>;
29
- /** Delete the entire database. */
29
+ /** Removes the entire database. */
30
30
  deleteDatabase(dbName: DbName): Promise<void>;
31
31
  /** Delete all databases. */
32
32
  purge(): Promise<void>;
33
- /** Check if a database with the given name exists. */
34
33
  private exists;
35
- /** Ensure that the database with the given name exists and returns it. */
36
34
  private ensureDb;
37
- /** Ensure that the store exists. Returns store's database. */
38
35
  private ensureStore;
39
36
  private register;
40
37
  private unregister;
41
38
  /** Wrap method to be run in a queue for the given database. */
42
39
  private enqueueByDbName;
43
40
  }
44
-
45
- export { type Db, type DbName, type DbStoreKey, type DbStoreName, Idb, _dispose_ };
41
+ export declare const idb: Idb;
package/dist/idb.js ADDED
@@ -0,0 +1,232 @@
1
+ import { Queue, is } from './utils.js';
2
+ export const _dispose_ = Symbol('dispose');
3
+ export class Idb {
4
+ dbs = {};
5
+ queues = {};
6
+ static _dispose_ = _dispose_;
7
+ constructor() {
8
+ this.get = this.enqueueByDbName(this.get);
9
+ this.has = this.enqueueByDbName(this.has);
10
+ this.set = this.enqueueByDbName(this.set);
11
+ this.keys = this.enqueueByDbName(this.keys);
12
+ this.delete = this.enqueueByDbName(this.delete);
13
+ this.deleteStore = this.enqueueByDbName(this.deleteStore);
14
+ this.deleteDatabase = this.enqueueByDbName(this.deleteDatabase);
15
+ }
16
+ /** Get a value from the store. */
17
+ async get(dbName, storeName, key) {
18
+ // DB does not exist? -> Return null
19
+ const exists = await this.exists(dbName);
20
+ if (!exists)
21
+ return null;
22
+ // Store does not exist? -> Return null
23
+ const db = await this.ensureDb(dbName);
24
+ if (!db.objectStoreNames.contains(storeName))
25
+ return null;
26
+ // Get value from store
27
+ return await new Promise((resolve, reject) => {
28
+ const tx = db.transaction([storeName], 'readonly');
29
+ const req = tx.objectStore(storeName).get(key);
30
+ req.onsuccess = () => resolve(req.result);
31
+ req.onerror = () => reject(req.error);
32
+ });
33
+ }
34
+ /** Check if a key exists in the store. */
35
+ async has(dbName, storeName, key) {
36
+ // DB does not exist? -> Return false
37
+ const exists = await this.exists(dbName);
38
+ if (!exists)
39
+ return false;
40
+ // Store does not exist? -> Return false
41
+ const db = await this.ensureDb(dbName);
42
+ if (!db.objectStoreNames.contains(storeName))
43
+ return false;
44
+ // Check if key exists in store
45
+ return await new Promise((resolve, reject) => {
46
+ const tx = db.transaction([storeName], 'readonly');
47
+ const req = tx.objectStore(storeName).getKey(key);
48
+ req.onsuccess = () => resolve(req.result !== undefined);
49
+ req.onerror = () => reject(req.error);
50
+ });
51
+ }
52
+ /** Set a value in the store. */
53
+ async set(dbName, storeName, key, value) {
54
+ // Ensure store for the DB
55
+ const db = await this.ensureStore(dbName, storeName);
56
+ // Set value
57
+ await new Promise((resolve, reject) => {
58
+ const tx = db.transaction([storeName], 'readwrite');
59
+ const req = tx.objectStore(storeName).put(value, key);
60
+ req.onsuccess = () => resolve(true);
61
+ req.onerror = () => reject(req.error);
62
+ tx.onabort = () => reject(tx.error);
63
+ });
64
+ }
65
+ /** Get a list of all keys in the store of the database. */
66
+ async keys(dbName, storeName) {
67
+ // DB does not exist? -> Return []
68
+ const exists = await this.exists(dbName);
69
+ if (!exists)
70
+ return [];
71
+ // Store does not exist? -> Return []
72
+ const db = await this.ensureDb(dbName);
73
+ if (!db.objectStoreNames.contains(storeName))
74
+ return [];
75
+ // Get store keys
76
+ return await new Promise((resolve, reject) => {
77
+ const tx = db.transaction([storeName], 'readonly');
78
+ const req = tx.objectStore(storeName).getAllKeys();
79
+ req.onsuccess = () => resolve(req.result.filter(is.string));
80
+ req.onerror = () => reject(req.error);
81
+ });
82
+ }
83
+ /** Delete a key from the store. */
84
+ async delete(dbName, storeName, key) {
85
+ // DB does not exist? -> Done
86
+ const exists = await this.exists(dbName);
87
+ if (!exists)
88
+ return;
89
+ // Store does not exist? -> Done
90
+ const db = await this.ensureDb(dbName);
91
+ if (!db.objectStoreNames.contains(storeName))
92
+ return;
93
+ // Delete store key
94
+ await new Promise((resolve, reject) => {
95
+ const tx = db.transaction([storeName], 'readwrite');
96
+ const req = tx.objectStore(storeName).delete(key);
97
+ req.onsuccess = () => resolve(true);
98
+ req.onerror = () => reject(req.error);
99
+ });
100
+ }
101
+ /** Get a list of all store names in the database. */
102
+ async listStores(dbName) {
103
+ const exists = await this.exists(dbName);
104
+ if (!exists)
105
+ return [];
106
+ const db = await this.ensureDb(dbName);
107
+ return [...db.objectStoreNames];
108
+ }
109
+ /** Get a list of all database names. */
110
+ async listDatabases() {
111
+ const dbs = await indexedDB.databases();
112
+ return dbs.map(db => db.name).filter(is.present);
113
+ }
114
+ /** Removes the store from the database. */
115
+ async deleteStore(dbName, storeName) {
116
+ // DB does not exist? -> Done
117
+ const exists = await this.exists(dbName);
118
+ if (!exists)
119
+ return;
120
+ // Store does not exist? -> Done
121
+ const db = await this.ensureDb(dbName);
122
+ if (!db.objectStoreNames.contains(storeName))
123
+ return;
124
+ // Unregister DB
125
+ this.unregister(dbName);
126
+ // Delete store (new DB instance is created during upgrade)
127
+ const newDb = await new Promise((resolve, reject) => {
128
+ const req = indexedDB.open(dbName, db.version + 1);
129
+ req.onsuccess = () => resolve(req.result);
130
+ req.onerror = () => reject(req.error);
131
+ req.onupgradeneeded = () => req.result.deleteObjectStore(storeName);
132
+ });
133
+ // Register new DB instance
134
+ this.register(dbName, newDb);
135
+ }
136
+ /** Removes the entire database. */
137
+ async deleteDatabase(dbName) {
138
+ // DB does not exist? -> Done
139
+ const exists = await this.exists(dbName);
140
+ if (!exists)
141
+ return;
142
+ // Unregister DB
143
+ this.unregister(dbName);
144
+ // Delete DB
145
+ await new Promise((resolve, reject) => {
146
+ const req = indexedDB.deleteDatabase(dbName);
147
+ req.onsuccess = () => resolve(true);
148
+ req.onerror = () => reject(req.error);
149
+ });
150
+ }
151
+ /** Delete all databases. */
152
+ async purge() {
153
+ const names = await this.listDatabases();
154
+ for (const name of names) {
155
+ await this.deleteDatabase(name);
156
+ }
157
+ }
158
+ /** Check if a database with the given name exists. */
159
+ async exists(dbName) {
160
+ // Connected to the DB? -> true
161
+ if (this.dbs[dbName])
162
+ return true;
163
+ // Check if DB exists
164
+ const dbs = await indexedDB.databases();
165
+ return !!dbs.find(db => db.name === dbName);
166
+ }
167
+ /** Ensure that the database with the given name exists and returns it. */
168
+ async ensureDb(dbName) {
169
+ // Already connected? -> Just return DB
170
+ if (this.dbs[dbName])
171
+ return this.dbs[dbName];
172
+ // Get DB version if it exists, or start with version 1
173
+ const dbs = await indexedDB.databases();
174
+ const meta = dbs.find(db => db.name === dbName);
175
+ const version = meta?.version || 1;
176
+ // Create DB / connnect to the existing one
177
+ const db = await new Promise((resolve, reject) => {
178
+ const req = indexedDB.open(dbName, version);
179
+ req.onsuccess = () => resolve(req.result);
180
+ req.onerror = () => reject(req.error);
181
+ });
182
+ // Register DB instance
183
+ this.register(dbName, db);
184
+ return db;
185
+ }
186
+ /** Ensure that the store exists. Returns store's database. */
187
+ async ensureStore(dbName, storeName) {
188
+ // Ensure DB
189
+ const db = await this.ensureDb(dbName);
190
+ // Store already exists? -> Done
191
+ if (db.objectStoreNames.contains(storeName))
192
+ return db;
193
+ // Unregister DB
194
+ this.unregister(dbName);
195
+ // Create store (new DB instance is created during upgrade)
196
+ const newDb = await new Promise((resolve, reject) => {
197
+ const req = indexedDB.open(dbName, db.version + 1);
198
+ req.onsuccess = () => resolve(req.result);
199
+ req.onerror = () => reject(req.error);
200
+ req.onupgradeneeded = () => req.result.createObjectStore(storeName);
201
+ });
202
+ // Register new DB instance
203
+ this.register(dbName, newDb);
204
+ return newDb;
205
+ }
206
+ register(dbName, db) {
207
+ this.dbs[dbName] = db;
208
+ // 'close' event is fired when closed unexpectedly, e.g. by deleting via devtools
209
+ const onClose = () => delete this.dbs[dbName];
210
+ db.addEventListener('close', onClose);
211
+ db[_dispose_] = () => db.removeEventListener('close', onClose);
212
+ }
213
+ unregister(dbName) {
214
+ if (!this.dbs[dbName])
215
+ return;
216
+ this.dbs[dbName].close();
217
+ this.dbs[dbName][_dispose_]?.();
218
+ delete this.dbs[dbName];
219
+ }
220
+ /** Wrap method to be run in a queue for the given database. */
221
+ enqueueByDbName(fn) {
222
+ return (async (dbName, ...args) => {
223
+ const queue = (this.queues[dbName] ??= new Queue(dbName));
224
+ const result = await queue.add(() => fn.call(this, dbName, ...args));
225
+ if (queue.isEmpty())
226
+ delete this.queues[dbName];
227
+ return result;
228
+ });
229
+ }
230
+ }
231
+ export const idb = new Idb();
232
+ //# sourceMappingURL=idb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb.js","sourceRoot":"","sources":["../src/idb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ declare global {
2
+ type Obj<T = unknown> = Record<PropertyKey, T>;
3
+ type Arr<T = unknown> = T[];
4
+ type Cls<T = unknown> = new (...args: any[]) => T;
5
+ type Fn<T = unknown> = (...args: any[]) => T;
6
+ type AsyncFn<T = unknown> = (...args: any[]) => Promise<T>;
7
+ }
8
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types-global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-global.js","sourceRoot":"","sources":["../src/types-global.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAA"}
@@ -0,0 +1,5 @@
1
+ export type Obj<T = unknown> = Record<PropertyKey, T>;
2
+ export type Arr<T = unknown> = T[];
3
+ export type Cls<T = unknown> = new (...args: any[]) => T;
4
+ export type Fn<T = unknown> = (...args: any[]) => T;
5
+ export type AsyncFn<T = unknown> = (...args: any[]) => Promise<T>;
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export type Rgb = [number, number, number];
2
+ export declare function colorHash(str: string): string;
@@ -0,0 +1,47 @@
1
+ export function colorHash(str) {
2
+ // Calculate hash (djb2 xor) as 32‑bit unsigned
3
+ let hash = 5381;
4
+ for (let i = 0; i < str.length; i++) {
5
+ hash = (hash * 33) ^ str.charCodeAt(i);
6
+ }
7
+ hash >>>= 0;
8
+ // Calculate hue. Golden‑ratio scramble gives maximum spread for 'near' strings.
9
+ const hue = Math.floor(((hash * 0.618033988749895) % 1) * 360);
10
+ // Start with vivid mid‑tone
11
+ const sat = 70;
12
+ let light = 50;
13
+ // Adjust lightness until it reads on both white and black backgrounds.
14
+ for (let i = 0; i < 20; i++) {
15
+ const rgb = hsl2rgb(hue, sat, light);
16
+ const l = lum(rgb);
17
+ const cW = contrast(1, l); // Versus white
18
+ const cB = contrast(0, l); // Versus black
19
+ if (cW >= 4.5 && cB >= 4.5)
20
+ break; // Good on both
21
+ light += cW < cB ? -5 : 5; // Move toward darker or lighter
22
+ }
23
+ // Convert to hex
24
+ const hex = hsl2rgb(hue, sat, light)
25
+ .map(v => v.toString(16).padStart(2, '0'))
26
+ .join('');
27
+ return `#${hex}`;
28
+ }
29
+ function hsl2rgb(hh, ss, ll) {
30
+ ss /= 100;
31
+ ll /= 100;
32
+ const k = (n) => (n + hh / 30) % 12;
33
+ const a = ss * Math.min(ll, 1 - ll);
34
+ const f = (n) => ll - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)));
35
+ return [f(0), f(8), f(4)].map(v => Math.round(v * 255));
36
+ }
37
+ function lum([r, g, b]) {
38
+ const c = (x) => {
39
+ x /= 255;
40
+ return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;
41
+ };
42
+ return 0.2126 * c(r) + 0.7152 * c(g) + 0.0722 * c(b);
43
+ }
44
+ function contrast(l1, l2) {
45
+ return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);
46
+ }
47
+ //# sourceMappingURL=utils-color-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-color-hash.js","sourceRoot":"","sources":["../src/utils-color-hash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Fn } from './types.js';
2
+ export type Log = Fn<void> & {
3
+ warn: Fn<void>;
4
+ error: Fn<void>;
5
+ };
6
+ export declare function createLog(name: string): Log;
@@ -0,0 +1,12 @@
1
+ import { colorHash } from './utils-color-hash.js';
2
+ export function createLog(name) {
3
+ const color = colorHash(name);
4
+ const log = print.bind(null, 'log', name, color);
5
+ log.warn = print.bind(null, 'warn', name, color);
6
+ log.error = print.bind(null, 'error', name, color);
7
+ return log;
8
+ }
9
+ function print(type, name, color, ...args) {
10
+ console[type](`%c[${name}]`, `color: ${color}`, ...args);
11
+ }
12
+ //# sourceMappingURL=utils-create-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-create-log.js","sourceRoot":"","sources":["../src/utils-create-log.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAIjD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAQ,CAAA;IACvD,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAgB,CAAA;IAC/D,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAiB,CAAA;IAClE,OAAO,GAAG,CAAA;AAAA,CACX;AAED,SAAS,KAAK,CAAC,IAA8B,EAAE,IAAY,EAAE,KAAa,EAAE,GAAG,IAAe,EAAE;IAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,EAAE,UAAU,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;AAAA,CACzD"}
@@ -0,0 +1,2 @@
1
+ import type { AsyncFn } from './types.js';
2
+ export declare function enqueue<T extends AsyncFn>(fn: T, thisValue?: unknown): T;
@@ -0,0 +1,5 @@
1
+ import { Queue } from './utils-queue.js';
2
+ export function enqueue(fn, thisValue = null) {
3
+ return new Queue().wrap(fn, thisValue);
4
+ }
5
+ //# sourceMappingURL=utils-enqueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-enqueue.js","sourceRoot":"","sources":["../src/utils-enqueue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,MAAM,UAAU,OAAO,CAAoB,EAAK,EAAE,SAAS,GAAY,IAAI,EAAE;IAC3E,OAAO,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;AAAA,CACvC"}
@@ -0,0 +1 @@
1
+ export declare function ensureArray<T>(value: T | T[]): T[];
@@ -0,0 +1,4 @@
1
+ export function ensureArray(value) {
2
+ return Array.isArray(value) ? value : [value];
3
+ }
4
+ //# sourceMappingURL=utils-ensure-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-ensure-array.js","sourceRoot":"","sources":["../src/utils-ensure-array.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAI,KAAc,EAAO;IAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AAAA,CAC9C"}
@@ -1,6 +1,5 @@
1
- import { Fn, Obj, Arr } from '../types/types.js';
2
-
3
- declare const is: {
1
+ import type { Arr, Fn, Obj } from './types.js';
2
+ export declare const is: {
4
3
  null: (v: unknown) => v is null;
5
4
  undefined: (v: unknown) => v is undefined;
6
5
  boolean: (v: unknown) => v is boolean;
@@ -26,8 +25,6 @@ declare const is: {
26
25
  absent: (v: unknown) => v is null | undefined;
27
26
  present: <T>(v: T) => v is NonNullable<T>;
28
27
  primitive: (v: unknown) => boolean;
29
- collection: (v: unknown) => v is Obj | Arr;
28
+ collection: (v: unknown) => v is Arr | Obj;
30
29
  compound: (v: unknown) => v is object;
31
30
  };
32
-
33
- export { is };
@@ -0,0 +1,30 @@
1
+ export const is = {
2
+ null: (v) => v === null,
3
+ undefined: (v) => v === undefined,
4
+ boolean: (v) => typeof v === 'boolean',
5
+ number: (v) => typeof v === 'number',
6
+ string: (v) => typeof v === 'string',
7
+ symbol: (v) => typeof v === 'symbol',
8
+ function: (v) => typeof v === 'function',
9
+ object: (v) => Object.prototype.toString.call(v) === '[object Object]',
10
+ array: (v) => Array.isArray(v),
11
+ set: (v) => v instanceof Set,
12
+ map: (v) => v instanceof Map,
13
+ blob: (v) => v instanceof Blob,
14
+ date: (v) => v instanceof Date,
15
+ error: (v) => v instanceof Error,
16
+ regex: (v) => v instanceof RegExp,
17
+ promise: (v) => v instanceof Promise,
18
+ uint8Array: (v) => v instanceof Uint8Array,
19
+ uint16Array: (v) => v instanceof Uint16Array,
20
+ uint32Array: (v) => v instanceof Uint32Array,
21
+ nan: (v) => Number.isNaN(v),
22
+ numeric: (v) => !is.nan(Number(v)),
23
+ integer: (v) => Number.isInteger(v),
24
+ absent: (v) => v === null || v === undefined,
25
+ present: (v) => !is.absent(v),
26
+ primitive: (v) => v !== Object(v),
27
+ collection: (v) => is.array(v) || is.object(v),
28
+ compound: (v) => v !== null && typeof v === 'object',
29
+ };
30
+ //# sourceMappingURL=utils-is.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-is.js","sourceRoot":"","sources":["../src/utils-is.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI;IAChC,SAAS,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS;IAC1C,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS;IAC/C,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;IAC7C,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;IAC7C,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;IAC7C,QAAQ,EAAE,CAAC,CAAU,EAAW,EAAE,CAAC,OAAO,CAAC,KAAK,UAAU;IAC1D,MAAM,EAAE,CAAC,CAAU,EAAY,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,iBAAiB;IACzF,KAAK,EAAE,CAAC,CAAU,EAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,GAAG;IACrC,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,GAAG;IACrC,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI;IACvC,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI;IACvC,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,KAAK;IACzC,KAAK,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,MAAM;IAC1C,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,OAAO;IAC7C,UAAU,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,UAAU;IACnD,WAAW,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,WAAW;IACrD,WAAW,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,YAAY,WAAW;IAErD,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAU,EAAe,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;IACrD,OAAO,EAAE,CAAI,CAAI,EAAuB,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,SAAS,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;IAC1C,UAAU,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;CAC9D,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function link<T, M extends keyof T>(target: T, method: M): T[M];
@@ -0,0 +1,7 @@
1
+ import { is } from './utils-is.js';
2
+ export function link(target, method) {
3
+ if (!is.function(target[method]))
4
+ throw new Error(`Property '${String(method)}' is not a function`);
5
+ return target[method].bind(target);
6
+ }
7
+ //# sourceMappingURL=utils-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-link.js","sourceRoot":"","sources":["../src/utils-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,MAAM,UAAU,IAAI,CAAuB,MAAS,EAAE,MAAS,EAAQ;IACrE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACnG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAS,CAAA;AAAA,CAC3C"}
@@ -1,20 +1,17 @@
1
- import { AsyncFn } from '../types/types.js';
2
-
3
- type TaskFn<T> = () => Promise<T>;
4
- type Task<T = any> = {
1
+ import type { AsyncFn } from './types.js';
2
+ export type TaskFn<T> = () => Promise<T>;
3
+ export type Task<T = any> = {
5
4
  fn: TaskFn<T>;
6
5
  result$: PromiseWithResolvers<T>;
7
6
  };
8
- declare class Queue {
7
+ export declare class Queue {
9
8
  name: string | null;
10
9
  tasks: Task[];
11
10
  private running;
12
11
  constructor(name?: string | null);
13
12
  add<T>(fn: TaskFn<T>): Promise<T>;
14
- wrap<T extends AsyncFn>(fn: T, thisValue?: unknown): T;
13
+ wrap<T extends AsyncFn>(fn: T, thisArg?: unknown): T;
15
14
  wait(): Promise<void>;
16
15
  isEmpty(): boolean;
17
16
  private start;
18
17
  }
19
-
20
- export { Queue, type Task, type TaskFn };
@@ -0,0 +1,50 @@
1
+ import { safe } from './utils-safe.js';
2
+ export class Queue {
3
+ name;
4
+ tasks = [];
5
+ running = false;
6
+ constructor(name = null) {
7
+ this.name = name;
8
+ }
9
+ async add(fn) {
10
+ const task = { fn, result$: Promise.withResolvers() };
11
+ this.tasks.push(task);
12
+ this.start();
13
+ return await task.result$.promise;
14
+ }
15
+ wrap(fn, thisArg = null) {
16
+ return (async (...args) => {
17
+ return await this.add(() => fn.call(thisArg, ...args));
18
+ });
19
+ }
20
+ async wait() {
21
+ const lastTask = this.tasks.at(-1);
22
+ if (lastTask)
23
+ await safe(lastTask.result$.promise);
24
+ }
25
+ isEmpty() {
26
+ return this.tasks.length === 0;
27
+ }
28
+ async start() {
29
+ if (this.running)
30
+ return;
31
+ if (this.isEmpty())
32
+ return;
33
+ this.running = true;
34
+ while (this.tasks.length > 0) {
35
+ const task = this.tasks[0];
36
+ if (!task)
37
+ break;
38
+ const [result, error] = await safe(task.fn);
39
+ this.tasks.shift();
40
+ if (error) {
41
+ task.result$.reject(error);
42
+ }
43
+ else {
44
+ task.result$.resolve(result);
45
+ }
46
+ }
47
+ this.running = false;
48
+ }
49
+ }
50
+ //# sourceMappingURL=utils-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-queue.js","sourceRoot":"","sources":["../src/utils-queue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAKtC,MAAM,OAAO,KAAK;IAChB,IAAI,CAAe;IACnB,KAAK,GAAW,EAAE,CAAA;IACV,OAAO,GAAG,KAAK,CAAA;IAEvB,YAAY,IAAI,GAAkB,IAAI,EAAE;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAAA,CACjB;IAED,KAAK,CAAC,GAAG,CAAI,EAAa,EAAc;QACtC,MAAM,IAAI,GAAY,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAK,EAAE,CAAA;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,IAAI,CAAC,KAAK,EAAE,CAAA;QACZ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IAAA,CAClC;IAED,IAAI,CAAoB,EAAK,EAAE,OAAO,GAAY,IAAI,EAAE;QACtD,OAAO,CAAC,KAAK,EAAE,GAAG,IAAmB,EAAE,EAAE,CAAC;YACxC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QAAA,CACvD,CAAM,CAAA;IAAA,CACR;IAED,KAAK,CAAC,IAAI,GAAG;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAClC,IAAI,QAAQ;YAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAAA,CACnD;IAED,OAAO,GAAG;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAA;IAAA,CAC/B;IAEO,KAAK,CAAC,KAAK,GAAG;QACpB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAM;QACxB,IAAI,IAAI,CAAC,OAAO,EAAE;YAAE,OAAM;QAE1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QAEnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC1B,IAAI,CAAC,IAAI;gBAAE,MAAK;YAChB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAClB,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IAAA,CACrB;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function safe<T>(effect: (() => T | Promise<T>) | Promise<T>): Promise<[T, null] | [null, Error]>;
2
+ export declare function safeSync<T>(effect: () => T): [T, null] | [null, Error];
@@ -0,0 +1,22 @@
1
+ import { is } from './utils-is.js';
2
+ export async function safe(effect) {
3
+ try {
4
+ const result = is.function(effect) ? await effect() : await effect;
5
+ return [result, null];
6
+ }
7
+ catch (e) {
8
+ const error = e instanceof Error ? e : new Error(String(e));
9
+ return [null, error];
10
+ }
11
+ }
12
+ export function safeSync(effect) {
13
+ try {
14
+ const result = effect();
15
+ return [result, null];
16
+ }
17
+ catch (e) {
18
+ const error = e instanceof Error ? e : new Error(String(e));
19
+ return [null, error];
20
+ }
21
+ }
22
+ //# sourceMappingURL=utils-safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-safe.js","sourceRoot":"","sources":["../src/utils-safe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,MAA2C,EACP;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,MAAM,CAAA;QAClE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtB,CAAC;AAAA,CACF;AAED,MAAM,UAAU,QAAQ,CAAI,MAAe,EAA6B;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;QACvB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACtB,CAAC;AAAA,CACF"}
@@ -0,0 +1 @@
1
+ export declare function unique<T>(items: T[], keyFn?: (item: T) => unknown): T[];