├── .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 |
--------------------------------------------------------------------------------