iconly 3.0.2 → 4.0.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/README.md CHANGED
@@ -1,44 +1,36 @@
1
- <div align="center">
2
- <br>
1
+ # iconly
3
2
 
4
- <h1>iconly</h1>
5
-
6
- <p><sup>A lightweight utility to load and cache SVG icons in the browser, using IndexedDB to store the data. It retrieves icons from a given SVG file, stores them in IndexedDB, and inserts them into the DOM for easy access and use.</sup></p>
3
+ A lightweight utility to load and cache SVG icons in the browser, using IndexedDB to store the data.
7
4
 
8
5
  [![npm](https://img.shields.io/npm/v/iconly.svg?colorB=brightgreen)](https://www.npmjs.com/package/iconly)
9
- [![GitHub package version](https://img.shields.io/github/package-json/v/ux-ui-pro/iconly.svg)](https://github.com/ux-ui-pro/iconly)
10
- [![NPM Downloads](https://img.shields.io/npm/dm/iconly.svg?style=flat)](https://www.npmjs.org/package/iconly)
6
+ [![NPM Downloads](https://img.shields.io/npm/dm/iconly.svg?style=flat)](https://www.npmjs.com/package/iconly)
11
7
 
12
- <sup>~2kB gzipped</sup>
8
+ [Demo](https://codepen.io/ux-ui/pen/zYmyqWR)
13
9
 
14
- <a href="https://codepen.io/ux-ui/pen/zYmyqWR">Demo</a>
10
+ ---
15
11
 
16
- </div>
17
- <br>
12
+ ## Features
18
13
 
19
- # Install
20
- ```console
21
- $ npm install iconly
22
- ```
23
- <br>
14
+ - Factory-based API with `createIconly()`.
15
+ - IndexedDB, memory, or session storage strategies.
16
+ - `init()` returns a `Result` and never throws.
17
+ - ~2kB gzipped.
24
18
 
25
- # Import
26
- ```javascript
27
- import { createIconly } from 'iconly';
19
+ ---
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ npm install iconly
28
25
  ```
29
- <br>
30
26
 
31
- # Upgrading to v3
32
- - The API is now factory-based: use `createIconly()` instead of `new Iconly()`.
33
- - `init()` returns a `Result<void>` and never throws.
34
- - The injected sprite wrapper is now `[data-iconly="iconset"]` inside `container` (instead of `#iconset`).
27
+ ---
35
28
 
36
- See `CHANGELOG.md` for details.
29
+ ## Quick Start
37
30
 
38
- <br>
31
+ ```ts
32
+ import { createIconly } from 'iconly';
39
33
 
40
- # Usage
41
- ```javascript
42
34
  const iconLoader = createIconly({
43
35
  file: './sprite.svg',
44
36
  version: '1.0',
@@ -55,44 +47,59 @@ if (!result.ok) {
55
47
 
56
48
  After `init()`, the SVG sprite is injected into the `container` inside `<div data-iconly="iconset" aria-hidden="true">...</div>`.
57
49
 
58
- ```HTML
50
+ ```html
59
51
  <svg>
60
52
  <use href="#icon-name"></use>
61
53
  </svg>
62
54
  ```
63
- <sub>File with icons</sub>
64
- ```HTML
55
+
56
+ Sprite file format:
57
+
58
+ ```html
65
59
  <svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none" fill="none">
66
60
  <symbol id="icon-name" viewBox="0 0 300 300">
67
- <path ... />
61
+ <path />
68
62
  </symbol>
69
- ...
70
63
  </svg>
71
64
  ```
72
- <br>
73
-
74
- # Options
75
- | Option | Type | Default | Description |
76
- |:------------------:|:---------------------------------------:|:---------------:|:----------------------------------------------------------------|
77
- | `file` | `string` | `'./icons.svg'` | The URL of the SVG file containing the icons. |
78
- | `version` | `string` | `'1.0'` | The version of the icon set. |
79
- | `debug` | `boolean` | `false` | If `true`, debug callbacks and logger debug output are enabled. |
80
- | `container` | `string \| HTMLElement` | `document.body` | The container element where the icons will be injected. |
81
- | `storage` | `'indexeddb' \| 'memory' \| 'session'` | `'indexeddb'` | Storage strategy used for caching icon data. |
82
- | `dbName` | `string` | `'iconlyDB'` | IndexedDB database name (only for `indexeddb`). |
83
- | `storeName` | `string` | `'icons'` | IndexedDB store name (only for `indexeddb`). |
84
- | `sessionKeyPrefix` | `string` | `'iconly'` | Prefix for SessionStorage keys (only for `session`). |
85
- | `logger` | `{ debug?, error? }` | `undefined` | Optional logger implementation for debug/error output. |
86
- | `onError` | `(error) => void` | `undefined` | Optional callback invoked on errors. |
87
- | `onDebug` | `(...args) => void` | `undefined` | Optional callback invoked for debug messages. |
88
- <br>
89
-
90
- # Error handling
65
+
66
+ ---
67
+
68
+ ## API
69
+
70
+ - `createIconly(config?)` creates an icon loader instance.
71
+ - `iconLoader.init()` fetches (or loads from cache) the sprite and injects it into the DOM; returns `Result<void>`.
72
+ - `iconLoader.abort()` cancels an in-flight fetch.
73
+
74
+ ---
75
+
76
+ ## Options
77
+
78
+ | Option | Type | Default | Description |
79
+ | --- | --- | --- | --- |
80
+ | `file` | `string` | `'./icons.svg'` | URL of the SVG file containing the icons. |
81
+ | `version` | `string` | `'1.0'` | Version of the icon set. |
82
+ | `debug` | `boolean` | `false` | Enables debug callbacks and logger debug output. |
83
+ | `container` | `string \| HTMLElement` | `document.body` | Container where icons are injected. |
84
+ | `storage` | `'indexeddb' \| 'memory' \| 'session'` | `'indexeddb'` | Storage strategy for caching icon data. |
85
+ | `dbName` | `string` | `'iconlyDB'` | IndexedDB database name (for `indexeddb`). |
86
+ | `storeName` | `string` | `'icons'` | IndexedDB store name (for `indexeddb`). |
87
+ | `sessionKeyPrefix` | `string` | `'iconly'` | SessionStorage key prefix (for `session`). |
88
+ | `logger` | `{ debug?, error? }` | `undefined` | Optional logger for debug/error output. |
89
+ | `onError` | `(error) => void` | `undefined` | Callback invoked on errors. |
90
+ | `onDebug` | `(...args) => void` | `undefined` | Callback invoked for debug messages. |
91
+
92
+ ---
93
+
94
+ ## Error handling
95
+
91
96
  - `init()` never throws; it returns a `Result` with `ok: false` and `error` details.
92
- - When `debug` is `false`, debug messages are suppressed (no `onDebug` calls and no `logger.debug`).
97
+ - When `debug` is `false`, debug messages are suppressed.
93
98
  - Errors still trigger `onError` and `logger.error` (if provided), even when `debug` is `false`.
94
- - You can cancel a fetch by calling `iconLoader.abort()`, which results in a `fetch_aborted` error code.
95
- <br>
99
+ - Call `iconLoader.abort()` to cancel a fetch (`fetch_aborted` error code).
100
+
101
+ ---
102
+
103
+ ## License
96
104
 
97
- # License
98
105
  MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,258 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/errors.ts
4
+ const createIconlyError = (code, message, cause) => ({
5
+ code,
6
+ message,
7
+ cause
8
+ });
9
+
10
+ //#endregion
11
+ //#region src/result.ts
12
+ const ok = (value) => ({
13
+ ok: true,
14
+ value
15
+ });
16
+ const err = (error) => ({
17
+ ok: false,
18
+ error
19
+ });
20
+
21
+ //#endregion
22
+ //#region src/dom.ts
23
+ const insertSvg = (container, data) => {
24
+ const found = container.querySelector("[data-iconly=\"iconset\"]");
25
+ let iconSetDiv = found instanceof HTMLElement ? found : null;
26
+ if (!iconSetDiv) {
27
+ iconSetDiv = document.createElement("div");
28
+ iconSetDiv.setAttribute("data-iconly", "iconset");
29
+ iconSetDiv.setAttribute("aria-hidden", "true");
30
+ iconSetDiv.style.cssText = "width: 0; height: 0; position: absolute; left: -9999px;";
31
+ container.appendChild(iconSetDiv);
32
+ }
33
+ const svgDoc = new DOMParser().parseFromString(data, "image/svg+xml");
34
+ const parserError = svgDoc.querySelector("parsererror");
35
+ if (parserError) return err(createIconlyError("parse_error", `SVG parsing error: ${parserError.textContent ?? "Unknown error"}`));
36
+ iconSetDiv.innerHTML = "";
37
+ const svgEl = svgDoc.documentElement;
38
+ if (!svgEl) return err(createIconlyError("parse_error", "No valid SVG content found."));
39
+ const imported = document.importNode(svgEl, true);
40
+ iconSetDiv.appendChild(imported);
41
+ return ok(void 0);
42
+ };
43
+
44
+ //#endregion
45
+ //#region src/fetcher.ts
46
+ const fetchSvg = async (file, signal) => {
47
+ try {
48
+ const response = await fetch(file, { signal });
49
+ if (!response.ok) return err(createIconlyError("fetch_failed", `Failed to fetch icons from "${file}".`));
50
+ return ok(await response.text());
51
+ } catch (error) {
52
+ if (error instanceof DOMException && error.name === "AbortError") return err(createIconlyError("fetch_aborted", "Fetch request was aborted.", error));
53
+ return err(createIconlyError("fetch_failed", "Failed to fetch icons.", error));
54
+ }
55
+ };
56
+
57
+ //#endregion
58
+ //#region src/storage/indexeddb.ts
59
+ const createIndexedDbStorage = (options = {}) => {
60
+ const dbName = options.dbName ?? "iconlyDB";
61
+ const storeName = options.storeName ?? "icons";
62
+ let dbPromise = null;
63
+ const openDb = async () => {
64
+ if (dbPromise) return dbPromise;
65
+ if (typeof indexedDB === "undefined") throw createIconlyError("indexeddb_not_supported", "IndexedDB is not supported.");
66
+ dbPromise = new Promise((resolve, reject) => {
67
+ const request = indexedDB.open(dbName, 1);
68
+ request.onerror = () => {
69
+ reject(createIconlyError("indexeddb_open_failed", "Failed to open IndexedDB connection.", request.error));
70
+ };
71
+ request.onupgradeneeded = (event) => {
72
+ const db = event.target.result;
73
+ if (!db.objectStoreNames.contains(storeName)) db.createObjectStore(storeName, { keyPath: "version" });
74
+ };
75
+ request.onsuccess = () => resolve(request.result);
76
+ });
77
+ return dbPromise;
78
+ };
79
+ const getStore = (db, mode) => db.transaction(storeName, mode).objectStore(storeName);
80
+ const toIconlyError = (error, fallbackCode, message) => {
81
+ if (error && typeof error === "object" && "code" in error && "message" in error) return error;
82
+ return createIconlyError(fallbackCode, message, error);
83
+ };
84
+ const get = async (version) => {
85
+ try {
86
+ const store = getStore(await openDb(), "readonly");
87
+ return await new Promise((resolve) => {
88
+ const request = store.get(version);
89
+ request.onsuccess = () => resolve(ok(request.result));
90
+ request.onerror = () => resolve(err(createIconlyError("indexeddb_request_failed", "Failed to read from IndexedDB.", request.error)));
91
+ });
92
+ } catch (error) {
93
+ return err(toIconlyError(error, "indexeddb_open_failed", "Failed to open IndexedDB."));
94
+ }
95
+ };
96
+ const set = async (record) => {
97
+ try {
98
+ const store = getStore(await openDb(), "readwrite");
99
+ return await new Promise((resolve) => {
100
+ const request = store.put(record);
101
+ request.onsuccess = () => resolve(ok(void 0));
102
+ request.onerror = () => resolve(err(createIconlyError("indexeddb_request_failed", "Failed to write to IndexedDB.", request.error)));
103
+ });
104
+ } catch (error) {
105
+ return err(createIconlyError("indexeddb_open_failed", "Failed to open IndexedDB.", error));
106
+ }
107
+ };
108
+ return {
109
+ get,
110
+ set
111
+ };
112
+ };
113
+
114
+ //#endregion
115
+ //#region src/storage/memory.ts
116
+ const createMemoryStorage = () => {
117
+ const store = /* @__PURE__ */ new Map();
118
+ const get = async (version) => {
119
+ if (!store.has(version)) return ok(void 0);
120
+ return ok({
121
+ version,
122
+ data: store.get(version) ?? ""
123
+ });
124
+ };
125
+ const set = async (record) => {
126
+ store.set(record.version, record.data);
127
+ return ok(void 0);
128
+ };
129
+ return {
130
+ get,
131
+ set
132
+ };
133
+ };
134
+
135
+ //#endregion
136
+ //#region src/storage/session.ts
137
+ const createSessionStorage = (options = {}) => {
138
+ const keyPrefix = options.keyPrefix ?? "iconly";
139
+ const resolveStorage = () => {
140
+ if (typeof window === "undefined" || !window.sessionStorage) return err(createIconlyError("storage_unavailable", "SessionStorage is not available."));
141
+ return ok(window.sessionStorage);
142
+ };
143
+ const get = async (version) => {
144
+ const storageResult = resolveStorage();
145
+ if (!storageResult.ok) return storageResult;
146
+ try {
147
+ const raw = storageResult.value.getItem(`${keyPrefix}:${version}`);
148
+ if (!raw) return ok(void 0);
149
+ return ok(JSON.parse(raw));
150
+ } catch (error) {
151
+ return err(createIconlyError("storage_read_failed", "Failed to read from SessionStorage.", error));
152
+ }
153
+ };
154
+ const set = async (record) => {
155
+ const storageResult = resolveStorage();
156
+ if (!storageResult.ok) return storageResult;
157
+ try {
158
+ storageResult.value.setItem(`${keyPrefix}:${record.version}`, JSON.stringify(record));
159
+ return ok(void 0);
160
+ } catch (error) {
161
+ return err(createIconlyError("storage_write_failed", "Failed to write to SessionStorage.", error));
162
+ }
163
+ };
164
+ return {
165
+ get,
166
+ set
167
+ };
168
+ };
169
+
170
+ //#endregion
171
+ //#region src/storage/index.ts
172
+ const resolveStorage = (strategy, options) => {
173
+ if (!strategy || strategy === "indexeddb") return createIndexedDbStorage({
174
+ dbName: options.dbName,
175
+ storeName: options.storeName
176
+ });
177
+ if (strategy === "memory") return createMemoryStorage();
178
+ if (strategy === "session") return createSessionStorage({ keyPrefix: options.sessionKeyPrefix });
179
+ return strategy;
180
+ };
181
+
182
+ //#endregion
183
+ //#region src/core.ts
184
+ const createIconly = (config = {}) => {
185
+ const resolved = {
186
+ file: config.file ?? "./icons.svg",
187
+ version: config.version ?? "1.0",
188
+ debug: config.debug ?? false,
189
+ container: config.container,
190
+ logger: config.logger,
191
+ onError: config.onError,
192
+ onDebug: config.onDebug
193
+ };
194
+ const storage = resolveStorage(config.storage, {
195
+ dbName: config.dbName,
196
+ storeName: config.storeName,
197
+ sessionKeyPrefix: config.sessionKeyPrefix
198
+ });
199
+ let controller = null;
200
+ const abort = () => {
201
+ controller?.abort();
202
+ };
203
+ const resolveContainer = () => {
204
+ if (typeof document === "undefined") return err(createIconlyError("container_invalid", "Document is not available in this environment."));
205
+ if (typeof resolved.container === "string") {
206
+ const found = document.querySelector(resolved.container);
207
+ if (!found || !(found instanceof HTMLElement)) return err(createIconlyError("container_invalid", `Invalid container selector: "${resolved.container}".`));
208
+ return ok(found);
209
+ }
210
+ if (resolved.container instanceof HTMLElement) return ok(resolved.container);
211
+ const fallback = document.body ?? document.documentElement;
212
+ if (!fallback) return err(createIconlyError("container_invalid", "No valid container element found."));
213
+ return ok(fallback);
214
+ };
215
+ const logDebug = (...messages) => {
216
+ if (!resolved.debug) return;
217
+ resolved.onDebug?.(...messages);
218
+ resolved.logger?.debug?.("[Iconly debug]", ...messages);
219
+ };
220
+ const logError = (error) => {
221
+ resolved.onError?.(error);
222
+ resolved.logger?.error?.("[Iconly error]", error);
223
+ };
224
+ const fail = (error) => {
225
+ logError(error);
226
+ return err(error);
227
+ };
228
+ const init = async () => {
229
+ const containerResult = resolveContainer();
230
+ if (!containerResult.ok) return fail(containerResult.error);
231
+ const cacheResult = await storage.get(resolved.version);
232
+ if (!cacheResult.ok) return fail(cacheResult.error);
233
+ let data = cacheResult.value?.data;
234
+ if (!data) {
235
+ controller = new AbortController();
236
+ const fetchResult = await fetchSvg(resolved.file, controller.signal);
237
+ if (!fetchResult.ok) return fail(fetchResult.error);
238
+ data = fetchResult.value;
239
+ const storeResult = await storage.set({
240
+ version: resolved.version,
241
+ data
242
+ });
243
+ if (!storeResult.ok) return fail(storeResult.error);
244
+ } else logDebug("Using cached icon set", resolved.version);
245
+ const insertResult = insertSvg(containerResult.value, data);
246
+ if (!insertResult.ok) return fail(insertResult.error);
247
+ logDebug("Iconly has successfully initialized.");
248
+ return ok(void 0);
249
+ };
250
+ return {
251
+ init,
252
+ abort
253
+ };
254
+ };
255
+
256
+ //#endregion
257
+ exports.createIconly = createIconly;
258
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/errors.ts","../src/result.ts","../src/dom.ts","../src/fetcher.ts","../src/storage/indexeddb.ts","../src/storage/memory.ts","../src/storage/session.ts","../src/storage/index.ts","../src/core.ts"],"sourcesContent":["import type { IconlyError, IconlyErrorCode } from './types';\n\nexport const createIconlyError = (\n code: IconlyErrorCode,\n message: string,\n cause?: unknown,\n): IconlyError => ({\n code,\n message,\n cause,\n});\n","import type { IconlyError, Result } from './types';\n\nexport const ok = <T>(value: T): Result<T> => ({ ok: true, value });\n\nexport const err = <T = never>(error: IconlyError): Result<T> => ({ ok: false, error });\n","import { createIconlyError } from './errors';\nimport { err, ok } from './result';\nimport type { Result } from './types';\n\nexport const insertSvg = (container: HTMLElement, data: string): Result<void> => {\n const found = container.querySelector('[data-iconly=\"iconset\"]');\n let iconSetDiv: HTMLElement | null = found instanceof HTMLElement ? found : null;\n\n if (!iconSetDiv) {\n iconSetDiv = document.createElement('div');\n iconSetDiv.setAttribute('data-iconly', 'iconset');\n iconSetDiv.setAttribute('aria-hidden', 'true');\n iconSetDiv.style.cssText = 'width: 0; height: 0; position: absolute; left: -9999px;';\n container.appendChild(iconSetDiv);\n }\n\n const parser = new DOMParser();\n const svgDoc = parser.parseFromString(data, 'image/svg+xml');\n const parserError = svgDoc.querySelector('parsererror');\n\n if (parserError) {\n return err(\n createIconlyError(\n 'parse_error',\n `SVG parsing error: ${parserError.textContent ?? 'Unknown error'}`,\n ),\n );\n }\n\n iconSetDiv.innerHTML = '';\n\n const svgEl = svgDoc.documentElement;\n\n if (!svgEl) {\n return err(createIconlyError('parse_error', 'No valid SVG content found.'));\n }\n\n const imported = document.importNode(svgEl, true);\n\n iconSetDiv.appendChild(imported);\n\n return ok(undefined);\n};\n","import { createIconlyError } from './errors';\nimport { err, ok } from './result';\nimport type { Result } from './types';\n\nexport const fetchSvg = async (file: string, signal?: AbortSignal): Promise<Result<string>> => {\n try {\n const response = await fetch(file, { signal });\n\n if (!response.ok) {\n return err(createIconlyError('fetch_failed', `Failed to fetch icons from \"${file}\".`));\n }\n\n const data = await response.text();\n\n return ok(data);\n } catch (error: unknown) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return err(createIconlyError('fetch_aborted', 'Fetch request was aborted.', error));\n }\n\n return err(createIconlyError('fetch_failed', 'Failed to fetch icons.', error));\n }\n};\n","import { createIconlyError } from '../errors';\nimport { err, ok } from '../result';\nimport type { IconlyError, IconRecord, IconStorage, Result } from '../types';\n\ninterface IndexedDbOptions {\n dbName?: string;\n storeName?: string;\n}\n\nexport const createIndexedDbStorage = (options: IndexedDbOptions = {}): IconStorage => {\n const dbName = options.dbName ?? 'iconlyDB';\n const storeName = options.storeName ?? 'icons';\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const openDb = async (): Promise<IDBDatabase> => {\n if (dbPromise) {\n return dbPromise;\n }\n\n if (typeof indexedDB === 'undefined') {\n throw createIconlyError('indexeddb_not_supported', 'IndexedDB is not supported.');\n }\n\n dbPromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onerror = (): void => {\n reject(\n createIconlyError(\n 'indexeddb_open_failed',\n 'Failed to open IndexedDB connection.',\n request.error,\n ),\n );\n };\n\n request.onupgradeneeded = (event): void => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName, { keyPath: 'version' });\n }\n };\n\n request.onsuccess = (): void => resolve(request.result);\n });\n\n return dbPromise;\n };\n\n const getStore = (db: IDBDatabase, mode: IDBTransactionMode): IDBObjectStore =>\n db.transaction(storeName, mode).objectStore(storeName);\n\n const toIconlyError = (\n error: unknown,\n fallbackCode: IconlyError['code'],\n message: string,\n ): IconlyError => {\n if (error && typeof error === 'object' && 'code' in error && 'message' in error) {\n return error as IconlyError;\n }\n\n return createIconlyError(fallbackCode, message, error);\n };\n\n const get = async (version: string): Promise<Result<IconRecord | undefined>> => {\n try {\n const db = await openDb();\n const store = getStore(db, 'readonly');\n\n return await new Promise<Result<IconRecord | undefined>>((resolve) => {\n const request = store.get(version);\n\n request.onsuccess = (): void => resolve(ok(request.result as IconRecord | undefined));\n request.onerror = (): void =>\n resolve(\n err(\n createIconlyError(\n 'indexeddb_request_failed',\n 'Failed to read from IndexedDB.',\n request.error,\n ),\n ),\n );\n });\n } catch (error: unknown) {\n return err(toIconlyError(error, 'indexeddb_open_failed', 'Failed to open IndexedDB.'));\n }\n };\n\n const set = async (record: IconRecord): Promise<Result<void>> => {\n try {\n const db = await openDb();\n const store = getStore(db, 'readwrite');\n\n return await new Promise<Result<void>>((resolve) => {\n const request = store.put(record);\n\n request.onsuccess = (): void => resolve(ok(undefined));\n request.onerror = (): void =>\n resolve(\n err(\n createIconlyError(\n 'indexeddb_request_failed',\n 'Failed to write to IndexedDB.',\n request.error,\n ),\n ),\n );\n });\n } catch (error: unknown) {\n return err(createIconlyError('indexeddb_open_failed', 'Failed to open IndexedDB.', error));\n }\n };\n\n return { get, set };\n};\n","import { ok } from '../result';\nimport type { IconRecord, IconStorage, Result } from '../types';\n\nexport const createMemoryStorage = (): IconStorage => {\n const store = new Map<string, string>();\n\n const get = async (version: string): Promise<Result<IconRecord | undefined>> => {\n if (!store.has(version)) {\n return ok(undefined);\n }\n\n return ok({ version, data: store.get(version) ?? '' });\n };\n\n const set = async (record: IconRecord): Promise<Result<void>> => {\n store.set(record.version, record.data);\n\n return ok(undefined);\n };\n\n return { get, set };\n};\n","import { createIconlyError } from '../errors';\nimport { err, ok } from '../result';\nimport type { IconRecord, IconStorage, Result } from '../types';\n\ninterface SessionStorageOptions {\n keyPrefix?: string;\n}\n\nexport const createSessionStorage = (options: SessionStorageOptions = {}): IconStorage => {\n const keyPrefix = options.keyPrefix ?? 'iconly';\n\n const resolveStorage = (): Result<Storage> => {\n if (typeof window === 'undefined' || !window.sessionStorage) {\n return err(createIconlyError('storage_unavailable', 'SessionStorage is not available.'));\n }\n\n return ok(window.sessionStorage);\n };\n\n const get = async (version: string): Promise<Result<IconRecord | undefined>> => {\n const storageResult = resolveStorage();\n\n if (!storageResult.ok) {\n return storageResult;\n }\n\n try {\n const raw = storageResult.value.getItem(`${keyPrefix}:${version}`);\n\n if (!raw) {\n return ok(undefined);\n }\n\n const parsed = JSON.parse(raw) as IconRecord;\n\n return ok(parsed);\n } catch (error: unknown) {\n return err(\n createIconlyError('storage_read_failed', 'Failed to read from SessionStorage.', error),\n );\n }\n };\n\n const set = async (record: IconRecord): Promise<Result<void>> => {\n const storageResult = resolveStorage();\n\n if (!storageResult.ok) {\n return storageResult;\n }\n\n try {\n storageResult.value.setItem(`${keyPrefix}:${record.version}`, JSON.stringify(record));\n\n return ok(undefined);\n } catch (error: unknown) {\n return err(\n createIconlyError('storage_write_failed', 'Failed to write to SessionStorage.', error),\n );\n }\n };\n\n return { get, set };\n};\n","import type { IconStorage, StorageStrategy } from '../types';\nimport { createIndexedDbStorage } from './indexeddb';\nimport { createMemoryStorage } from './memory';\nimport { createSessionStorage } from './session';\n\nexport interface StorageFactoryOptions {\n dbName?: string;\n storeName?: string;\n sessionKeyPrefix?: string;\n}\n\nexport const resolveStorage = (\n strategy: StorageStrategy | undefined,\n options: StorageFactoryOptions,\n): IconStorage => {\n if (!strategy || strategy === 'indexeddb') {\n return createIndexedDbStorage({\n dbName: options.dbName,\n storeName: options.storeName,\n });\n }\n\n if (strategy === 'memory') {\n return createMemoryStorage();\n }\n\n if (strategy === 'session') {\n return createSessionStorage({ keyPrefix: options.sessionKeyPrefix });\n }\n\n return strategy;\n};\n","import { insertSvg } from './dom';\nimport { createIconlyError } from './errors';\nimport { fetchSvg } from './fetcher';\nimport { err, ok } from './result';\nimport { resolveStorage } from './storage';\nimport type { IconlyConfig, IconlyError, IconlyInstance, IconStorage, Result } from './types';\n\ninterface ResolvedIconlyConfig {\n file: string;\n version: string;\n debug: boolean;\n container?: string | HTMLElement;\n logger?: IconlyConfig['logger'];\n onError?: IconlyConfig['onError'];\n onDebug?: IconlyConfig['onDebug'];\n}\n\nexport const createIconly = (config: IconlyConfig = {}): IconlyInstance => {\n const resolved: ResolvedIconlyConfig = {\n file: config.file ?? './icons.svg',\n version: config.version ?? '1.0',\n debug: config.debug ?? false,\n container: config.container,\n logger: config.logger,\n onError: config.onError,\n onDebug: config.onDebug,\n };\n\n const storage: IconStorage = resolveStorage(config.storage, {\n dbName: config.dbName,\n storeName: config.storeName,\n sessionKeyPrefix: config.sessionKeyPrefix,\n });\n\n let controller: AbortController | null = null;\n\n const abort = (): void => {\n controller?.abort();\n };\n\n const resolveContainer = (): Result<HTMLElement> => {\n if (typeof document === 'undefined') {\n return err(\n createIconlyError('container_invalid', 'Document is not available in this environment.'),\n );\n }\n\n if (typeof resolved.container === 'string') {\n const found = document.querySelector(resolved.container);\n\n if (!found || !(found instanceof HTMLElement)) {\n return err(\n createIconlyError(\n 'container_invalid',\n `Invalid container selector: \"${resolved.container}\".`,\n ),\n );\n }\n\n return ok(found);\n }\n\n if (resolved.container instanceof HTMLElement) {\n return ok(resolved.container);\n }\n\n const fallback = document.body ?? document.documentElement;\n\n if (!fallback) {\n return err(createIconlyError('container_invalid', 'No valid container element found.'));\n }\n\n return ok(fallback);\n };\n\n const logDebug = (...messages: unknown[]): void => {\n if (!resolved.debug) {\n return;\n }\n\n resolved.onDebug?.(...messages);\n resolved.logger?.debug?.('[Iconly debug]', ...messages);\n };\n\n const logError = (error: IconlyError): void => {\n resolved.onError?.(error);\n resolved.logger?.error?.('[Iconly error]', error);\n };\n\n const fail = (error: IconlyError): Result<void> => {\n logError(error);\n\n return err(error);\n };\n\n const init = async (): Promise<Result<void>> => {\n const containerResult = resolveContainer();\n\n if (!containerResult.ok) {\n return fail(containerResult.error);\n }\n\n const cacheResult = await storage.get(resolved.version);\n\n if (!cacheResult.ok) {\n return fail(cacheResult.error);\n }\n\n let data = cacheResult.value?.data;\n\n if (!data) {\n controller = new AbortController();\n\n const fetchResult = await fetchSvg(resolved.file, controller.signal);\n\n if (!fetchResult.ok) {\n return fail(fetchResult.error);\n }\n\n data = fetchResult.value;\n\n const storeResult = await storage.set({\n version: resolved.version,\n data,\n });\n\n if (!storeResult.ok) {\n return fail(storeResult.error);\n }\n } else {\n logDebug('Using cached icon set', resolved.version);\n }\n\n const insertResult = insertSvg(containerResult.value, data);\n\n if (!insertResult.ok) {\n return fail(insertResult.error);\n }\n\n logDebug('Iconly has successfully initialized.');\n\n return ok(undefined);\n };\n\n return { init, abort };\n};\n"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ //#region src/types.d.ts
2
+ type Result<T> = {
3
+ ok: true;
4
+ value: T;
5
+ } | {
6
+ ok: false;
7
+ error: IconlyError;
8
+ };
9
+ type IconlyErrorCode = 'container_invalid' | 'fetch_aborted' | 'fetch_failed' | 'indexeddb_not_supported' | 'indexeddb_open_failed' | 'indexeddb_request_failed' | 'parse_error' | 'storage_read_failed' | 'storage_unavailable' | 'storage_write_failed';
10
+ interface IconlyError {
11
+ code: IconlyErrorCode;
12
+ message: string;
13
+ cause?: unknown;
14
+ }
15
+ interface Logger {
16
+ debug?: (...messages: unknown[]) => void;
17
+ error?: (...messages: unknown[]) => void;
18
+ }
19
+ interface IconRecord {
20
+ version: string;
21
+ data: string;
22
+ }
23
+ interface IconStorage {
24
+ get(version: string): Promise<Result<IconRecord | undefined>>;
25
+ set(record: IconRecord): Promise<Result<void>>;
26
+ }
27
+ interface IconlyInstance {
28
+ init: () => Promise<Result<void>>;
29
+ abort: () => void;
30
+ }
31
+ type StorageStrategy = 'indexeddb' | 'memory' | 'session' | IconStorage;
32
+ interface IconlyConfig {
33
+ file?: string;
34
+ version?: string;
35
+ debug?: boolean;
36
+ container?: string | HTMLElement;
37
+ storage?: StorageStrategy;
38
+ dbName?: string;
39
+ storeName?: string;
40
+ sessionKeyPrefix?: string;
41
+ logger?: Logger;
42
+ onError?: (error: IconlyError) => void;
43
+ onDebug?: (...messages: unknown[]) => void;
44
+ }
45
+ //#endregion
46
+ //#region src/core.d.ts
47
+ declare const createIconly: (config?: IconlyConfig) => IconlyInstance;
48
+ //#endregion
49
+ export { type IconRecord, type IconStorage, type IconlyConfig, type IconlyError, type IconlyErrorCode, type IconlyInstance, type Logger, type Result, type StorageStrategy, createIconly };
50
+ //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,55 +1,50 @@
1
- export declare const createIconly: (config?: IconlyConfig) => IconlyInstance;
2
-
3
- export declare interface IconlyConfig {
4
- file?: string;
5
- version?: string;
6
- debug?: boolean;
7
- container?: string | HTMLElement;
8
- storage?: StorageStrategy;
9
- dbName?: string;
10
- storeName?: string;
11
- sessionKeyPrefix?: string;
12
- logger?: Logger;
13
- onError?: (error: IconlyError) => void;
14
- onDebug?: (...messages: unknown[]) => void;
15
- }
16
-
17
- export declare interface IconlyError {
18
- code: IconlyErrorCode;
19
- message: string;
20
- cause?: unknown;
21
- }
22
-
23
- export declare type IconlyErrorCode = 'container_invalid' | 'fetch_aborted' | 'fetch_failed' | 'indexeddb_not_supported' | 'indexeddb_open_failed' | 'indexeddb_request_failed' | 'parse_error' | 'storage_read_failed' | 'storage_unavailable' | 'storage_write_failed';
24
-
25
- export declare interface IconlyInstance {
26
- init: () => Promise<Result<void>>;
27
- abort: () => void;
28
- }
29
-
30
- export declare interface IconRecord {
31
- version: string;
32
- data: string;
33
- }
34
-
35
- export declare interface IconStorage {
36
- get(version: string): Promise<Result<IconRecord | undefined>>;
37
- set(record: IconRecord): Promise<Result<void>>;
38
- }
39
-
40
- export declare interface Logger {
41
- debug?: (...messages: unknown[]) => void;
42
- error?: (...messages: unknown[]) => void;
43
- }
44
-
45
- export declare type Result<T> = {
46
- ok: true;
47
- value: T;
48
- } | {
49
- ok: false;
50
- error: IconlyError;
51
- };
52
-
53
- export declare type StorageStrategy = 'indexeddb' | 'memory' | 'session' | IconStorage;
54
-
55
- export { }
1
+ //#region src/types.d.ts
2
+ type Result<T> = {
3
+ ok: true;
4
+ value: T;
5
+ } | {
6
+ ok: false;
7
+ error: IconlyError;
8
+ };
9
+ type IconlyErrorCode = 'container_invalid' | 'fetch_aborted' | 'fetch_failed' | 'indexeddb_not_supported' | 'indexeddb_open_failed' | 'indexeddb_request_failed' | 'parse_error' | 'storage_read_failed' | 'storage_unavailable' | 'storage_write_failed';
10
+ interface IconlyError {
11
+ code: IconlyErrorCode;
12
+ message: string;
13
+ cause?: unknown;
14
+ }
15
+ interface Logger {
16
+ debug?: (...messages: unknown[]) => void;
17
+ error?: (...messages: unknown[]) => void;
18
+ }
19
+ interface IconRecord {
20
+ version: string;
21
+ data: string;
22
+ }
23
+ interface IconStorage {
24
+ get(version: string): Promise<Result<IconRecord | undefined>>;
25
+ set(record: IconRecord): Promise<Result<void>>;
26
+ }
27
+ interface IconlyInstance {
28
+ init: () => Promise<Result<void>>;
29
+ abort: () => void;
30
+ }
31
+ type StorageStrategy = 'indexeddb' | 'memory' | 'session' | IconStorage;
32
+ interface IconlyConfig {
33
+ file?: string;
34
+ version?: string;
35
+ debug?: boolean;
36
+ container?: string | HTMLElement;
37
+ storage?: StorageStrategy;
38
+ dbName?: string;
39
+ storeName?: string;
40
+ sessionKeyPrefix?: string;
41
+ logger?: Logger;
42
+ onError?: (error: IconlyError) => void;
43
+ onDebug?: (...messages: unknown[]) => void;
44
+ }
45
+ //#endregion
46
+ //#region src/core.d.ts
47
+ declare const createIconly: (config?: IconlyConfig) => IconlyInstance;
48
+ //#endregion
49
+ export { type IconRecord, type IconStorage, type IconlyConfig, type IconlyError, type IconlyErrorCode, type IconlyInstance, type Logger, type Result, type StorageStrategy, createIconly };
50
+ //# sourceMappingURL=index.d.ts.map