opfs-worker 2.1.0 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +51 -37
  2. package/dist/BaseOPFS-Bu7FZtCb.cjs +2 -0
  3. package/dist/BaseOPFS-Bu7FZtCb.cjs.map +1 -0
  4. package/dist/{BaseOPFS-Cylz6ijk.js → BaseOPFS-C3NE4BKr.js} +804 -484
  5. package/dist/BaseOPFS-C3NE4BKr.js.map +1 -0
  6. package/dist/OPFSAsync-C0RsxCX5.cjs +2 -0
  7. package/dist/OPFSAsync-C0RsxCX5.cjs.map +1 -0
  8. package/dist/{OPFSAsync-BKSAJJeh.js → OPFSAsync-aeLUdIqd.js} +19 -19
  9. package/dist/OPFSAsync-aeLUdIqd.js.map +1 -0
  10. package/dist/OPFSFacade-BJv2yuWU.cjs +2 -0
  11. package/dist/OPFSFacade-BJv2yuWU.cjs.map +1 -0
  12. package/dist/OPFSFacade-DiogtQoq.js +308 -0
  13. package/dist/OPFSFacade-DiogtQoq.js.map +1 -0
  14. package/dist/OPFSSync-3qlSBYmz.cjs +2 -0
  15. package/dist/OPFSSync-3qlSBYmz.cjs.map +1 -0
  16. package/dist/{OPFSSync-CsSQkpk5.js → OPFSSync-CvSOswhW.js} +57 -57
  17. package/dist/OPFSSync-CvSOswhW.js.map +1 -0
  18. package/dist/assets/dedicated.worker-Bqqr9UBA.js.map +1 -0
  19. package/dist/core/BaseOPFS.d.ts +60 -9
  20. package/dist/core/BaseOPFS.d.ts.map +1 -1
  21. package/dist/core/OPFSAsync.d.ts.map +1 -1
  22. package/dist/core/OPFSSync.d.ts.map +1 -1
  23. package/dist/createOPFSAsync-B611B63X.js +10 -0
  24. package/dist/{createOPFSAsync-Y4Mg6qte.js.map → createOPFSAsync-B611B63X.js.map} +1 -1
  25. package/dist/createOPFSAsync-BATjJg8k.cjs +2 -0
  26. package/dist/{createOPFSAsync-BwKDmHsy.cjs.map → createOPFSAsync-BATjJg8k.cjs.map} +1 -1
  27. package/dist/createOPFSDedicated-DgudPTB8.js +2676 -0
  28. package/dist/createOPFSDedicated-DgudPTB8.js.map +1 -0
  29. package/dist/createOPFSDedicated-EmIwluQo.cjs +2597 -0
  30. package/dist/createOPFSDedicated-EmIwluQo.cjs.map +1 -0
  31. package/dist/{createOPFSShared-CGdd__PH.js → createOPFSShared-BWYln8jJ.js} +2 -2
  32. package/dist/{createOPFSShared-CGdd__PH.js.map → createOPFSShared-BWYln8jJ.js.map} +1 -1
  33. package/dist/{createOPFSShared-CskROt7U.cjs → createOPFSShared-DPJpCd7z.cjs} +2 -2
  34. package/dist/{createOPFSShared-CskROt7U.cjs.map → createOPFSShared-DPJpCd7z.cjs.map} +1 -1
  35. package/dist/dedicated.worker.js +1104 -790
  36. package/dist/dedicated.worker.js.map +1 -1
  37. package/dist/facade/OPFSFacade.d.ts +21 -3
  38. package/dist/facade/OPFSFacade.d.ts.map +1 -1
  39. package/dist/facade/createOPFSDedicated.d.ts +4 -2
  40. package/dist/facade/createOPFSDedicated.d.ts.map +1 -1
  41. package/dist/index.async.cjs +1 -1
  42. package/dist/index.async.js +33 -32
  43. package/dist/index.cjs +1 -1
  44. package/dist/index.d.ts +1 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +44 -43
  47. package/dist/index.pure.cjs +1 -1
  48. package/dist/index.pure.js +38 -37
  49. package/dist/index.sharedworker.cjs +1 -1
  50. package/dist/index.sharedworker.js +34 -33
  51. package/dist/index.sync.cjs +1 -1
  52. package/dist/index.sync.d.ts +2 -0
  53. package/dist/index.sync.d.ts.map +1 -1
  54. package/dist/index.sync.js +34 -32
  55. package/dist/shared.worker.js +1101 -791
  56. package/dist/shared.worker.js.map +1 -1
  57. package/dist/types.d.ts +38 -5
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/utils/helpers.d.ts +13 -3
  60. package/dist/utils/helpers.d.ts.map +1 -1
  61. package/dist/worker/createDedicatedWorker.d.ts +8 -3
  62. package/dist/worker/createDedicatedWorker.d.ts.map +1 -1
  63. package/docs/README.md +13 -25
  64. package/docs/api/README.md +221 -0
  65. package/docs/api/file-descriptors.md +137 -0
  66. package/docs/guides/async.md +4 -4
  67. package/docs/guides/dedicated.md +10 -8
  68. package/docs/guides/hashing.md +3 -3
  69. package/docs/guides/pure.md +4 -4
  70. package/docs/guides/sharedworker.md +2 -2
  71. package/docs/guides/streaming.md +146 -12
  72. package/docs/guides/watching.md +3 -3
  73. package/docs/migration.md +10 -11
  74. package/docs/types.md +93 -155
  75. package/package.json +20 -9
  76. package/src/core/BaseOPFS.ts +194 -29
  77. package/src/core/OPFSAsync.ts +4 -5
  78. package/src/core/OPFSSync.ts +6 -7
  79. package/src/facade/OPFSFacade.ts +51 -4
  80. package/src/facade/createOPFSDedicated.ts +4 -2
  81. package/src/index.sync.ts +2 -0
  82. package/src/index.ts +1 -5
  83. package/src/types.ts +42 -3
  84. package/src/utils/helpers.ts +32 -6
  85. package/src/worker/createDedicatedWorker.ts +85 -7
  86. package/src/worker/dedicated.worker.ts +12 -1
  87. package/dist/BaseOPFS-BPw9AIQ-.cjs +0 -4
  88. package/dist/BaseOPFS-BPw9AIQ-.cjs.map +0 -1
  89. package/dist/BaseOPFS-Cylz6ijk.js.map +0 -1
  90. package/dist/OPFSAsync-BKSAJJeh.js.map +0 -1
  91. package/dist/OPFSAsync-s2P7y3sw.cjs +0 -2
  92. package/dist/OPFSAsync-s2P7y3sw.cjs.map +0 -1
  93. package/dist/OPFSFacade-DePnNRgt.cjs +0 -2
  94. package/dist/OPFSFacade-DePnNRgt.cjs.map +0 -1
  95. package/dist/OPFSFacade-XohWlHuu.js +0 -281
  96. package/dist/OPFSFacade-XohWlHuu.js.map +0 -1
  97. package/dist/OPFSSync-C7KBepe_.cjs +0 -2
  98. package/dist/OPFSSync-C7KBepe_.cjs.map +0 -1
  99. package/dist/OPFSSync-CsSQkpk5.js.map +0 -1
  100. package/dist/assets/dedicated.worker-nY3tK4zi.js.map +0 -1
  101. package/dist/createOPFSAsync-BwKDmHsy.cjs +0 -2
  102. package/dist/createOPFSAsync-Y4Mg6qte.js +0 -10
  103. package/dist/createOPFSDedicated-CsnV6MLP.js +0 -2333
  104. package/dist/createOPFSDedicated-CsnV6MLP.js.map +0 -1
  105. package/dist/createOPFSDedicated-pKTRWLdz.cjs +0 -2283
  106. package/dist/createOPFSDedicated-pKTRWLdz.cjs.map +0 -1
  107. package/docs/api/backend.md +0 -36
  108. package/docs/api/create.md +0 -82
  109. package/docs/api/facade.md +0 -52
  110. package/docs/choosing-a-mode.md +0 -41
  111. package/docs/file-descriptors.md +0 -695
package/docs/types.md CHANGED
@@ -1,38 +1,22 @@
1
1
  # Types
2
2
 
3
- TypeScript types shipped with the package.
4
-
5
- ## Core Types
6
-
7
- ### `FileStat`
8
-
9
- File or directory statistics.
3
+ ## `FileStat`
10
4
 
11
5
  ```typescript
12
6
  interface FileStat {
13
7
  kind: 'file' | 'directory';
14
8
  size: number;
15
- mtime: string; // ISO string
16
- ctime: string; // ISO string
9
+ mtime: string; // ISO
10
+ ctime: string; // ISO
17
11
  isFile: boolean;
18
12
  isDirectory: boolean;
19
- hash?: string; // Hash of file content (only for files)
13
+ hash?: string; // files only, when hashing is enabled
20
14
  }
21
15
  ```
22
16
 
23
- **Properties:**
24
-
25
- - `kind`: Type of the file system entry
26
- - `size`: Size in bytes (0 for directories)
27
- - `mtime`: Last modification time as ISO string
28
- - `ctime`: Creation time as ISO string
29
- - `isFile`: True if this is a file
30
- - `isDirectory`: True if this is a directory
31
- - `hash`: Optional hash of file content (only present for files when hashing is enabled)
17
+ `size` is `0` for directories.
32
18
 
33
- ### `DirentData`
34
-
35
- Directory entry information.
19
+ ## `DirentData`
36
20
 
37
21
  ```typescript
38
22
  interface DirentData {
@@ -43,46 +27,61 @@ interface DirentData {
43
27
  }
44
28
  ```
45
29
 
46
- **Properties:**
30
+ ## `WatchOptions`
47
31
 
48
- - `name`: Name of the file or directory
49
- - `kind`: Type of the entry
50
- - `isFile`: True if this is a file
51
- - `isDirectory`: True if this is a directory
32
+ ```typescript
33
+ interface WatchOptions {
34
+ recursive?: boolean; // default: true
35
+ include?: string | string[]; // minimatch, default: ['**']
36
+ exclude?: string | string[]; // minimatch, default: []
37
+ }
38
+ ```
52
39
 
53
- ### `WatchOptions`
40
+ ## `ImportFilesProgress`
54
41
 
55
- Options for file watching operations.
42
+ Fired by `importFiles` / `onProgress` for each chunk written:
56
43
 
57
44
  ```typescript
58
- interface WatchOptions {
59
- recursive?: boolean; // Whether to watch recursively (default: true)
60
- include?: string | string[]; // Glob patterns to include in watching (minimatch syntax, default: ['**'])
61
- exclude?: string | string[]; // Glob patterns to exclude from watching (minimatch syntax, default: [])
45
+ interface ImportFilesProgress {
46
+ path: string; // file currently being written
47
+ index: number; // 0-based
48
+ count: number; // total entries
49
+ bytesWritten: number; // within current file
50
+ bytesTotal: number; // size of current file
51
+ totalBytesWritten: number;
52
+ totalBytes: number; // sum of all entry sizes
62
53
  }
63
54
  ```
64
55
 
65
- **Properties:**
56
+ ## `ImportFilesResult`
57
+
58
+ Returned when `importFiles` finishes:
59
+
60
+ ```typescript
61
+ interface ImportFilesResult {
62
+ paths: string[]; // written paths, in order
63
+ count: number; // paths.length
64
+ bytesWritten: number; // total bytes across all files
65
+ }
66
+ ```
66
67
 
67
- - `recursive`: Whether to watch the entire directory tree (default: true)
68
- - `include`: Glob patterns to include in watching (default: all files)
69
- - `exclude`: Glob patterns to exclude from watching (default: none)
68
+ Entries accept `Iterable<[path, string | Uint8Array | Blob]>` or `Map<string, …>` — see [streaming](./guides/streaming.md).
70
69
 
71
- ### `OPFSApi`
70
+ ## `OPFSApi`
72
71
 
73
- Promise-based fs API surface shared by all backends — a Comlink proxy to `OPFSSync` in a worker, or an in-process `OPFSAsync` instance. This is what `OPFSFacade` talks to (see `OPFSBackend` in [Create helpers](./api/create.md)).
72
+ Public bytes API shared by all backends — the public methods of `BaseOPFS` (subclasses `OPFSSync` / `OPFSAsync`, or a Comlink proxy). What `OPFSFacade` talks to via `fs.backend`.
74
73
 
75
74
  ```typescript
76
- type OPFSApi = { [K in keyof OPFSSync]: OPFSSync[K] };
75
+ type OPFSApi = Pick<BaseOPFS, keyof BaseOPFS>;
77
76
  ```
78
77
 
79
- ### `PathLike`
78
+ ## `PathLike`
80
79
 
81
80
  ```typescript
82
81
  type PathLike = string | URL;
83
82
  ```
84
83
 
85
- ### `FileOpenOptions`
84
+ ## `FileOpenOptions`
86
85
 
87
86
  ```typescript
88
87
  interface FileOpenOptions {
@@ -92,40 +91,26 @@ interface FileOpenOptions {
92
91
  }
93
92
  ```
94
93
 
95
- ## Configuration Types
96
-
97
- ### `OPFSOptions`
98
-
99
- Configuration for all backends. Human-readable table: [Create helpers → Options](./api/create.md#options).
94
+ ## `OPFSOptions`
100
95
 
101
96
  ```typescript
102
97
  interface OPFSOptions {
103
- /** Root path for the file system (default: '/') */
98
+ /** Root path (default: '/') */
104
99
  root?: string;
105
- /** Namespace for the events (default: 'opfs-worker:${root}') */
100
+ /** Event namespace (default: 'opfs-worker:${root}') */
106
101
  namespace?: string;
107
- /** Hash algorithm for file hashing, or false/null to disable (default: 'etag') */
102
+ /** Hash algorithm, or false/null to disable (default: 'etag') */
108
103
  hashAlgorithm?: null | false | 'etag' | 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512';
109
- /** Maximum file size in bytes for SHA-* hashing (default: 50MB); ignored by 'etag' */
104
+ /** Max bytes for SHA-* hashing (default: 50MB); ignored by 'etag' */
110
105
  maxFileSize?: number;
111
- /** Custom name for the broadcast channel (default: 'opfs-worker') */
106
+ /** Broadcast channel name or instance (default: 'opfs-worker') */
112
107
  broadcastChannel?: string | BroadcastChannel | null;
113
108
  }
114
109
  ```
115
110
 
116
- **Properties:**
117
-
118
- - `root`: Root path for the file system
119
- - `namespace`: Namespace for events and isolation
120
- - `hashAlgorithm`: `'etag'` (default, mtime+size), `'SHA-*'`, or `null`/`false` to disable
121
- - `maxFileSize`: Max bytes for SHA-* content hashing (etag ignores this)
122
- - `broadcastChannel`: Custom broadcast channel name or instance
123
-
124
- ## Event Types
125
-
126
- ### `WatchEventType`
111
+ Defaults and behavior: [API → Options](./api/README.md#options).
127
112
 
128
- Enumeration of file system change event types.
113
+ ## `WatchEventType`
129
114
 
130
115
  ```typescript
131
116
  enum WatchEventType {
@@ -135,15 +120,7 @@ enum WatchEventType {
135
120
  }
136
121
  ```
137
122
 
138
- **Values:**
139
-
140
- - `Added`: File or directory was created
141
- - `Changed`: File or directory was modified
142
- - `Removed`: File or directory was deleted
143
-
144
- ### `WatchEvent`
145
-
146
- File system change event sent via BroadcastChannel.
123
+ ## `WatchEvent`
147
124
 
148
125
  ```typescript
149
126
  interface WatchEvent {
@@ -156,91 +133,52 @@ interface WatchEvent {
156
133
  }
157
134
  ```
158
135
 
159
- **Properties:**
160
-
161
- - `namespace`: Event namespace for isolation
162
- - `path`: Path of the changed file/directory
163
- - `type`: Type of change (added, changed, removed)
164
- - `isDirectory`: Whether the changed item is a directory
165
- - `timestamp`: ISO timestamp of the change
166
- - `hash`: Optional hash of the file content (if hashing is enabled)
167
-
168
- ## Utility Types
169
-
170
- ### `Kind`
171
-
172
- File system entry type.
136
+ ## Utility types
173
137
 
174
138
  ```typescript
175
139
  type Kind = 'file' | 'directory';
176
- ```
177
-
178
- ### `Encoding`
179
-
180
- Supported text encodings.
181
-
182
- ```typescript
183
140
  type Encoding = 'utf-8' | 'utf-16le' | 'ascii' | 'latin1' | 'base64' | 'hex' | 'binary';
184
141
  ```
185
142
 
186
- ## Error Types
187
-
188
- The library provides comprehensive error handling with specific error types that are Node.js SystemError compatible:
189
-
190
- ### Base Error Class
191
-
192
- - `OPFSError` - Base error class for all OPFS-related errors (Node.js SystemError compatible)
193
-
194
- **Properties:**
195
-
196
- - `errno: number` - Numeric error code (e.g., -2 for ENOENT)
197
- - `syscall?: string` - System call name (e.g., 'open', 'read', 'write')
198
- - `path?: string` - File path when applicable
199
- - `name: string` - Error class name ('OPFSError')
200
- - `message: string` - Human-readable error message
201
- - `cause?: any` - Underlying error (Node.js 16+ feature)
202
-
203
- ### Specialized Error Classes
204
-
205
- - `OPFSNotSupportedError` - Thrown when OPFS is not supported in the browser
206
- - `PathError` - Thrown for invalid paths or path traversal attempts
207
- - `ExistenceError` - Thrown when files or directories don't exist
208
- - Usage: `new ExistenceError('File not found: /path/to/file', 'ENOENT', '/path/to/file')`
209
- - `PermissionError` - Thrown when permission is denied for an operation
210
- - `StorageError` - Thrown when an operation fails due to insufficient storage
211
- - `TimeoutError` - Thrown when an operation times out
212
- - `FileBusyError` - Thrown when a file is busy (locked by another operation)
213
- - `FileTypeError` - Thrown when file/directory type expectations don't match
214
- - Usage: `new FileTypeError('directory', '/path/to/dir')`
215
- - `ValidationError` - Thrown for validation failures (invalid arguments, formats, etc.)
216
- - Usage: `new ValidationError('Invalid size', 'EINVAL', '/path/to/file')`
217
- - `OperationAbortedError` - Thrown when an operation is aborted
218
- - `IOError` - Thrown for I/O operation failures
219
- - `OperationNotSupportedError` - Thrown when an operation is not supported
220
- - `DirectoryOperationError` - Thrown when directory operations fail
221
- - Usage: `new DirectoryOperationError('RM_FAILED', '/path/to/dir')`
222
- - `InitializationFailedError` - Thrown when OPFS initialization fails
223
- - `FileSystemOperationError` - Thrown when file system operations fail
224
- - `PathResolutionFailedError` - Thrown when path resolution fails
225
- - `AlreadyExistsError` - Thrown when a file or directory already exists
226
-
227
- ### Error Code Mapping
228
-
229
- The library uses standard POSIX error codes with numeric errno mapping:
230
-
231
- - `ENOENT` (-2) - No such file or directory
232
- - `EISDIR` (-21) - Is a directory
233
- - `ENOTDIR` (-20) - Not a directory
234
- - `EACCES` (-13) - Permission denied
235
- - `EEXIST` (-17) - File exists
236
- - `ENOTEMPTY` (-39) - Directory not empty
237
- - `EINVAL` (-22) - Invalid argument
238
- - `EIO` (-5) - I/O error
239
- - `ENOSPC` (-28) - No space left on device
240
- - `EBUSY` (-16) - Device or resource busy
241
- - `EINTR` (-4) - Interrupted system call
242
- - `ENOTSUP` (-95) - Operation not supported
243
- - `ERANGE` (-34) - Result too large
244
- - `EBADF` (-9) - Bad file descriptor
245
-
246
- Each error type extends the base `OPFSError` class and provides specific error codes and context information for better debugging.
143
+ ## Errors
144
+
145
+ Node.js SystemError-compatible. Base class: `OPFSError` (`errno`, `syscall?`, `path?`, `cause?`).
146
+
147
+ | Class | |
148
+ | ---------------------------- | ------------------------------------------------------------------- |
149
+ | `OPFSNotSupportedError` | OPFS missing in the browser |
150
+ | `PathError` | Bad path / traversal |
151
+ | `ExistenceError` | Missing entry — `new ExistenceError(msg, 'ENOENT', path)` |
152
+ | `PermissionError` | Access denied |
153
+ | `StorageError` | Quota / storage full |
154
+ | `TimeoutError` | Timed out |
155
+ | `FileBusyError` | Locked / busy |
156
+ | `FileTypeError` | File vs directory mismatch — `new FileTypeError('directory', path)` |
157
+ | `ValidationError` | Bad args — `new ValidationError(msg, 'EINVAL', path)` |
158
+ | `OperationAbortedError` | Aborted |
159
+ | `IOError` | I/O failure |
160
+ | `OperationNotSupportedError` | Not supported (e.g. FDs on async) |
161
+ | `DirectoryOperationError` | Dir op failed — `new DirectoryOperationError('RM_FAILED', path)` |
162
+ | `InitializationFailedError` | Init failed |
163
+ | `FileSystemOperationError` | Generic FS failure |
164
+ | `PathResolutionFailedError` | Path resolve failed |
165
+ | `AlreadyExistsError` | Already exists |
166
+
167
+ ### errno
168
+
169
+ | Code | errno | |
170
+ | ----------- | ----- | ------------------------- |
171
+ | `ENOENT` | -2 | No such file or directory |
172
+ | `EISDIR` | -21 | Is a directory |
173
+ | `ENOTDIR` | -20 | Not a directory |
174
+ | `EACCES` | -13 | Permission denied |
175
+ | `EEXIST` | -17 | File exists |
176
+ | `ENOTEMPTY` | -39 | Directory not empty |
177
+ | `EINVAL` | -22 | Invalid argument |
178
+ | `EIO` | -5 | I/O error |
179
+ | `ENOSPC` | -28 | No space left |
180
+ | `EBUSY` | -16 | Busy |
181
+ | `EINTR` | -4 | Interrupted |
182
+ | `ENOTSUP` | -95 | Not supported |
183
+ | `ERANGE` | -34 | Result too large |
184
+ | `EBADF` | -9 | Bad file descriptor |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opfs-worker",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "A robust TypeScript library for working with Origin Private File System (OPFS) through Web Workers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -66,7 +66,7 @@
66
66
  "prepublishOnly": "bun run lint && bun run type-check && bun run build",
67
67
  "changelog": "changeset",
68
68
  "version-packages": "changeset version",
69
- "release": "changeset publish"
69
+ "release": "bun run scripts/release.mjs"
70
70
  },
71
71
  "keywords": [
72
72
  "opfs",
@@ -89,33 +89,44 @@
89
89
  "homepage": "https://github.com/kachurun/opfs-worker#readme",
90
90
  "devDependencies": {
91
91
  "@changesets/cli": "^2.29.5",
92
+ "@codemirror/commands": "6.10.4",
93
+ "@codemirror/lang-cpp": "6.0.3",
92
94
  "@codemirror/lang-css": "6.3.1",
95
+ "@codemirror/lang-go": "6.0.1",
93
96
  "@codemirror/lang-html": "6.4.11",
97
+ "@codemirror/lang-java": "6.0.2",
94
98
  "@codemirror/lang-javascript": "6.2.5",
95
99
  "@codemirror/lang-json": "6.0.2",
96
100
  "@codemirror/lang-markdown": "6.5.1",
101
+ "@codemirror/lang-php": "6.0.2",
102
+ "@codemirror/lang-python": "6.2.1",
103
+ "@codemirror/lang-rust": "6.0.2",
104
+ "@codemirror/lang-sql": "6.10.0",
97
105
  "@codemirror/lang-xml": "6.1.0",
106
+ "@codemirror/lang-yaml": "6.1.3",
107
+ "@codemirror/language": "6.12.4",
108
+ "@codemirror/legacy-modes": "6.5.3",
109
+ "@codemirror/state": "6.7.1",
98
110
  "@codemirror/theme-one-dark": "6.1.3",
111
+ "@codemirror/view": "6.43.6",
99
112
  "@flexbe/eslint-config": "^1.0.11",
100
113
  "@tailwindcss/vite": "4.3.3",
101
114
  "@types/minimatch": "^6.0.0",
102
115
  "@types/node": "^24.2.0",
103
- "@types/react": "^19.1.9",
104
- "@types/react-dom": "^19.1.7",
105
116
  "@typescript-eslint/eslint-plugin": "^8.39.0",
106
117
  "@typescript-eslint/parser": "^8.39.0",
107
- "@uiw/react-codemirror": "4.25.11",
108
118
  "@vitest/coverage-v8": "^3.2.4",
109
119
  "daisyui": "5.7.4",
110
120
  "eslint": "^9.32.0",
121
+ "fflate": "0.8.3",
111
122
  "happy-dom": "^18.0.1",
112
- "lucide-react": "1.26.0",
113
- "react": "^19.1.1",
114
- "react-dom": "^19.1.1",
115
- "react-icons": "5.7.0",
123
+ "lucide-solid": "1.27.0",
124
+ "solid-icons": "1.2.0",
125
+ "solid-js": "1.9.14",
116
126
  "tailwindcss": "4.3.3",
117
127
  "typescript": "^5.9.2",
118
128
  "vite": "^7.0.6",
129
+ "vite-plugin-solid": "2.11.13",
119
130
  "vitest": "^3.2.4"
120
131
  },
121
132
  "engines": {