├── .gitignore ├── .prettierrc ├── README.md ├── bin └── index.js ├── demo ├── index.html ├── main-thread.js ├── module-workers-polyfill.min.js ├── node.mjs ├── script.js ├── worker.js └── wrapped-worker.js ├── index.d.ts ├── index.mjs ├── node.mjs ├── package-lock.json ├── package.json ├── sqlite-wasm └── jswasm │ ├── sqlite3-bundler-friendly.mjs │ ├── sqlite3-node.mjs │ ├── sqlite3-opfs-async-proxy.js │ ├── sqlite3-worker1-bundler-friendly.mjs │ ├── sqlite3-worker1-promiser.js │ ├── sqlite3-worker1-promiser.mjs │ ├── sqlite3-worker1.js │ ├── sqlite3.js │ ├── sqlite3.mjs │ └── sqlite3.wasm └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | # Compiled output 3 | /dist 4 | /tmp 5 | /out-tsc 6 | /bazel-out 7 | 8 | # Node 9 | /node_modules 10 | npm-debug.log 11 | yarn-error.log 12 | 13 | # IDEs and editors 14 | .idea/ 15 | .project 16 | .classpath 17 | .c9/ 18 | *.launch 19 | .settings/ 20 | *.sublime-workspace 21 | 22 | # Visual Studio Code 23 | .vscode/* 24 | !.vscode/settings.json 25 | !.vscode/tasks.json 26 | !.vscode/launch.json 27 | !.vscode/extensions.json 28 | .history/* 29 | 30 | # Miscellaneous 31 | /connect.lock 32 | /coverage 33 | /libpeerconnection.log 34 | testem.log 35 | /typings 36 | 37 | # System files 38 | .DS_Store 39 | Thumbs.db 40 | 41 | node_modules/* 42 | dist/ 43 | bundle -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "bracketSpacing": true, 4 | "embeddedLanguageFormatting": "auto", 5 | "htmlWhitespaceSensitivity": "css", 6 | "insertPragma": false, 7 | "bracketSameLine": false, 8 | "jsxSingleQuote": false, 9 | "printWidth": 80, 10 | "proseWrap": "always", 11 | "quoteProps": "as-needed", 12 | "requirePragma": false, 13 | "semi": true, 14 | "singleQuote": true, 15 | "tabWidth": 2, 16 | "trailingComma": "all", 17 | "useTabs": false, 18 | "vueIndentScriptAndStyle": false, 19 | "plugins": ["prettier-plugin-jsdoc"] 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SQLite Wasm 2 | 3 | SQLite Wasm conveniently wrapped as an ES Module. 4 | 5 | ## Bug reports 6 | 7 | > [!Warning] 8 | > 9 | > This project wraps the code of 10 | > [SQLite Wasm](https://sqlite.org/wasm/doc/trunk/index.md) with _no_ changes, 11 | > apart from added TypeScript types. Please do _not_ file issues or feature 12 | > requests regarding the underlying SQLite Wasm code here. Instead, please 13 | > follow the 14 | > [SQLite bug filing instructions](https://www.sqlite.org/src/wiki?name=Bug+Reports). 15 | > Filing TypeScript type related issues and feature requests is fine. 16 | 17 | ## Node.js support 18 | 19 | > [!Warning] 20 | > 21 | > Node.js is currently only supported for in-memory databases without 22 | > persistence. 23 | 24 | ## Installation 25 | 26 | ```bash 27 | npm install @sqlite.org/sqlite-wasm 28 | ``` 29 | 30 | ## Usage 31 | 32 | There are three ways to use SQLite Wasm: 33 | 34 | - [in the main thread with a wrapped worker](#in-a-wrapped-worker-with-opfs-if-available) 35 | (🏆 preferred option) 36 | - [in a worker](#in-a-worker-with-opfs-if-available) 37 | - [in the main thread](#in-the-main-thread-without-opfs) 38 | 39 | Only the worker versions allow you to use the origin private file system (OPFS) 40 | storage back-end. 41 | 42 | ### In a wrapped worker (with OPFS if available): 43 | 44 | > [!Warning] 45 | > 46 | > For this to work, you need to set the following headers on your server: 47 | > 48 | > `Cross-Origin-Opener-Policy: same-origin` 49 | > 50 | > `Cross-Origin-Embedder-Policy: require-corp` 51 | 52 | ```js 53 | import { sqlite3Worker1Promiser } from '@sqlite.org/sqlite-wasm'; 54 | 55 | const log = console.log; 56 | const error = console.error; 57 | 58 | const initializeSQLite = async () => { 59 | try { 60 | log('Loading and initializing SQLite3 module...'); 61 | 62 | const promiser = await new Promise((resolve) => { 63 | const _promiser = sqlite3Worker1Promiser({ 64 | onready: () => resolve(_promiser), 65 | }); 66 | }); 67 | 68 | log('Done initializing. Running demo...'); 69 | 70 | const configResponse = await promiser('config-get', {}); 71 | log('Running SQLite3 version', configResponse.result.version.libVersion); 72 | 73 | const openResponse = await promiser('open', { 74 | filename: 'file:mydb.sqlite3?vfs=opfs', 75 | }); 76 | const { dbId } = openResponse; 77 | log( 78 | 'OPFS is available, created persisted database at', 79 | openResponse.result.filename.replace(/^file:(.*?)\?vfs=opfs$/, '$1'), 80 | ); 81 | // Your SQLite code here. 82 | } catch (err) { 83 | if (!(err instanceof Error)) { 84 | err = new Error(err.result.message); 85 | } 86 | error(err.name, err.message); 87 | } 88 | }; 89 | 90 | initializeSQLite(); 91 | ``` 92 | 93 | The `promiser` object above implements the 94 | [Worker1 API](https://sqlite.org/wasm/doc/trunk/api-worker1.md#worker1-methods). 95 | 96 | ### In a worker (with OPFS if available): 97 | 98 | > [!Warning] 99 | > 100 | > For this to work, you need to set the following headers on your server: 101 | > 102 | > `Cross-Origin-Opener-Policy: same-origin` 103 | > 104 | > `Cross-Origin-Embedder-Policy: require-corp` 105 | 106 | ```js 107 | // In `main.js`. 108 | const worker = new Worker('worker.js', { type: 'module' }); 109 | ``` 110 | 111 | ```js 112 | // In `worker.js`. 113 | import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; 114 | 115 | const log = console.log; 116 | const error = console.error; 117 | 118 | const start = (sqlite3) => { 119 | log('Running SQLite3 version', sqlite3.version.libVersion); 120 | const db = 121 | 'opfs' in sqlite3 122 | ? new sqlite3.oo1.OpfsDb('/mydb.sqlite3') 123 | : new sqlite3.oo1.DB('/mydb.sqlite3', 'ct'); 124 | log( 125 | 'opfs' in sqlite3 126 | ? `OPFS is available, created persisted database at ${db.filename}` 127 | : `OPFS is not available, created transient database ${db.filename}`, 128 | ); 129 | // Your SQLite code here. 130 | }; 131 | 132 | const initializeSQLite = async () => { 133 | try { 134 | log('Loading and initializing SQLite3 module...'); 135 | const sqlite3 = await sqlite3InitModule({ print: log, printErr: error }); 136 | log('Done initializing. Running demo...'); 137 | start(sqlite3); 138 | } catch (err) { 139 | error('Initialization error:', err.name, err.message); 140 | } 141 | }; 142 | 143 | initializeSQLite(); 144 | ``` 145 | 146 | The `db` object above implements the 147 | [Object Oriented API #1](https://sqlite.org/wasm/doc/trunk/api-oo1.md). 148 | 149 | ### In the main thread (without OPFS): 150 | 151 | ```js 152 | import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; 153 | 154 | const log = console.log; 155 | const error = console.error; 156 | 157 | const start = (sqlite3) => { 158 | log('Running SQLite3 version', sqlite3.version.libVersion); 159 | const db = new sqlite3.oo1.DB('/mydb.sqlite3', 'ct'); 160 | // Your SQLite code here. 161 | }; 162 | 163 | const initializeSQLite = async () => { 164 | try { 165 | log('Loading and initializing SQLite3 module...'); 166 | const sqlite3 = await sqlite3InitModule({ 167 | print: log, 168 | printErr: error, 169 | }); 170 | log('Done initializing. Running demo...'); 171 | start(sqlite3); 172 | } catch (err) { 173 | error('Initialization error:', err.name, err.message); 174 | } 175 | }; 176 | 177 | initializeSQLite(); 178 | ``` 179 | 180 | The `db` object above implements the 181 | [Object Oriented API #1](https://sqlite.org/wasm/doc/trunk/api-oo1.md). 182 | 183 | ## Usage with vite 184 | 185 | If you are using [vite](https://vitejs.dev/), you need to add the following 186 | config option in `vite.config.js`: 187 | 188 | ```js 189 | import { defineConfig } from 'vite'; 190 | 191 | export default defineConfig({ 192 | server: { 193 | headers: { 194 | 'Cross-Origin-Opener-Policy': 'same-origin', 195 | 'Cross-Origin-Embedder-Policy': 'require-corp', 196 | }, 197 | }, 198 | optimizeDeps: { 199 | exclude: ['@sqlite.org/sqlite-wasm'], 200 | }, 201 | }); 202 | ``` 203 | 204 | Check out a 205 | [sample project](https://stackblitz.com/edit/vitejs-vite-ttrbwh?file=main.js) 206 | that shows this in action. 207 | 208 | ## Demo 209 | 210 | See the [demo](https://github.com/sqlite/sqlite-wasm/tree/main/demo) folder for 211 | examples of how to use this in the main thread and in a worker. (Note that the 212 | worker variant requires special HTTP headers, so it can't be hosted on GitHub 213 | Pages.) An example that shows how to use this with vite is available on 214 | [StackBlitz](https://stackblitz.com/edit/vitejs-vite-ttrbwh?file=main.js). 215 | 216 | ## Projects using this package 217 | 218 | See the list of 219 | [npm dependents](https://www.npmjs.com/browse/depended/@sqlite.org/sqlite-wasm) 220 | for this package. 221 | 222 | ## Deploying a new version 223 | 224 | (These steps can only be executed by maintainers.) 225 | 226 | 1. Update the version number in `package.json` reflecting the current 227 | [SQLite version number](https://sqlite.org/download.html) and add a build 228 | identifier suffix like `-build1`. The complete version number should read 229 | something like `3.41.2-build1`. 230 | 1. Run `npm run build` to build the ES Module. This downloads the latest SQLite 231 | Wasm binary and builds the ES Module. 232 | 1. Run `npm run deploy` to commit the changes, push to GitHub, and publish the 233 | new version to npm. 234 | 235 | ## License 236 | 237 | Apache 2.0. 238 | 239 | ## Acknowledgements 240 | 241 | This project is based on [SQLite Wasm](https://sqlite.org/wasm), which it 242 | conveniently wraps as an ES Module and publishes to npm as 243 | [`@sqlite.org/sqlite-wasm`](https://www.npmjs.com/package/@sqlite.org/sqlite-wasm). 244 | -------------------------------------------------------------------------------- /bin/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import fs from 'fs'; 3 | import fetch from 'node-fetch'; 4 | import decompress from 'decompress'; 5 | 6 | async function getSqliteWasmDownloadLink() { 7 | const response = await fetch('https://sqlite.org/download.html'); 8 | const html = await response.text(); 9 | const sqliteWasmLink = 10 | 'https://sqlite.org/' + 11 | html 12 | .replace( 13 | /^.*?.*?$/gms, 14 | '$1', 15 | ) 16 | .split(/\n/) 17 | .filter((row) => /sqlite-wasm/.test(row))[0] 18 | .split(/,/)[2]; 19 | console.log(`Found SQLite Wasm download link: ${sqliteWasmLink}`); 20 | return sqliteWasmLink; 21 | } 22 | 23 | async function downloadAndUnzipSqliteWasm(sqliteWasmDownloadLink) { 24 | if (!sqliteWasmDownloadLink) { 25 | throw new Error('Unable to find SQLite Wasm download link'); 26 | } 27 | console.log('Downloading and unzipping SQLite Wasm...'); 28 | const response = await fetch(sqliteWasmDownloadLink); 29 | if (!response.ok || response.status !== 200) { 30 | throw new Error( 31 | `Unable to download SQLite Wasm from ${sqliteWasmDownloadLink}`, 32 | ); 33 | } 34 | const buffer = await response.arrayBuffer(); 35 | fs.writeFileSync('sqlite-wasm.zip', Buffer.from(buffer)); 36 | const files = await decompress('sqlite-wasm.zip', 'sqlite-wasm', { 37 | strip: 1, 38 | filter: (file) => 39 | /jswasm/.test(file.path) && /(\.mjs|\.wasm|\.js)$/.test(file.path), 40 | }); 41 | console.log( 42 | `Downloaded and unzipped:\n${files 43 | .map((file) => (/\//.test(file.path) ? '‣ ' + file.path + '\n' : '')) 44 | .join('')}`, 45 | ); 46 | fs.rmSync('sqlite-wasm.zip'); 47 | } 48 | 49 | async function main() { 50 | try { 51 | const sqliteWasmLink = await getSqliteWasmDownloadLink(); 52 | await downloadAndUnzipSqliteWasm(sqliteWasmLink); 53 | fs.copyFileSync( 54 | './node_modules/module-workers-polyfill/module-workers-polyfill.min.js', 55 | './demo/module-workers-polyfill.min.js', 56 | ); 57 | } catch (err) { 58 | console.error(err.name, err.message); 59 | } 60 | } 61 | 62 | main(); 63 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SQLite Wasm Demo 6 | 7 | 8 | 9 | 10 | 11 |

SQLite Wasm Demo

12 |

Wrapped Worker

13 |
14 |

Worker

15 |
16 |

Main thread

17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /demo/main-thread.js: -------------------------------------------------------------------------------- 1 | import sqlite3InitModule from '../index.mjs'; 2 | 3 | const container = document.querySelector('.main-thread'); 4 | 5 | const logHtml = function (cssClass, ...args) { 6 | const div = document.createElement('div'); 7 | if (cssClass) div.classList.add(cssClass); 8 | div.append(document.createTextNode(args.join(' '))); 9 | container.append(div); 10 | }; 11 | 12 | const log = (...args) => logHtml('', ...args); 13 | const error = (...args) => logHtml('error', ...args); 14 | 15 | const start = function (sqlite3) { 16 | log('Running SQLite3 version', sqlite3.version.libVersion); 17 | const db = new sqlite3.oo1.DB('/mydb.sqlite3', 'ct'); 18 | log('Created transient database', db.filename); 19 | 20 | try { 21 | log('Creating a table...'); 22 | db.exec('CREATE TABLE IF NOT EXISTS t(a,b)'); 23 | log('Insert some data using exec()...'); 24 | for (let i = 20; i <= 25; ++i) { 25 | db.exec({ 26 | sql: 'INSERT INTO t(a,b) VALUES (?,?)', 27 | bind: [i, i * 2], 28 | }); 29 | } 30 | log('Query data with exec()...'); 31 | db.exec({ 32 | sql: 'SELECT a FROM t ORDER BY a LIMIT 3', 33 | callback: (row) => { 34 | log(row); 35 | }, 36 | }); 37 | } finally { 38 | db.close(); 39 | } 40 | }; 41 | 42 | log('Loading and initializing SQLite3 module...'); 43 | sqlite3InitModule({ 44 | print: log, 45 | printErr: error, 46 | }).then((sqlite3) => { 47 | log('Done initializing. Running demo...'); 48 | try { 49 | start(sqlite3); 50 | } catch (err) { 51 | error(err.name, err.message); 52 | } 53 | }); 54 | -------------------------------------------------------------------------------- /demo/module-workers-polyfill.min.js: -------------------------------------------------------------------------------- 1 | !(function (e) { 2 | if (!e || !0 !== e._$P) { 3 | if (e) { 4 | var n, 5 | r = Object.defineProperty({}, 'type', { 6 | get: function () { 7 | n = !0; 8 | }, 9 | }); 10 | try { 11 | var t = URL.createObjectURL( 12 | new Blob([''], { type: 'text/javascript' }), 13 | ); 14 | new e(t, r).terminate(), URL.revokeObjectURL(t); 15 | } catch (e) {} 16 | if (!n) 17 | try { 18 | new e('data:text/javascript,', r).terminate(); 19 | } catch (e) {} 20 | if (n) return; 21 | (self.Worker = function (n, r) { 22 | return ( 23 | r && 24 | 'module' == r.type && 25 | ((r = { name: n + '\n' + (r.name || '') }), 26 | (n = 27 | 'undefined' == typeof document 28 | ? location.href 29 | : (document.currentScript && document.currentScript.src) || 30 | new Error().stack.match( 31 | /[(@]((file|https?):\/\/[^)]+?):\d+(:\d+)?(?:\)|$)/m, 32 | )[1])), 33 | new e(n, r) 34 | ); 35 | })._$P = !0; 36 | } 37 | 'undefined' == typeof document && 38 | (function () { 39 | var e = {}, 40 | n = {}; 41 | function r(e, n) { 42 | for ( 43 | n = n.replace(/^(\.\.\/|\.\/)/, e.replace(/[^/]+$/g, '') + '$1'); 44 | n !== (n = n.replace(/[^/]+\/\.\.\//g, '')); 45 | 46 | ); 47 | return n.replace(/\.\//g, ''); 48 | } 49 | var t = [], 50 | s = t.push.bind(t); 51 | addEventListener('message', s); 52 | var a = self.name.match(/^[^\n]+/)[0]; 53 | (self.name = self.name.replace(/^[^\n]*\n/g, '')), 54 | (function t(s, a) { 55 | var u, 56 | o = s; 57 | return ( 58 | a && (s = r(a, s)), 59 | e[s] || 60 | (e[s] = fetch(s).then(function (a) { 61 | if ((o = a.url) !== s) { 62 | if (null != e[o]) return e[o]; 63 | e[o] = e[s]; 64 | } 65 | return a.text().then(function (e) { 66 | if (!a.ok) throw e; 67 | var c = { exports: {} }; 68 | u = n[o] || (n[o] = c.exports); 69 | var i = function (e) { 70 | return t(e, o); 71 | }, 72 | f = []; 73 | return ( 74 | (e = (function (e, n) { 75 | n = n || []; 76 | var r, 77 | t = [], 78 | a = 0; 79 | function u(e, n) { 80 | for ( 81 | var s, 82 | a = /(?:^|,)\s*([\w$]+)(?:\s+as\s+([\w$]+))?\s*/g, 83 | u = []; 84 | (s = a.exec(e)); 85 | 86 | ) 87 | n 88 | ? t.push((s[2] || s[1]) + ':' + s[1]) 89 | : u.push((s[2] || s[1]) + '=' + r + '.' + s[1]); 90 | return u; 91 | } 92 | return ( 93 | (e = e 94 | .replace( 95 | /(^\s*|[;}\s\n]\s*)import\s*(?:(?:([\w$]+)(?:\s*\,\s*\{([^}]+)\})?|(?:\*\s*as\s+([\w$]+))|\{([^}]*)\})\s*from)?\s*(['"])(.+?)\6/g, 96 | function (e, t, s, o, c, i, f, p) { 97 | return ( 98 | n.push(p), 99 | (t += 100 | 'var ' + 101 | (r = '$im$' + ++a) + 102 | '=$require(' + 103 | f + 104 | p + 105 | f + 106 | ')'), 107 | s && 108 | (t += 109 | ';var ' + 110 | s + 111 | " = 'default' in " + 112 | r + 113 | ' ? ' + 114 | r + 115 | '.default : ' + 116 | r), 117 | c && (t += ';var ' + c + ' = ' + r), 118 | (o = o || i) && (t += ';var ' + u(o, !1)), 119 | t 120 | ); 121 | }, 122 | ) 123 | .replace( 124 | /((?:^|[;}\s\n])\s*)export\s*(?:\s+(default)\s+|((?:async\s+)?function\s*\*?|class|const\s|let\s|var\s)\s*([a-zA-Z0-9$_{[]+))/g, 125 | function (e, n, r, s, u) { 126 | if (r) { 127 | var o = '$im$' + ++a; 128 | return ( 129 | t.push('default:' + o), n + 'var ' + o + '=' 130 | ); 131 | } 132 | return t.push(u + ':' + u), n + s + ' ' + u; 133 | }, 134 | ) 135 | .replace( 136 | /((?:^|[;}\s\n])\s*)export\s*\{([^}]+)\}\s*;?/g, 137 | function (e, n, r) { 138 | return u(r, !0), n; 139 | }, 140 | ) 141 | .replace( 142 | /((?:^|[^a-zA-Z0-9$_@`'".])\s*)(import\s*\([\s\S]+?\))/g, 143 | '$1$$$2', 144 | )).replace( 145 | /((?:^|[^a-zA-Z0-9$_@`'".])\s*)import\.meta\.url/g, 146 | '$1' + JSON.stringify(s), 147 | ) + 148 | '\n$module.exports={' + 149 | t.join(',') + 150 | '}' 151 | ); 152 | })(e, f)), 153 | Promise.all( 154 | f.map(function (e) { 155 | var s = r(o, e); 156 | return s in n ? n[s] : t(s); 157 | }), 158 | ).then(function (n) { 159 | e += '\n//# sourceURL=' + s; 160 | try { 161 | var r = new Function( 162 | '$import', 163 | '$require', 164 | '$module', 165 | '$exports', 166 | e, 167 | ); 168 | } catch (n) { 169 | var t = n.line - 1, 170 | a = n.column, 171 | o = e.split('\n'), 172 | p = 173 | (o[t - 2] || '') + 174 | '\n' + 175 | o[t - 1] + 176 | '\n' + 177 | (null == a 178 | ? '' 179 | : new Array(a).join('-') + '^\n') + 180 | (o[t] || ''), 181 | l = new Error(n.message + '\n\n' + p, s, t); 182 | throw ( 183 | ((l.sourceURL = l.fileName = s), 184 | (l.line = t), 185 | (l.column = a), 186 | l) 187 | ); 188 | } 189 | var m = r( 190 | i, 191 | function (e) { 192 | return n[f.indexOf(e)]; 193 | }, 194 | c, 195 | c.exports, 196 | ); 197 | return ( 198 | null != m && (c.exports = m), 199 | Object.assign(u, c.exports), 200 | c.exports 201 | ); 202 | }) 203 | ); 204 | }); 205 | })) 206 | ); 207 | })(a) 208 | .then(function () { 209 | removeEventListener('message', s), t.map(dispatchEvent); 210 | }) 211 | .catch(function (e) { 212 | setTimeout(function () { 213 | throw e; 214 | }); 215 | }); 216 | })(); 217 | } 218 | })(self.Worker); 219 | -------------------------------------------------------------------------------- /demo/node.mjs: -------------------------------------------------------------------------------- 1 | import sqlite3InitModule from '../node.mjs'; 2 | 3 | const log = (...args) => console.log(...args); 4 | const error = (...args) => console.error(...args); 5 | 6 | const start = function (sqlite3) { 7 | log('Running SQLite3 version', sqlite3.version.libVersion); 8 | 9 | const db = new sqlite3.oo1.DB('./local', 'cw'); 10 | 11 | try { 12 | log('Creating a table...'); 13 | db.exec('CREATE TABLE IF NOT EXISTS t(a,b)'); 14 | log('Insert some data using exec()...'); 15 | for (let i = 20; i <= 25; ++i) { 16 | db.exec({ 17 | sql: 'INSERT INTO t(a,b) VALUES (?,?)', 18 | bind: [i, i * 2], 19 | }); 20 | } 21 | log('Query data with exec()...'); 22 | db.exec({ 23 | sql: 'SELECT a FROM t ORDER BY a LIMIT 3', 24 | callback: (row) => { 25 | log(row); 26 | }, 27 | }); 28 | } finally { 29 | db.close(); 30 | } 31 | }; 32 | 33 | log('Loading and initializing SQLite3 module...'); 34 | sqlite3InitModule({ 35 | print: log, 36 | printErr: error, 37 | }).then((sqlite3) => { 38 | log('Done initializing. Running demo...'); 39 | try { 40 | start(sqlite3); 41 | } catch (err) { 42 | error(err.name, err.message); 43 | } 44 | }); 45 | -------------------------------------------------------------------------------- /demo/script.js: -------------------------------------------------------------------------------- 1 | const container = document.querySelector('.worker'); 2 | 3 | const logHtml = (cssClass, ...args) => { 4 | const div = document.createElement('div'); 5 | if (cssClass) div.classList.add(cssClass); 6 | div.append(document.createTextNode(args.join(' '))); 7 | container.append(div); 8 | }; 9 | 10 | (async () => { 11 | // Module Worker polyfill from https://stackoverflow.com/a/62963963/6255000. 12 | const supportsWorkerType = () => { 13 | let supports = false; 14 | const tester = { 15 | get type() { 16 | supports = true; 17 | }, 18 | }; 19 | try { 20 | new Worker('data:,""', tester); 21 | } finally { 22 | return supports; 23 | } 24 | }; 25 | if (!supportsWorkerType()) { 26 | await import('./module-workers-polyfill.min.js'); 27 | } 28 | 29 | const worker = new Worker('/demo/worker.js', { 30 | type: 'module', 31 | }); 32 | 33 | worker.addEventListener('message', ({ data }) => { 34 | switch (data.type) { 35 | case 'log': 36 | logHtml(data.payload.cssClass, ...data.payload.args); 37 | break; 38 | default: 39 | logHtml('error', 'Unhandled message:', data.type); 40 | } 41 | }); 42 | })(); 43 | -------------------------------------------------------------------------------- /demo/worker.js: -------------------------------------------------------------------------------- 1 | import sqlite3InitModule from '../index.mjs'; 2 | 3 | const logHtml = function (cssClass, ...args) { 4 | postMessage({ 5 | type: 'log', 6 | payload: { cssClass, args }, 7 | }); 8 | }; 9 | 10 | const log = (...args) => logHtml('', ...args); 11 | const error = (...args) => logHtml('error', ...args); 12 | 13 | const start = function (sqlite3) { 14 | log('Running SQLite3 version', sqlite3.version.libVersion); 15 | let db; 16 | if ('opfs' in sqlite3) { 17 | db = new sqlite3.oo1.OpfsDb('/mydb.sqlite3'); 18 | log('OPFS is available, created persisted database at', db.filename); 19 | } else { 20 | db = new sqlite3.oo1.DB('/mydb.sqlite3', 'ct'); 21 | log('OPFS is not available, created transient database', db.filename); 22 | } 23 | try { 24 | log('Creating a table...'); 25 | db.exec('CREATE TABLE IF NOT EXISTS t(a,b)'); 26 | log('Insert some data using exec()...'); 27 | for (let i = 20; i <= 25; ++i) { 28 | db.exec({ 29 | sql: 'INSERT INTO t(a,b) VALUES (?,?)', 30 | bind: [i, i * 2], 31 | }); 32 | } 33 | log('Query data with exec()...'); 34 | db.exec({ 35 | sql: 'SELECT a FROM t ORDER BY a LIMIT 3', 36 | callback: (row) => { 37 | log(row); 38 | }, 39 | }); 40 | } finally { 41 | db.close(); 42 | } 43 | }; 44 | 45 | log('Loading and initializing SQLite3 module...'); 46 | sqlite3InitModule({ 47 | print: log, 48 | printErr: error, 49 | }).then((sqlite3) => { 50 | log('Done initializing. Running demo...'); 51 | try { 52 | start(sqlite3); 53 | } catch (err) { 54 | error(err.name, err.message); 55 | } 56 | }); 57 | -------------------------------------------------------------------------------- /demo/wrapped-worker.js: -------------------------------------------------------------------------------- 1 | import { sqlite3Worker1Promiser } from '../index.mjs'; 2 | 3 | (async () => { 4 | const container = document.querySelector('.worker-promiser'); 5 | 6 | const logHtml = function (cssClass, ...args) { 7 | const div = document.createElement('div'); 8 | if (cssClass) div.classList.add(cssClass); 9 | div.append(document.createTextNode(args.join(' '))); 10 | container.append(div); 11 | }; 12 | 13 | try { 14 | logHtml('', 'Loading and initializing SQLite3 module...'); 15 | 16 | const promiser = await new Promise((resolve) => { 17 | const _promiser = sqlite3Worker1Promiser({ 18 | onready: () => { 19 | resolve(_promiser); 20 | }, 21 | }); 22 | }); 23 | 24 | logHtml('', 'Done initializing. Running demo...'); 25 | 26 | let response; 27 | 28 | response = await promiser('config-get', {}); 29 | logHtml('', 'Running SQLite3 version', response.result.version.libVersion); 30 | 31 | response = await promiser('open', { 32 | filename: 'file:worker-promiser.sqlite3?vfs=opfs', 33 | }); 34 | const { dbId } = response; 35 | logHtml( 36 | '', 37 | 'OPFS is available, created persisted database at', 38 | response.result.filename.replace(/^file:(.*?)\?vfs=opfs/, '$1'), 39 | ); 40 | 41 | await promiser('exec', { dbId, sql: 'CREATE TABLE IF NOT EXISTS t(a,b)' }); 42 | logHtml('', 'Creating a table...'); 43 | 44 | logHtml('', 'Insert some data using exec()...'); 45 | for (let i = 20; i <= 25; ++i) { 46 | await promiser('exec', { 47 | dbId, 48 | sql: 'INSERT INTO t(a,b) VALUES (?,?)', 49 | bind: [i, i * 2], 50 | }); 51 | } 52 | 53 | logHtml('', 'Query data with exec()'); 54 | await promiser('exec', { 55 | dbId, 56 | sql: 'SELECT a FROM t ORDER BY a LIMIT 3', 57 | callback: (result) => { 58 | if (!result.row) { 59 | return; 60 | } 61 | logHtml('', result.row); 62 | }, 63 | }); 64 | 65 | await promiser('close', { dbId }); 66 | } catch (err) { 67 | if (!(err instanceof Error)) { 68 | err = new Error(err.result.message); 69 | } 70 | console.error(err.name, err.message); 71 | } 72 | })(); 73 | -------------------------------------------------------------------------------- /index.mjs: -------------------------------------------------------------------------------- 1 | import { default as sqlite3InitModule } from './sqlite-wasm/jswasm/sqlite3-bundler-friendly.mjs'; 2 | import './sqlite-wasm/jswasm/sqlite3-worker1-promiser.mjs'; 3 | 4 | const sqlite3Worker1Promiser = globalThis.sqlite3Worker1Promiser; 5 | 6 | export default sqlite3InitModule; 7 | export { sqlite3Worker1Promiser }; 8 | -------------------------------------------------------------------------------- /node.mjs: -------------------------------------------------------------------------------- 1 | import { default as sqlite3InitModule } from './sqlite-wasm/jswasm/sqlite3-node.mjs'; 2 | 3 | export default sqlite3InitModule; 4 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sqlite.org/sqlite-wasm", 3 | "version": "3.49.2-build1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@sqlite.org/sqlite-wasm", 9 | "version": "3.49.2-build1", 10 | "license": "Apache-2.0", 11 | "bin": { 12 | "sqlite-wasm": "bin/index.js" 13 | }, 14 | "devDependencies": { 15 | "decompress": "^4.2.1", 16 | "http-server": "github:vapier/http-server", 17 | "module-workers-polyfill": "^0.3.2", 18 | "node-fetch": "^3.3.2", 19 | "prettier": "^3.5.3", 20 | "prettier-plugin-jsdoc": "^1.3.2", 21 | "publint": "^0.3.12", 22 | "shx": "^0.4.0", 23 | "typescript": "^5.8.3" 24 | } 25 | }, 26 | "node_modules/@nodelib/fs.scandir": { 27 | "version": "2.1.5", 28 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 29 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 30 | "dev": true, 31 | "license": "MIT", 32 | "dependencies": { 33 | "@nodelib/fs.stat": "2.0.5", 34 | "run-parallel": "^1.1.9" 35 | }, 36 | "engines": { 37 | "node": ">= 8" 38 | } 39 | }, 40 | "node_modules/@nodelib/fs.stat": { 41 | "version": "2.0.5", 42 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 43 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 44 | "dev": true, 45 | "license": "MIT", 46 | "engines": { 47 | "node": ">= 8" 48 | } 49 | }, 50 | "node_modules/@nodelib/fs.walk": { 51 | "version": "1.2.8", 52 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 53 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 54 | "dev": true, 55 | "license": "MIT", 56 | "dependencies": { 57 | "@nodelib/fs.scandir": "2.1.5", 58 | "fastq": "^1.6.0" 59 | }, 60 | "engines": { 61 | "node": ">= 8" 62 | } 63 | }, 64 | "node_modules/@publint/pack": { 65 | "version": "0.1.2", 66 | "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.2.tgz", 67 | "integrity": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==", 68 | "dev": true, 69 | "license": "MIT", 70 | "engines": { 71 | "node": ">=18" 72 | }, 73 | "funding": { 74 | "url": "https://bjornlu.com/sponsor" 75 | } 76 | }, 77 | "node_modules/@types/debug": { 78 | "version": "4.1.9", 79 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", 80 | "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", 81 | "dev": true, 82 | "dependencies": { 83 | "@types/ms": "*" 84 | } 85 | }, 86 | "node_modules/@types/mdast": { 87 | "version": "4.0.1", 88 | "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.1.tgz", 89 | "integrity": "sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g==", 90 | "dev": true, 91 | "dependencies": { 92 | "@types/unist": "*" 93 | } 94 | }, 95 | "node_modules/@types/ms": { 96 | "version": "0.7.32", 97 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", 98 | "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==", 99 | "dev": true 100 | }, 101 | "node_modules/@types/unist": { 102 | "version": "3.0.0", 103 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", 104 | "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==", 105 | "dev": true 106 | }, 107 | "node_modules/ansi-styles": { 108 | "version": "4.3.0", 109 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 110 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 111 | "dev": true, 112 | "dependencies": { 113 | "color-convert": "^2.0.1" 114 | }, 115 | "engines": { 116 | "node": ">=8" 117 | }, 118 | "funding": { 119 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 120 | } 121 | }, 122 | "node_modules/async": { 123 | "version": "2.6.4", 124 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", 125 | "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", 126 | "dev": true, 127 | "dependencies": { 128 | "lodash": "^4.17.14" 129 | } 130 | }, 131 | "node_modules/base64-js": { 132 | "version": "1.5.1", 133 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 134 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 135 | "dev": true, 136 | "funding": [ 137 | { 138 | "type": "github", 139 | "url": "https://github.com/sponsors/feross" 140 | }, 141 | { 142 | "type": "patreon", 143 | "url": "https://www.patreon.com/feross" 144 | }, 145 | { 146 | "type": "consulting", 147 | "url": "https://feross.org/support" 148 | } 149 | ] 150 | }, 151 | "node_modules/basic-auth": { 152 | "version": "2.0.1", 153 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 154 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 155 | "dev": true, 156 | "dependencies": { 157 | "safe-buffer": "5.1.2" 158 | }, 159 | "engines": { 160 | "node": ">= 0.8" 161 | } 162 | }, 163 | "node_modules/binary-searching": { 164 | "version": "2.0.5", 165 | "resolved": "https://registry.npmjs.org/binary-searching/-/binary-searching-2.0.5.tgz", 166 | "integrity": "sha512-v4N2l3RxL+m4zDxyxz3Ne2aTmiPn8ZUpKFpdPtO+ItW1NcTCXA7JeHG5GMBSvoKSkQZ9ycS+EouDVxYB9ufKWA==", 167 | "dev": true 168 | }, 169 | "node_modules/bl": { 170 | "version": "1.2.3", 171 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", 172 | "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", 173 | "dev": true, 174 | "dependencies": { 175 | "readable-stream": "^2.3.5", 176 | "safe-buffer": "^5.1.1" 177 | } 178 | }, 179 | "node_modules/braces": { 180 | "version": "3.0.3", 181 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 182 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 183 | "dev": true, 184 | "license": "MIT", 185 | "dependencies": { 186 | "fill-range": "^7.1.1" 187 | }, 188 | "engines": { 189 | "node": ">=8" 190 | } 191 | }, 192 | "node_modules/buffer": { 193 | "version": "5.7.1", 194 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 195 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 196 | "dev": true, 197 | "funding": [ 198 | { 199 | "type": "github", 200 | "url": "https://github.com/sponsors/feross" 201 | }, 202 | { 203 | "type": "patreon", 204 | "url": "https://www.patreon.com/feross" 205 | }, 206 | { 207 | "type": "consulting", 208 | "url": "https://feross.org/support" 209 | } 210 | ], 211 | "dependencies": { 212 | "base64-js": "^1.3.1", 213 | "ieee754": "^1.1.13" 214 | } 215 | }, 216 | "node_modules/buffer-alloc": { 217 | "version": "1.2.0", 218 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 219 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 220 | "dev": true, 221 | "dependencies": { 222 | "buffer-alloc-unsafe": "^1.1.0", 223 | "buffer-fill": "^1.0.0" 224 | } 225 | }, 226 | "node_modules/buffer-alloc-unsafe": { 227 | "version": "1.1.0", 228 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 229 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 230 | "dev": true 231 | }, 232 | "node_modules/buffer-crc32": { 233 | "version": "0.2.13", 234 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 235 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 236 | "dev": true, 237 | "engines": { 238 | "node": "*" 239 | } 240 | }, 241 | "node_modules/buffer-fill": { 242 | "version": "1.0.0", 243 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 244 | "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", 245 | "dev": true 246 | }, 247 | "node_modules/call-bind": { 248 | "version": "1.0.2", 249 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 250 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 251 | "dev": true, 252 | "dependencies": { 253 | "function-bind": "^1.1.1", 254 | "get-intrinsic": "^1.0.2" 255 | }, 256 | "funding": { 257 | "url": "https://github.com/sponsors/ljharb" 258 | } 259 | }, 260 | "node_modules/chalk": { 261 | "version": "4.1.2", 262 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 263 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 264 | "dev": true, 265 | "dependencies": { 266 | "ansi-styles": "^4.1.0", 267 | "supports-color": "^7.1.0" 268 | }, 269 | "engines": { 270 | "node": ">=10" 271 | }, 272 | "funding": { 273 | "url": "https://github.com/chalk/chalk?sponsor=1" 274 | } 275 | }, 276 | "node_modules/character-entities": { 277 | "version": "2.0.2", 278 | "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", 279 | "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", 280 | "dev": true, 281 | "funding": { 282 | "type": "github", 283 | "url": "https://github.com/sponsors/wooorm" 284 | } 285 | }, 286 | "node_modules/color-convert": { 287 | "version": "2.0.1", 288 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 289 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 290 | "dev": true, 291 | "dependencies": { 292 | "color-name": "~1.1.4" 293 | }, 294 | "engines": { 295 | "node": ">=7.0.0" 296 | } 297 | }, 298 | "node_modules/color-name": { 299 | "version": "1.1.4", 300 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 301 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 302 | "dev": true 303 | }, 304 | "node_modules/commander": { 305 | "version": "2.20.3", 306 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 307 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 308 | "dev": true 309 | }, 310 | "node_modules/comment-parser": { 311 | "version": "1.4.0", 312 | "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", 313 | "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", 314 | "dev": true, 315 | "engines": { 316 | "node": ">= 12.0.0" 317 | } 318 | }, 319 | "node_modules/core-util-is": { 320 | "version": "1.0.2", 321 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 322 | "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", 323 | "dev": true 324 | }, 325 | "node_modules/corser": { 326 | "version": "2.0.1", 327 | "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", 328 | "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", 329 | "dev": true, 330 | "engines": { 331 | "node": ">= 0.4.0" 332 | } 333 | }, 334 | "node_modules/cross-spawn": { 335 | "version": "6.0.6", 336 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", 337 | "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", 338 | "dev": true, 339 | "license": "MIT", 340 | "dependencies": { 341 | "nice-try": "^1.0.4", 342 | "path-key": "^2.0.1", 343 | "semver": "^5.5.0", 344 | "shebang-command": "^1.2.0", 345 | "which": "^1.2.9" 346 | }, 347 | "engines": { 348 | "node": ">=4.8" 349 | } 350 | }, 351 | "node_modules/data-uri-to-buffer": { 352 | "version": "4.0.1", 353 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 354 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 355 | "dev": true, 356 | "engines": { 357 | "node": ">= 12" 358 | } 359 | }, 360 | "node_modules/debug": { 361 | "version": "3.2.7", 362 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 363 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 364 | "dev": true, 365 | "dependencies": { 366 | "ms": "^2.1.1" 367 | } 368 | }, 369 | "node_modules/decode-named-character-reference": { 370 | "version": "1.0.2", 371 | "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", 372 | "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", 373 | "dev": true, 374 | "dependencies": { 375 | "character-entities": "^2.0.0" 376 | }, 377 | "funding": { 378 | "type": "github", 379 | "url": "https://github.com/sponsors/wooorm" 380 | } 381 | }, 382 | "node_modules/decompress": { 383 | "version": "4.2.1", 384 | "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", 385 | "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", 386 | "dev": true, 387 | "dependencies": { 388 | "decompress-tar": "^4.0.0", 389 | "decompress-tarbz2": "^4.0.0", 390 | "decompress-targz": "^4.0.0", 391 | "decompress-unzip": "^4.0.1", 392 | "graceful-fs": "^4.1.10", 393 | "make-dir": "^1.0.0", 394 | "pify": "^2.3.0", 395 | "strip-dirs": "^2.0.0" 396 | }, 397 | "engines": { 398 | "node": ">=4" 399 | } 400 | }, 401 | "node_modules/decompress-tar": { 402 | "version": "4.1.1", 403 | "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", 404 | "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", 405 | "dev": true, 406 | "dependencies": { 407 | "file-type": "^5.2.0", 408 | "is-stream": "^1.1.0", 409 | "tar-stream": "^1.5.2" 410 | }, 411 | "engines": { 412 | "node": ">=4" 413 | } 414 | }, 415 | "node_modules/decompress-tarbz2": { 416 | "version": "4.1.1", 417 | "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", 418 | "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", 419 | "dev": true, 420 | "dependencies": { 421 | "decompress-tar": "^4.1.0", 422 | "file-type": "^6.1.0", 423 | "is-stream": "^1.1.0", 424 | "seek-bzip": "^1.0.5", 425 | "unbzip2-stream": "^1.0.9" 426 | }, 427 | "engines": { 428 | "node": ">=4" 429 | } 430 | }, 431 | "node_modules/decompress-tarbz2/node_modules/file-type": { 432 | "version": "6.2.0", 433 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", 434 | "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", 435 | "dev": true, 436 | "engines": { 437 | "node": ">=4" 438 | } 439 | }, 440 | "node_modules/decompress-targz": { 441 | "version": "4.1.1", 442 | "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", 443 | "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", 444 | "dev": true, 445 | "dependencies": { 446 | "decompress-tar": "^4.1.1", 447 | "file-type": "^5.2.0", 448 | "is-stream": "^1.1.0" 449 | }, 450 | "engines": { 451 | "node": ">=4" 452 | } 453 | }, 454 | "node_modules/decompress-unzip": { 455 | "version": "4.0.1", 456 | "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", 457 | "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", 458 | "dev": true, 459 | "dependencies": { 460 | "file-type": "^3.8.0", 461 | "get-stream": "^2.2.0", 462 | "pify": "^2.3.0", 463 | "yauzl": "^2.4.2" 464 | }, 465 | "engines": { 466 | "node": ">=4" 467 | } 468 | }, 469 | "node_modules/decompress-unzip/node_modules/file-type": { 470 | "version": "3.9.0", 471 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", 472 | "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", 473 | "dev": true, 474 | "engines": { 475 | "node": ">=0.10.0" 476 | } 477 | }, 478 | "node_modules/dequal": { 479 | "version": "2.0.3", 480 | "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 481 | "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 482 | "dev": true, 483 | "engines": { 484 | "node": ">=6" 485 | } 486 | }, 487 | "node_modules/devlop": { 488 | "version": "1.1.0", 489 | "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", 490 | "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", 491 | "dev": true, 492 | "dependencies": { 493 | "dequal": "^2.0.0" 494 | }, 495 | "funding": { 496 | "type": "github", 497 | "url": "https://github.com/sponsors/wooorm" 498 | } 499 | }, 500 | "node_modules/end-of-stream": { 501 | "version": "1.4.4", 502 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 503 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 504 | "dev": true, 505 | "dependencies": { 506 | "once": "^1.4.0" 507 | } 508 | }, 509 | "node_modules/eventemitter3": { 510 | "version": "4.0.7", 511 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 512 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 513 | "dev": true 514 | }, 515 | "node_modules/execa": { 516 | "version": "1.0.0", 517 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 518 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 519 | "dev": true, 520 | "license": "MIT", 521 | "dependencies": { 522 | "cross-spawn": "^6.0.0", 523 | "get-stream": "^4.0.0", 524 | "is-stream": "^1.1.0", 525 | "npm-run-path": "^2.0.0", 526 | "p-finally": "^1.0.0", 527 | "signal-exit": "^3.0.0", 528 | "strip-eof": "^1.0.0" 529 | }, 530 | "engines": { 531 | "node": ">=6" 532 | } 533 | }, 534 | "node_modules/execa/node_modules/get-stream": { 535 | "version": "4.1.0", 536 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 537 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 538 | "dev": true, 539 | "license": "MIT", 540 | "dependencies": { 541 | "pump": "^3.0.0" 542 | }, 543 | "engines": { 544 | "node": ">=6" 545 | } 546 | }, 547 | "node_modules/fast-glob": { 548 | "version": "3.3.3", 549 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 550 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 551 | "dev": true, 552 | "license": "MIT", 553 | "dependencies": { 554 | "@nodelib/fs.stat": "^2.0.2", 555 | "@nodelib/fs.walk": "^1.2.3", 556 | "glob-parent": "^5.1.2", 557 | "merge2": "^1.3.0", 558 | "micromatch": "^4.0.8" 559 | }, 560 | "engines": { 561 | "node": ">=8.6.0" 562 | } 563 | }, 564 | "node_modules/fastq": { 565 | "version": "1.19.1", 566 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 567 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 568 | "dev": true, 569 | "license": "ISC", 570 | "dependencies": { 571 | "reusify": "^1.0.4" 572 | } 573 | }, 574 | "node_modules/fd-slicer": { 575 | "version": "1.1.0", 576 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 577 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 578 | "dev": true, 579 | "dependencies": { 580 | "pend": "~1.2.0" 581 | } 582 | }, 583 | "node_modules/fetch-blob": { 584 | "version": "3.2.0", 585 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 586 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 587 | "dev": true, 588 | "funding": [ 589 | { 590 | "type": "github", 591 | "url": "https://github.com/sponsors/jimmywarting" 592 | }, 593 | { 594 | "type": "paypal", 595 | "url": "https://paypal.me/jimmywarting" 596 | } 597 | ], 598 | "dependencies": { 599 | "node-domexception": "^1.0.0", 600 | "web-streams-polyfill": "^3.0.3" 601 | }, 602 | "engines": { 603 | "node": "^12.20 || >= 14.13" 604 | } 605 | }, 606 | "node_modules/file-type": { 607 | "version": "5.2.0", 608 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", 609 | "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", 610 | "dev": true, 611 | "engines": { 612 | "node": ">=4" 613 | } 614 | }, 615 | "node_modules/fill-range": { 616 | "version": "7.1.1", 617 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 618 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 619 | "dev": true, 620 | "license": "MIT", 621 | "dependencies": { 622 | "to-regex-range": "^5.0.1" 623 | }, 624 | "engines": { 625 | "node": ">=8" 626 | } 627 | }, 628 | "node_modules/follow-redirects": { 629 | "version": "1.15.6", 630 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 631 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 632 | "dev": true, 633 | "funding": [ 634 | { 635 | "type": "individual", 636 | "url": "https://github.com/sponsors/RubenVerborgh" 637 | } 638 | ], 639 | "engines": { 640 | "node": ">=4.0" 641 | }, 642 | "peerDependenciesMeta": { 643 | "debug": { 644 | "optional": true 645 | } 646 | } 647 | }, 648 | "node_modules/formdata-polyfill": { 649 | "version": "4.0.10", 650 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 651 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 652 | "dev": true, 653 | "dependencies": { 654 | "fetch-blob": "^3.1.2" 655 | }, 656 | "engines": { 657 | "node": ">=12.20.0" 658 | } 659 | }, 660 | "node_modules/fs-constants": { 661 | "version": "1.0.0", 662 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 663 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 664 | "dev": true 665 | }, 666 | "node_modules/function-bind": { 667 | "version": "1.1.2", 668 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 669 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 670 | "dev": true, 671 | "license": "MIT", 672 | "funding": { 673 | "url": "https://github.com/sponsors/ljharb" 674 | } 675 | }, 676 | "node_modules/get-intrinsic": { 677 | "version": "1.2.0", 678 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 679 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 680 | "dev": true, 681 | "dependencies": { 682 | "function-bind": "^1.1.1", 683 | "has": "^1.0.3", 684 | "has-symbols": "^1.0.3" 685 | }, 686 | "funding": { 687 | "url": "https://github.com/sponsors/ljharb" 688 | } 689 | }, 690 | "node_modules/get-stream": { 691 | "version": "2.3.1", 692 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", 693 | "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", 694 | "dev": true, 695 | "dependencies": { 696 | "object-assign": "^4.0.1", 697 | "pinkie-promise": "^2.0.0" 698 | }, 699 | "engines": { 700 | "node": ">=0.10.0" 701 | } 702 | }, 703 | "node_modules/glob-parent": { 704 | "version": "5.1.2", 705 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 706 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 707 | "dev": true, 708 | "license": "ISC", 709 | "dependencies": { 710 | "is-glob": "^4.0.1" 711 | }, 712 | "engines": { 713 | "node": ">= 6" 714 | } 715 | }, 716 | "node_modules/graceful-fs": { 717 | "version": "4.2.11", 718 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 719 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 720 | "dev": true 721 | }, 722 | "node_modules/has": { 723 | "version": "1.0.3", 724 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 725 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 726 | "dev": true, 727 | "dependencies": { 728 | "function-bind": "^1.1.1" 729 | }, 730 | "engines": { 731 | "node": ">= 0.4.0" 732 | } 733 | }, 734 | "node_modules/has-flag": { 735 | "version": "4.0.0", 736 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 737 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 738 | "dev": true, 739 | "engines": { 740 | "node": ">=8" 741 | } 742 | }, 743 | "node_modules/has-symbols": { 744 | "version": "1.0.3", 745 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 746 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 747 | "dev": true, 748 | "engines": { 749 | "node": ">= 0.4" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/ljharb" 753 | } 754 | }, 755 | "node_modules/hasown": { 756 | "version": "2.0.2", 757 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 758 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 759 | "dev": true, 760 | "license": "MIT", 761 | "dependencies": { 762 | "function-bind": "^1.1.2" 763 | }, 764 | "engines": { 765 | "node": ">= 0.4" 766 | } 767 | }, 768 | "node_modules/he": { 769 | "version": "1.2.0", 770 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 771 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 772 | "dev": true, 773 | "bin": { 774 | "he": "bin/he" 775 | } 776 | }, 777 | "node_modules/html-encoding-sniffer": { 778 | "version": "3.0.0", 779 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", 780 | "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", 781 | "dev": true, 782 | "dependencies": { 783 | "whatwg-encoding": "^2.0.0" 784 | }, 785 | "engines": { 786 | "node": ">=12" 787 | } 788 | }, 789 | "node_modules/http-proxy": { 790 | "version": "1.18.1", 791 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", 792 | "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", 793 | "dev": true, 794 | "dependencies": { 795 | "eventemitter3": "^4.0.0", 796 | "follow-redirects": "^1.0.0", 797 | "requires-port": "^1.0.0" 798 | }, 799 | "engines": { 800 | "node": ">=8.0.0" 801 | } 802 | }, 803 | "node_modules/http-server": { 804 | "version": "14.1.0", 805 | "resolved": "git+ssh://git@github.com/vapier/http-server.git#35fad5cd29005748916d1bca24db83ab6976ba41", 806 | "dev": true, 807 | "license": "MIT", 808 | "dependencies": { 809 | "basic-auth": "^2.0.1", 810 | "chalk": "^4.1.2", 811 | "corser": "^2.0.1", 812 | "he": "^1.2.0", 813 | "html-encoding-sniffer": "^3.0.0", 814 | "http-proxy": "^1.18.1", 815 | "mime": "^1.6.0", 816 | "minimist": "^1.2.6", 817 | "opener": "^1.5.1", 818 | "portfinder": "^1.0.28", 819 | "secure-compare": "3.0.1", 820 | "union": "~0.5.0", 821 | "url-join": "^4.0.1" 822 | }, 823 | "bin": { 824 | "http-server": "bin/http-server" 825 | }, 826 | "engines": { 827 | "node": ">=12" 828 | } 829 | }, 830 | "node_modules/iconv-lite": { 831 | "version": "0.6.3", 832 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 833 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 834 | "dev": true, 835 | "dependencies": { 836 | "safer-buffer": ">= 2.1.2 < 3.0.0" 837 | }, 838 | "engines": { 839 | "node": ">=0.10.0" 840 | } 841 | }, 842 | "node_modules/ieee754": { 843 | "version": "1.2.1", 844 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 845 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 846 | "dev": true, 847 | "funding": [ 848 | { 849 | "type": "github", 850 | "url": "https://github.com/sponsors/feross" 851 | }, 852 | { 853 | "type": "patreon", 854 | "url": "https://www.patreon.com/feross" 855 | }, 856 | { 857 | "type": "consulting", 858 | "url": "https://feross.org/support" 859 | } 860 | ] 861 | }, 862 | "node_modules/inherits": { 863 | "version": "2.0.4", 864 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 865 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 866 | "dev": true 867 | }, 868 | "node_modules/interpret": { 869 | "version": "1.4.0", 870 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 871 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 872 | "dev": true, 873 | "license": "MIT", 874 | "engines": { 875 | "node": ">= 0.10" 876 | } 877 | }, 878 | "node_modules/is-core-module": { 879 | "version": "2.16.1", 880 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 881 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 882 | "dev": true, 883 | "license": "MIT", 884 | "dependencies": { 885 | "hasown": "^2.0.2" 886 | }, 887 | "engines": { 888 | "node": ">= 0.4" 889 | }, 890 | "funding": { 891 | "url": "https://github.com/sponsors/ljharb" 892 | } 893 | }, 894 | "node_modules/is-extglob": { 895 | "version": "2.1.1", 896 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 897 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 898 | "dev": true, 899 | "license": "MIT", 900 | "engines": { 901 | "node": ">=0.10.0" 902 | } 903 | }, 904 | "node_modules/is-glob": { 905 | "version": "4.0.3", 906 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 907 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 908 | "dev": true, 909 | "license": "MIT", 910 | "dependencies": { 911 | "is-extglob": "^2.1.1" 912 | }, 913 | "engines": { 914 | "node": ">=0.10.0" 915 | } 916 | }, 917 | "node_modules/is-natural-number": { 918 | "version": "4.0.1", 919 | "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", 920 | "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", 921 | "dev": true 922 | }, 923 | "node_modules/is-number": { 924 | "version": "7.0.0", 925 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 926 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 927 | "dev": true, 928 | "license": "MIT", 929 | "engines": { 930 | "node": ">=0.12.0" 931 | } 932 | }, 933 | "node_modules/is-stream": { 934 | "version": "1.1.0", 935 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 936 | "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", 937 | "dev": true, 938 | "engines": { 939 | "node": ">=0.10.0" 940 | } 941 | }, 942 | "node_modules/isarray": { 943 | "version": "1.0.0", 944 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 945 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 946 | "dev": true 947 | }, 948 | "node_modules/isexe": { 949 | "version": "2.0.0", 950 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 951 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 952 | "dev": true, 953 | "license": "ISC" 954 | }, 955 | "node_modules/lodash": { 956 | "version": "4.17.21", 957 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 958 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 959 | "dev": true 960 | }, 961 | "node_modules/make-dir": { 962 | "version": "1.3.0", 963 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 964 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 965 | "dev": true, 966 | "dependencies": { 967 | "pify": "^3.0.0" 968 | }, 969 | "engines": { 970 | "node": ">=4" 971 | } 972 | }, 973 | "node_modules/make-dir/node_modules/pify": { 974 | "version": "3.0.0", 975 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 976 | "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", 977 | "dev": true, 978 | "engines": { 979 | "node": ">=4" 980 | } 981 | }, 982 | "node_modules/mdast-util-from-markdown": { 983 | "version": "2.0.0", 984 | "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", 985 | "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", 986 | "dev": true, 987 | "dependencies": { 988 | "@types/mdast": "^4.0.0", 989 | "@types/unist": "^3.0.0", 990 | "decode-named-character-reference": "^1.0.0", 991 | "devlop": "^1.0.0", 992 | "mdast-util-to-string": "^4.0.0", 993 | "micromark": "^4.0.0", 994 | "micromark-util-decode-numeric-character-reference": "^2.0.0", 995 | "micromark-util-decode-string": "^2.0.0", 996 | "micromark-util-normalize-identifier": "^2.0.0", 997 | "micromark-util-symbol": "^2.0.0", 998 | "micromark-util-types": "^2.0.0", 999 | "unist-util-stringify-position": "^4.0.0" 1000 | }, 1001 | "funding": { 1002 | "type": "opencollective", 1003 | "url": "https://opencollective.com/unified" 1004 | } 1005 | }, 1006 | "node_modules/mdast-util-to-string": { 1007 | "version": "4.0.0", 1008 | "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", 1009 | "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", 1010 | "dev": true, 1011 | "dependencies": { 1012 | "@types/mdast": "^4.0.0" 1013 | }, 1014 | "funding": { 1015 | "type": "opencollective", 1016 | "url": "https://opencollective.com/unified" 1017 | } 1018 | }, 1019 | "node_modules/merge2": { 1020 | "version": "1.4.1", 1021 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1022 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1023 | "dev": true, 1024 | "license": "MIT", 1025 | "engines": { 1026 | "node": ">= 8" 1027 | } 1028 | }, 1029 | "node_modules/micromark": { 1030 | "version": "4.0.0", 1031 | "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", 1032 | "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", 1033 | "dev": true, 1034 | "funding": [ 1035 | { 1036 | "type": "GitHub Sponsors", 1037 | "url": "https://github.com/sponsors/unifiedjs" 1038 | }, 1039 | { 1040 | "type": "OpenCollective", 1041 | "url": "https://opencollective.com/unified" 1042 | } 1043 | ], 1044 | "dependencies": { 1045 | "@types/debug": "^4.0.0", 1046 | "debug": "^4.0.0", 1047 | "decode-named-character-reference": "^1.0.0", 1048 | "devlop": "^1.0.0", 1049 | "micromark-core-commonmark": "^2.0.0", 1050 | "micromark-factory-space": "^2.0.0", 1051 | "micromark-util-character": "^2.0.0", 1052 | "micromark-util-chunked": "^2.0.0", 1053 | "micromark-util-combine-extensions": "^2.0.0", 1054 | "micromark-util-decode-numeric-character-reference": "^2.0.0", 1055 | "micromark-util-encode": "^2.0.0", 1056 | "micromark-util-normalize-identifier": "^2.0.0", 1057 | "micromark-util-resolve-all": "^2.0.0", 1058 | "micromark-util-sanitize-uri": "^2.0.0", 1059 | "micromark-util-subtokenize": "^2.0.0", 1060 | "micromark-util-symbol": "^2.0.0", 1061 | "micromark-util-types": "^2.0.0" 1062 | } 1063 | }, 1064 | "node_modules/micromark-core-commonmark": { 1065 | "version": "2.0.0", 1066 | "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", 1067 | "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", 1068 | "dev": true, 1069 | "funding": [ 1070 | { 1071 | "type": "GitHub Sponsors", 1072 | "url": "https://github.com/sponsors/unifiedjs" 1073 | }, 1074 | { 1075 | "type": "OpenCollective", 1076 | "url": "https://opencollective.com/unified" 1077 | } 1078 | ], 1079 | "dependencies": { 1080 | "decode-named-character-reference": "^1.0.0", 1081 | "devlop": "^1.0.0", 1082 | "micromark-factory-destination": "^2.0.0", 1083 | "micromark-factory-label": "^2.0.0", 1084 | "micromark-factory-space": "^2.0.0", 1085 | "micromark-factory-title": "^2.0.0", 1086 | "micromark-factory-whitespace": "^2.0.0", 1087 | "micromark-util-character": "^2.0.0", 1088 | "micromark-util-chunked": "^2.0.0", 1089 | "micromark-util-classify-character": "^2.0.0", 1090 | "micromark-util-html-tag-name": "^2.0.0", 1091 | "micromark-util-normalize-identifier": "^2.0.0", 1092 | "micromark-util-resolve-all": "^2.0.0", 1093 | "micromark-util-subtokenize": "^2.0.0", 1094 | "micromark-util-symbol": "^2.0.0", 1095 | "micromark-util-types": "^2.0.0" 1096 | } 1097 | }, 1098 | "node_modules/micromark-factory-destination": { 1099 | "version": "2.0.0", 1100 | "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", 1101 | "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", 1102 | "dev": true, 1103 | "funding": [ 1104 | { 1105 | "type": "GitHub Sponsors", 1106 | "url": "https://github.com/sponsors/unifiedjs" 1107 | }, 1108 | { 1109 | "type": "OpenCollective", 1110 | "url": "https://opencollective.com/unified" 1111 | } 1112 | ], 1113 | "dependencies": { 1114 | "micromark-util-character": "^2.0.0", 1115 | "micromark-util-symbol": "^2.0.0", 1116 | "micromark-util-types": "^2.0.0" 1117 | } 1118 | }, 1119 | "node_modules/micromark-factory-label": { 1120 | "version": "2.0.0", 1121 | "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", 1122 | "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", 1123 | "dev": true, 1124 | "funding": [ 1125 | { 1126 | "type": "GitHub Sponsors", 1127 | "url": "https://github.com/sponsors/unifiedjs" 1128 | }, 1129 | { 1130 | "type": "OpenCollective", 1131 | "url": "https://opencollective.com/unified" 1132 | } 1133 | ], 1134 | "dependencies": { 1135 | "devlop": "^1.0.0", 1136 | "micromark-util-character": "^2.0.0", 1137 | "micromark-util-symbol": "^2.0.0", 1138 | "micromark-util-types": "^2.0.0" 1139 | } 1140 | }, 1141 | "node_modules/micromark-factory-space": { 1142 | "version": "2.0.0", 1143 | "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", 1144 | "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", 1145 | "dev": true, 1146 | "funding": [ 1147 | { 1148 | "type": "GitHub Sponsors", 1149 | "url": "https://github.com/sponsors/unifiedjs" 1150 | }, 1151 | { 1152 | "type": "OpenCollective", 1153 | "url": "https://opencollective.com/unified" 1154 | } 1155 | ], 1156 | "dependencies": { 1157 | "micromark-util-character": "^2.0.0", 1158 | "micromark-util-types": "^2.0.0" 1159 | } 1160 | }, 1161 | "node_modules/micromark-factory-title": { 1162 | "version": "2.0.0", 1163 | "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", 1164 | "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", 1165 | "dev": true, 1166 | "funding": [ 1167 | { 1168 | "type": "GitHub Sponsors", 1169 | "url": "https://github.com/sponsors/unifiedjs" 1170 | }, 1171 | { 1172 | "type": "OpenCollective", 1173 | "url": "https://opencollective.com/unified" 1174 | } 1175 | ], 1176 | "dependencies": { 1177 | "micromark-factory-space": "^2.0.0", 1178 | "micromark-util-character": "^2.0.0", 1179 | "micromark-util-symbol": "^2.0.0", 1180 | "micromark-util-types": "^2.0.0" 1181 | } 1182 | }, 1183 | "node_modules/micromark-factory-whitespace": { 1184 | "version": "2.0.0", 1185 | "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", 1186 | "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", 1187 | "dev": true, 1188 | "funding": [ 1189 | { 1190 | "type": "GitHub Sponsors", 1191 | "url": "https://github.com/sponsors/unifiedjs" 1192 | }, 1193 | { 1194 | "type": "OpenCollective", 1195 | "url": "https://opencollective.com/unified" 1196 | } 1197 | ], 1198 | "dependencies": { 1199 | "micromark-factory-space": "^2.0.0", 1200 | "micromark-util-character": "^2.0.0", 1201 | "micromark-util-symbol": "^2.0.0", 1202 | "micromark-util-types": "^2.0.0" 1203 | } 1204 | }, 1205 | "node_modules/micromark-util-character": { 1206 | "version": "2.0.1", 1207 | "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", 1208 | "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", 1209 | "dev": true, 1210 | "funding": [ 1211 | { 1212 | "type": "GitHub Sponsors", 1213 | "url": "https://github.com/sponsors/unifiedjs" 1214 | }, 1215 | { 1216 | "type": "OpenCollective", 1217 | "url": "https://opencollective.com/unified" 1218 | } 1219 | ], 1220 | "dependencies": { 1221 | "micromark-util-symbol": "^2.0.0", 1222 | "micromark-util-types": "^2.0.0" 1223 | } 1224 | }, 1225 | "node_modules/micromark-util-chunked": { 1226 | "version": "2.0.0", 1227 | "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", 1228 | "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", 1229 | "dev": true, 1230 | "funding": [ 1231 | { 1232 | "type": "GitHub Sponsors", 1233 | "url": "https://github.com/sponsors/unifiedjs" 1234 | }, 1235 | { 1236 | "type": "OpenCollective", 1237 | "url": "https://opencollective.com/unified" 1238 | } 1239 | ], 1240 | "dependencies": { 1241 | "micromark-util-symbol": "^2.0.0" 1242 | } 1243 | }, 1244 | "node_modules/micromark-util-classify-character": { 1245 | "version": "2.0.0", 1246 | "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", 1247 | "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", 1248 | "dev": true, 1249 | "funding": [ 1250 | { 1251 | "type": "GitHub Sponsors", 1252 | "url": "https://github.com/sponsors/unifiedjs" 1253 | }, 1254 | { 1255 | "type": "OpenCollective", 1256 | "url": "https://opencollective.com/unified" 1257 | } 1258 | ], 1259 | "dependencies": { 1260 | "micromark-util-character": "^2.0.0", 1261 | "micromark-util-symbol": "^2.0.0", 1262 | "micromark-util-types": "^2.0.0" 1263 | } 1264 | }, 1265 | "node_modules/micromark-util-combine-extensions": { 1266 | "version": "2.0.0", 1267 | "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", 1268 | "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", 1269 | "dev": true, 1270 | "funding": [ 1271 | { 1272 | "type": "GitHub Sponsors", 1273 | "url": "https://github.com/sponsors/unifiedjs" 1274 | }, 1275 | { 1276 | "type": "OpenCollective", 1277 | "url": "https://opencollective.com/unified" 1278 | } 1279 | ], 1280 | "dependencies": { 1281 | "micromark-util-chunked": "^2.0.0", 1282 | "micromark-util-types": "^2.0.0" 1283 | } 1284 | }, 1285 | "node_modules/micromark-util-decode-numeric-character-reference": { 1286 | "version": "2.0.0", 1287 | "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz", 1288 | "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==", 1289 | "dev": true, 1290 | "funding": [ 1291 | { 1292 | "type": "GitHub Sponsors", 1293 | "url": "https://github.com/sponsors/unifiedjs" 1294 | }, 1295 | { 1296 | "type": "OpenCollective", 1297 | "url": "https://opencollective.com/unified" 1298 | } 1299 | ], 1300 | "dependencies": { 1301 | "micromark-util-symbol": "^2.0.0" 1302 | } 1303 | }, 1304 | "node_modules/micromark-util-decode-string": { 1305 | "version": "2.0.0", 1306 | "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", 1307 | "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", 1308 | "dev": true, 1309 | "funding": [ 1310 | { 1311 | "type": "GitHub Sponsors", 1312 | "url": "https://github.com/sponsors/unifiedjs" 1313 | }, 1314 | { 1315 | "type": "OpenCollective", 1316 | "url": "https://opencollective.com/unified" 1317 | } 1318 | ], 1319 | "dependencies": { 1320 | "decode-named-character-reference": "^1.0.0", 1321 | "micromark-util-character": "^2.0.0", 1322 | "micromark-util-decode-numeric-character-reference": "^2.0.0", 1323 | "micromark-util-symbol": "^2.0.0" 1324 | } 1325 | }, 1326 | "node_modules/micromark-util-encode": { 1327 | "version": "2.0.0", 1328 | "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", 1329 | "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", 1330 | "dev": true, 1331 | "funding": [ 1332 | { 1333 | "type": "GitHub Sponsors", 1334 | "url": "https://github.com/sponsors/unifiedjs" 1335 | }, 1336 | { 1337 | "type": "OpenCollective", 1338 | "url": "https://opencollective.com/unified" 1339 | } 1340 | ] 1341 | }, 1342 | "node_modules/micromark-util-html-tag-name": { 1343 | "version": "2.0.0", 1344 | "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", 1345 | "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", 1346 | "dev": true, 1347 | "funding": [ 1348 | { 1349 | "type": "GitHub Sponsors", 1350 | "url": "https://github.com/sponsors/unifiedjs" 1351 | }, 1352 | { 1353 | "type": "OpenCollective", 1354 | "url": "https://opencollective.com/unified" 1355 | } 1356 | ] 1357 | }, 1358 | "node_modules/micromark-util-normalize-identifier": { 1359 | "version": "2.0.0", 1360 | "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", 1361 | "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", 1362 | "dev": true, 1363 | "funding": [ 1364 | { 1365 | "type": "GitHub Sponsors", 1366 | "url": "https://github.com/sponsors/unifiedjs" 1367 | }, 1368 | { 1369 | "type": "OpenCollective", 1370 | "url": "https://opencollective.com/unified" 1371 | } 1372 | ], 1373 | "dependencies": { 1374 | "micromark-util-symbol": "^2.0.0" 1375 | } 1376 | }, 1377 | "node_modules/micromark-util-resolve-all": { 1378 | "version": "2.0.0", 1379 | "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", 1380 | "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", 1381 | "dev": true, 1382 | "funding": [ 1383 | { 1384 | "type": "GitHub Sponsors", 1385 | "url": "https://github.com/sponsors/unifiedjs" 1386 | }, 1387 | { 1388 | "type": "OpenCollective", 1389 | "url": "https://opencollective.com/unified" 1390 | } 1391 | ], 1392 | "dependencies": { 1393 | "micromark-util-types": "^2.0.0" 1394 | } 1395 | }, 1396 | "node_modules/micromark-util-sanitize-uri": { 1397 | "version": "2.0.0", 1398 | "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", 1399 | "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", 1400 | "dev": true, 1401 | "funding": [ 1402 | { 1403 | "type": "GitHub Sponsors", 1404 | "url": "https://github.com/sponsors/unifiedjs" 1405 | }, 1406 | { 1407 | "type": "OpenCollective", 1408 | "url": "https://opencollective.com/unified" 1409 | } 1410 | ], 1411 | "dependencies": { 1412 | "micromark-util-character": "^2.0.0", 1413 | "micromark-util-encode": "^2.0.0", 1414 | "micromark-util-symbol": "^2.0.0" 1415 | } 1416 | }, 1417 | "node_modules/micromark-util-subtokenize": { 1418 | "version": "2.0.0", 1419 | "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", 1420 | "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", 1421 | "dev": true, 1422 | "funding": [ 1423 | { 1424 | "type": "GitHub Sponsors", 1425 | "url": "https://github.com/sponsors/unifiedjs" 1426 | }, 1427 | { 1428 | "type": "OpenCollective", 1429 | "url": "https://opencollective.com/unified" 1430 | } 1431 | ], 1432 | "dependencies": { 1433 | "devlop": "^1.0.0", 1434 | "micromark-util-chunked": "^2.0.0", 1435 | "micromark-util-symbol": "^2.0.0", 1436 | "micromark-util-types": "^2.0.0" 1437 | } 1438 | }, 1439 | "node_modules/micromark-util-symbol": { 1440 | "version": "2.0.0", 1441 | "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", 1442 | "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", 1443 | "dev": true, 1444 | "funding": [ 1445 | { 1446 | "type": "GitHub Sponsors", 1447 | "url": "https://github.com/sponsors/unifiedjs" 1448 | }, 1449 | { 1450 | "type": "OpenCollective", 1451 | "url": "https://opencollective.com/unified" 1452 | } 1453 | ] 1454 | }, 1455 | "node_modules/micromark-util-types": { 1456 | "version": "2.0.0", 1457 | "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", 1458 | "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", 1459 | "dev": true, 1460 | "funding": [ 1461 | { 1462 | "type": "GitHub Sponsors", 1463 | "url": "https://github.com/sponsors/unifiedjs" 1464 | }, 1465 | { 1466 | "type": "OpenCollective", 1467 | "url": "https://opencollective.com/unified" 1468 | } 1469 | ] 1470 | }, 1471 | "node_modules/micromark/node_modules/debug": { 1472 | "version": "4.3.4", 1473 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1474 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1475 | "dev": true, 1476 | "dependencies": { 1477 | "ms": "2.1.2" 1478 | }, 1479 | "engines": { 1480 | "node": ">=6.0" 1481 | }, 1482 | "peerDependenciesMeta": { 1483 | "supports-color": { 1484 | "optional": true 1485 | } 1486 | } 1487 | }, 1488 | "node_modules/micromark/node_modules/ms": { 1489 | "version": "2.1.2", 1490 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1491 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1492 | "dev": true 1493 | }, 1494 | "node_modules/micromatch": { 1495 | "version": "4.0.8", 1496 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1497 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1498 | "dev": true, 1499 | "license": "MIT", 1500 | "dependencies": { 1501 | "braces": "^3.0.3", 1502 | "picomatch": "^2.3.1" 1503 | }, 1504 | "engines": { 1505 | "node": ">=8.6" 1506 | } 1507 | }, 1508 | "node_modules/mime": { 1509 | "version": "1.6.0", 1510 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1511 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1512 | "dev": true, 1513 | "bin": { 1514 | "mime": "cli.js" 1515 | }, 1516 | "engines": { 1517 | "node": ">=4" 1518 | } 1519 | }, 1520 | "node_modules/minimist": { 1521 | "version": "1.2.8", 1522 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1523 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1524 | "dev": true, 1525 | "funding": { 1526 | "url": "https://github.com/sponsors/ljharb" 1527 | } 1528 | }, 1529 | "node_modules/mkdirp": { 1530 | "version": "0.5.6", 1531 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1532 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1533 | "dev": true, 1534 | "dependencies": { 1535 | "minimist": "^1.2.6" 1536 | }, 1537 | "bin": { 1538 | "mkdirp": "bin/cmd.js" 1539 | } 1540 | }, 1541 | "node_modules/module-workers-polyfill": { 1542 | "version": "0.3.2", 1543 | "resolved": "https://registry.npmjs.org/module-workers-polyfill/-/module-workers-polyfill-0.3.2.tgz", 1544 | "integrity": "sha512-zcEMj8vUGYu1Tc5s2GK84MBzRSweec/Ef6F7phRF8QlTfTf2upFNsR3W0lDhvN2E6o1TTXbFIYynD0rQSlynPw==", 1545 | "dev": true 1546 | }, 1547 | "node_modules/mri": { 1548 | "version": "1.2.0", 1549 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1550 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1551 | "dev": true, 1552 | "engines": { 1553 | "node": ">=4" 1554 | } 1555 | }, 1556 | "node_modules/ms": { 1557 | "version": "2.1.3", 1558 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1559 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1560 | "dev": true 1561 | }, 1562 | "node_modules/nice-try": { 1563 | "version": "1.0.5", 1564 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1565 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1566 | "dev": true, 1567 | "license": "MIT" 1568 | }, 1569 | "node_modules/node-domexception": { 1570 | "version": "1.0.0", 1571 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1572 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1573 | "dev": true, 1574 | "funding": [ 1575 | { 1576 | "type": "github", 1577 | "url": "https://github.com/sponsors/jimmywarting" 1578 | }, 1579 | { 1580 | "type": "github", 1581 | "url": "https://paypal.me/jimmywarting" 1582 | } 1583 | ], 1584 | "engines": { 1585 | "node": ">=10.5.0" 1586 | } 1587 | }, 1588 | "node_modules/node-fetch": { 1589 | "version": "3.3.2", 1590 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 1591 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 1592 | "dev": true, 1593 | "dependencies": { 1594 | "data-uri-to-buffer": "^4.0.0", 1595 | "fetch-blob": "^3.1.4", 1596 | "formdata-polyfill": "^4.0.10" 1597 | }, 1598 | "engines": { 1599 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1600 | }, 1601 | "funding": { 1602 | "type": "opencollective", 1603 | "url": "https://opencollective.com/node-fetch" 1604 | } 1605 | }, 1606 | "node_modules/npm-run-path": { 1607 | "version": "2.0.2", 1608 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1609 | "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", 1610 | "dev": true, 1611 | "license": "MIT", 1612 | "dependencies": { 1613 | "path-key": "^2.0.0" 1614 | }, 1615 | "engines": { 1616 | "node": ">=4" 1617 | } 1618 | }, 1619 | "node_modules/object-assign": { 1620 | "version": "4.1.1", 1621 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1622 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1623 | "dev": true, 1624 | "engines": { 1625 | "node": ">=0.10.0" 1626 | } 1627 | }, 1628 | "node_modules/object-inspect": { 1629 | "version": "1.12.3", 1630 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1631 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1632 | "dev": true, 1633 | "funding": { 1634 | "url": "https://github.com/sponsors/ljharb" 1635 | } 1636 | }, 1637 | "node_modules/once": { 1638 | "version": "1.4.0", 1639 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1640 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1641 | "dev": true, 1642 | "dependencies": { 1643 | "wrappy": "1" 1644 | } 1645 | }, 1646 | "node_modules/opener": { 1647 | "version": "1.5.2", 1648 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", 1649 | "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", 1650 | "dev": true, 1651 | "bin": { 1652 | "opener": "bin/opener-bin.js" 1653 | } 1654 | }, 1655 | "node_modules/p-finally": { 1656 | "version": "1.0.0", 1657 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1658 | "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", 1659 | "dev": true, 1660 | "license": "MIT", 1661 | "engines": { 1662 | "node": ">=4" 1663 | } 1664 | }, 1665 | "node_modules/package-manager-detector": { 1666 | "version": "1.1.0", 1667 | "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.1.0.tgz", 1668 | "integrity": "sha512-Y8f9qUlBzW8qauJjd/eu6jlpJZsuPJm2ZAV0cDVd420o4EdpH5RPdoCv+60/TdJflGatr4sDfpAL6ArWZbM5tA==", 1669 | "dev": true, 1670 | "license": "MIT" 1671 | }, 1672 | "node_modules/path-key": { 1673 | "version": "2.0.1", 1674 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1675 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 1676 | "dev": true, 1677 | "license": "MIT", 1678 | "engines": { 1679 | "node": ">=4" 1680 | } 1681 | }, 1682 | "node_modules/path-parse": { 1683 | "version": "1.0.7", 1684 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1685 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1686 | "dev": true, 1687 | "license": "MIT" 1688 | }, 1689 | "node_modules/pend": { 1690 | "version": "1.2.0", 1691 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1692 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 1693 | "dev": true 1694 | }, 1695 | "node_modules/picocolors": { 1696 | "version": "1.1.1", 1697 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1698 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1699 | "dev": true, 1700 | "license": "ISC" 1701 | }, 1702 | "node_modules/picomatch": { 1703 | "version": "2.3.1", 1704 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1705 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1706 | "dev": true, 1707 | "license": "MIT", 1708 | "engines": { 1709 | "node": ">=8.6" 1710 | }, 1711 | "funding": { 1712 | "url": "https://github.com/sponsors/jonschlinkert" 1713 | } 1714 | }, 1715 | "node_modules/pify": { 1716 | "version": "2.3.0", 1717 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1718 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1719 | "dev": true, 1720 | "engines": { 1721 | "node": ">=0.10.0" 1722 | } 1723 | }, 1724 | "node_modules/pinkie": { 1725 | "version": "2.0.4", 1726 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1727 | "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", 1728 | "dev": true, 1729 | "engines": { 1730 | "node": ">=0.10.0" 1731 | } 1732 | }, 1733 | "node_modules/pinkie-promise": { 1734 | "version": "2.0.1", 1735 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1736 | "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", 1737 | "dev": true, 1738 | "dependencies": { 1739 | "pinkie": "^2.0.0" 1740 | }, 1741 | "engines": { 1742 | "node": ">=0.10.0" 1743 | } 1744 | }, 1745 | "node_modules/portfinder": { 1746 | "version": "1.0.32", 1747 | "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", 1748 | "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", 1749 | "dev": true, 1750 | "dependencies": { 1751 | "async": "^2.6.4", 1752 | "debug": "^3.2.7", 1753 | "mkdirp": "^0.5.6" 1754 | }, 1755 | "engines": { 1756 | "node": ">= 0.12.0" 1757 | } 1758 | }, 1759 | "node_modules/prettier": { 1760 | "version": "3.5.3", 1761 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", 1762 | "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 1763 | "dev": true, 1764 | "license": "MIT", 1765 | "bin": { 1766 | "prettier": "bin/prettier.cjs" 1767 | }, 1768 | "engines": { 1769 | "node": ">=14" 1770 | }, 1771 | "funding": { 1772 | "url": "https://github.com/prettier/prettier?sponsor=1" 1773 | } 1774 | }, 1775 | "node_modules/prettier-plugin-jsdoc": { 1776 | "version": "1.3.2", 1777 | "resolved": "https://registry.npmjs.org/prettier-plugin-jsdoc/-/prettier-plugin-jsdoc-1.3.2.tgz", 1778 | "integrity": "sha512-LNi9eq0TjyZn/PUNf/SYQxxUvGg5FLK4alEbi3i/S+2JbMyTu790c/puFueXzx09KP44oWCJ+TaHRyM/a0rKJQ==", 1779 | "dev": true, 1780 | "license": "MIT", 1781 | "dependencies": { 1782 | "binary-searching": "^2.0.5", 1783 | "comment-parser": "^1.4.0", 1784 | "mdast-util-from-markdown": "^2.0.0" 1785 | }, 1786 | "engines": { 1787 | "node": ">=14.13.1 || >=16.0.0" 1788 | }, 1789 | "peerDependencies": { 1790 | "prettier": "^3.0.0" 1791 | } 1792 | }, 1793 | "node_modules/process-nextick-args": { 1794 | "version": "2.0.1", 1795 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1796 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1797 | "dev": true 1798 | }, 1799 | "node_modules/publint": { 1800 | "version": "0.3.12", 1801 | "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.12.tgz", 1802 | "integrity": "sha512-1w3MMtL9iotBjm1mmXtG3Nk06wnq9UhGNRpQ2j6n1Zq7YAD6gnxMMZMIxlRPAydVjVbjSm+n0lhwqsD1m4LD5w==", 1803 | "dev": true, 1804 | "license": "MIT", 1805 | "dependencies": { 1806 | "@publint/pack": "^0.1.2", 1807 | "package-manager-detector": "^1.1.0", 1808 | "picocolors": "^1.1.1", 1809 | "sade": "^1.8.1" 1810 | }, 1811 | "bin": { 1812 | "publint": "src/cli.js" 1813 | }, 1814 | "engines": { 1815 | "node": ">=18" 1816 | }, 1817 | "funding": { 1818 | "url": "https://bjornlu.com/sponsor" 1819 | } 1820 | }, 1821 | "node_modules/pump": { 1822 | "version": "3.0.2", 1823 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1824 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1825 | "dev": true, 1826 | "license": "MIT", 1827 | "dependencies": { 1828 | "end-of-stream": "^1.1.0", 1829 | "once": "^1.3.1" 1830 | } 1831 | }, 1832 | "node_modules/qs": { 1833 | "version": "6.11.1", 1834 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", 1835 | "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", 1836 | "dev": true, 1837 | "dependencies": { 1838 | "side-channel": "^1.0.4" 1839 | }, 1840 | "engines": { 1841 | "node": ">=0.6" 1842 | }, 1843 | "funding": { 1844 | "url": "https://github.com/sponsors/ljharb" 1845 | } 1846 | }, 1847 | "node_modules/queue-microtask": { 1848 | "version": "1.2.3", 1849 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1850 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1851 | "dev": true, 1852 | "funding": [ 1853 | { 1854 | "type": "github", 1855 | "url": "https://github.com/sponsors/feross" 1856 | }, 1857 | { 1858 | "type": "patreon", 1859 | "url": "https://www.patreon.com/feross" 1860 | }, 1861 | { 1862 | "type": "consulting", 1863 | "url": "https://feross.org/support" 1864 | } 1865 | ], 1866 | "license": "MIT" 1867 | }, 1868 | "node_modules/readable-stream": { 1869 | "version": "2.3.8", 1870 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", 1871 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", 1872 | "dev": true, 1873 | "dependencies": { 1874 | "core-util-is": "~1.0.0", 1875 | "inherits": "~2.0.3", 1876 | "isarray": "~1.0.0", 1877 | "process-nextick-args": "~2.0.0", 1878 | "safe-buffer": "~5.1.1", 1879 | "string_decoder": "~1.1.1", 1880 | "util-deprecate": "~1.0.1" 1881 | } 1882 | }, 1883 | "node_modules/rechoir": { 1884 | "version": "0.6.2", 1885 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1886 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 1887 | "dev": true, 1888 | "dependencies": { 1889 | "resolve": "^1.1.6" 1890 | }, 1891 | "engines": { 1892 | "node": ">= 0.10" 1893 | } 1894 | }, 1895 | "node_modules/requires-port": { 1896 | "version": "1.0.0", 1897 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 1898 | "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", 1899 | "dev": true 1900 | }, 1901 | "node_modules/resolve": { 1902 | "version": "1.22.10", 1903 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1904 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1905 | "dev": true, 1906 | "license": "MIT", 1907 | "dependencies": { 1908 | "is-core-module": "^2.16.0", 1909 | "path-parse": "^1.0.7", 1910 | "supports-preserve-symlinks-flag": "^1.0.0" 1911 | }, 1912 | "bin": { 1913 | "resolve": "bin/resolve" 1914 | }, 1915 | "engines": { 1916 | "node": ">= 0.4" 1917 | }, 1918 | "funding": { 1919 | "url": "https://github.com/sponsors/ljharb" 1920 | } 1921 | }, 1922 | "node_modules/reusify": { 1923 | "version": "1.1.0", 1924 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1925 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1926 | "dev": true, 1927 | "license": "MIT", 1928 | "engines": { 1929 | "iojs": ">=1.0.0", 1930 | "node": ">=0.10.0" 1931 | } 1932 | }, 1933 | "node_modules/run-parallel": { 1934 | "version": "1.2.0", 1935 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1936 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1937 | "dev": true, 1938 | "funding": [ 1939 | { 1940 | "type": "github", 1941 | "url": "https://github.com/sponsors/feross" 1942 | }, 1943 | { 1944 | "type": "patreon", 1945 | "url": "https://www.patreon.com/feross" 1946 | }, 1947 | { 1948 | "type": "consulting", 1949 | "url": "https://feross.org/support" 1950 | } 1951 | ], 1952 | "license": "MIT", 1953 | "dependencies": { 1954 | "queue-microtask": "^1.2.2" 1955 | } 1956 | }, 1957 | "node_modules/sade": { 1958 | "version": "1.8.1", 1959 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1960 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1961 | "dev": true, 1962 | "dependencies": { 1963 | "mri": "^1.1.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">=6" 1967 | } 1968 | }, 1969 | "node_modules/safe-buffer": { 1970 | "version": "5.1.2", 1971 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1972 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1973 | "dev": true 1974 | }, 1975 | "node_modules/safer-buffer": { 1976 | "version": "2.1.2", 1977 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1978 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1979 | "dev": true 1980 | }, 1981 | "node_modules/secure-compare": { 1982 | "version": "3.0.1", 1983 | "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", 1984 | "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", 1985 | "dev": true 1986 | }, 1987 | "node_modules/seek-bzip": { 1988 | "version": "1.0.6", 1989 | "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", 1990 | "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", 1991 | "dev": true, 1992 | "dependencies": { 1993 | "commander": "^2.8.1" 1994 | }, 1995 | "bin": { 1996 | "seek-bunzip": "bin/seek-bunzip", 1997 | "seek-table": "bin/seek-bzip-table" 1998 | } 1999 | }, 2000 | "node_modules/semver": { 2001 | "version": "5.7.2", 2002 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 2003 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 2004 | "dev": true, 2005 | "license": "ISC", 2006 | "bin": { 2007 | "semver": "bin/semver" 2008 | } 2009 | }, 2010 | "node_modules/shebang-command": { 2011 | "version": "1.2.0", 2012 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2013 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 2014 | "dev": true, 2015 | "license": "MIT", 2016 | "dependencies": { 2017 | "shebang-regex": "^1.0.0" 2018 | }, 2019 | "engines": { 2020 | "node": ">=0.10.0" 2021 | } 2022 | }, 2023 | "node_modules/shebang-regex": { 2024 | "version": "1.0.0", 2025 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2026 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 2027 | "dev": true, 2028 | "license": "MIT", 2029 | "engines": { 2030 | "node": ">=0.10.0" 2031 | } 2032 | }, 2033 | "node_modules/shelljs": { 2034 | "version": "0.9.2", 2035 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", 2036 | "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", 2037 | "dev": true, 2038 | "license": "BSD-3-Clause", 2039 | "dependencies": { 2040 | "execa": "^1.0.0", 2041 | "fast-glob": "^3.3.2", 2042 | "interpret": "^1.0.0", 2043 | "rechoir": "^0.6.2" 2044 | }, 2045 | "bin": { 2046 | "shjs": "bin/shjs" 2047 | }, 2048 | "engines": { 2049 | "node": ">=18" 2050 | } 2051 | }, 2052 | "node_modules/shx": { 2053 | "version": "0.4.0", 2054 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", 2055 | "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", 2056 | "dev": true, 2057 | "license": "MIT", 2058 | "dependencies": { 2059 | "minimist": "^1.2.8", 2060 | "shelljs": "^0.9.2" 2061 | }, 2062 | "bin": { 2063 | "shx": "lib/cli.js" 2064 | }, 2065 | "engines": { 2066 | "node": ">=18" 2067 | } 2068 | }, 2069 | "node_modules/side-channel": { 2070 | "version": "1.0.4", 2071 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 2072 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 2073 | "dev": true, 2074 | "dependencies": { 2075 | "call-bind": "^1.0.0", 2076 | "get-intrinsic": "^1.0.2", 2077 | "object-inspect": "^1.9.0" 2078 | }, 2079 | "funding": { 2080 | "url": "https://github.com/sponsors/ljharb" 2081 | } 2082 | }, 2083 | "node_modules/signal-exit": { 2084 | "version": "3.0.7", 2085 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2086 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 2087 | "dev": true, 2088 | "license": "ISC" 2089 | }, 2090 | "node_modules/string_decoder": { 2091 | "version": "1.1.1", 2092 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2093 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2094 | "dev": true, 2095 | "dependencies": { 2096 | "safe-buffer": "~5.1.0" 2097 | } 2098 | }, 2099 | "node_modules/strip-dirs": { 2100 | "version": "2.1.0", 2101 | "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", 2102 | "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", 2103 | "dev": true, 2104 | "dependencies": { 2105 | "is-natural-number": "^4.0.1" 2106 | } 2107 | }, 2108 | "node_modules/strip-eof": { 2109 | "version": "1.0.0", 2110 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2111 | "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", 2112 | "dev": true, 2113 | "license": "MIT", 2114 | "engines": { 2115 | "node": ">=0.10.0" 2116 | } 2117 | }, 2118 | "node_modules/supports-color": { 2119 | "version": "7.2.0", 2120 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2121 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2122 | "dev": true, 2123 | "dependencies": { 2124 | "has-flag": "^4.0.0" 2125 | }, 2126 | "engines": { 2127 | "node": ">=8" 2128 | } 2129 | }, 2130 | "node_modules/supports-preserve-symlinks-flag": { 2131 | "version": "1.0.0", 2132 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2133 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2134 | "dev": true, 2135 | "license": "MIT", 2136 | "engines": { 2137 | "node": ">= 0.4" 2138 | }, 2139 | "funding": { 2140 | "url": "https://github.com/sponsors/ljharb" 2141 | } 2142 | }, 2143 | "node_modules/tar-stream": { 2144 | "version": "1.6.2", 2145 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 2146 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 2147 | "dev": true, 2148 | "dependencies": { 2149 | "bl": "^1.0.0", 2150 | "buffer-alloc": "^1.2.0", 2151 | "end-of-stream": "^1.0.0", 2152 | "fs-constants": "^1.0.0", 2153 | "readable-stream": "^2.3.0", 2154 | "to-buffer": "^1.1.1", 2155 | "xtend": "^4.0.0" 2156 | }, 2157 | "engines": { 2158 | "node": ">= 0.8.0" 2159 | } 2160 | }, 2161 | "node_modules/through": { 2162 | "version": "2.3.8", 2163 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2164 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 2165 | "dev": true 2166 | }, 2167 | "node_modules/to-buffer": { 2168 | "version": "1.1.1", 2169 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 2170 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", 2171 | "dev": true 2172 | }, 2173 | "node_modules/to-regex-range": { 2174 | "version": "5.0.1", 2175 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2176 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2177 | "dev": true, 2178 | "license": "MIT", 2179 | "dependencies": { 2180 | "is-number": "^7.0.0" 2181 | }, 2182 | "engines": { 2183 | "node": ">=8.0" 2184 | } 2185 | }, 2186 | "node_modules/typescript": { 2187 | "version": "5.8.3", 2188 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 2189 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 2190 | "dev": true, 2191 | "license": "Apache-2.0", 2192 | "bin": { 2193 | "tsc": "bin/tsc", 2194 | "tsserver": "bin/tsserver" 2195 | }, 2196 | "engines": { 2197 | "node": ">=14.17" 2198 | } 2199 | }, 2200 | "node_modules/unbzip2-stream": { 2201 | "version": "1.4.3", 2202 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 2203 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 2204 | "dev": true, 2205 | "dependencies": { 2206 | "buffer": "^5.2.1", 2207 | "through": "^2.3.8" 2208 | } 2209 | }, 2210 | "node_modules/union": { 2211 | "version": "0.5.0", 2212 | "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", 2213 | "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", 2214 | "dev": true, 2215 | "dependencies": { 2216 | "qs": "^6.4.0" 2217 | }, 2218 | "engines": { 2219 | "node": ">= 0.8.0" 2220 | } 2221 | }, 2222 | "node_modules/unist-util-stringify-position": { 2223 | "version": "4.0.0", 2224 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", 2225 | "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", 2226 | "dev": true, 2227 | "dependencies": { 2228 | "@types/unist": "^3.0.0" 2229 | }, 2230 | "funding": { 2231 | "type": "opencollective", 2232 | "url": "https://opencollective.com/unified" 2233 | } 2234 | }, 2235 | "node_modules/url-join": { 2236 | "version": "4.0.1", 2237 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", 2238 | "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", 2239 | "dev": true 2240 | }, 2241 | "node_modules/util-deprecate": { 2242 | "version": "1.0.2", 2243 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2244 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2245 | "dev": true 2246 | }, 2247 | "node_modules/web-streams-polyfill": { 2248 | "version": "3.2.1", 2249 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", 2250 | "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", 2251 | "dev": true, 2252 | "engines": { 2253 | "node": ">= 8" 2254 | } 2255 | }, 2256 | "node_modules/whatwg-encoding": { 2257 | "version": "2.0.0", 2258 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", 2259 | "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", 2260 | "dev": true, 2261 | "dependencies": { 2262 | "iconv-lite": "0.6.3" 2263 | }, 2264 | "engines": { 2265 | "node": ">=12" 2266 | } 2267 | }, 2268 | "node_modules/which": { 2269 | "version": "1.3.1", 2270 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2271 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2272 | "dev": true, 2273 | "license": "ISC", 2274 | "dependencies": { 2275 | "isexe": "^2.0.0" 2276 | }, 2277 | "bin": { 2278 | "which": "bin/which" 2279 | } 2280 | }, 2281 | "node_modules/wrappy": { 2282 | "version": "1.0.2", 2283 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2284 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2285 | "dev": true 2286 | }, 2287 | "node_modules/xtend": { 2288 | "version": "4.0.2", 2289 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2290 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2291 | "dev": true, 2292 | "engines": { 2293 | "node": ">=0.4" 2294 | } 2295 | }, 2296 | "node_modules/yauzl": { 2297 | "version": "2.10.0", 2298 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2299 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 2300 | "dev": true, 2301 | "dependencies": { 2302 | "buffer-crc32": "~0.2.3", 2303 | "fd-slicer": "~1.1.0" 2304 | } 2305 | } 2306 | } 2307 | } 2308 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sqlite.org/sqlite-wasm", 3 | "version": "3.50.0-build1", 4 | "description": "SQLite Wasm conveniently wrapped as an ES Module.", 5 | "keywords": [ 6 | "sqlite", 7 | "sqlite3", 8 | "sqlite-wasm", 9 | "sqlite3-wasm", 10 | "webassembly", 11 | "wasm", 12 | "esm", 13 | "opfs", 14 | "origin-private-file-system" 15 | ], 16 | "main": "index.mjs", 17 | "node": "node.mjs", 18 | "type": "module", 19 | "files": [ 20 | "index.d.ts", 21 | "index.mjs", 22 | "node.mjs", 23 | "sqlite-wasm/" 24 | ], 25 | "types": "index.d.ts", 26 | "exports": { 27 | ".": { 28 | "types": "./index.d.ts", 29 | "node": "./node.mjs", 30 | "import": "./index.mjs", 31 | "main": "./index.mjs", 32 | "browser": "./index.mjs" 33 | }, 34 | "./package.json": "./package.json", 35 | "./sqlite3.wasm": "./sqlite-wasm/jswasm/sqlite3.wasm" 36 | }, 37 | "bin": { 38 | "sqlite-wasm": "bin/index.js" 39 | }, 40 | "scripts": { 41 | "publint": "npx publint", 42 | "check-types": "tsc", 43 | "clean": "shx rm -rf sqlite-wasm", 44 | "build": "npm run clean && node bin/index.js", 45 | "start": "npx http-server --coop", 46 | "start:node": "cd demo && node node.mjs", 47 | "fix": "npx prettier . --write", 48 | "prepublishOnly": "npm run build && npm run fix && npm run publint && npm run check-types", 49 | "deploy": "npm run prepublishOnly && git add . && git commit -am 'New release' && git push && npm publish --access public" 50 | }, 51 | "repository": { 52 | "type": "git", 53 | "url": "git+https://github.com/sqlite/sqlite-wasm.git" 54 | }, 55 | "author": "Thomas Steiner (tomac@google.com)", 56 | "license": "Apache-2.0", 57 | "bugs": { 58 | "url": "https://github.com/sqlite/sqlite-wasm/issues" 59 | }, 60 | "homepage": "https://github.com/sqlite/sqlite-wasm#readme", 61 | "devDependencies": { 62 | "decompress": "^4.2.1", 63 | "http-server": "github:vapier/http-server", 64 | "module-workers-polyfill": "^0.3.2", 65 | "node-fetch": "^3.3.2", 66 | "prettier": "^3.5.3", 67 | "prettier-plugin-jsdoc": "^1.3.2", 68 | "publint": "^0.3.12", 69 | "shx": "^0.4.0", 70 | "typescript": "^5.8.3" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3-opfs-async-proxy.js: -------------------------------------------------------------------------------- 1 | /* 2 | 2022-09-16 3 | 4 | The author disclaims copyright to this source code. In place of a 5 | legal notice, here is a blessing: 6 | 7 | * May you do good and not evil. 8 | * May you find forgiveness for yourself and forgive others. 9 | * May you share freely, never taking more than you give. 10 | 11 | *********************************************************************** 12 | 13 | A Worker which manages asynchronous OPFS handles on behalf of a 14 | synchronous API which controls it via a combination of Worker 15 | messages, SharedArrayBuffer, and Atomics. It is the asynchronous 16 | counterpart of the API defined in sqlite3-vfs-opfs.js. 17 | 18 | Highly indebted to: 19 | 20 | https://github.com/rhashimoto/wa-sqlite/blob/master/src/examples/OriginPrivateFileSystemVFS.js 21 | 22 | for demonstrating how to use the OPFS APIs. 23 | 24 | This file is to be loaded as a Worker. It does not have any direct 25 | access to the sqlite3 JS/WASM bits, so any bits which it needs (most 26 | notably SQLITE_xxx integer codes) have to be imported into it via an 27 | initialization process. 28 | 29 | This file represents an implementation detail of a larger piece of 30 | code, and not a public interface. Its details may change at any time 31 | and are not intended to be used by any client-level code. 32 | 33 | 2022-11-27: Chrome v108 changes some async methods to synchronous, as 34 | documented at: 35 | 36 | https://developer.chrome.com/blog/sync-methods-for-accesshandles/ 37 | 38 | Firefox v111 and Safari 16.4, both released in March 2023, also 39 | include this. 40 | 41 | We cannot change to the sync forms at this point without breaking 42 | clients who use Chrome v104-ish or higher. truncate(), getSize(), 43 | flush(), and close() are now (as of v108) synchronous. Calling them 44 | with an "await", as we have to for the async forms, is still legal 45 | with the sync forms but is superfluous. Calling the async forms with 46 | theFunc().then(...) is not compatible with the change to 47 | synchronous, but we do do not use those APIs that way. i.e. we don't 48 | _need_ to change anything for this, but at some point (after Chrome 49 | versions (approximately) 104-107 are extinct) should change our 50 | usage of those methods to remove the "await". 51 | */ 52 | 'use strict'; 53 | const wPost = (type, ...args) => postMessage({ type, payload: args }); 54 | const installAsyncProxy = function () { 55 | const toss = function (...args) { 56 | throw new Error(args.join(' ')); 57 | }; 58 | if (globalThis.window === globalThis) { 59 | toss( 60 | 'This code cannot run from the main thread.', 61 | 'Load it as a Worker from a separate Worker.', 62 | ); 63 | } else if (!navigator?.storage?.getDirectory) { 64 | toss('This API requires navigator.storage.getDirectory.'); 65 | } 66 | 67 | const state = Object.create(null); 68 | 69 | state.verbose = 1; 70 | 71 | const loggers = { 72 | 0: console.error.bind(console), 73 | 1: console.warn.bind(console), 74 | 2: console.log.bind(console), 75 | }; 76 | const logImpl = (level, ...args) => { 77 | if (state.verbose > level) loggers[level]('OPFS asyncer:', ...args); 78 | }; 79 | const log = (...args) => logImpl(2, ...args); 80 | const warn = (...args) => logImpl(1, ...args); 81 | const error = (...args) => logImpl(0, ...args); 82 | 83 | const __openFiles = Object.create(null); 84 | 85 | const __implicitLocks = new Set(); 86 | 87 | const getResolvedPath = function (filename, splitIt) { 88 | const p = new URL(filename, 'file://irrelevant').pathname; 89 | return splitIt ? p.split('/').filter((v) => !!v) : p; 90 | }; 91 | 92 | const getDirForFilename = async function f(absFilename, createDirs = false) { 93 | const path = getResolvedPath(absFilename, true); 94 | const filename = path.pop(); 95 | let dh = state.rootDir; 96 | for (const dirName of path) { 97 | if (dirName) { 98 | dh = await dh.getDirectoryHandle(dirName, { create: !!createDirs }); 99 | } 100 | } 101 | return [dh, filename]; 102 | }; 103 | 104 | const closeSyncHandle = async (fh) => { 105 | if (fh.syncHandle) { 106 | log('Closing sync handle for', fh.filenameAbs); 107 | const h = fh.syncHandle; 108 | delete fh.syncHandle; 109 | delete fh.xLock; 110 | __implicitLocks.delete(fh.fid); 111 | return h.close(); 112 | } 113 | }; 114 | 115 | const closeSyncHandleNoThrow = async (fh) => { 116 | try { 117 | await closeSyncHandle(fh); 118 | } catch (e) { 119 | warn('closeSyncHandleNoThrow() ignoring:', e, fh); 120 | } 121 | }; 122 | 123 | const releaseImplicitLocks = async () => { 124 | if (__implicitLocks.size) { 125 | for (const fid of __implicitLocks) { 126 | const fh = __openFiles[fid]; 127 | await closeSyncHandleNoThrow(fh); 128 | log('Auto-unlocked', fid, fh.filenameAbs); 129 | } 130 | } 131 | }; 132 | 133 | const releaseImplicitLock = async (fh) => { 134 | if (fh.releaseImplicitLocks && __implicitLocks.has(fh.fid)) { 135 | return closeSyncHandleNoThrow(fh); 136 | } 137 | }; 138 | 139 | class GetSyncHandleError extends Error { 140 | constructor(errorObject, ...msg) { 141 | super( 142 | [...msg, ': ' + errorObject.name + ':', errorObject.message].join(' '), 143 | { 144 | cause: errorObject, 145 | }, 146 | ); 147 | this.name = 'GetSyncHandleError'; 148 | } 149 | } 150 | 151 | GetSyncHandleError.convertRc = (e, rc) => { 152 | if (e instanceof GetSyncHandleError) { 153 | if ( 154 | e.cause.name === 'NoModificationAllowedError' || 155 | (e.cause.name === 'DOMException' && 156 | 0 === e.cause.message.indexOf('Access Handles cannot')) 157 | ) { 158 | return state.sq3Codes.SQLITE_BUSY; 159 | } else if ('NotFoundError' === e.cause.name) { 160 | return state.sq3Codes.SQLITE_CANTOPEN; 161 | } 162 | } else if ('NotFoundError' === e?.name) { 163 | return state.sq3Codes.SQLITE_CANTOPEN; 164 | } 165 | return rc; 166 | }; 167 | 168 | const getSyncHandle = async (fh, opName) => { 169 | if (!fh.syncHandle) { 170 | const t = performance.now(); 171 | log('Acquiring sync handle for', fh.filenameAbs); 172 | const maxTries = 6, 173 | msBase = state.asyncIdleWaitTime * 2; 174 | let i = 1, 175 | ms = msBase; 176 | for (; true; ms = msBase * ++i) { 177 | try { 178 | fh.syncHandle = await fh.fileHandle.createSyncAccessHandle(); 179 | break; 180 | } catch (e) { 181 | if (i === maxTries) { 182 | throw new GetSyncHandleError( 183 | e, 184 | 'Error getting sync handle for', 185 | opName + '().', 186 | maxTries, 187 | 'attempts failed.', 188 | fh.filenameAbs, 189 | ); 190 | } 191 | warn( 192 | 'Error getting sync handle for', 193 | opName + '(). Waiting', 194 | ms, 195 | 'ms and trying again.', 196 | fh.filenameAbs, 197 | e, 198 | ); 199 | Atomics.wait(state.sabOPView, state.opIds.retry, 0, ms); 200 | } 201 | } 202 | log( 203 | 'Got', 204 | opName + '() sync handle for', 205 | fh.filenameAbs, 206 | 'in', 207 | performance.now() - t, 208 | 'ms', 209 | ); 210 | if (!fh.xLock) { 211 | __implicitLocks.add(fh.fid); 212 | log( 213 | 'Acquired implicit lock for', 214 | opName + '()', 215 | fh.fid, 216 | fh.filenameAbs, 217 | ); 218 | } 219 | } 220 | return fh.syncHandle; 221 | }; 222 | 223 | const storeAndNotify = (opName, value) => { 224 | log(opName + '() => notify(', value, ')'); 225 | Atomics.store(state.sabOPView, state.opIds.rc, value); 226 | Atomics.notify(state.sabOPView, state.opIds.rc); 227 | }; 228 | 229 | const affirmNotRO = function (opName, fh) { 230 | if (fh.readOnly) toss(opName + '(): File is read-only: ' + fh.filenameAbs); 231 | }; 232 | 233 | let flagAsyncShutdown = false; 234 | 235 | const vfsAsyncImpls = { 236 | 'opfs-async-shutdown': async () => { 237 | flagAsyncShutdown = true; 238 | storeAndNotify('opfs-async-shutdown', 0); 239 | }, 240 | mkdir: async (dirname) => { 241 | let rc = 0; 242 | try { 243 | await getDirForFilename(dirname + '/filepart', true); 244 | } catch (e) { 245 | state.s11n.storeException(2, e); 246 | rc = state.sq3Codes.SQLITE_IOERR; 247 | } 248 | storeAndNotify('mkdir', rc); 249 | }, 250 | xAccess: async (filename) => { 251 | let rc = 0; 252 | try { 253 | const [dh, fn] = await getDirForFilename(filename); 254 | await dh.getFileHandle(fn); 255 | } catch (e) { 256 | state.s11n.storeException(2, e); 257 | rc = state.sq3Codes.SQLITE_IOERR; 258 | } 259 | storeAndNotify('xAccess', rc); 260 | }, 261 | xClose: async function (fid) { 262 | const opName = 'xClose'; 263 | __implicitLocks.delete(fid); 264 | const fh = __openFiles[fid]; 265 | let rc = 0; 266 | if (fh) { 267 | delete __openFiles[fid]; 268 | await closeSyncHandle(fh); 269 | if (fh.deleteOnClose) { 270 | try { 271 | await fh.dirHandle.removeEntry(fh.filenamePart); 272 | } catch (e) { 273 | warn('Ignoring dirHandle.removeEntry() failure of', fh, e); 274 | } 275 | } 276 | } else { 277 | state.s11n.serialize(); 278 | rc = state.sq3Codes.SQLITE_NOTFOUND; 279 | } 280 | storeAndNotify(opName, rc); 281 | }, 282 | xDelete: async function (...args) { 283 | const rc = await vfsAsyncImpls.xDeleteNoWait(...args); 284 | storeAndNotify('xDelete', rc); 285 | }, 286 | xDeleteNoWait: async function (filename, syncDir = 0, recursive = false) { 287 | let rc = 0; 288 | try { 289 | while (filename) { 290 | const [hDir, filenamePart] = await getDirForFilename(filename, false); 291 | if (!filenamePart) break; 292 | await hDir.removeEntry(filenamePart, { recursive }); 293 | if (0x1234 !== syncDir) break; 294 | recursive = false; 295 | filename = getResolvedPath(filename, true); 296 | filename.pop(); 297 | filename = filename.join('/'); 298 | } 299 | } catch (e) { 300 | state.s11n.storeException(2, e); 301 | rc = state.sq3Codes.SQLITE_IOERR_DELETE; 302 | } 303 | return rc; 304 | }, 305 | xFileSize: async function (fid) { 306 | const fh = __openFiles[fid]; 307 | let rc = 0; 308 | try { 309 | const sz = await (await getSyncHandle(fh, 'xFileSize')).getSize(); 310 | state.s11n.serialize(Number(sz)); 311 | } catch (e) { 312 | state.s11n.storeException(1, e); 313 | rc = GetSyncHandleError.convertRc(e, state.sq3Codes.SQLITE_IOERR); 314 | } 315 | await releaseImplicitLock(fh); 316 | storeAndNotify('xFileSize', rc); 317 | }, 318 | xLock: async function (fid, lockType) { 319 | const fh = __openFiles[fid]; 320 | let rc = 0; 321 | const oldLockType = fh.xLock; 322 | fh.xLock = lockType; 323 | if (!fh.syncHandle) { 324 | try { 325 | await getSyncHandle(fh, 'xLock'); 326 | __implicitLocks.delete(fid); 327 | } catch (e) { 328 | state.s11n.storeException(1, e); 329 | rc = GetSyncHandleError.convertRc( 330 | e, 331 | state.sq3Codes.SQLITE_IOERR_LOCK, 332 | ); 333 | fh.xLock = oldLockType; 334 | } 335 | } 336 | storeAndNotify('xLock', rc); 337 | }, 338 | xOpen: async function (fid, filename, flags, opfsFlags) { 339 | const opName = 'xOpen'; 340 | const create = state.sq3Codes.SQLITE_OPEN_CREATE & flags; 341 | try { 342 | let hDir, filenamePart; 343 | try { 344 | [hDir, filenamePart] = await getDirForFilename(filename, !!create); 345 | } catch (e) { 346 | state.s11n.storeException(1, e); 347 | storeAndNotify(opName, state.sq3Codes.SQLITE_NOTFOUND); 348 | return; 349 | } 350 | if (state.opfsFlags.OPFS_UNLINK_BEFORE_OPEN & opfsFlags) { 351 | try { 352 | await hDir.removeEntry(filenamePart); 353 | } catch (e) {} 354 | } 355 | const hFile = await hDir.getFileHandle(filenamePart, { create }); 356 | const fh = Object.assign(Object.create(null), { 357 | fid: fid, 358 | filenameAbs: filename, 359 | filenamePart: filenamePart, 360 | dirHandle: hDir, 361 | fileHandle: hFile, 362 | sabView: state.sabFileBufView, 363 | readOnly: !create && !!(state.sq3Codes.SQLITE_OPEN_READONLY & flags), 364 | deleteOnClose: !!(state.sq3Codes.SQLITE_OPEN_DELETEONCLOSE & flags), 365 | }); 366 | fh.releaseImplicitLocks = 367 | opfsFlags & state.opfsFlags.OPFS_UNLOCK_ASAP || 368 | state.opfsFlags.defaultUnlockAsap; 369 | __openFiles[fid] = fh; 370 | storeAndNotify(opName, 0); 371 | } catch (e) { 372 | error(opName, e); 373 | state.s11n.storeException(1, e); 374 | storeAndNotify(opName, state.sq3Codes.SQLITE_IOERR); 375 | } 376 | }, 377 | xRead: async function (fid, n, offset64) { 378 | let rc = 0, 379 | nRead; 380 | const fh = __openFiles[fid]; 381 | try { 382 | nRead = (await getSyncHandle(fh, 'xRead')).read( 383 | fh.sabView.subarray(0, n), 384 | { at: Number(offset64) }, 385 | ); 386 | if (nRead < n) { 387 | fh.sabView.fill(0, nRead, n); 388 | rc = state.sq3Codes.SQLITE_IOERR_SHORT_READ; 389 | } 390 | } catch (e) { 391 | error('xRead() failed', e, fh); 392 | state.s11n.storeException(1, e); 393 | rc = GetSyncHandleError.convertRc(e, state.sq3Codes.SQLITE_IOERR_READ); 394 | } 395 | await releaseImplicitLock(fh); 396 | storeAndNotify('xRead', rc); 397 | }, 398 | xSync: async function (fid, flags) { 399 | const fh = __openFiles[fid]; 400 | let rc = 0; 401 | if (!fh.readOnly && fh.syncHandle) { 402 | try { 403 | await fh.syncHandle.flush(); 404 | } catch (e) { 405 | state.s11n.storeException(2, e); 406 | rc = state.sq3Codes.SQLITE_IOERR_FSYNC; 407 | } 408 | } 409 | storeAndNotify('xSync', rc); 410 | }, 411 | xTruncate: async function (fid, size) { 412 | let rc = 0; 413 | const fh = __openFiles[fid]; 414 | try { 415 | affirmNotRO('xTruncate', fh); 416 | await (await getSyncHandle(fh, 'xTruncate')).truncate(size); 417 | } catch (e) { 418 | error('xTruncate():', e, fh); 419 | state.s11n.storeException(2, e); 420 | rc = GetSyncHandleError.convertRc( 421 | e, 422 | state.sq3Codes.SQLITE_IOERR_TRUNCATE, 423 | ); 424 | } 425 | await releaseImplicitLock(fh); 426 | storeAndNotify('xTruncate', rc); 427 | }, 428 | xUnlock: async function (fid, lockType) { 429 | let rc = 0; 430 | const fh = __openFiles[fid]; 431 | if (fh.syncHandle && state.sq3Codes.SQLITE_LOCK_NONE === lockType) { 432 | try { 433 | await closeSyncHandle(fh); 434 | } catch (e) { 435 | state.s11n.storeException(1, e); 436 | rc = state.sq3Codes.SQLITE_IOERR_UNLOCK; 437 | } 438 | } 439 | storeAndNotify('xUnlock', rc); 440 | }, 441 | xWrite: async function (fid, n, offset64) { 442 | let rc; 443 | const fh = __openFiles[fid]; 444 | try { 445 | affirmNotRO('xWrite', fh); 446 | rc = 447 | n === 448 | (await getSyncHandle(fh, 'xWrite')).write(fh.sabView.subarray(0, n), { 449 | at: Number(offset64), 450 | }) 451 | ? 0 452 | : state.sq3Codes.SQLITE_IOERR_WRITE; 453 | } catch (e) { 454 | error('xWrite():', e, fh); 455 | state.s11n.storeException(1, e); 456 | rc = GetSyncHandleError.convertRc(e, state.sq3Codes.SQLITE_IOERR_WRITE); 457 | } 458 | await releaseImplicitLock(fh); 459 | storeAndNotify('xWrite', rc); 460 | }, 461 | }; 462 | 463 | const initS11n = () => { 464 | if (state.s11n) return state.s11n; 465 | const textDecoder = new TextDecoder(), 466 | textEncoder = new TextEncoder('utf-8'), 467 | viewU8 = new Uint8Array( 468 | state.sabIO, 469 | state.sabS11nOffset, 470 | state.sabS11nSize, 471 | ), 472 | viewDV = new DataView( 473 | state.sabIO, 474 | state.sabS11nOffset, 475 | state.sabS11nSize, 476 | ); 477 | state.s11n = Object.create(null); 478 | const TypeIds = Object.create(null); 479 | TypeIds.number = { 480 | id: 1, 481 | size: 8, 482 | getter: 'getFloat64', 483 | setter: 'setFloat64', 484 | }; 485 | TypeIds.bigint = { 486 | id: 2, 487 | size: 8, 488 | getter: 'getBigInt64', 489 | setter: 'setBigInt64', 490 | }; 491 | TypeIds.boolean = { 492 | id: 3, 493 | size: 4, 494 | getter: 'getInt32', 495 | setter: 'setInt32', 496 | }; 497 | TypeIds.string = { id: 4 }; 498 | const getTypeId = (v) => 499 | TypeIds[typeof v] || 500 | toss('Maintenance required: this value type cannot be serialized.', v); 501 | const getTypeIdById = (tid) => { 502 | switch (tid) { 503 | case TypeIds.number.id: 504 | return TypeIds.number; 505 | case TypeIds.bigint.id: 506 | return TypeIds.bigint; 507 | case TypeIds.boolean.id: 508 | return TypeIds.boolean; 509 | case TypeIds.string.id: 510 | return TypeIds.string; 511 | default: 512 | toss('Invalid type ID:', tid); 513 | } 514 | }; 515 | state.s11n.deserialize = function (clear = false) { 516 | const argc = viewU8[0]; 517 | const rc = argc ? [] : null; 518 | if (argc) { 519 | const typeIds = []; 520 | let offset = 1, 521 | i, 522 | n, 523 | v; 524 | for (i = 0; i < argc; ++i, ++offset) { 525 | typeIds.push(getTypeIdById(viewU8[offset])); 526 | } 527 | for (i = 0; i < argc; ++i) { 528 | const t = typeIds[i]; 529 | if (t.getter) { 530 | v = viewDV[t.getter](offset, state.littleEndian); 531 | offset += t.size; 532 | } else { 533 | n = viewDV.getInt32(offset, state.littleEndian); 534 | offset += 4; 535 | v = textDecoder.decode(viewU8.slice(offset, offset + n)); 536 | offset += n; 537 | } 538 | rc.push(v); 539 | } 540 | } 541 | if (clear) viewU8[0] = 0; 542 | 543 | return rc; 544 | }; 545 | state.s11n.serialize = function (...args) { 546 | if (args.length) { 547 | const typeIds = []; 548 | let i = 0, 549 | offset = 1; 550 | viewU8[0] = args.length & 0xff; 551 | for (; i < args.length; ++i, ++offset) { 552 | typeIds.push(getTypeId(args[i])); 553 | viewU8[offset] = typeIds[i].id; 554 | } 555 | for (i = 0; i < args.length; ++i) { 556 | const t = typeIds[i]; 557 | if (t.setter) { 558 | viewDV[t.setter](offset, args[i], state.littleEndian); 559 | offset += t.size; 560 | } else { 561 | const s = textEncoder.encode(args[i]); 562 | viewDV.setInt32(offset, s.byteLength, state.littleEndian); 563 | offset += 4; 564 | viewU8.set(s, offset); 565 | offset += s.byteLength; 566 | } 567 | } 568 | } else { 569 | viewU8[0] = 0; 570 | } 571 | }; 572 | 573 | state.s11n.storeException = state.asyncS11nExceptions 574 | ? (priority, e) => { 575 | if (priority <= state.asyncS11nExceptions) { 576 | state.s11n.serialize([e.name, ': ', e.message].join('')); 577 | } 578 | } 579 | : () => {}; 580 | 581 | return state.s11n; 582 | }; 583 | 584 | const waitLoop = async function f() { 585 | const opHandlers = Object.create(null); 586 | for (let k of Object.keys(state.opIds)) { 587 | const vi = vfsAsyncImpls[k]; 588 | if (!vi) continue; 589 | const o = Object.create(null); 590 | opHandlers[state.opIds[k]] = o; 591 | o.key = k; 592 | o.f = vi; 593 | } 594 | while (!flagAsyncShutdown) { 595 | try { 596 | if ( 597 | 'not-equal' !== 598 | Atomics.wait( 599 | state.sabOPView, 600 | state.opIds.whichOp, 601 | 0, 602 | state.asyncIdleWaitTime, 603 | ) 604 | ) { 605 | await releaseImplicitLocks(); 606 | continue; 607 | } 608 | const opId = Atomics.load(state.sabOPView, state.opIds.whichOp); 609 | Atomics.store(state.sabOPView, state.opIds.whichOp, 0); 610 | const hnd = 611 | opHandlers[opId] ?? toss('No waitLoop handler for whichOp #', opId); 612 | const args = state.s11n.deserialize(true) || []; 613 | 614 | if (hnd.f) await hnd.f(...args); 615 | else error('Missing callback for opId', opId); 616 | } catch (e) { 617 | error('in waitLoop():', e); 618 | } 619 | } 620 | }; 621 | 622 | navigator.storage 623 | .getDirectory() 624 | .then(function (d) { 625 | state.rootDir = d; 626 | globalThis.onmessage = function ({ data }) { 627 | switch (data.type) { 628 | case 'opfs-async-init': { 629 | const opt = data.args; 630 | for (const k in opt) state[k] = opt[k]; 631 | state.verbose = opt.verbose ?? 1; 632 | state.sabOPView = new Int32Array(state.sabOP); 633 | state.sabFileBufView = new Uint8Array( 634 | state.sabIO, 635 | 0, 636 | state.fileBufferSize, 637 | ); 638 | state.sabS11nView = new Uint8Array( 639 | state.sabIO, 640 | state.sabS11nOffset, 641 | state.sabS11nSize, 642 | ); 643 | Object.keys(vfsAsyncImpls).forEach((k) => { 644 | if (!Number.isFinite(state.opIds[k])) { 645 | toss('Maintenance required: missing state.opIds[', k, ']'); 646 | } 647 | }); 648 | initS11n(); 649 | log('init state', state); 650 | wPost('opfs-async-inited'); 651 | waitLoop(); 652 | break; 653 | } 654 | case 'opfs-async-restart': 655 | if (flagAsyncShutdown) { 656 | warn( 657 | 'Restarting after opfs-async-shutdown. Might or might not work.', 658 | ); 659 | flagAsyncShutdown = false; 660 | waitLoop(); 661 | } 662 | break; 663 | } 664 | }; 665 | wPost('opfs-async-loaded'); 666 | }) 667 | .catch((e) => error('error initializing OPFS asyncer:', e)); 668 | }; 669 | if (!globalThis.SharedArrayBuffer) { 670 | wPost( 671 | 'opfs-unavailable', 672 | 'Missing SharedArrayBuffer API.', 673 | 'The server must emit the COOP/COEP response headers to enable that.', 674 | ); 675 | } else if (!globalThis.Atomics) { 676 | wPost( 677 | 'opfs-unavailable', 678 | 'Missing Atomics API.', 679 | 'The server must emit the COOP/COEP response headers to enable that.', 680 | ); 681 | } else if ( 682 | !globalThis.FileSystemHandle || 683 | !globalThis.FileSystemDirectoryHandle || 684 | !globalThis.FileSystemFileHandle || 685 | !globalThis.FileSystemFileHandle.prototype.createSyncAccessHandle || 686 | !navigator?.storage?.getDirectory 687 | ) { 688 | wPost('opfs-unavailable', 'Missing required OPFS APIs.'); 689 | } else { 690 | installAsyncProxy(); 691 | } 692 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3-worker1-bundler-friendly.mjs: -------------------------------------------------------------------------------- 1 | /* 2 | 2022-05-23 3 | 4 | The author disclaims copyright to this source code. In place of a 5 | legal notice, here is a blessing: 6 | 7 | * May you do good and not evil. 8 | * May you find forgiveness for yourself and forgive others. 9 | * May you share freely, never taking more than you give. 10 | 11 | *********************************************************************** 12 | 13 | This is a JS Worker file for the main sqlite3 api. It loads 14 | sqlite3.js, initializes the module, and postMessage()'s a message 15 | after the module is initialized: 16 | 17 | {type: 'sqlite3-api', result: 'worker1-ready'} 18 | 19 | This seemingly superfluous level of indirection is necessary when 20 | loading sqlite3.js via a Worker. Instantiating a worker with new 21 | Worker("sqlite.js") will not (cannot) call sqlite3InitModule() to 22 | initialize the module due to a timing/order-of-operations conflict 23 | (and that symbol is not exported in a way that a Worker loading it 24 | that way can see it). Thus JS code wanting to load the sqlite3 25 | Worker-specific API needs to pass _this_ file (or equivalent) to the 26 | Worker constructor and then listen for an event in the form shown 27 | above in order to know when the module has completed initialization. 28 | 29 | This file accepts a URL arguments to adjust how it loads sqlite3.js: 30 | 31 | - `sqlite3.dir`, if set, treats the given directory name as the 32 | directory from which `sqlite3.js` will be loaded. 33 | */ 34 | import { default as sqlite3InitModule } from './sqlite3-bundler-friendly.mjs'; 35 | sqlite3InitModule().then((sqlite3) => sqlite3.initWorker1API()); 36 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3-worker1-promiser.js: -------------------------------------------------------------------------------- 1 | /* 2 | 2022-08-24 3 | 4 | The author disclaims copyright to this source code. In place of a 5 | legal notice, here is a blessing: 6 | 7 | * May you do good and not evil. 8 | * May you find forgiveness for yourself and forgive others. 9 | * May you share freely, never taking more than you give. 10 | 11 | *********************************************************************** 12 | 13 | This file implements a Promise-based proxy for the sqlite3 Worker 14 | API #1. It is intended to be included either from the main thread or 15 | a Worker, but only if (A) the environment supports nested Workers 16 | and (B) it's _not_ a Worker which loads the sqlite3 WASM/JS 17 | module. This file's features will load that module and provide a 18 | slightly simpler client-side interface than the slightly-lower-level 19 | Worker API does. 20 | 21 | This script necessarily exposes one global symbol, but clients may 22 | freely `delete` that symbol after calling it. 23 | */ 24 | 'use strict'; 25 | 26 | globalThis.sqlite3Worker1Promiser = function callee( 27 | config = callee.defaultConfig, 28 | ) { 29 | if (1 === arguments.length && 'function' === typeof arguments[0]) { 30 | const f = config; 31 | config = Object.assign(Object.create(null), callee.defaultConfig); 32 | config.onready = f; 33 | } else { 34 | config = Object.assign(Object.create(null), callee.defaultConfig, config); 35 | } 36 | const handlerMap = Object.create(null); 37 | const noop = function () {}; 38 | const err = config.onerror || noop; 39 | const debug = config.debug || noop; 40 | const idTypeMap = config.generateMessageId ? undefined : Object.create(null); 41 | const genMsgId = 42 | config.generateMessageId || 43 | function (msg) { 44 | return ( 45 | msg.type + '#' + (idTypeMap[msg.type] = (idTypeMap[msg.type] || 0) + 1) 46 | ); 47 | }; 48 | const toss = (...args) => { 49 | throw new Error(args.join(' ')); 50 | }; 51 | if (!config.worker) config.worker = callee.defaultConfig.worker; 52 | if ('function' === typeof config.worker) config.worker = config.worker(); 53 | let dbId; 54 | let promiserFunc; 55 | config.worker.onmessage = function (ev) { 56 | ev = ev.data; 57 | debug('worker1.onmessage', ev); 58 | let msgHandler = handlerMap[ev.messageId]; 59 | if (!msgHandler) { 60 | if (ev && 'sqlite3-api' === ev.type && 'worker1-ready' === ev.result) { 61 | if (config.onready) config.onready(promiserFunc); 62 | return; 63 | } 64 | msgHandler = handlerMap[ev.type]; 65 | if (msgHandler && msgHandler.onrow) { 66 | msgHandler.onrow(ev); 67 | return; 68 | } 69 | if (config.onunhandled) config.onunhandled(arguments[0]); 70 | else err('sqlite3Worker1Promiser() unhandled worker message:', ev); 71 | return; 72 | } 73 | delete handlerMap[ev.messageId]; 74 | switch (ev.type) { 75 | case 'error': 76 | msgHandler.reject(ev); 77 | return; 78 | case 'open': 79 | if (!dbId) dbId = ev.dbId; 80 | break; 81 | case 'close': 82 | if (ev.dbId === dbId) dbId = undefined; 83 | break; 84 | default: 85 | break; 86 | } 87 | try { 88 | msgHandler.resolve(ev); 89 | } catch (e) { 90 | msgHandler.reject(e); 91 | } 92 | }; 93 | return (promiserFunc = function () { 94 | let msg; 95 | if (1 === arguments.length) { 96 | msg = arguments[0]; 97 | } else if (2 === arguments.length) { 98 | msg = Object.create(null); 99 | msg.type = arguments[0]; 100 | msg.args = arguments[1]; 101 | msg.dbId = msg.args.dbId; 102 | } else { 103 | toss('Invalid arguments for sqlite3Worker1Promiser()-created factory.'); 104 | } 105 | if (!msg.dbId && msg.type !== 'open') msg.dbId = dbId; 106 | msg.messageId = genMsgId(msg); 107 | msg.departureTime = performance.now(); 108 | const proxy = Object.create(null); 109 | proxy.message = msg; 110 | let rowCallbackId; 111 | if ('exec' === msg.type && msg.args) { 112 | if ('function' === typeof msg.args.callback) { 113 | rowCallbackId = msg.messageId + ':row'; 114 | proxy.onrow = msg.args.callback; 115 | msg.args.callback = rowCallbackId; 116 | handlerMap[rowCallbackId] = proxy; 117 | } else if ('string' === typeof msg.args.callback) { 118 | toss( 119 | 'exec callback may not be a string when using the Promise interface.', 120 | ); 121 | } 122 | } 123 | 124 | let p = new Promise(function (resolve, reject) { 125 | proxy.resolve = resolve; 126 | proxy.reject = reject; 127 | handlerMap[msg.messageId] = proxy; 128 | debug( 129 | 'Posting', 130 | msg.type, 131 | 'message to Worker dbId=' + (dbId || 'default') + ':', 132 | msg, 133 | ); 134 | config.worker.postMessage(msg); 135 | }); 136 | if (rowCallbackId) p = p.finally(() => delete handlerMap[rowCallbackId]); 137 | return p; 138 | }); 139 | }; 140 | 141 | globalThis.sqlite3Worker1Promiser.defaultConfig = { 142 | worker: function () { 143 | let theJs = 'sqlite3-worker1.js'; 144 | if (this.currentScript) { 145 | const src = this.currentScript.src.split('/'); 146 | src.pop(); 147 | theJs = src.join('/') + '/' + theJs; 148 | } else if (globalThis.location) { 149 | const urlParams = new URL(globalThis.location.href).searchParams; 150 | if (urlParams.has('sqlite3.dir')) { 151 | theJs = urlParams.get('sqlite3.dir') + '/' + theJs; 152 | } 153 | } 154 | return new Worker(theJs + globalThis.location.search); 155 | }.bind({ 156 | currentScript: globalThis?.document?.currentScript, 157 | }), 158 | onerror: (...args) => console.error('worker1 promiser error', ...args), 159 | }; 160 | 161 | sqlite3Worker1Promiser.v2 = function (config) { 162 | let oldFunc; 163 | if ('function' == typeof config) { 164 | oldFunc = config; 165 | config = {}; 166 | } else if ('function' === typeof config?.onready) { 167 | oldFunc = config.onready; 168 | delete config.onready; 169 | } 170 | const promiseProxy = Object.create(null); 171 | config = Object.assign(config || Object.create(null), { 172 | onready: async function (func) { 173 | try { 174 | if (oldFunc) await oldFunc(func); 175 | promiseProxy.resolve(func); 176 | } catch (e) { 177 | promiseProxy.reject(e); 178 | } 179 | }, 180 | }); 181 | const p = new Promise(function (resolve, reject) { 182 | promiseProxy.resolve = resolve; 183 | promiseProxy.reject = reject; 184 | }); 185 | try { 186 | this.original(config); 187 | } catch (e) { 188 | promiseProxy.reject(e); 189 | } 190 | return p; 191 | }.bind({ 192 | original: sqlite3Worker1Promiser, 193 | }); 194 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3-worker1-promiser.mjs: -------------------------------------------------------------------------------- 1 | /* 2 | 2022-08-24 3 | 4 | The author disclaims copyright to this source code. In place of a 5 | legal notice, here is a blessing: 6 | 7 | * May you do good and not evil. 8 | * May you find forgiveness for yourself and forgive others. 9 | * May you share freely, never taking more than you give. 10 | 11 | *********************************************************************** 12 | 13 | This file implements a Promise-based proxy for the sqlite3 Worker 14 | API #1. It is intended to be included either from the main thread or 15 | a Worker, but only if (A) the environment supports nested Workers 16 | and (B) it's _not_ a Worker which loads the sqlite3 WASM/JS 17 | module. This file's features will load that module and provide a 18 | slightly simpler client-side interface than the slightly-lower-level 19 | Worker API does. 20 | 21 | This script necessarily exposes one global symbol, but clients may 22 | freely `delete` that symbol after calling it. 23 | */ 24 | 'use strict'; 25 | 26 | globalThis.sqlite3Worker1Promiser = function callee( 27 | config = callee.defaultConfig, 28 | ) { 29 | if (1 === arguments.length && 'function' === typeof arguments[0]) { 30 | const f = config; 31 | config = Object.assign(Object.create(null), callee.defaultConfig); 32 | config.onready = f; 33 | } else { 34 | config = Object.assign(Object.create(null), callee.defaultConfig, config); 35 | } 36 | const handlerMap = Object.create(null); 37 | const noop = function () {}; 38 | const err = config.onerror || noop; 39 | const debug = config.debug || noop; 40 | const idTypeMap = config.generateMessageId ? undefined : Object.create(null); 41 | const genMsgId = 42 | config.generateMessageId || 43 | function (msg) { 44 | return ( 45 | msg.type + '#' + (idTypeMap[msg.type] = (idTypeMap[msg.type] || 0) + 1) 46 | ); 47 | }; 48 | const toss = (...args) => { 49 | throw new Error(args.join(' ')); 50 | }; 51 | if (!config.worker) config.worker = callee.defaultConfig.worker; 52 | if ('function' === typeof config.worker) config.worker = config.worker(); 53 | let dbId; 54 | let promiserFunc; 55 | config.worker.onmessage = function (ev) { 56 | ev = ev.data; 57 | debug('worker1.onmessage', ev); 58 | let msgHandler = handlerMap[ev.messageId]; 59 | if (!msgHandler) { 60 | if (ev && 'sqlite3-api' === ev.type && 'worker1-ready' === ev.result) { 61 | if (config.onready) config.onready(promiserFunc); 62 | return; 63 | } 64 | msgHandler = handlerMap[ev.type]; 65 | if (msgHandler && msgHandler.onrow) { 66 | msgHandler.onrow(ev); 67 | return; 68 | } 69 | if (config.onunhandled) config.onunhandled(arguments[0]); 70 | else err('sqlite3Worker1Promiser() unhandled worker message:', ev); 71 | return; 72 | } 73 | delete handlerMap[ev.messageId]; 74 | switch (ev.type) { 75 | case 'error': 76 | msgHandler.reject(ev); 77 | return; 78 | case 'open': 79 | if (!dbId) dbId = ev.dbId; 80 | break; 81 | case 'close': 82 | if (ev.dbId === dbId) dbId = undefined; 83 | break; 84 | default: 85 | break; 86 | } 87 | try { 88 | msgHandler.resolve(ev); 89 | } catch (e) { 90 | msgHandler.reject(e); 91 | } 92 | }; 93 | return (promiserFunc = function () { 94 | let msg; 95 | if (1 === arguments.length) { 96 | msg = arguments[0]; 97 | } else if (2 === arguments.length) { 98 | msg = Object.create(null); 99 | msg.type = arguments[0]; 100 | msg.args = arguments[1]; 101 | msg.dbId = msg.args.dbId; 102 | } else { 103 | toss('Invalid arguments for sqlite3Worker1Promiser()-created factory.'); 104 | } 105 | if (!msg.dbId && msg.type !== 'open') msg.dbId = dbId; 106 | msg.messageId = genMsgId(msg); 107 | msg.departureTime = performance.now(); 108 | const proxy = Object.create(null); 109 | proxy.message = msg; 110 | let rowCallbackId; 111 | if ('exec' === msg.type && msg.args) { 112 | if ('function' === typeof msg.args.callback) { 113 | rowCallbackId = msg.messageId + ':row'; 114 | proxy.onrow = msg.args.callback; 115 | msg.args.callback = rowCallbackId; 116 | handlerMap[rowCallbackId] = proxy; 117 | } else if ('string' === typeof msg.args.callback) { 118 | toss( 119 | 'exec callback may not be a string when using the Promise interface.', 120 | ); 121 | } 122 | } 123 | 124 | let p = new Promise(function (resolve, reject) { 125 | proxy.resolve = resolve; 126 | proxy.reject = reject; 127 | handlerMap[msg.messageId] = proxy; 128 | debug( 129 | 'Posting', 130 | msg.type, 131 | 'message to Worker dbId=' + (dbId || 'default') + ':', 132 | msg, 133 | ); 134 | config.worker.postMessage(msg); 135 | }); 136 | if (rowCallbackId) p = p.finally(() => delete handlerMap[rowCallbackId]); 137 | return p; 138 | }); 139 | }; 140 | 141 | globalThis.sqlite3Worker1Promiser.defaultConfig = { 142 | worker: function () { 143 | return new Worker( 144 | new URL('sqlite3-worker1-bundler-friendly.mjs', import.meta.url), 145 | { 146 | type: 'module', 147 | }, 148 | ); 149 | }, 150 | onerror: (...args) => console.error('worker1 promiser error', ...args), 151 | }; 152 | 153 | sqlite3Worker1Promiser.v2 = function (config) { 154 | let oldFunc; 155 | if ('function' == typeof config) { 156 | oldFunc = config; 157 | config = {}; 158 | } else if ('function' === typeof config?.onready) { 159 | oldFunc = config.onready; 160 | delete config.onready; 161 | } 162 | const promiseProxy = Object.create(null); 163 | config = Object.assign(config || Object.create(null), { 164 | onready: async function (func) { 165 | try { 166 | if (oldFunc) await oldFunc(func); 167 | promiseProxy.resolve(func); 168 | } catch (e) { 169 | promiseProxy.reject(e); 170 | } 171 | }, 172 | }); 173 | const p = new Promise(function (resolve, reject) { 174 | promiseProxy.resolve = resolve; 175 | promiseProxy.reject = reject; 176 | }); 177 | try { 178 | this.original(config); 179 | } catch (e) { 180 | promiseProxy.reject(e); 181 | } 182 | return p; 183 | }.bind({ 184 | original: sqlite3Worker1Promiser, 185 | }); 186 | 187 | export default sqlite3Worker1Promiser.v2; 188 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3-worker1.js: -------------------------------------------------------------------------------- 1 | /* 2 | 2022-05-23 3 | 4 | The author disclaims copyright to this source code. In place of a 5 | legal notice, here is a blessing: 6 | 7 | * May you do good and not evil. 8 | * May you find forgiveness for yourself and forgive others. 9 | * May you share freely, never taking more than you give. 10 | 11 | *********************************************************************** 12 | 13 | This is a JS Worker file for the main sqlite3 api. It loads 14 | sqlite3.js, initializes the module, and postMessage()'s a message 15 | after the module is initialized: 16 | 17 | {type: 'sqlite3-api', result: 'worker1-ready'} 18 | 19 | This seemingly superfluous level of indirection is necessary when 20 | loading sqlite3.js via a Worker. Instantiating a worker with new 21 | Worker("sqlite.js") will not (cannot) call sqlite3InitModule() to 22 | initialize the module due to a timing/order-of-operations conflict 23 | (and that symbol is not exported in a way that a Worker loading it 24 | that way can see it). Thus JS code wanting to load the sqlite3 25 | Worker-specific API needs to pass _this_ file (or equivalent) to the 26 | Worker constructor and then listen for an event in the form shown 27 | above in order to know when the module has completed initialization. 28 | 29 | This file accepts a URL arguments to adjust how it loads sqlite3.js: 30 | 31 | - `sqlite3.dir`, if set, treats the given directory name as the 32 | directory from which `sqlite3.js` will be loaded. 33 | */ 34 | 'use strict'; 35 | { 36 | const urlParams = globalThis.location 37 | ? new URL(globalThis.location.href).searchParams 38 | : new URLSearchParams(); 39 | let theJs = 'sqlite3.js'; 40 | if (urlParams.has('sqlite3.dir')) { 41 | theJs = urlParams.get('sqlite3.dir') + '/' + theJs; 42 | } 43 | 44 | importScripts(theJs); 45 | } 46 | sqlite3InitModule().then((sqlite3) => sqlite3.initWorker1API()); 47 | -------------------------------------------------------------------------------- /sqlite-wasm/jswasm/sqlite3.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqlite/sqlite-wasm/420abf118afd0db04a4b2fa002baa39dab940200/sqlite-wasm/jswasm/sqlite3.wasm -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "noEmit": true, 5 | "strict": true 6 | } 7 | } 8 | --------------------------------------------------------------------------------