dropcap 1.4.0 → 1.5.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.
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-BTVCWUZ5.js.map
@@ -25,14 +25,9 @@ var Unit = class {
25
25
  Error.captureStackTrace(error, this.never);
26
26
  return error;
27
27
  }
28
- Error(message) {
29
- const error = new Error(`[${this.constructor.name}] ${message}`);
30
- Error.captureStackTrace(error, this.Error);
31
- return error;
32
- }
33
28
  };
34
29
 
35
30
  export {
36
31
  Unit
37
32
  };
38
- //# sourceMappingURL=chunk-IEKJYSB2.js.map
33
+ //# sourceMappingURL=chunk-DCUMKBR5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/utils-unit.ts"],"sourcesContent":["import type { Cls } from '../types/types'\nimport { createLog } from './utils-create-log'\n\nexport class Unit<TRoot = unknown> {\n $: TRoot\n log = createLog(this.constructor.name)\n #parent: Unit<TRoot> | null = null\n\n constructor(parent?: Unit<TRoot> | null) {\n this.$ = (parent?.$ ?? this) as TRoot\n this.#parent = parent ?? null\n }\n\n closest<T extends Unit<TRoot>>(Ancestor: Cls<T>): T | null {\n let cursor = this.#parent\n while (cursor) {\n if (cursor instanceof Ancestor) return cursor as T\n cursor = cursor.#parent\n }\n return null\n }\n\n never(message?: string) {\n const details = message ? `: ${message}` : ''\n const error = new Error(`[${this.constructor.name}] This should never happen${details}`)\n Error.captureStackTrace(error, this.never)\n return error\n }\n\n Error(message?: string) {\n const error = new Error(`[${this.constructor.name}] ${message}`)\n Error.captureStackTrace(error, this.Error)\n return error\n }\n}\n"],"mappings":";;;;;AAGO,IAAM,OAAN,MAA4B;AAAA,EACjC;AAAA,EACA,MAAM,UAAU,KAAK,YAAY,IAAI;AAAA,EACrC,UAA8B;AAAA,EAE9B,YAAY,QAA6B;AACvC,SAAK,IAAK,QAAQ,KAAK;AACvB,SAAK,UAAU,UAAU;AAAA,EAC3B;AAAA,EAEA,QAA+B,UAA4B;AACzD,QAAI,SAAS,KAAK;AAClB,WAAO,QAAQ;AACb,UAAI,kBAAkB,SAAU,QAAO;AACvC,eAAS,OAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAkB;AACtB,UAAM,UAAU,UAAU,KAAK,OAAO,KAAK;AAC3C,UAAM,QAAQ,IAAI,MAAM,IAAI,KAAK,YAAY,IAAI,6BAA6B,OAAO,EAAE;AACvF,UAAM,kBAAkB,OAAO,KAAK,KAAK;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAkB;AACtB,UAAM,QAAQ,IAAI,MAAM,IAAI,KAAK,YAAY,IAAI,KAAK,OAAO,EAAE;AAC/D,UAAM,kBAAkB,OAAO,KAAK,KAAK;AACzC,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/utils/utils-unit.ts"],"sourcesContent":["import type { Cls } from '../types/types'\nimport { createLog } from './utils-create-log'\n\nexport class Unit<TRoot = unknown> {\n $: TRoot\n log = createLog(this.constructor.name)\n #parent: Unit<TRoot> | null = null\n\n constructor(parent?: Unit<TRoot> | null) {\n this.$ = (parent?.$ ?? this) as TRoot\n this.#parent = parent ?? null\n }\n\n closest<T extends Unit<TRoot>>(Ancestor: Cls<T>): T | null {\n let cursor = this.#parent\n while (cursor) {\n if (cursor instanceof Ancestor) return cursor as T\n cursor = cursor.#parent\n }\n return null\n }\n\n never(message?: string) {\n const details = message ? `: ${message}` : ''\n const error = new Error(`[${this.constructor.name}] This should never happen${details}`)\n Error.captureStackTrace(error, this.never)\n return error\n }\n}\n"],"mappings":";;;;;AAGO,IAAM,OAAN,MAA4B;AAAA,EACjC;AAAA,EACA,MAAM,UAAU,KAAK,YAAY,IAAI;AAAA,EACrC,UAA8B;AAAA,EAE9B,YAAY,QAA6B;AACvC,SAAK,IAAK,QAAQ,KAAK;AACvB,SAAK,UAAU,UAAU;AAAA,EAC3B;AAAA,EAEA,QAA+B,UAA4B;AACzD,QAAI,SAAS,KAAK;AAClB,WAAO,QAAQ;AACb,UAAI,kBAAkB,SAAU,QAAO;AACvC,eAAS,OAAO;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAkB;AACtB,UAAM,UAAU,UAAU,KAAK,OAAO,KAAK;AAC3C,UAAM,QAAQ,IAAI,MAAM,IAAI,KAAK,YAAY,IAAI,6BAA6B,OAAO,EAAE;AACvF,UAAM,kBAAkB,OAAO,KAAK,KAAK;AACzC,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,13 @@
1
+ import {
2
+ Queue
3
+ } from "./chunk-HFBHFWH2.js";
4
+
5
+ // src/utils/utils-enqueue.ts
6
+ function enqueue(fn, thisValue = null) {
7
+ return new Queue().wrap(fn, thisValue);
8
+ }
9
+
10
+ export {
11
+ enqueue
12
+ };
13
+ //# sourceMappingURL=chunk-GBAIHJZH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/utils-enqueue.ts"],"sourcesContent":["import type { AsyncFn } from '../types/types'\nimport { Queue } from './utils-queue'\n\nexport function enqueue<T extends AsyncFn>(fn: T, thisValue: unknown = null) {\n return new Queue().wrap(fn, thisValue)\n}\n"],"mappings":";;;;;AAGO,SAAS,QAA2B,IAAO,YAAqB,MAAM;AAC3E,SAAO,IAAI,MAAM,EAAE,KAAK,IAAI,SAAS;AACvC;","names":[]}
@@ -16,9 +16,9 @@ var Queue = class {
16
16
  this.start();
17
17
  return await task.result$.promise;
18
18
  }
19
- wrap(fn, thisValue = null) {
19
+ wrap(fn, thisArg = null) {
20
20
  return (async (...args) => {
21
- return await this.add(() => fn.call(thisValue, ...args));
21
+ return await this.add(() => fn.call(thisArg, ...args));
22
22
  });
23
23
  }
24
24
  async wait() {
@@ -50,4 +50,4 @@ var Queue = class {
50
50
  export {
51
51
  Queue
52
52
  };
53
- //# sourceMappingURL=chunk-5N6O5FSZ.js.map
53
+ //# sourceMappingURL=chunk-HFBHFWH2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/utils-queue.ts"],"sourcesContent":["import type { AsyncFn } from '../types/types'\nimport { safe } from './utils-safe'\n\nexport type TaskFn<T> = () => Promise<T>\nexport type Task<T = any> = { fn: TaskFn<T>; result$: PromiseWithResolvers<T> }\n\nexport class Queue {\n name: string | null\n tasks: Task[] = []\n private running = false\n\n constructor(name: string | null = null) {\n this.name = name\n }\n\n async add<T>(fn: TaskFn<T>): Promise<T> {\n const task: Task<T> = { fn, result$: Promise.withResolvers<T>() }\n this.tasks.push(task)\n this.start()\n return await task.result$.promise\n }\n\n wrap<T extends AsyncFn>(fn: T, thisArg: unknown = null) {\n return (async (...args: Parameters<T>) => {\n return await this.add(() => fn.call(thisArg, ...args))\n }) as T\n }\n\n async wait() {\n const lastTask = this.tasks.at(-1)\n if (lastTask) await safe(lastTask.result$.promise)\n }\n\n isEmpty() {\n return this.tasks.length === 0\n }\n\n private async start() {\n if (this.running) return\n if (this.isEmpty()) return\n\n this.running = true\n\n while (this.tasks.length > 0) {\n const task = this.tasks[0]\n if (!task) break\n const [result, error] = await safe(task.fn)\n this.tasks.shift()\n if (error) {\n task.result$.reject(error)\n } else {\n task.result$.resolve(result)\n }\n }\n\n this.running = false\n }\n}\n"],"mappings":";;;;;AAMO,IAAM,QAAN,MAAY;AAAA,EACjB;AAAA,EACA,QAAgB,CAAC;AAAA,EACT,UAAU;AAAA,EAElB,YAAY,OAAsB,MAAM;AACtC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,IAAO,IAA2B;AACtC,UAAM,OAAgB,EAAE,IAAI,SAAS,QAAQ,cAAiB,EAAE;AAChE,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,MAAM;AACX,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC5B;AAAA,EAEA,KAAwB,IAAO,UAAmB,MAAM;AACtD,YAAQ,UAAU,SAAwB;AACxC,aAAO,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,SAAS,GAAG,IAAI,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE;AACjC,QAAI,SAAU,OAAM,KAAK,SAAS,QAAQ,OAAO;AAAA,EACnD;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAc,QAAQ;AACpB,QAAI,KAAK,QAAS;AAClB,QAAI,KAAK,QAAQ,EAAG;AAEpB,SAAK,UAAU;AAEf,WAAO,KAAK,MAAM,SAAS,GAAG;AAC5B,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,UAAI,CAAC,KAAM;AACX,YAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,KAAK,KAAK,EAAE;AAC1C,WAAK,MAAM,MAAM;AACjB,UAAI,OAAO;AACT,aAAK,QAAQ,OAAO,KAAK;AAAA,MAC3B,OAAO;AACL,aAAK,QAAQ,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AAEA,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]}
package/dist/idb/idb.d.ts CHANGED
@@ -24,9 +24,9 @@ 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>;
@@ -41,5 +41,6 @@ declare class Idb {
41
41
  /** Wrap method to be run in a queue for the given database. */
42
42
  private enqueueByDbName;
43
43
  }
44
+ declare const idb: Idb;
44
45
 
45
- export { type Db, type DbName, type DbStoreKey, type DbStoreName, Idb, _dispose_ };
46
+ export { type Db, type DbName, type DbStoreKey, type DbStoreName, Idb, _dispose_, idb };
package/dist/idb/idb.js CHANGED
@@ -1,15 +1,16 @@
1
- import "../chunk-SDOWUYJK.js";
1
+ import "../chunk-BTVCWUZ5.js";
2
2
  import "../chunk-OURJLKNI.js";
3
- import "../chunk-IEKJYSB2.js";
3
+ import "../chunk-DCUMKBR5.js";
4
4
  import "../chunk-RXAMNVZW.js";
5
5
  import "../chunk-IL3H2YKT.js";
6
6
  import "../chunk-NIQOLOOJ.js";
7
- import "../chunk-6X6FFIZN.js";
8
- import "../chunk-WBZCJMFI.js";
7
+ import "../chunk-GBAIHJZH.js";
9
8
  import {
10
9
  Queue
11
- } from "../chunk-5N6O5FSZ.js";
10
+ } from "../chunk-HFBHFWH2.js";
12
11
  import "../chunk-YPFVC6GE.js";
12
+ import "../chunk-6X6FFIZN.js";
13
+ import "../chunk-WBZCJMFI.js";
13
14
  import {
14
15
  is
15
16
  } from "../chunk-IQMQQI6W.js";
@@ -104,7 +105,7 @@ var Idb = class {
104
105
  const dbs = await indexedDB.databases();
105
106
  return dbs.map((db) => db.name).filter(is.present);
106
107
  }
107
- /** Delete the store from the database. */
108
+ /** Removes the store from the database. */
108
109
  async deleteStore(dbName, storeName) {
109
110
  const exists = await this.exists(dbName);
110
111
  if (!exists) return;
@@ -119,7 +120,7 @@ var Idb = class {
119
120
  });
120
121
  this.register(dbName, newDb);
121
122
  }
122
- /** Delete the entire database. */
123
+ /** Removes the entire database. */
123
124
  async deleteDatabase(dbName) {
124
125
  const exists = await this.exists(dbName);
125
126
  if (!exists) return;
@@ -193,8 +194,10 @@ var Idb = class {
193
194
  });
194
195
  }
195
196
  };
197
+ var idb = new Idb();
196
198
  export {
197
199
  Idb,
198
- _dispose_
200
+ _dispose_,
201
+ idb
199
202
  };
200
203
  //# sourceMappingURL=idb.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/idb/idb.ts"],"sourcesContent":["import type { AsyncFn } from '../types/types'\nimport { Queue, is } from '../utils/utils'\n\nexport const _dispose_ = Symbol('dispose')\n\nexport type Db = IDBDatabase & { [_dispose_]?: () => void }\nexport type DbName = string\nexport type DbStoreName = string\nexport type DbStoreKey = string\n\nexport class Idb {\n private dbs: { [name: DbName]: Db } = {}\n private queues: Record<string, Queue> = {}\n static _dispose_ = _dispose_\n\n constructor() {\n this.get = this.enqueueByDbName(this.get)\n this.has = this.enqueueByDbName(this.has)\n this.set = this.enqueueByDbName(this.set)\n this.keys = this.enqueueByDbName(this.keys)\n this.delete = this.enqueueByDbName(this.delete)\n this.deleteStore = this.enqueueByDbName(this.deleteStore)\n this.deleteDatabase = this.enqueueByDbName(this.deleteDatabase)\n }\n\n /** Get a value from the store. */\n async get<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Return null\n const exists = await this.exists(dbName)\n if (!exists) return null\n\n // Store does not exist? -> Return null\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return null\n\n // Get value from store\n return await new Promise<T>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).get(key)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Check if a key exists in the store. */\n async has(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Return false\n const exists = await this.exists(dbName)\n if (!exists) return false\n\n // Store does not exist? -> Return false\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return false\n\n // Check if key exists in store\n return await new Promise<boolean>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).getKey(key)\n req.onsuccess = () => resolve(req.result !== undefined)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Set a value in the store. */\n async set<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey, value: T) {\n // Ensure store for the DB\n const db = await this.ensureStore(dbName, storeName)\n\n // Set value\n await new Promise((resolve, reject) => {\n const tx = db.transaction([storeName], 'readwrite')\n const req = tx.objectStore(storeName).put(value, key)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n tx.onabort = () => reject(tx.error)\n })\n }\n\n /** Get a list of all keys in the store of the database. */\n async keys(dbName: DbName, storeName: DbStoreName) {\n // DB does not exist? -> Return []\n const exists = await this.exists(dbName)\n if (!exists) return []\n\n // Store does not exist? -> Return []\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return []\n\n // Get store keys\n return await new Promise<DbStoreKey[]>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).getAllKeys()\n req.onsuccess = () => resolve(req.result.filter(is.string))\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Delete a key from the store. */\n async delete(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Store does not exist? -> Done\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return\n\n // Delete store key\n await new Promise((resolve, reject) => {\n const tx = db.transaction([storeName], 'readwrite')\n const req = tx.objectStore(storeName).delete(key)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Get a list of all store names in the database. */\n async listStores(dbName: DbName) {\n const exists = await this.exists(dbName)\n if (!exists) return []\n const db = await this.ensureDb(dbName)\n return [...db.objectStoreNames]\n }\n\n /** Get a list of all database names. */\n async listDatabases() {\n const dbs = await indexedDB.databases()\n return dbs.map(db => db.name).filter(is.present)\n }\n\n /** Delete the store from the database. */\n async deleteStore(dbName: DbName, storeName: DbStoreName) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Store does not exist? -> Done\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return\n\n // Unregister DB\n this.unregister(dbName)\n\n // Delete store (new DB instance is created during upgrade)\n const newDb = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, db.version + 1)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n req.onupgradeneeded = () => req.result.deleteObjectStore(storeName)\n })\n\n // Register new DB instance\n this.register(dbName, newDb)\n }\n\n /** Delete the entire database. */\n async deleteDatabase(dbName: DbName) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Unregister DB\n this.unregister(dbName)\n\n // Delete DB\n await new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(dbName)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Delete all databases. */\n async purge() {\n const names = await this.listDatabases()\n for (const name of names) {\n await this.deleteDatabase(name)\n }\n }\n\n /** Check if a database with the given name exists. */\n private async exists(dbName: DbName) {\n // Connected to the DB? -> true\n if (this.dbs[dbName]) return true\n\n // Check if DB exists\n const dbs = await indexedDB.databases()\n return !!dbs.find(db => db.name === dbName)\n }\n\n /** Ensure that the database with the given name exists and returns it. */\n private async ensureDb(dbName: DbName) {\n // Already connected? -> Just return DB\n if (this.dbs[dbName]) return this.dbs[dbName]\n\n // Get DB version if it exists, or start with version 1\n const dbs = await indexedDB.databases()\n const meta = dbs.find(db => db.name === dbName)\n const version = meta?.version || 1\n\n // Create DB / connnect to the existing one\n const db = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, version)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n\n // Register DB instance\n this.register(dbName, db)\n\n return db\n }\n\n /** Ensure that the store exists. Returns store's database. */\n private async ensureStore(dbName: DbName, storeName: DbStoreName) {\n // Ensure DB\n const db = await this.ensureDb(dbName)\n\n // Store already exists? -> Done\n if (db.objectStoreNames.contains(storeName)) return db\n\n // Unregister DB\n this.unregister(dbName)\n\n // Create store (new DB instance is created during upgrade)\n const newDb = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, db.version + 1)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n req.onupgradeneeded = () => req.result.createObjectStore(storeName)\n })\n\n // Register new DB instance\n this.register(dbName, newDb)\n\n return newDb\n }\n\n private register(dbName: DbName, db: Db) {\n this.dbs[dbName] = db\n\n // 'close' event is fired when closed unexpectedly, e.g. by deleting via devtools\n const onClose = () => delete this.dbs[dbName]\n db.addEventListener('close', onClose)\n db[_dispose_] = () => db.removeEventListener('close', onClose)\n }\n\n private unregister(dbName: DbName) {\n if (!this.dbs[dbName]) return\n this.dbs[dbName].close()\n this.dbs[dbName][_dispose_]?.()\n delete this.dbs[dbName]\n }\n\n /** Wrap method to be run in a queue for the given database. */\n private enqueueByDbName<T extends AsyncFn>(fn: T) {\n return (async (dbName: DbName, ...args: unknown[]) => {\n const queue = (this.queues[dbName] ??= new Queue(dbName))\n const result = await queue.add(() => fn.call(this, dbName, ...args))\n if (queue.isEmpty()) delete this.queues[dbName]\n return result\n }) as T\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAGO,IAAM,YAAY,uBAAO,SAAS;AAOlC,IAAM,MAAN,MAAU;AAAA,EACP,MAA8B,CAAC;AAAA,EAC/B,SAAgC,CAAC;AAAA,EACzC,OAAO,YAAY;AAAA,EAEnB,cAAc;AACZ,SAAK,MAAM,KAAK,gBAAgB,KAAK,GAAG;AACxC,SAAK,MAAM,KAAK,gBAAgB,KAAK,GAAG;AACxC,SAAK,MAAM,KAAK,gBAAgB,KAAK,GAAG;AACxC,SAAK,OAAO,KAAK,gBAAgB,KAAK,IAAI;AAC1C,SAAK,SAAS,KAAK,gBAAgB,KAAK,MAAM;AAC9C,SAAK,cAAc,KAAK,gBAAgB,KAAK,WAAW;AACxD,SAAK,iBAAiB,KAAK,gBAAgB,KAAK,cAAc;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,IAAiB,QAAgB,WAAwB,KAAiB;AAE9E,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ,QAAO;AAGpB,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,QAAI,CAAC,GAAG,iBAAiB,SAAS,SAAS,EAAG,QAAO;AAGrD,WAAO,MAAM,IAAI,QAAW,CAAC,SAAS,WAAW;AAC/C,YAAM,KAAK,GAAG,YAAY,CAAC,SAAS,GAAG,UAAU;AACjD,YAAM,MAAM,GAAG,YAAY,SAAS,EAAE,IAAI,GAAG;AAC7C,UAAI,YAAY,MAAM,QAAQ,IAAI,MAAM;AACxC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAI,QAAgB,WAAwB,KAAiB;AAEjE,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ,QAAO;AAGpB,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,QAAI,CAAC,GAAG,iBAAiB,SAAS,SAAS,EAAG,QAAO;AAGrD,WAAO,MAAM,IAAI,QAAiB,CAAC,SAAS,WAAW;AACrD,YAAM,KAAK,GAAG,YAAY,CAAC,SAAS,GAAG,UAAU;AACjD,YAAM,MAAM,GAAG,YAAY,SAAS,EAAE,OAAO,GAAG;AAChD,UAAI,YAAY,MAAM,QAAQ,IAAI,WAAW,MAAS;AACtD,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAiB,QAAgB,WAAwB,KAAiB,OAAU;AAExF,UAAM,KAAK,MAAM,KAAK,YAAY,QAAQ,SAAS;AAGnD,UAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,YAAM,KAAK,GAAG,YAAY,CAAC,SAAS,GAAG,WAAW;AAClD,YAAM,MAAM,GAAG,YAAY,SAAS,EAAE,IAAI,OAAO,GAAG;AACpD,UAAI,YAAY,MAAM,QAAQ,IAAI;AAClC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AACpC,SAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,IACpC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAK,QAAgB,WAAwB;AAEjD,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ,QAAO,CAAC;AAGrB,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,QAAI,CAAC,GAAG,iBAAiB,SAAS,SAAS,EAAG,QAAO,CAAC;AAGtD,WAAO,MAAM,IAAI,QAAsB,CAAC,SAAS,WAAW;AAC1D,YAAM,KAAK,GAAG,YAAY,CAAC,SAAS,GAAG,UAAU;AACjD,YAAM,MAAM,GAAG,YAAY,SAAS,EAAE,WAAW;AACjD,UAAI,YAAY,MAAM,QAAQ,IAAI,OAAO,OAAO,GAAG,MAAM,CAAC;AAC1D,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,QAAgB,WAAwB,KAAiB;AAEpE,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ;AAGb,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,QAAI,CAAC,GAAG,iBAAiB,SAAS,SAAS,EAAG;AAG9C,UAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,YAAM,KAAK,GAAG,YAAY,CAAC,SAAS,GAAG,WAAW;AAClD,YAAM,MAAM,GAAG,YAAY,SAAS,EAAE,OAAO,GAAG;AAChD,UAAI,YAAY,MAAM,QAAQ,IAAI;AAClC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,QAAgB;AAC/B,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,WAAO,CAAC,GAAG,GAAG,gBAAgB;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,gBAAgB;AACpB,UAAM,MAAM,MAAM,UAAU,UAAU;AACtC,WAAO,IAAI,IAAI,QAAM,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,YAAY,QAAgB,WAAwB;AAExD,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ;AAGb,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AACrC,QAAI,CAAC,GAAG,iBAAiB,SAAS,SAAS,EAAG;AAG9C,SAAK,WAAW,MAAM;AAGtB,UAAM,QAAQ,MAAM,IAAI,QAAY,CAAC,SAAS,WAAW;AACvD,YAAM,MAAM,UAAU,KAAK,QAAQ,GAAG,UAAU,CAAC;AACjD,UAAI,YAAY,MAAM,QAAQ,IAAI,MAAM;AACxC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AACpC,UAAI,kBAAkB,MAAM,IAAI,OAAO,kBAAkB,SAAS;AAAA,IACpE,CAAC;AAGD,SAAK,SAAS,QAAQ,KAAK;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAM,eAAe,QAAgB;AAEnC,UAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AACvC,QAAI,CAAC,OAAQ;AAGb,SAAK,WAAW,MAAM;AAGtB,UAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACrC,YAAM,MAAM,UAAU,eAAe,MAAM;AAC3C,UAAI,YAAY,MAAM,QAAQ,IAAI;AAClC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAQ;AACZ,UAAM,QAAQ,MAAM,KAAK,cAAc;AACvC,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,eAAe,IAAI;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,OAAO,QAAgB;AAEnC,QAAI,KAAK,IAAI,MAAM,EAAG,QAAO;AAG7B,UAAM,MAAM,MAAM,UAAU,UAAU;AACtC,WAAO,CAAC,CAAC,IAAI,KAAK,QAAM,GAAG,SAAS,MAAM;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAc,SAAS,QAAgB;AAErC,QAAI,KAAK,IAAI,MAAM,EAAG,QAAO,KAAK,IAAI,MAAM;AAG5C,UAAM,MAAM,MAAM,UAAU,UAAU;AACtC,UAAM,OAAO,IAAI,KAAK,CAAAA,QAAMA,IAAG,SAAS,MAAM;AAC9C,UAAM,UAAU,MAAM,WAAW;AAGjC,UAAM,KAAK,MAAM,IAAI,QAAY,CAAC,SAAS,WAAW;AACpD,YAAM,MAAM,UAAU,KAAK,QAAQ,OAAO;AAC1C,UAAI,YAAY,MAAM,QAAQ,IAAI,MAAM;AACxC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,IACtC,CAAC;AAGD,SAAK,SAAS,QAAQ,EAAE;AAExB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,YAAY,QAAgB,WAAwB;AAEhE,UAAM,KAAK,MAAM,KAAK,SAAS,MAAM;AAGrC,QAAI,GAAG,iBAAiB,SAAS,SAAS,EAAG,QAAO;AAGpD,SAAK,WAAW,MAAM;AAGtB,UAAM,QAAQ,MAAM,IAAI,QAAY,CAAC,SAAS,WAAW;AACvD,YAAM,MAAM,UAAU,KAAK,QAAQ,GAAG,UAAU,CAAC;AACjD,UAAI,YAAY,MAAM,QAAQ,IAAI,MAAM;AACxC,UAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AACpC,UAAI,kBAAkB,MAAM,IAAI,OAAO,kBAAkB,SAAS;AAAA,IACpE,CAAC;AAGD,SAAK,SAAS,QAAQ,KAAK;AAE3B,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,QAAgB,IAAQ;AACvC,SAAK,IAAI,MAAM,IAAI;AAGnB,UAAM,UAAU,MAAM,OAAO,KAAK,IAAI,MAAM;AAC5C,OAAG,iBAAiB,SAAS,OAAO;AACpC,OAAG,SAAS,IAAI,MAAM,GAAG,oBAAoB,SAAS,OAAO;AAAA,EAC/D;AAAA,EAEQ,WAAW,QAAgB;AACjC,QAAI,CAAC,KAAK,IAAI,MAAM,EAAG;AACvB,SAAK,IAAI,MAAM,EAAE,MAAM;AACvB,SAAK,IAAI,MAAM,EAAE,SAAS,IAAI;AAC9B,WAAO,KAAK,IAAI,MAAM;AAAA,EACxB;AAAA;AAAA,EAGQ,gBAAmC,IAAO;AAChD,YAAQ,OAAO,WAAmB,SAAoB;AACpD,YAAM,QAAS,KAAK,OAAO,MAAM,MAAM,IAAI,MAAM,MAAM;AACvD,YAAM,SAAS,MAAM,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,QAAQ,GAAG,IAAI,CAAC;AACnE,UAAI,MAAM,QAAQ,EAAG,QAAO,KAAK,OAAO,MAAM;AAC9C,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["db"]}
1
+ {"version":3,"sources":["../../src/idb/idb.ts"],"sourcesContent":["import type { AsyncFn } from '../types/types'\nimport { Queue, is } from '../utils/utils'\n\nexport const _dispose_ = Symbol('dispose')\n\nexport type Db = IDBDatabase & { [_dispose_]?: () => void }\nexport type DbName = string\nexport type DbStoreName = string\nexport type DbStoreKey = string\n\nexport class Idb {\n private dbs: { [name: DbName]: Db } = {}\n private queues: Record<string, Queue> = {}\n static _dispose_ = _dispose_\n\n constructor() {\n this.get = this.enqueueByDbName(this.get)\n this.has = this.enqueueByDbName(this.has)\n this.set = this.enqueueByDbName(this.set)\n this.keys = this.enqueueByDbName(this.keys)\n this.delete = this.enqueueByDbName(this.delete)\n this.deleteStore = this.enqueueByDbName(this.deleteStore)\n this.deleteDatabase = this.enqueueByDbName(this.deleteDatabase)\n }\n\n /** Get a value from the store. */\n async get<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Return null\n const exists = await this.exists(dbName)\n if (!exists) return null\n\n // Store does not exist? -> Return null\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return null\n\n // Get value from store\n return await new Promise<T>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).get(key)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Check if a key exists in the store. */\n async has(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Return false\n const exists = await this.exists(dbName)\n if (!exists) return false\n\n // Store does not exist? -> Return false\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return false\n\n // Check if key exists in store\n return await new Promise<boolean>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).getKey(key)\n req.onsuccess = () => resolve(req.result !== undefined)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Set a value in the store. */\n async set<T = unknown>(dbName: DbName, storeName: DbStoreName, key: DbStoreKey, value: T) {\n // Ensure store for the DB\n const db = await this.ensureStore(dbName, storeName)\n\n // Set value\n await new Promise((resolve, reject) => {\n const tx = db.transaction([storeName], 'readwrite')\n const req = tx.objectStore(storeName).put(value, key)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n tx.onabort = () => reject(tx.error)\n })\n }\n\n /** Get a list of all keys in the store of the database. */\n async keys(dbName: DbName, storeName: DbStoreName) {\n // DB does not exist? -> Return []\n const exists = await this.exists(dbName)\n if (!exists) return []\n\n // Store does not exist? -> Return []\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return []\n\n // Get store keys\n return await new Promise<DbStoreKey[]>((resolve, reject) => {\n const tx = db.transaction([storeName], 'readonly')\n const req = tx.objectStore(storeName).getAllKeys()\n req.onsuccess = () => resolve(req.result.filter(is.string))\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Delete a key from the store. */\n async delete(dbName: DbName, storeName: DbStoreName, key: DbStoreKey) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Store does not exist? -> Done\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return\n\n // Delete store key\n await new Promise((resolve, reject) => {\n const tx = db.transaction([storeName], 'readwrite')\n const req = tx.objectStore(storeName).delete(key)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Get a list of all store names in the database. */\n async listStores(dbName: DbName) {\n const exists = await this.exists(dbName)\n if (!exists) return []\n const db = await this.ensureDb(dbName)\n return [...db.objectStoreNames]\n }\n\n /** Get a list of all database names. */\n async listDatabases() {\n const dbs = await indexedDB.databases()\n return dbs.map(db => db.name).filter(is.present)\n }\n\n /** Removes the store from the database. */\n async deleteStore(dbName: DbName, storeName: DbStoreName) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Store does not exist? -> Done\n const db = await this.ensureDb(dbName)\n if (!db.objectStoreNames.contains(storeName)) return\n\n // Unregister DB\n this.unregister(dbName)\n\n // Delete store (new DB instance is created during upgrade)\n const newDb = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, db.version + 1)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n req.onupgradeneeded = () => req.result.deleteObjectStore(storeName)\n })\n\n // Register new DB instance\n this.register(dbName, newDb)\n }\n\n /** Removes the entire database. */\n async deleteDatabase(dbName: DbName) {\n // DB does not exist? -> Done\n const exists = await this.exists(dbName)\n if (!exists) return\n\n // Unregister DB\n this.unregister(dbName)\n\n // Delete DB\n await new Promise((resolve, reject) => {\n const req = indexedDB.deleteDatabase(dbName)\n req.onsuccess = () => resolve(true)\n req.onerror = () => reject(req.error)\n })\n }\n\n /** Delete all databases. */\n async purge() {\n const names = await this.listDatabases()\n for (const name of names) {\n await this.deleteDatabase(name)\n }\n }\n\n /** Check if a database with the given name exists. */\n private async exists(dbName: DbName) {\n // Connected to the DB? -> true\n if (this.dbs[dbName]) return true\n\n // Check if DB exists\n const dbs = await indexedDB.databases()\n return !!dbs.find(db => db.name === dbName)\n }\n\n /** Ensure that the database with the given name exists and returns it. */\n private async ensureDb(dbName: DbName) {\n // Already connected? -> Just return DB\n if (this.dbs[dbName]) return this.dbs[dbName]\n\n // Get DB version if it exists, or start with version 1\n const dbs = await indexedDB.databases()\n const meta = dbs.find(db => db.name === dbName)\n const version = meta?.version || 1\n\n // Create DB / connnect to the existing one\n const db = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, version)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n\n // Register DB instance\n this.register(dbName, db)\n\n return db\n }\n\n /** Ensure that the store exists. Returns store's database. */\n private async ensureStore(dbName: DbName, storeName: DbStoreName) {\n // Ensure DB\n const db = await this.ensureDb(dbName)\n\n // Store already exists? -> Done\n if (db.objectStoreNames.contains(storeName)) return db\n\n // Unregister DB\n this.unregister(dbName)\n\n // Create store (new DB instance is created during upgrade)\n const newDb = await new Promise<Db>((resolve, reject) => {\n const req = indexedDB.open(dbName, db.version + 1)\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n req.onupgradeneeded = () => req.result.createObjectStore(storeName)\n })\n\n // Register new DB instance\n this.register(dbName, newDb)\n\n return newDb\n }\n\n private register(dbName: DbName, db: Db) {\n this.dbs[dbName] = db\n\n // 'close' event is fired when closed unexpectedly, e.g. by deleting via devtools\n const onClose = () => delete this.dbs[dbName]\n db.addEventListener('close', onClose)\n db[_dispose_] = () => db.removeEventListener('close', onClose)\n }\n\n private unregister(dbName: DbName) {\n if (!this.dbs[dbName]) return\n this.dbs[dbName].close()\n this.dbs[dbName][_dispose_]?.()\n delete this.dbs[dbName]\n }\n\n /** Wrap method to be run in a queue for the given database. */\n private enqueueByDbName<T extends AsyncFn>(fn: T) {\n return (async (dbName: DbName, ...args: unknown[]) => {\n const queue = (this.queues[dbName] ??= new Queue(dbName))\n const result = await queue.add(() => fn.call(this, dbName, ...args))\n if (queue.isEmpty()) delete this.queues[dbName]\n return result\n }) as T\n }\n}\n\nexport const idb = new Idb()\n"],"mappings":"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","names":["db"]}
@@ -0,0 +1,5 @@
1
+ import { AsyncFn } from '../types/types.js';
2
+
3
+ declare function enqueue<T extends AsyncFn>(fn: T, thisValue?: unknown): T;
4
+
5
+ export { enqueue };
@@ -0,0 +1,10 @@
1
+ import {
2
+ enqueue
3
+ } from "../chunk-GBAIHJZH.js";
4
+ import "../chunk-HFBHFWH2.js";
5
+ import "../chunk-YPFVC6GE.js";
6
+ import "../chunk-IQMQQI6W.js";
7
+ export {
8
+ enqueue
9
+ };
10
+ //# sourceMappingURL=utils-enqueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -11,7 +11,7 @@ declare class Queue {
11
11
  private running;
12
12
  constructor(name?: string | null);
13
13
  add<T>(fn: TaskFn<T>): Promise<T>;
14
- wrap<T extends AsyncFn>(fn: T, thisValue?: unknown): T;
14
+ wrap<T extends AsyncFn>(fn: T, thisArg?: unknown): T;
15
15
  wait(): Promise<void>;
16
16
  isEmpty(): boolean;
17
17
  private start;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Queue
3
- } from "../chunk-5N6O5FSZ.js";
3
+ } from "../chunk-HFBHFWH2.js";
4
4
  import "../chunk-YPFVC6GE.js";
5
5
  import "../chunk-IQMQQI6W.js";
6
6
  export {
@@ -8,7 +8,6 @@ declare class Unit<TRoot = unknown> {
8
8
  constructor(parent?: Unit<TRoot> | null);
9
9
  closest<T extends Unit<TRoot>>(Ancestor: Cls<T>): T | null;
10
10
  never(message?: string): Error;
11
- Error(message?: string): Error;
12
11
  }
13
12
 
14
13
  export { Unit };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Unit
3
- } from "../chunk-IEKJYSB2.js";
3
+ } from "../chunk-DCUMKBR5.js";
4
4
  import "../chunk-IL3H2YKT.js";
5
5
  import "../chunk-NIQOLOOJ.js";
6
6
  export {
@@ -1,11 +1,12 @@
1
1
  export { colorHash } from './utils-color-hash.js';
2
2
  export { Log, createLog } from './utils-create-log.js';
3
+ export { enqueue } from './utils-enqueue.js';
3
4
  export { ensureArray } from './utils-ensure-array.js';
4
5
  export { is } from './utils-is.js';
6
+ export { link } from './utils-link.js';
5
7
  export { Queue } from './utils-queue.js';
6
8
  export { safe, safeSync } from './utils-safe.js';
7
9
  export { unique } from './utils-unique.js';
8
10
  export { Unit } from './utils-unit.js';
9
11
  export { wait } from './utils-wait.js';
10
- export { link } from './utils-link.js';
11
12
  import '../types/types.js';
@@ -1,10 +1,10 @@
1
- import "../chunk-SDOWUYJK.js";
1
+ import "../chunk-BTVCWUZ5.js";
2
2
  import {
3
3
  unique
4
4
  } from "../chunk-OURJLKNI.js";
5
5
  import {
6
6
  Unit
7
- } from "../chunk-IEKJYSB2.js";
7
+ } from "../chunk-DCUMKBR5.js";
8
8
  import {
9
9
  wait
10
10
  } from "../chunk-RXAMNVZW.js";
@@ -15,18 +15,21 @@ import {
15
15
  colorHash
16
16
  } from "../chunk-NIQOLOOJ.js";
17
17
  import {
18
- ensureArray
19
- } from "../chunk-6X6FFIZN.js";
20
- import {
21
- link
22
- } from "../chunk-WBZCJMFI.js";
18
+ enqueue
19
+ } from "../chunk-GBAIHJZH.js";
23
20
  import {
24
21
  Queue
25
- } from "../chunk-5N6O5FSZ.js";
22
+ } from "../chunk-HFBHFWH2.js";
26
23
  import {
27
24
  safe,
28
25
  safeSync
29
26
  } from "../chunk-YPFVC6GE.js";
27
+ import {
28
+ ensureArray
29
+ } from "../chunk-6X6FFIZN.js";
30
+ import {
31
+ link
32
+ } from "../chunk-WBZCJMFI.js";
30
33
  import {
31
34
  is
32
35
  } from "../chunk-IQMQQI6W.js";
@@ -35,6 +38,7 @@ export {
35
38
  Unit,
36
39
  colorHash,
37
40
  createLog,
41
+ enqueue,
38
42
  ensureArray,
39
43
  is,
40
44
  link,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dropcap",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "imkost",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/utils-queue.ts"],"sourcesContent":["import type { AsyncFn } from '../types/types'\nimport { safe } from './utils-safe'\n\nexport type TaskFn<T> = () => Promise<T>\nexport type Task<T = any> = { fn: TaskFn<T>; result$: PromiseWithResolvers<T> }\n\nexport class Queue {\n name: string | null\n tasks: Task[] = []\n private running = false\n\n constructor(name: string | null = null) {\n this.name = name\n }\n\n async add<T>(fn: TaskFn<T>): Promise<T> {\n const task: Task<T> = { fn, result$: Promise.withResolvers<T>() }\n this.tasks.push(task)\n this.start()\n return await task.result$.promise\n }\n\n wrap<T extends AsyncFn>(fn: T, thisValue: unknown = null) {\n return (async (...args: Parameters<T>) => {\n return await this.add(() => fn.call(thisValue, ...args))\n }) as T\n }\n\n async wait() {\n const lastTask = this.tasks.at(-1)\n if (lastTask) await safe(lastTask.result$.promise)\n }\n\n isEmpty() {\n return this.tasks.length === 0\n }\n\n private async start() {\n if (this.running) return\n if (this.isEmpty()) return\n\n this.running = true\n\n while (this.tasks.length > 0) {\n const task = this.tasks[0]\n if (!task) break\n const [result, error] = await safe(task.fn)\n this.tasks.shift()\n if (error) {\n task.result$.reject(error)\n } else {\n task.result$.resolve(result)\n }\n }\n\n this.running = false\n }\n}\n"],"mappings":";;;;;AAMO,IAAM,QAAN,MAAY;AAAA,EACjB;AAAA,EACA,QAAgB,CAAC;AAAA,EACT,UAAU;AAAA,EAElB,YAAY,OAAsB,MAAM;AACtC,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,IAAO,IAA2B;AACtC,UAAM,OAAgB,EAAE,IAAI,SAAS,QAAQ,cAAiB,EAAE;AAChE,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,MAAM;AACX,WAAO,MAAM,KAAK,QAAQ;AAAA,EAC5B;AAAA,EAEA,KAAwB,IAAO,YAAqB,MAAM;AACxD,YAAQ,UAAU,SAAwB;AACxC,aAAO,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,WAAW,GAAG,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,WAAW,KAAK,MAAM,GAAG,EAAE;AACjC,QAAI,SAAU,OAAM,KAAK,SAAS,QAAQ,OAAO;AAAA,EACnD;AAAA,EAEA,UAAU;AACR,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAc,QAAQ;AACpB,QAAI,KAAK,QAAS;AAClB,QAAI,KAAK,QAAQ,EAAG;AAEpB,SAAK,UAAU;AAEf,WAAO,KAAK,MAAM,SAAS,GAAG;AAC5B,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,UAAI,CAAC,KAAM;AACX,YAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,KAAK,KAAK,EAAE;AAC1C,WAAK,MAAM,MAAM;AACjB,UAAI,OAAO;AACT,aAAK,QAAQ,OAAO,KAAK;AAAA,MAC3B,OAAO;AACL,aAAK,QAAQ,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AAEA,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-SDOWUYJK.js.map