iconly 1.4.3 → 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.
package/.eslintignore ADDED
@@ -0,0 +1,3 @@
1
+ node_modules
2
+ .parcel
3
+ dist
package/.eslintrc.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "env": {
3
+ "browser": true,
4
+ "es2022": true
5
+ },
6
+ "extends": [
7
+ "airbnb-base",
8
+ "plugin:@typescript-eslint/recommended"
9
+ ],
10
+ "parser": "@typescript-eslint/parser",
11
+ "parserOptions": {
12
+ "ecmaVersion": "latest",
13
+ "sourceType": "module",
14
+ "project": "./tsconfig.json"
15
+ },
16
+ "plugins": ["@typescript-eslint"],
17
+ "rules": {
18
+ "max-len": [
19
+ "off",
20
+ {
21
+ "code": 100,
22
+ "ignoreUrls": true
23
+ }
24
+ ]
25
+ }
26
+ }
package/README.md CHANGED
@@ -3,22 +3,24 @@
3
3
 
4
4
  <h1>iconly</h1>
5
5
 
6
+ <p><sup>Iconly is designed to load and cache SVG icons in the browser, using IndexedDB to store the data. It retrieves the icons from a given SVG file, stores them in IndexedDB, and inserts them into the DOM for easy access and use.</sup></p>
7
+
6
8
  [![npm](https://img.shields.io/npm/v/iconly.svg?colorB=brightgreen)](https://www.npmjs.com/package/iconly)
7
9
  [![GitHub package version](https://img.shields.io/github/package-json/v/ux-ui-pro/iconly.svg)](https://github.com/ux-ui-pro/iconly)
8
10
  [![NPM Downloads](https://img.shields.io/npm/dm/iconly.svg?style=flat)](https://www.npmjs.org/package/iconly)
9
11
 
10
- <p>The Iconly class is designed to manage icons in a web application</p>
11
- <h3><a href="https://codepen.io/ux-ui/pen/zYmyqWR">Demo</a></h3>
12
+ <sup>1kB gzipped</sup>
13
+
14
+ <a href="https://codepen.io/ux-ui/pen/zYmyqWR">Demo</a>
12
15
 
13
16
  </div>
14
17
  <br>
15
18
 
16
19
  &#10148; **Installation**
17
20
 
18
- ```
21
+ ```console
19
22
  $ yarn add iconly
20
23
  ```
21
-
22
24
  <br>
23
25
 
24
26
  &#10148; **Import**
@@ -64,4 +66,4 @@ iconly.init().then(() => console.log('Iconly is initialized and icons are loaded
64
66
 
65
67
  &#10148; **License**
66
68
 
67
- <sup>iconly is released under MIT license</sup>
69
+ iconly is released under MIT license
@@ -0,0 +1,12 @@
1
+ export default class Iconly {
2
+ constructor(options?: {
3
+ file?: string;
4
+ version?: string;
5
+ debug?: boolean;
6
+ container?: string | HTMLElement;
7
+ });
8
+ init(): Promise<void>;
9
+ }
10
+ export default Iconly;
11
+
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"mappings":"AAAA,qBAAM,MAAM;gBAUE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KAAO;IAiE1G,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA4C5B;AAED,eAAe,MAAM,CAAC","sources":["src/src/index.ts","src/index.ts"],"sourcesContent":[null,"class Iconly {\n private static dbInstance: Promise<IDBDatabase> | null = null;\n\n private readonly options: {\n file: string;\n version: string;\n debug: boolean;\n container: HTMLElement;\n };\n\n constructor(options: { file?: string; version?: string; debug?: boolean; container?: string | HTMLElement } = {}) {\n const defaultOptions = {\n file: './icons.svg',\n version: '1.0',\n debug: false,\n container: document.body ?? document.documentElement,\n };\n\n this.options = {\n ...defaultOptions,\n ...options,\n container: typeof options.container === 'string'\n ? document.querySelector(options.container) ?? defaultOptions.container\n : options.container ?? defaultOptions.container,\n };\n\n if (!this.options.container) {\n throw new Error('Invalid container element');\n }\n\n if (!Iconly.dbInstance) {\n Iconly.dbInstance = this.openDB('iconlyDB', 1);\n }\n }\n\n private async openDB(name: string, version: number): Promise<IDBDatabase> {\n if (!('indexedDB' in window)) {\n this.logError('This browser doesn\\'t support IndexedDB');\n throw new Error('IndexedDB not supported');\n }\n\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(name, version);\n\n request.onerror = () => reject(new Error(`IndexedDB error: ${request.error}`));\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains('icons')) {\n db.createObjectStore('icons', { keyPath: 'version' });\n }\n };\n request.onsuccess = () => resolve(request.result);\n });\n }\n\n private static async fetchData(file: string): Promise<string> {\n const response = await fetch(file);\n if (!response.ok) throw new Error('Network response was not ok');\n return response.text();\n }\n\n private insert(data: string): void {\n let iconSetDiv = document.getElementById('iconset');\n\n if (!iconSetDiv) {\n iconSetDiv = document.createElement('div');\n iconSetDiv.id = 'iconset';\n iconSetDiv.setAttribute('aria-hidden', 'true');\n iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\n this.options.container.appendChild(iconSetDiv);\n }\n\n iconSetDiv.innerHTML = data;\n }\n\n async init(): Promise<void> {\n const { file, version } = this.options;\n\n try {\n let data = await Iconly.fetchData(file);\n\n const db = await Iconly.dbInstance;\n const store = db.transaction('icons', 'readwrite').objectStore('icons');\n\n const dbVersion = await new Promise<{ version: string; data: string } | undefined>((resolve, reject) => {\n const request = store.get(version);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n if (!dbVersion) {\n await new Promise<void>((resolve, reject) => {\n const request = store.put({ version, data });\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n } else {\n data = dbVersion.data;\n }\n\n await new Promise<void>((resolve, reject) => {\n const tx = store.transaction;\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n\n this.insert(data);\n } catch (error) {\n this.logError('Error initializing Iconly:', error);\n }\n }\n\n private logError(...messages: unknown[]): void {\n if (this.options.debug) {\n // eslint-disable-next-line no-console\n console.error(...messages);\n }\n }\n}\n\nexport default Iconly;\n"],"names":[],"version":3,"file":"index.d.ts.map"}
package/dist/index.js CHANGED
@@ -9,80 +9,70 @@ function $parcel$export(e, n, v, s) {
9
9
 
10
10
  $parcel$defineInteropFlag(module.exports);
11
11
 
12
- $parcel$export(module.exports, "default", () => $4fa36e821943b400$export$2e2bcd8739ae039);
13
- class $4fa36e821943b400$var$Iconly {
14
- static #dbInstance;
15
- #options;
16
- #container;
17
- constructor(options){
18
- this.#options = {
12
+ $parcel$export(module.exports, "default", function () { return $a196c1ed25598f0e$export$2e2bcd8739ae039; });
13
+ class $a196c1ed25598f0e$var$Iconly {
14
+ static dbInstance = null;
15
+ options;
16
+ constructor(options = {}){
17
+ const defaultOptions = {
19
18
  file: "./icons.svg",
20
19
  version: "1.0",
21
20
  debug: false,
22
- container: document.body || document.documentElement,
23
- ...options
21
+ container: document.body ?? document.documentElement
24
22
  };
25
- this.#container = typeof this.#options.container === "string" ? document.querySelector(this.#options.container) : this.#options.container;
26
- if (!$4fa36e821943b400$var$Iconly.#dbInstance) $4fa36e821943b400$var$Iconly.#dbInstance = this.#openDB("iconlyDB", 1);
23
+ this.options = {
24
+ ...defaultOptions,
25
+ ...options,
26
+ container: typeof options.container === "string" ? document.querySelector(options.container) ?? defaultOptions.container : options.container ?? defaultOptions.container
27
+ };
28
+ if (!this.options.container) throw new Error("Invalid container element");
29
+ if (!$a196c1ed25598f0e$var$Iconly.dbInstance) $a196c1ed25598f0e$var$Iconly.dbInstance = this.openDB("iconlyDB", 1);
27
30
  }
28
- async #openDB(name, version) {
31
+ async openDB(name, version) {
29
32
  if (!("indexedDB" in window)) {
30
- this.#logError("This browser doesn't support IndexedDB");
31
- return;
32
- }
33
- let db;
34
- try {
35
- db = await new Promise((resolve, reject)=>{
36
- const request = indexedDB.open(name, version);
37
- request.onerror = ()=>reject(`IndexedDB error: ${request.error}`);
38
- request.onupgradeneeded = (event)=>{
39
- const db = event.target.result;
40
- if (!db.objectStoreNames.contains("icons")) db.createObjectStore("icons", {
41
- keyPath: "version"
42
- });
43
- };
44
- request.onsuccess = ()=>resolve(request.result);
45
- });
46
- } catch (error) {
47
- this.#logError(error);
48
- throw error;
33
+ this.logError("This browser doesn't support IndexedDB");
34
+ throw new Error("IndexedDB not supported");
49
35
  }
50
- return db;
36
+ return new Promise((resolve, reject)=>{
37
+ const request = indexedDB.open(name, version);
38
+ request.onerror = ()=>reject(new Error(`IndexedDB error: ${request.error}`));
39
+ request.onupgradeneeded = (event)=>{
40
+ const db = event.target.result;
41
+ if (!db.objectStoreNames.contains("icons")) db.createObjectStore("icons", {
42
+ keyPath: "version"
43
+ });
44
+ };
45
+ request.onsuccess = ()=>resolve(request.result);
46
+ });
51
47
  }
52
- async #fetchData(file) {
53
- try {
54
- const response = await fetch(file);
55
- if (!response.ok) throw new Error("Network response was not ok");
56
- return response.text();
57
- } catch (error) {
58
- this.#logError(error);
59
- throw error;
60
- }
48
+ static async fetchData(file) {
49
+ const response = await fetch(file);
50
+ if (!response.ok) throw new Error("Network response was not ok");
51
+ return response.text();
61
52
  }
62
- async #insert(data) {
53
+ insert(data) {
63
54
  let iconSetDiv = document.getElementById("iconset");
64
55
  if (!iconSetDiv) {
65
56
  iconSetDiv = document.createElement("div");
66
57
  iconSetDiv.id = "iconset";
67
58
  iconSetDiv.setAttribute("aria-hidden", "true");
68
59
  iconSetDiv.style.cssText = "width: 0; height: 0; position: absolute; left: -9999px;";
69
- this.#container.appendChild(iconSetDiv);
60
+ this.options.container.appendChild(iconSetDiv);
70
61
  }
71
62
  iconSetDiv.innerHTML = data;
72
63
  }
73
64
  async init() {
74
- const { file: file, version: version } = this.#options;
65
+ const { file: file, version: version } = this.options;
75
66
  try {
76
- let data = await this.#fetchData(file);
77
- const db = await $4fa36e821943b400$var$Iconly.#dbInstance;
78
- const tx = db.transaction("icons", "readwrite");
79
- const store = tx.objectStore("icons");
67
+ let data = await $a196c1ed25598f0e$var$Iconly.fetchData(file);
68
+ const db = await $a196c1ed25598f0e$var$Iconly.dbInstance;
69
+ const store = db.transaction("icons", "readwrite").objectStore("icons");
80
70
  const dbVersion = await new Promise((resolve, reject)=>{
81
71
  const request = store.get(version);
82
72
  request.onsuccess = ()=>resolve(request.result);
83
73
  request.onerror = ()=>reject(request.error);
84
74
  });
85
- if (!(dbVersion && dbVersion.data)) await new Promise((resolve, reject)=>{
75
+ if (!dbVersion) await new Promise((resolve, reject)=>{
86
76
  const request = store.put({
87
77
  version: version,
88
78
  data: data
@@ -91,17 +81,23 @@ class $4fa36e821943b400$var$Iconly {
91
81
  request.onerror = ()=>reject(request.error);
92
82
  });
93
83
  else data = dbVersion.data;
94
- await tx.complete;
95
- await this.#insert(data);
84
+ await new Promise((resolve, reject)=>{
85
+ const tx = store.transaction;
86
+ tx.oncomplete = ()=>resolve();
87
+ tx.onerror = ()=>reject(tx.error);
88
+ tx.onabort = ()=>reject(tx.error);
89
+ });
90
+ this.insert(data);
96
91
  } catch (error) {
97
- this.#logError("Error initializing Iconly:", error);
92
+ this.logError("Error initializing Iconly:", error);
98
93
  }
99
94
  }
100
- #logError(...messages) {
101
- if (this.#options.debug) console.error(...messages);
95
+ logError(...messages) {
96
+ if (this.options.debug) // eslint-disable-next-line no-console
97
+ console.error(...messages);
102
98
  }
103
99
  }
104
- var $4fa36e821943b400$export$2e2bcd8739ae039 = $4fa36e821943b400$var$Iconly;
100
+ var $a196c1ed25598f0e$export$2e2bcd8739ae039 = $a196c1ed25598f0e$var$Iconly;
105
101
 
106
102
 
107
103
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.js"],"sourcesContent":["class Iconly {\r\n\tstatic #dbInstance;\r\n\r\n\t#options;\r\n\r\n\t#container;\r\n\r\n\tconstructor(options) {\r\n\t\tthis.#options = {\r\n\t\t\tfile: './icons.svg',\r\n\t\t\tversion: '1.0',\r\n\t\t\tdebug: false,\r\n\t\t\tcontainer: document.body || document.documentElement,\r\n\t\t\t...options\r\n\t\t};\r\n\r\n\t\tthis.#container = typeof this.#options.container === 'string' ? document.querySelector(this.#options.container) : this.#options.container;\r\n\r\n\t\tif (!Iconly.#dbInstance) {\r\n\t\t\tIconly.#dbInstance = this.#openDB('iconlyDB', 1);\r\n\t\t}\r\n\t}\r\n\r\n\tasync #openDB(name, version) {\r\n\t\tif (!('indexedDB' in window)) {\r\n\t\t\tthis.#logError('This browser doesn\\'t support IndexedDB');\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet db;\r\n\r\n\t\ttry {\r\n\t\t\tdb = await new Promise((resolve, reject) => {\r\n\t\t\t\tconst request = indexedDB.open(name, version);\r\n\r\n\t\t\t\trequest.onerror = () => reject(`IndexedDB error: ${request.error}`);\r\n\t\t\t\trequest.onupgradeneeded = (event) => {\r\n\t\t\t\t\tconst db = event.target.result;\r\n\t\t\t\t\tif (!db.objectStoreNames.contains('icons')) {\r\n\t\t\t\t\t\tdb.createObjectStore('icons', { keyPath: 'version' });\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\r\n\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError(error);\r\n\r\n\t\t\tthrow error;\r\n\t\t}\r\n\r\n\t\treturn db;\r\n\t}\r\n\r\n\tasync #fetchData(file) {\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(file);\r\n\r\n\t\t\tif (!response.ok) throw new Error('Network response was not ok');\r\n\r\n\t\t\treturn response.text();\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError(error);\r\n\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\tasync #insert(data) {\r\n\t\tlet iconSetDiv = document.getElementById('iconset');\r\n\r\n\t\tif (!iconSetDiv) {\r\n\t\t\ticonSetDiv = document.createElement('div');\r\n\t\t\ticonSetDiv.id = 'iconset';\r\n\t\t\ticonSetDiv.setAttribute('aria-hidden', 'true');\r\n\t\t\ticonSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\r\n\r\n\t\t\tthis.#container.appendChild(iconSetDiv);\r\n\t\t}\r\n\r\n\t\ticonSetDiv.innerHTML = data;\r\n\t}\r\n\r\n\tasync init() {\r\n\t\tconst { file, version } = this.#options;\r\n\r\n\t\ttry {\r\n\t\t\tlet data = await this.#fetchData(file);\r\n\r\n\t\t\tconst db = await Iconly.#dbInstance;\r\n\t\t\tconst tx = db.transaction('icons', 'readwrite');\r\n\t\t\tconst store = tx.objectStore('icons');\r\n\r\n\t\t\tconst dbVersion = await new Promise((resolve, reject) => {\r\n\t\t\t\tconst request = store.get(version);\r\n\r\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\r\n\t\t\t\trequest.onerror = () => reject(request.error);\r\n\t\t\t});\r\n\r\n\t\t\tif (!(dbVersion && dbVersion.data)) {\r\n\t\t\t\tawait new Promise((resolve, reject) => {\r\n\t\t\t\t\tconst request = store.put({ version, data });\r\n\r\n\t\t\t\t\trequest.onsuccess = () => resolve();\r\n\t\t\t\t\trequest.onerror = () => reject(request.error);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tdata = dbVersion.data;\r\n\t\t\t}\r\n\r\n\t\t\tawait tx.complete;\r\n\t\t\tawait this.#insert(data);\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError('Error initializing Iconly:', error);\r\n\t\t}\r\n\t}\r\n\r\n\t#logError(...messages) {\r\n\t\tif (this.#options.debug) {\r\n\t\t\tconsole.error(...messages);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default Iconly;\r\n"],"names":[],"version":3,"file":"index.js.map"}
1
+ {"mappings":"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","sources":["src/index.ts"],"sourcesContent":["class Iconly {\n private static dbInstance: Promise<IDBDatabase> | null = null;\n\n private readonly options: {\n file: string;\n version: string;\n debug: boolean;\n container: HTMLElement;\n };\n\n constructor(options: { file?: string; version?: string; debug?: boolean; container?: string | HTMLElement } = {}) {\n const defaultOptions = {\n file: './icons.svg',\n version: '1.0',\n debug: false,\n container: document.body ?? document.documentElement,\n };\n\n this.options = {\n ...defaultOptions,\n ...options,\n container: typeof options.container === 'string'\n ? document.querySelector(options.container) ?? defaultOptions.container\n : options.container ?? defaultOptions.container,\n };\n\n if (!this.options.container) {\n throw new Error('Invalid container element');\n }\n\n if (!Iconly.dbInstance) {\n Iconly.dbInstance = this.openDB('iconlyDB', 1);\n }\n }\n\n private async openDB(name: string, version: number): Promise<IDBDatabase> {\n if (!('indexedDB' in window)) {\n this.logError('This browser doesn\\'t support IndexedDB');\n throw new Error('IndexedDB not supported');\n }\n\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(name, version);\n\n request.onerror = () => reject(new Error(`IndexedDB error: ${request.error}`));\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains('icons')) {\n db.createObjectStore('icons', { keyPath: 'version' });\n }\n };\n request.onsuccess = () => resolve(request.result);\n });\n }\n\n private static async fetchData(file: string): Promise<string> {\n const response = await fetch(file);\n if (!response.ok) throw new Error('Network response was not ok');\n return response.text();\n }\n\n private insert(data: string): void {\n let iconSetDiv = document.getElementById('iconset');\n\n if (!iconSetDiv) {\n iconSetDiv = document.createElement('div');\n iconSetDiv.id = 'iconset';\n iconSetDiv.setAttribute('aria-hidden', 'true');\n iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\n this.options.container.appendChild(iconSetDiv);\n }\n\n iconSetDiv.innerHTML = data;\n }\n\n async init(): Promise<void> {\n const { file, version } = this.options;\n\n try {\n let data = await Iconly.fetchData(file);\n\n const db = await Iconly.dbInstance;\n const store = db.transaction('icons', 'readwrite').objectStore('icons');\n\n const dbVersion = await new Promise<{ version: string; data: string } | undefined>((resolve, reject) => {\n const request = store.get(version);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n if (!dbVersion) {\n await new Promise<void>((resolve, reject) => {\n const request = store.put({ version, data });\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n } else {\n data = dbVersion.data;\n }\n\n await new Promise<void>((resolve, reject) => {\n const tx = store.transaction;\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n\n this.insert(data);\n } catch (error) {\n this.logError('Error initializing Iconly:', error);\n }\n }\n\n private logError(...messages: unknown[]): void {\n if (this.options.debug) {\n // eslint-disable-next-line no-console\n console.error(...messages);\n }\n }\n}\n\nexport default Iconly;\n"],"names":[],"version":3,"file":"index.js.map"}
@@ -1,76 +1,66 @@
1
- class $cf838c15c8b009ba$var$Iconly {
2
- static #dbInstance;
3
- #options;
4
- #container;
5
- constructor(options){
6
- this.#options = {
1
+ class $643fcf18b2d2e76f$var$Iconly {
2
+ static dbInstance = null;
3
+ options;
4
+ constructor(options = {}){
5
+ const defaultOptions = {
7
6
  file: "./icons.svg",
8
7
  version: "1.0",
9
8
  debug: false,
10
- container: document.body || document.documentElement,
11
- ...options
9
+ container: document.body ?? document.documentElement
12
10
  };
13
- this.#container = typeof this.#options.container === "string" ? document.querySelector(this.#options.container) : this.#options.container;
14
- if (!$cf838c15c8b009ba$var$Iconly.#dbInstance) $cf838c15c8b009ba$var$Iconly.#dbInstance = this.#openDB("iconlyDB", 1);
11
+ this.options = {
12
+ ...defaultOptions,
13
+ ...options,
14
+ container: typeof options.container === "string" ? document.querySelector(options.container) ?? defaultOptions.container : options.container ?? defaultOptions.container
15
+ };
16
+ if (!this.options.container) throw new Error("Invalid container element");
17
+ if (!$643fcf18b2d2e76f$var$Iconly.dbInstance) $643fcf18b2d2e76f$var$Iconly.dbInstance = this.openDB("iconlyDB", 1);
15
18
  }
16
- async #openDB(name, version) {
19
+ async openDB(name, version) {
17
20
  if (!("indexedDB" in window)) {
18
- this.#logError("This browser doesn't support IndexedDB");
19
- return;
20
- }
21
- let db;
22
- try {
23
- db = await new Promise((resolve, reject)=>{
24
- const request = indexedDB.open(name, version);
25
- request.onerror = ()=>reject(`IndexedDB error: ${request.error}`);
26
- request.onupgradeneeded = (event)=>{
27
- const db = event.target.result;
28
- if (!db.objectStoreNames.contains("icons")) db.createObjectStore("icons", {
29
- keyPath: "version"
30
- });
31
- };
32
- request.onsuccess = ()=>resolve(request.result);
33
- });
34
- } catch (error) {
35
- this.#logError(error);
36
- throw error;
21
+ this.logError("This browser doesn't support IndexedDB");
22
+ throw new Error("IndexedDB not supported");
37
23
  }
38
- return db;
24
+ return new Promise((resolve, reject)=>{
25
+ const request = indexedDB.open(name, version);
26
+ request.onerror = ()=>reject(new Error(`IndexedDB error: ${request.error}`));
27
+ request.onupgradeneeded = (event)=>{
28
+ const db = event.target.result;
29
+ if (!db.objectStoreNames.contains("icons")) db.createObjectStore("icons", {
30
+ keyPath: "version"
31
+ });
32
+ };
33
+ request.onsuccess = ()=>resolve(request.result);
34
+ });
39
35
  }
40
- async #fetchData(file) {
41
- try {
42
- const response = await fetch(file);
43
- if (!response.ok) throw new Error("Network response was not ok");
44
- return response.text();
45
- } catch (error) {
46
- this.#logError(error);
47
- throw error;
48
- }
36
+ static async fetchData(file) {
37
+ const response = await fetch(file);
38
+ if (!response.ok) throw new Error("Network response was not ok");
39
+ return response.text();
49
40
  }
50
- async #insert(data) {
41
+ insert(data) {
51
42
  let iconSetDiv = document.getElementById("iconset");
52
43
  if (!iconSetDiv) {
53
44
  iconSetDiv = document.createElement("div");
54
45
  iconSetDiv.id = "iconset";
55
46
  iconSetDiv.setAttribute("aria-hidden", "true");
56
47
  iconSetDiv.style.cssText = "width: 0; height: 0; position: absolute; left: -9999px;";
57
- this.#container.appendChild(iconSetDiv);
48
+ this.options.container.appendChild(iconSetDiv);
58
49
  }
59
50
  iconSetDiv.innerHTML = data;
60
51
  }
61
52
  async init() {
62
- const { file: file, version: version } = this.#options;
53
+ const { file: file, version: version } = this.options;
63
54
  try {
64
- let data = await this.#fetchData(file);
65
- const db = await $cf838c15c8b009ba$var$Iconly.#dbInstance;
66
- const tx = db.transaction("icons", "readwrite");
67
- const store = tx.objectStore("icons");
55
+ let data = await $643fcf18b2d2e76f$var$Iconly.fetchData(file);
56
+ const db = await $643fcf18b2d2e76f$var$Iconly.dbInstance;
57
+ const store = db.transaction("icons", "readwrite").objectStore("icons");
68
58
  const dbVersion = await new Promise((resolve, reject)=>{
69
59
  const request = store.get(version);
70
60
  request.onsuccess = ()=>resolve(request.result);
71
61
  request.onerror = ()=>reject(request.error);
72
62
  });
73
- if (!(dbVersion && dbVersion.data)) await new Promise((resolve, reject)=>{
63
+ if (!dbVersion) await new Promise((resolve, reject)=>{
74
64
  const request = store.put({
75
65
  version: version,
76
66
  data: data
@@ -79,18 +69,24 @@ class $cf838c15c8b009ba$var$Iconly {
79
69
  request.onerror = ()=>reject(request.error);
80
70
  });
81
71
  else data = dbVersion.data;
82
- await tx.complete;
83
- await this.#insert(data);
72
+ await new Promise((resolve, reject)=>{
73
+ const tx = store.transaction;
74
+ tx.oncomplete = ()=>resolve();
75
+ tx.onerror = ()=>reject(tx.error);
76
+ tx.onabort = ()=>reject(tx.error);
77
+ });
78
+ this.insert(data);
84
79
  } catch (error) {
85
- this.#logError("Error initializing Iconly:", error);
80
+ this.logError("Error initializing Iconly:", error);
86
81
  }
87
82
  }
88
- #logError(...messages) {
89
- if (this.#options.debug) console.error(...messages);
83
+ logError(...messages) {
84
+ if (this.options.debug) // eslint-disable-next-line no-console
85
+ console.error(...messages);
90
86
  }
91
87
  }
92
- var $cf838c15c8b009ba$export$2e2bcd8739ae039 = $cf838c15c8b009ba$var$Iconly;
88
+ var $643fcf18b2d2e76f$export$2e2bcd8739ae039 = $643fcf18b2d2e76f$var$Iconly;
93
89
 
94
90
 
95
- export {$cf838c15c8b009ba$export$2e2bcd8739ae039 as default};
91
+ export {$643fcf18b2d2e76f$export$2e2bcd8739ae039 as default};
96
92
  //# sourceMappingURL=index.module.js.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.js"],"sourcesContent":["class Iconly {\r\n\tstatic #dbInstance;\r\n\r\n\t#options;\r\n\r\n\t#container;\r\n\r\n\tconstructor(options) {\r\n\t\tthis.#options = {\r\n\t\t\tfile: './icons.svg',\r\n\t\t\tversion: '1.0',\r\n\t\t\tdebug: false,\r\n\t\t\tcontainer: document.body || document.documentElement,\r\n\t\t\t...options\r\n\t\t};\r\n\r\n\t\tthis.#container = typeof this.#options.container === 'string' ? document.querySelector(this.#options.container) : this.#options.container;\r\n\r\n\t\tif (!Iconly.#dbInstance) {\r\n\t\t\tIconly.#dbInstance = this.#openDB('iconlyDB', 1);\r\n\t\t}\r\n\t}\r\n\r\n\tasync #openDB(name, version) {\r\n\t\tif (!('indexedDB' in window)) {\r\n\t\t\tthis.#logError('This browser doesn\\'t support IndexedDB');\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet db;\r\n\r\n\t\ttry {\r\n\t\t\tdb = await new Promise((resolve, reject) => {\r\n\t\t\t\tconst request = indexedDB.open(name, version);\r\n\r\n\t\t\t\trequest.onerror = () => reject(`IndexedDB error: ${request.error}`);\r\n\t\t\t\trequest.onupgradeneeded = (event) => {\r\n\t\t\t\t\tconst db = event.target.result;\r\n\t\t\t\t\tif (!db.objectStoreNames.contains('icons')) {\r\n\t\t\t\t\t\tdb.createObjectStore('icons', { keyPath: 'version' });\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\r\n\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError(error);\r\n\r\n\t\t\tthrow error;\r\n\t\t}\r\n\r\n\t\treturn db;\r\n\t}\r\n\r\n\tasync #fetchData(file) {\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(file);\r\n\r\n\t\t\tif (!response.ok) throw new Error('Network response was not ok');\r\n\r\n\t\t\treturn response.text();\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError(error);\r\n\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\tasync #insert(data) {\r\n\t\tlet iconSetDiv = document.getElementById('iconset');\r\n\r\n\t\tif (!iconSetDiv) {\r\n\t\t\ticonSetDiv = document.createElement('div');\r\n\t\t\ticonSetDiv.id = 'iconset';\r\n\t\t\ticonSetDiv.setAttribute('aria-hidden', 'true');\r\n\t\t\ticonSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\r\n\r\n\t\t\tthis.#container.appendChild(iconSetDiv);\r\n\t\t}\r\n\r\n\t\ticonSetDiv.innerHTML = data;\r\n\t}\r\n\r\n\tasync init() {\r\n\t\tconst { file, version } = this.#options;\r\n\r\n\t\ttry {\r\n\t\t\tlet data = await this.#fetchData(file);\r\n\r\n\t\t\tconst db = await Iconly.#dbInstance;\r\n\t\t\tconst tx = db.transaction('icons', 'readwrite');\r\n\t\t\tconst store = tx.objectStore('icons');\r\n\r\n\t\t\tconst dbVersion = await new Promise((resolve, reject) => {\r\n\t\t\t\tconst request = store.get(version);\r\n\r\n\t\t\t\trequest.onsuccess = () => resolve(request.result);\r\n\t\t\t\trequest.onerror = () => reject(request.error);\r\n\t\t\t});\r\n\r\n\t\t\tif (!(dbVersion && dbVersion.data)) {\r\n\t\t\t\tawait new Promise((resolve, reject) => {\r\n\t\t\t\t\tconst request = store.put({ version, data });\r\n\r\n\t\t\t\t\trequest.onsuccess = () => resolve();\r\n\t\t\t\t\trequest.onerror = () => reject(request.error);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tdata = dbVersion.data;\r\n\t\t\t}\r\n\r\n\t\t\tawait tx.complete;\r\n\t\t\tawait this.#insert(data);\r\n\t\t} catch (error) {\r\n\t\t\tthis.#logError('Error initializing Iconly:', error);\r\n\t\t}\r\n\t}\r\n\r\n\t#logError(...messages) {\r\n\t\tif (this.#options.debug) {\r\n\t\t\tconsole.error(...messages);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default Iconly;\r\n"],"names":[],"version":3,"file":"index.module.js.map"}
1
+ {"mappings":"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","sources":["src/index.ts"],"sourcesContent":["class Iconly {\n private static dbInstance: Promise<IDBDatabase> | null = null;\n\n private readonly options: {\n file: string;\n version: string;\n debug: boolean;\n container: HTMLElement;\n };\n\n constructor(options: { file?: string; version?: string; debug?: boolean; container?: string | HTMLElement } = {}) {\n const defaultOptions = {\n file: './icons.svg',\n version: '1.0',\n debug: false,\n container: document.body ?? document.documentElement,\n };\n\n this.options = {\n ...defaultOptions,\n ...options,\n container: typeof options.container === 'string'\n ? document.querySelector(options.container) ?? defaultOptions.container\n : options.container ?? defaultOptions.container,\n };\n\n if (!this.options.container) {\n throw new Error('Invalid container element');\n }\n\n if (!Iconly.dbInstance) {\n Iconly.dbInstance = this.openDB('iconlyDB', 1);\n }\n }\n\n private async openDB(name: string, version: number): Promise<IDBDatabase> {\n if (!('indexedDB' in window)) {\n this.logError('This browser doesn\\'t support IndexedDB');\n throw new Error('IndexedDB not supported');\n }\n\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(name, version);\n\n request.onerror = () => reject(new Error(`IndexedDB error: ${request.error}`));\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n const db = (event.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains('icons')) {\n db.createObjectStore('icons', { keyPath: 'version' });\n }\n };\n request.onsuccess = () => resolve(request.result);\n });\n }\n\n private static async fetchData(file: string): Promise<string> {\n const response = await fetch(file);\n if (!response.ok) throw new Error('Network response was not ok');\n return response.text();\n }\n\n private insert(data: string): void {\n let iconSetDiv = document.getElementById('iconset');\n\n if (!iconSetDiv) {\n iconSetDiv = document.createElement('div');\n iconSetDiv.id = 'iconset';\n iconSetDiv.setAttribute('aria-hidden', 'true');\n iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\n this.options.container.appendChild(iconSetDiv);\n }\n\n iconSetDiv.innerHTML = data;\n }\n\n async init(): Promise<void> {\n const { file, version } = this.options;\n\n try {\n let data = await Iconly.fetchData(file);\n\n const db = await Iconly.dbInstance;\n const store = db.transaction('icons', 'readwrite').objectStore('icons');\n\n const dbVersion = await new Promise<{ version: string; data: string } | undefined>((resolve, reject) => {\n const request = store.get(version);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n if (!dbVersion) {\n await new Promise<void>((resolve, reject) => {\n const request = store.put({ version, data });\n request.onsuccess = () => resolve();\n request.onerror = () => reject(request.error);\n });\n } else {\n data = dbVersion.data;\n }\n\n await new Promise<void>((resolve, reject) => {\n const tx = store.transaction;\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n\n this.insert(data);\n } catch (error) {\n this.logError('Error initializing Iconly:', error);\n }\n }\n\n private logError(...messages: unknown[]): void {\n if (this.options.debug) {\n // eslint-disable-next-line no-console\n console.error(...messages);\n }\n }\n}\n\nexport default Iconly;\n"],"names":[],"version":3,"file":"index.module.js.map"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "iconly",
3
- "version": "1.4.3",
4
- "description": "SVG Sprite",
3
+ "version": "1.5.0",
4
+ "description": "Iconly is designed to load and cache SVG icons in the browser, using IndexedDB to store the data. It retrieves the icons from a given SVG file, stores them in IndexedDB, and inserts them into the DOM for easy access and use.",
5
5
  "author": "ux-ui.pro",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -11,37 +11,48 @@
11
11
  "bugs": {
12
12
  "url": "https://github.com/ux-ui-pro/iconly/issues"
13
13
  },
14
- "main": "dist/index.js",
15
- "module": "dist/index.module.js",
16
- "targets": {
17
- "main": {
18
- "source": "src/index.js"
19
- },
20
- "module": {
21
- "source": "src/index.js"
22
- }
23
- },
14
+ "homepage": "https://github.com/ux-ui-pro/iconly",
15
+ "sideEffects": false,
24
16
  "scripts": {
25
17
  "clean": "rm -rf dist .parcel-cache",
26
18
  "build": "yarn clean && parcel build",
27
- "lint:js": "eslint --ext .js",
19
+ "lint:js": "eslint **/*.{ts,js}",
28
20
  "lintfix": "yarn lint:js --fix"
29
21
  },
22
+ "browserslist": "> 0.5%, last 2 versions, not dead",
23
+ "source": "src/index.ts",
24
+ "main": "dist/index.js",
25
+ "module": "dist/index.module.js",
26
+ "types": "dist/index.d.ts",
30
27
  "devDependencies": {
31
- "eslint": "^7.32.0 || ^8.56.0",
28
+ "@parcel/packager-ts": "2.12.0",
29
+ "@parcel/transformer-typescript-types": "2.12.0",
30
+ "@typescript-eslint/eslint-plugin": "^7.11.0",
31
+ "@typescript-eslint/parser": "^7.11.0",
32
+ "eslint": "^7.32.0 || ^8.57.0",
32
33
  "eslint-config-airbnb-base": "^15.0.0",
33
- "parcel": "^2.11.0"
34
+ "eslint-plugin-import": "^2.29.1",
35
+ "parcel": "^2.12.0",
36
+ "typescript": "^5.4.5"
34
37
  },
35
38
  "keywords": [
36
- "svg",
37
39
  "icon",
38
40
  "icons",
41
+ "svg",
39
42
  "sprite",
40
- "IndexedDB",
41
43
  "vector",
42
- "LocalStorage",
43
- "mobile",
44
- "ios",
45
- "ui"
44
+ "ui",
45
+ "icon-set",
46
+ "svg-icons",
47
+ "IndexedDB",
48
+ "loader",
49
+ "storage",
50
+ "fetch",
51
+ "component",
52
+ "sprites",
53
+ "typescript",
54
+ "utility",
55
+ "javascript",
56
+ "es6"
46
57
  ]
47
58
  }
package/src/index.ts ADDED
@@ -0,0 +1,122 @@
1
+ class Iconly {
2
+ private static dbInstance: Promise<IDBDatabase> | null = null;
3
+
4
+ private readonly options: {
5
+ file: string;
6
+ version: string;
7
+ debug: boolean;
8
+ container: HTMLElement;
9
+ };
10
+
11
+ constructor(options: { file?: string; version?: string; debug?: boolean; container?: string | HTMLElement } = {}) {
12
+ const defaultOptions = {
13
+ file: './icons.svg',
14
+ version: '1.0',
15
+ debug: false,
16
+ container: document.body ?? document.documentElement,
17
+ };
18
+
19
+ this.options = {
20
+ ...defaultOptions,
21
+ ...options,
22
+ container: typeof options.container === 'string'
23
+ ? document.querySelector(options.container) ?? defaultOptions.container
24
+ : options.container ?? defaultOptions.container,
25
+ };
26
+
27
+ if (!this.options.container) {
28
+ throw new Error('Invalid container element');
29
+ }
30
+
31
+ if (!Iconly.dbInstance) {
32
+ Iconly.dbInstance = this.openDB('iconlyDB', 1);
33
+ }
34
+ }
35
+
36
+ private async openDB(name: string, version: number): Promise<IDBDatabase> {
37
+ if (!('indexedDB' in window)) {
38
+ this.logError('This browser doesn\'t support IndexedDB');
39
+ throw new Error('IndexedDB not supported');
40
+ }
41
+
42
+ return new Promise<IDBDatabase>((resolve, reject) => {
43
+ const request = indexedDB.open(name, version);
44
+
45
+ request.onerror = () => reject(new Error(`IndexedDB error: ${request.error}`));
46
+ request.onupgradeneeded = (event: IDBVersionChangeEvent) => {
47
+ const db = (event.target as IDBOpenDBRequest).result;
48
+ if (!db.objectStoreNames.contains('icons')) {
49
+ db.createObjectStore('icons', { keyPath: 'version' });
50
+ }
51
+ };
52
+ request.onsuccess = () => resolve(request.result);
53
+ });
54
+ }
55
+
56
+ private static async fetchData(file: string): Promise<string> {
57
+ const response = await fetch(file);
58
+ if (!response.ok) throw new Error('Network response was not ok');
59
+ return response.text();
60
+ }
61
+
62
+ private insert(data: string): void {
63
+ let iconSetDiv = document.getElementById('iconset');
64
+
65
+ if (!iconSetDiv) {
66
+ iconSetDiv = document.createElement('div');
67
+ iconSetDiv.id = 'iconset';
68
+ iconSetDiv.setAttribute('aria-hidden', 'true');
69
+ iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';
70
+ this.options.container.appendChild(iconSetDiv);
71
+ }
72
+
73
+ iconSetDiv.innerHTML = data;
74
+ }
75
+
76
+ async init(): Promise<void> {
77
+ const { file, version } = this.options;
78
+
79
+ try {
80
+ let data = await Iconly.fetchData(file);
81
+
82
+ const db = await Iconly.dbInstance;
83
+ const store = db.transaction('icons', 'readwrite').objectStore('icons');
84
+
85
+ const dbVersion = await new Promise<{ version: string; data: string } | undefined>((resolve, reject) => {
86
+ const request = store.get(version);
87
+ request.onsuccess = () => resolve(request.result);
88
+ request.onerror = () => reject(request.error);
89
+ });
90
+
91
+ if (!dbVersion) {
92
+ await new Promise<void>((resolve, reject) => {
93
+ const request = store.put({ version, data });
94
+ request.onsuccess = () => resolve();
95
+ request.onerror = () => reject(request.error);
96
+ });
97
+ } else {
98
+ data = dbVersion.data;
99
+ }
100
+
101
+ await new Promise<void>((resolve, reject) => {
102
+ const tx = store.transaction;
103
+ tx.oncomplete = () => resolve();
104
+ tx.onerror = () => reject(tx.error);
105
+ tx.onabort = () => reject(tx.error);
106
+ });
107
+
108
+ this.insert(data);
109
+ } catch (error) {
110
+ this.logError('Error initializing Iconly:', error);
111
+ }
112
+ }
113
+
114
+ private logError(...messages: unknown[]): void {
115
+ if (this.options.debug) {
116
+ // eslint-disable-next-line no-console
117
+ console.error(...messages);
118
+ }
119
+ }
120
+ }
121
+
122
+ export default Iconly;
package/tsconfig.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "compilerOptions": {
3
+ "isolatedModules": true,
4
+ "target": "es2022"
5
+ }
6
+ }
package/src/index.js DELETED
@@ -1,126 +0,0 @@
1
- class Iconly {
2
- static #dbInstance;
3
-
4
- #options;
5
-
6
- #container;
7
-
8
- constructor(options) {
9
- this.#options = {
10
- file: './icons.svg',
11
- version: '1.0',
12
- debug: false,
13
- container: document.body || document.documentElement,
14
- ...options
15
- };
16
-
17
- this.#container = typeof this.#options.container === 'string' ? document.querySelector(this.#options.container) : this.#options.container;
18
-
19
- if (!Iconly.#dbInstance) {
20
- Iconly.#dbInstance = this.#openDB('iconlyDB', 1);
21
- }
22
- }
23
-
24
- async #openDB(name, version) {
25
- if (!('indexedDB' in window)) {
26
- this.#logError('This browser doesn\'t support IndexedDB');
27
-
28
- return;
29
- }
30
-
31
- let db;
32
-
33
- try {
34
- db = await new Promise((resolve, reject) => {
35
- const request = indexedDB.open(name, version);
36
-
37
- request.onerror = () => reject(`IndexedDB error: ${request.error}`);
38
- request.onupgradeneeded = (event) => {
39
- const db = event.target.result;
40
- if (!db.objectStoreNames.contains('icons')) {
41
- db.createObjectStore('icons', { keyPath: 'version' });
42
- }
43
- };
44
- request.onsuccess = () => resolve(request.result);
45
- });
46
- } catch (error) {
47
- this.#logError(error);
48
-
49
- throw error;
50
- }
51
-
52
- return db;
53
- }
54
-
55
- async #fetchData(file) {
56
- try {
57
- const response = await fetch(file);
58
-
59
- if (!response.ok) throw new Error('Network response was not ok');
60
-
61
- return response.text();
62
- } catch (error) {
63
- this.#logError(error);
64
-
65
- throw error;
66
- }
67
- }
68
-
69
- async #insert(data) {
70
- let iconSetDiv = document.getElementById('iconset');
71
-
72
- if (!iconSetDiv) {
73
- iconSetDiv = document.createElement('div');
74
- iconSetDiv.id = 'iconset';
75
- iconSetDiv.setAttribute('aria-hidden', 'true');
76
- iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';
77
-
78
- this.#container.appendChild(iconSetDiv);
79
- }
80
-
81
- iconSetDiv.innerHTML = data;
82
- }
83
-
84
- async init() {
85
- const { file, version } = this.#options;
86
-
87
- try {
88
- let data = await this.#fetchData(file);
89
-
90
- const db = await Iconly.#dbInstance;
91
- const tx = db.transaction('icons', 'readwrite');
92
- const store = tx.objectStore('icons');
93
-
94
- const dbVersion = await new Promise((resolve, reject) => {
95
- const request = store.get(version);
96
-
97
- request.onsuccess = () => resolve(request.result);
98
- request.onerror = () => reject(request.error);
99
- });
100
-
101
- if (!(dbVersion && dbVersion.data)) {
102
- await new Promise((resolve, reject) => {
103
- const request = store.put({ version, data });
104
-
105
- request.onsuccess = () => resolve();
106
- request.onerror = () => reject(request.error);
107
- });
108
- } else {
109
- data = dbVersion.data;
110
- }
111
-
112
- await tx.complete;
113
- await this.#insert(data);
114
- } catch (error) {
115
- this.#logError('Error initializing Iconly:', error);
116
- }
117
- }
118
-
119
- #logError(...messages) {
120
- if (this.#options.debug) {
121
- console.error(...messages);
122
- }
123
- }
124
- }
125
-
126
- export default Iconly;