From cea397e3f86576cba06861975d905c44b2d85940 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 5 Dec 2024 14:01:55 -0600 Subject: [PATCH 01/20] =?UTF-8?q?feat(developer):=20seed=20ldml=20visual?= =?UTF-8?q?=20editor=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - minor cleanup to re-add the custom view - some comments Fixes: #12789 --- .../src/vscode-plugin/media/ldmleditor.css | 28 ++++ developer/src/vscode-plugin/package.json | 12 ++ developer/src/vscode-plugin/src/extension.ts | 3 + developer/src/vscode-plugin/src/ldmleditor.ts | 156 ++++++++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 developer/src/vscode-plugin/media/ldmleditor.css create mode 100644 developer/src/vscode-plugin/src/ldmleditor.ts diff --git a/developer/src/vscode-plugin/media/ldmleditor.css b/developer/src/vscode-plugin/media/ldmleditor.css new file mode 100644 index 00000000000..44a7e4b2a1d --- /dev/null +++ b/developer/src/vscode-plugin/media/ldmleditor.css @@ -0,0 +1,28 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * CSS for the LDML editor + */ + +body { + justify-content: center; + align-items: center; + /* margin: 1em 2em; */ + /* background-repeat: repeat; */ +} + + +h1 { + color: black; + background-color: white; +} + +pre { + color: black; + background-color: goldenrod; + border: 2px solid purple; + padding: 1em; + height: 10em; + overflow-y: scroll; +} + diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index b10870454e8..f47393d4d1a 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -15,6 +15,18 @@ "activationEvents": [], "main": "./out/extension.js", "contributes": { + "customEditors": [ + { + "viewType": "keyman.ldml", + "displayName": "Keyman LDML", + "selector": [ + { + "filenamePattern": "*.xml" + } + ], + "priority": "default" + } + ] }, "scripts": { "vscode:prepublish": "npm run compile", diff --git a/developer/src/vscode-plugin/src/extension.ts b/developer/src/vscode-plugin/src/extension.ts index 5cecb4fe8d2..418e8ce4142 100644 --- a/developer/src/vscode-plugin/src/extension.ts +++ b/developer/src/vscode-plugin/src/extension.ts @@ -3,9 +3,12 @@ */ import * as vscode from 'vscode'; +import { LdmlEditorProvider } from './ldmleditor'; /** called when extension is activated */ export function activate(context: vscode.ExtensionContext) { + // LDML EDITOR STUFF + context.subscriptions.push(LdmlEditorProvider.register(context)); } /** called when extension is deactivated */ diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts new file mode 100644 index 00000000000..77d48e3fa98 --- /dev/null +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -0,0 +1,156 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * The LDML editor itself + */ + +import * as vscode from 'vscode'; +import * as crypto from 'crypto'; + +interface LdmlDocumentDelegate { + getFileData(): Promise; +} + +class LdmlDocument implements vscode.CustomDocument { + constructor(public uri: vscode.Uri, public backupId: string | undefined, public delegate: LdmlDocumentDelegate) { + + } + + static create(uri: vscode.Uri, backupId: string | undefined, delegate: LdmlDocumentDelegate): LdmlDocument | PromiseLike { + return new LdmlDocument(uri, backupId, delegate); + } + + private _onDidChangeDocument = new vscode.EventEmitter<{ + // TODO-LDML-EDITOR + }>(); + + public readonly onDidChangeContent = this._onDidChangeDocument.event; + + private _onDidDispose = new vscode.EventEmitter<{ + // TODO-LDML-EDITOR + }>(); + + public readonly onDidDispose = this._onDidDispose.event; + + dispose(): void { + [this._onDidChangeDocument, + this._onDidDispose].forEach(e => e.dispose()); + // TODO-LDML-EDITOR others + } +} + +export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { + private static readonly viewType = 'keyman.ldml'; // sync w/ package.json + + constructor(private readonly context: vscode.ExtensionContext) { } + static register(context: vscode.ExtensionContext): vscode.Disposable { + const provider = new LdmlEditorProvider(context); + const providerRegistration = vscode.window.registerCustomEditorProvider(LdmlEditorProvider.viewType, provider); + return providerRegistration; + } + + private readonly _onDidChangeCustomDocument = new vscode.EventEmitter>(); + public readonly onDidChangeCustomDocument = this._onDidChangeCustomDocument.event; + + async saveCustomDocument(document: LdmlDocument, cancellation: vscode.CancellationToken): Promise { + // TODO-LDML-EDITOR + return; + } + async saveCustomDocumentAs(document: LdmlDocument, destination: vscode.Uri, cancellation: vscode.CancellationToken): Promise { + // TODO-LDML-EDITOR + return; + } + async revertCustomDocument(document: LdmlDocument, cancellation: vscode.CancellationToken): Promise { + // TODO-LDML-EDITOR + return; + } + async backupCustomDocument(document: LdmlDocument, context: vscode.CustomDocumentBackupContext, cancellation: vscode.CancellationToken): Promise { + throw new Error('Method not implemented.'); // TODO-LDML-EDITOR + } + async openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken): Promise { + const document : LdmlDocument = await LdmlDocument.create(uri, openContext.backupId, { + getFileData: async() => { + return new Uint8Array(); // TODO-LDML-EDITOR + } + }); + + const listeners: vscode.Disposable[] = []; + + // listeners.push(document.onDidChange(e => { + // // Tell VS Code that the document has been edited by the use. + // this._onDidChangeCustomDocument.fire({ + // document, + // ...e, + // }); + // })); + + listeners.push(document.onDidChangeContent(e => { + // TODO + })); + + document.onDidDispose(() => listeners.forEach(e => e.dispose())); + + return document; + + } + async resolveCustomTextEditor(document: vscode.TextDocument, webviewPanel: vscode.WebviewPanel, token: vscode.CancellationToken): Promise { + webviewPanel.webview.options = { + enableScripts: true, + }; + + const { webview } = webviewPanel; + + const styleMainUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'media', 'ldml.css')); + + const nonce = crypto.randomUUID().toString(); + + // TODO-LDML-EDITOR move to React function + webview.html = ` + + + + + + + + + + + + + + LDML + + +

Hello, World!

+
${document.getText().replaceAll('<', '<').trim()}
+ + + `.trim(); + + function updateWebview() { + webviewPanel.webview.postMessage({ + type: 'update', + text: document.getText(), + }); + } + + webviewPanel.webview.onDidReceiveMessage(e => { + switch (e.type) { + // TODO-LDML-EDITOR actions from the UI to the extension + // case 'add': + // this.addNewScratch(document); + // return; + + // case 'delete': + // this.deleteScratch(document, e.id); + // return; + } + }); + + updateWebview(); + } +} From 15c044126541556a5a4805981ef2d7218e03a81b Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 5 Dec 2024 15:02:23 -0600 Subject: [PATCH 02/20] =?UTF-8?q?chore(developer):=20add=20react/parcel=20?= =?UTF-8?q?=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add React 19 - parcel builds into build/ which is picked up by the app Fixes: #12789 --- developer/src/vscode-plugin/.gitignore | 2 + developer/src/vscode-plugin/app/App.css | 3 + developer/src/vscode-plugin/app/App.tsx | 18 + developer/src/vscode-plugin/app/index.html | 14 + developer/src/vscode-plugin/app/index.js | 12 + developer/src/vscode-plugin/build.sh | 2 +- developer/src/vscode-plugin/package.json | 19 +- developer/src/vscode-plugin/src/ldmleditor.ts | 12 +- package-lock.json | 3657 ++++++++++++++++- 9 files changed, 3523 insertions(+), 216 deletions(-) create mode 100644 developer/src/vscode-plugin/app/App.css create mode 100644 developer/src/vscode-plugin/app/App.tsx create mode 100644 developer/src/vscode-plugin/app/index.html create mode 100644 developer/src/vscode-plugin/app/index.js diff --git a/developer/src/vscode-plugin/.gitignore b/developer/src/vscode-plugin/.gitignore index 890b4c93da8..9b9ed8610eb 100644 --- a/developer/src/vscode-plugin/.gitignore +++ b/developer/src/vscode-plugin/.gitignore @@ -4,3 +4,5 @@ node_modules .vscode-test/ *.vsix !.vscode +/.parcel-cache +/build diff --git a/developer/src/vscode-plugin/app/App.css b/developer/src/vscode-plugin/app/App.css new file mode 100644 index 00000000000..493161332b3 --- /dev/null +++ b/developer/src/vscode-plugin/app/App.css @@ -0,0 +1,3 @@ +.App { + text-align: center; +} diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx new file mode 100644 index 00000000000..f109b9973be --- /dev/null +++ b/developer/src/vscode-plugin/app/App.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import './App.css'; + +let a : number = 3; + +function count() : number { + return (++a); +} + +function App() { + return ( +
+ Hello world!! 2+2 = ${count()} +
+ ); +} + +export default App; diff --git a/developer/src/vscode-plugin/app/index.html b/developer/src/vscode-plugin/app/index.html new file mode 100644 index 00000000000..6bdf5f16289 --- /dev/null +++ b/developer/src/vscode-plugin/app/index.html @@ -0,0 +1,14 @@ + + + + + + Editor + + + + +
+ + + diff --git a/developer/src/vscode-plugin/app/index.js b/developer/src/vscode-plugin/app/index.js new file mode 100644 index 00000000000..3e6650df5de --- /dev/null +++ b/developer/src/vscode-plugin/app/index.js @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +// bootstrap react app + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); diff --git a/developer/src/vscode-plugin/build.sh b/developer/src/vscode-plugin/build.sh index 84824e51bae..5ea90a0f314 100755 --- a/developer/src/vscode-plugin/build.sh +++ b/developer/src/vscode-plugin/build.sh @@ -24,7 +24,7 @@ builder_describe_outputs \ builder_parse "$@" -builder_run_action clean rm -rf ./out/ ./tsconfig.tsbuildinfo .vscode-test +builder_run_action clean rm -rf ./out/ ./tsconfig.tsbuildinfo .vscode-test ./build .parcel-cache builder_run_action configure verify_npm_setup builder_run_action build npm run compile builder_run_action test npm test diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index f47393d4d1a..d76597388ff 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -30,19 +30,21 @@ }, "scripts": { "vscode:prepublish": "npm run compile", - "compile": "tsc -b ./", + "compile": "tsc -b ./ && npm run build", "watch": "tsc -watch -b ./", "pretest": "npm run compile && npm run lint", "lint": "eslint src", "test": "echo use 'ui-test' to run the test - TODO-LDML-EDITOR", - "ui-test": "vscode-test" + "ui-test": "vscode-test", + "build": "parcel build --target=default --cache-dir=.parcel-cache --no-content-hash" }, "devDependencies": { "@types/mocha": "^10.0.0", "@types/node": "20.4.1", "@types/vscode": "^1.93.0", "@vscode/test-cli": "^0.0.10", - "@vscode/test-electron": "^2.4.1" + "@vscode/test-electron": "^2.4.1", + "parcel": "^2.13.2" }, "license": "MIT", "dependencies": { @@ -50,6 +52,15 @@ "@keymanapp/developer-utils": "*", "@keymanapp/kmc-kmn": "*", "@keymanapp/kmc-ldml": "*", - "@keymanapp/kmc-package": "*" + "@keymanapp/kmc-package": "*", + "process": "^0.11.10", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "targets": { + "default": { + "source": "app/index.html", + "distDir": "./build" + } } } diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index 77d48e3fa98..f211e11cdd1 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -100,7 +100,9 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { const { webview } = webviewPanel; - const styleMainUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'media', 'ldml.css')); + // these are fixed IDs as parcel is set to not do content hashing + const styleUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'build', 'index.89a9d63e.css')); + const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'build', 'index.2f8490e0.js')); const nonce = crypto.randomUUID().toString(); @@ -111,22 +113,22 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { - - + LDML -

Hello, World!

-
${document.getText().replaceAll('<', '<').trim()}
+ +
+ `.trim(); diff --git a/package-lock.json b/package-lock.json index 76e2574792e..9818fd013b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2148,14 +2148,18 @@ "@keymanapp/developer-utils": "*", "@keymanapp/kmc-kmn": "*", "@keymanapp/kmc-ldml": "*", - "@keymanapp/kmc-package": "*" + "@keymanapp/kmc-package": "*", + "process": "^0.11.10", + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { "@types/mocha": "^10.0.0", "@types/node": "20.4.1", "@types/vscode": "^1.93.0", "@vscode/test-cli": "^0.0.10", - "@vscode/test-electron": "^2.4.1" + "@vscode/test-electron": "^2.4.1", + "parcel": "^2.13.2" }, "engines": { "vscode": "^1.93.0" @@ -3120,6 +3124,107 @@ "resolved": "web/src/engine/common/web-utils", "link": true }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", + "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", + "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", + "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", + "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", + "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", + "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@mdn/browser-compat-data": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", @@ -3442,6 +3547,118 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", + "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/lr": "^1.0.0", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@mischnic/json-sourcemap/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3705,97 +3922,1620 @@ "@octokit/openapi-types": "^11.2.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.2.tgz", - "integrity": "sha512-hZ/JhxPIceWaGSEzUZp83/8M49CoxlkuThfTR7t4AoCu5+ZvJ3vktLm60Otww2TXeROB5igiZ8D9oPQh6ckBVg==", + "node_modules/@parcel/bundler-default": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.13.2.tgz", + "integrity": "sha512-WY0LB1B7H6zIGXBtwssZRmzk788GzHoOGvMSIqgE/mZ0+jPF5V54zkjbhPBXj1fvoKOGlFy8Bm/gd/GnlQDdIg==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "@parcel/diagnostic": "2.13.2", + "@parcel/graph": "3.3.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@parcel/cache": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.13.2.tgz", + "integrity": "sha512-Y0nWlCMWDSp1lxiPI5zCWTGD0InnVZ+IfqeyLWmROAqValYyd0QZCvnSljKJ144jWTr0jXxDveir+DVF8sAYaA==", "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/fs": "2.13.2", + "@parcel/logger": "2.13.2", + "@parcel/utils": "2.13.2", + "lmdb": "2.8.5" + }, "engines": { - "node": ">=8" + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" } }, - "node_modules/@puppeteer/browsers/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@parcel/codeframe": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.13.2.tgz", + "integrity": "sha512-qFMiS14orb6QSQj5/J/QN+gJElUfedVAKBTNkp9QB4i8ObdLHDqHRUzFb55ZQJI3G4vsxOOWAOUXGirtLwrxGQ==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "chalk": "^4.1.2" }, "engines": { - "node": ">=12" + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@parcel/compressor-raw": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.13.2.tgz", + "integrity": "sha512-HX51w7WlgQY2f30p3Le1B5nFsUrtEA1phvWEwQDm1gEC6OPmDrxNsFLWx18JdGlKWTaPYbAGXRMSOjUWU41N9w==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@parcel/plugin": "2.13.2" }, "engines": { - "node": ">=6.0" + "node": ">= 16.0.0", + "parcel": "^2.13.2" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.13.2.tgz", + "integrity": "sha512-oTf69/Ikxb7b8uqdu4SasRnIn7e68dCSNW2PhXuBkHq2GgzTSnpSqCwur70wQwrHKHdNt9RtIjLQgC6oOs5aJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/bundler-default": "2.13.2", + "@parcel/compressor-raw": "2.13.2", + "@parcel/namer-default": "2.13.2", + "@parcel/optimizer-css": "2.13.2", + "@parcel/optimizer-htmlnano": "2.13.2", + "@parcel/optimizer-image": "2.13.2", + "@parcel/optimizer-svgo": "2.13.2", + "@parcel/optimizer-swc": "2.13.2", + "@parcel/packager-css": "2.13.2", + "@parcel/packager-html": "2.13.2", + "@parcel/packager-js": "2.13.2", + "@parcel/packager-raw": "2.13.2", + "@parcel/packager-svg": "2.13.2", + "@parcel/packager-wasm": "2.13.2", + "@parcel/reporter-dev-server": "2.13.2", + "@parcel/resolver-default": "2.13.2", + "@parcel/runtime-browser-hmr": "2.13.2", + "@parcel/runtime-js": "2.13.2", + "@parcel/runtime-react-refresh": "2.13.2", + "@parcel/runtime-service-worker": "2.13.2", + "@parcel/transformer-babel": "2.13.2", + "@parcel/transformer-css": "2.13.2", + "@parcel/transformer-html": "2.13.2", + "@parcel/transformer-image": "2.13.2", + "@parcel/transformer-js": "2.13.2", + "@parcel/transformer-json": "2.13.2", + "@parcel/transformer-postcss": "2.13.2", + "@parcel/transformer-posthtml": "2.13.2", + "@parcel/transformer-raw": "2.13.2", + "@parcel/transformer-react-refresh-wrap": "2.13.2", + "@parcel/transformer-svg": "2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/core": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.13.2.tgz", + "integrity": "sha512-1zC5Au4z9or5XyP6ipfvJqHktuB0jD7WuxMcV1CWAZGARHKylLe+0ccl+Wx7HN5O+xAvfCDtTlKrATY8qyrIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/cache": "2.13.2", + "@parcel/diagnostic": "2.13.2", + "@parcel/events": "2.13.2", + "@parcel/feature-flags": "2.13.2", + "@parcel/fs": "2.13.2", + "@parcel/graph": "3.3.2", + "@parcel/logger": "2.13.2", + "@parcel/package-manager": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/profiler": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "@parcel/workers": "2.13.2", + "base-x": "^3.0.8", + "browserslist": "^4.6.6", + "clone": "^2.1.1", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "json5": "^2.2.0", + "msgpackr": "^1.9.9", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@parcel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@parcel/diagnostic": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.13.2.tgz", + "integrity": "sha512-6Au0JEJ5SY2gYrY0/m0i0sTuqTvK0k2E9azhBJR+zzCREbUxLiDdLZ+vXAfLW7t/kPAcWtdNU0Bj7pnZcMiMXg==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "@mischnic/json-sourcemap": "^0.1.0", + "nullthrows": "^1.1.1" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.13.2.tgz", + "integrity": "sha512-BVB9hW1RGh/tMaDHfpa+uIgz5PMULorCnjmWr/KvrlhdUSUQoaPYfRcTDYrKhoKuNIKsWSnTGvXrxE53L5qo0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/feature-flags": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/feature-flags/-/feature-flags-2.13.2.tgz", + "integrity": "sha512-cCwDAKD4Er24EkuQ+loVZXSURpM0gAGRsLJVoBtFiCSbB3nmIJJ6FLRwSBI/5OsOUExiUXDvSpfUCA5ldGTzbw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.13.2.tgz", + "integrity": "sha512-bdeIMuAXhMnROvqV55JWRUmjD438/T7h3r3NsFnkq+Mp4z2nuAn0STxbqDNxIgTMJHNunSDzncqRNMT7xJCe8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/feature-flags": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/types-internal": "2.13.2", + "@parcel/utils": "2.13.2", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/graph": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.3.2.tgz", + "integrity": "sha512-aAysQLRr8SOonSHWqdKHMJzfcrDFXKK8IYZEurlOzosiSgZXrAK7q8b8JcaJ4r84/jlvQYNYneNZeFQxKjHXkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/feature-flags": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.13.2.tgz", + "integrity": "sha512-SFVABAMqaT9jIDn4maPgaQQauPDz8fpoKUGEuLF44Q0aQFbBUy7vX7KYs/EvYSWZo4VyJcUDHvIInBlepA0/ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/events": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.13.2.tgz", + "integrity": "sha512-MIEoetfT/snk1GqWzBI3AhifV257i2xke9dvyQl14PPiMl+TlVhwnbQyA09WJBvDor+MuxZypHL7xoFdW8ff3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.13.2.tgz", + "integrity": "sha512-wHaaJZcZEZUaCylC88PqjN4BybJhnkpP5RYg1xGWBTzdxhZthxvDbeOI+0YZ4jZXrLyVNjPyPRwyx0ETlq8MKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.4.2.tgz", + "integrity": "sha512-SwnKLcZRG1VdB5JeM/Ax5VMWWh2QfXufmMQCKKx0/Kk41nUpie+aIZKj3LH6Z/fJsnKig/vXpeWoxGhmG523qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.0", + "@parcel/diagnostic": "2.13.2", + "@parcel/fs": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.13.2.tgz", + "integrity": "sha512-V9JszWd1Lk3b/9hpfRp6U8lfOIaFPyevGFNTrT+CFMviuipCMWrkUgBa7wtFvqN1i8IJ5NV5FhIlc12qfBBBgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-htmlnano": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.13.2.tgz", + "integrity": "sha512-/ikDOZrnO4tdt99h34OyqnNIhugdeqWgnpfqEQ6Xi7odIn8OIGfwAHBXoyKRyUU8YUTqLhzOhckbSMwFTPRmXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "htmlnano": "^2.0.0", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.13.2.tgz", + "integrity": "sha512-1BsQOPoSB0TBJJ40TiN+VS3YK2V4EMDtaOML1Bet2oTLMlL77vJG/xT5QHzhExYK+ZyFh2R0gq7deEKXNScBzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/utils": "2.13.2", + "@parcel/workers": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/optimizer-svgo": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.13.2.tgz", + "integrity": "sha512-QbuQzGfk5b/p9Yzc8PaSyjwalZbu/5afrKaLYKkiyG+kAVVOGMsxA2WPqPdb8x551AgdQL4OVODS9dE3zdDQOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.13.2.tgz", + "integrity": "sha512-tyxXn36UAxZkAh+/cjvWwLCBkY+DL7+4G9NHWl5KeFqErc4diBox81Aiu8hnswNzFIg4ljn6f0rNpnWM3yfoMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "@swc/core": "^1.7.26", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.13.2.tgz", + "integrity": "sha512-6HjfbdJUjHyNKzYB7GSYnOCtLwqCGW7yT95GlnnTKyFffvXYsqvBSyepMuPRlbX0mFUm4S9l2DH3OVZrk108AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/fs": "2.13.2", + "@parcel/logger": "2.13.2", + "@parcel/node-resolver-core": "3.4.2", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "@parcel/workers": "2.13.2", + "@swc/core": "^1.7.26", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.13.2.tgz", + "integrity": "sha512-agao71rIHU1lR776IMwxKvknl1/Yglhkr2qSY0JQC10PRQXHs7nj0GXd69p568W42A3/rkMWrXjWkGzhbAcPRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.13.2.tgz", + "integrity": "sha512-RHoYR4sp5VZATQbKE2Rn7DrJKK7HnvUTKB0WPFSppWJbJrqrZgvVCqnBMI2FPkbCoznGdt20rQ1R6vs591fuxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.13.2.tgz", + "integrity": "sha512-/dx19/vTCb4JIx/556hz6KEmwanasUNLAFsZ1PAm5AYDcoxJtHiNITRilA6JTlO+mdsERxOI5eE7tHCTou1ErQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "globals": "^13.2.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.13.2.tgz", + "integrity": "sha512-P+BnMZ3WS4F+Kpd+iv6PCfgyCftPGf8iGSQOCPkWb5fjuNjfvIzsq4WAW41FPbu788JwChev1O4zREYzlQjG2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.13.2.tgz", + "integrity": "sha512-K99yyQ1IsbQlGWYOLaxv/GGeWXDq0snbgGrCJvXFS8APZZ2CrXRm2634XLFkY3XA1cKqP47wz+KbibMT/+uaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "posthtml": "^0.16.4" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.13.2.tgz", + "integrity": "sha512-XqFQQcQRgZLPHgLWsQmWHr47ebsu9F7hmpHS+hFNHda4zj7WDtw7r7n6/d8CEXzdI3agpxR3XKVZzx7nB6sQig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2" + }, + "engines": { + "node": ">=16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.13.2.tgz", + "integrity": "sha512-Q+RIENS1B185yLPhrGdzBK1oJrZmh/RXrYMnzJs78Tog8SpihjeNBNR6z4PT85o2F+Gy2y1S9A26fpiGq161qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/types": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.13.2.tgz", + "integrity": "sha512-fur6Oq2HkX6AiM8rtqmDvldH5JWz0sqXA1ylz8cE3XOiDZIuvCulZmQ+hH+4odaNH6QocI1MwfV+GDh3HlQoCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/events": "2.13.2", + "@parcel/types-internal": "2.13.2", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.13.2.tgz", + "integrity": "sha512-dIx4d/B+P+7n+lPCnjorM3ygHf3E/P3os3g6BjUe7gOlq/acTwtM0TNXNdRLcsw3K+RzA2VkHLnvdgjIJ18F5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/types": "2.13.2", + "@parcel/utils": "2.13.2", + "chalk": "^4.1.2", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.13.2.tgz", + "integrity": "sha512-alWCPZiXEy5a1/mVnxQTJwJhWrnjaR+JOHQSu69eBGuWHqhXt2SCyKpczT08nm37GIxkhsiIaVR8sP4lVriApw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.13.2.tgz", + "integrity": "sha512-QdnyUHrYcb5iIMqqp6nmR0xi63sPLTALsRYMoLpQPXP/SrO4JQIqGeBSdHi+59esDnlbWDtN2RpBJ3cXlOsjsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.13.2.tgz", + "integrity": "sha512-8bMK04AxUmLF0+rsEl9u2LiboAsTjAemer9N/qMnWfsbxvEDunfTR39fwEEXpGAQV2sFb0ZPYtTxOc8bk5ygcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/node-resolver-core": "3.4.2", + "@parcel/plugin": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.13.2.tgz", + "integrity": "sha512-ByF8Ww1g6XbtwqBxNZrUz/j9EG0O7sqefkW7E2IWhlxFiNJakIrgaN5VKCBRRWaDvyAz0Kn6Md9e6GLmioRXkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.13.2.tgz", + "integrity": "sha512-DxRFW30RWM8noK1+yrqa+GYblMJabx6cg5Q7BI1SmTvVflomYVy2KEBVA161VZoxjHS6o0lToziAeVcUJT5GUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-react-refresh": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.13.2.tgz", + "integrity": "sha512-anLQUANkU++brMa7PWBmvbGDgaNMA9BP7vg/g22KI7w6nh9D3f4JBi/Vo4N66zHATpex41gAjGmFXcBtotc5bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "react-error-overlay": "6.0.9", + "react-refresh": ">=0.9 <=0.14" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.13.2.tgz", + "integrity": "sha512-EWn3eM5d81uL9+hXqAnuXo/6yq/7p1VEOKn83FEsbO4TAb6Pd25bJ0mPnWpewPcJBQUoPX3Wjx7VzVit7eeuYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.13.2.tgz", + "integrity": "sha512-XFIewSwxkrDYOnnSP/XZ1LDLdXTs7L9CjQUWtl46Vir5Pq/rinemwLJeKGIwKLHy7fhUZQjYxquH6fBL+AY8DA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.13.2.tgz", + "integrity": "sha512-2cHXLQ2+jeae+mImoaKTtkKhCKATaPY2+Pao0g3zh1xwhNu/08xj7upnbD548UEyEChUWn6IjWljDsx4y8Oa3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "browserslist": "^4.6.6", + "json5": "^2.2.0", + "nullthrows": "^1.1.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.13.2.tgz", + "integrity": "sha512-QR9I4wYc+Tw7eET5ak3BvXLdsmDJGzq+Gd4KaULa0sNKioDUXCi79E5rGICW8E+BbHGKar7boNzk7HrNZX7PLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "browserslist": "^4.6.6", + "lightningcss": "^1.22.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.13.2.tgz", + "integrity": "sha512-LlQHODz/R832ZuRkCGlOQe+TF1BR9nriUcVSc2Z7q5xQ/HblNPrVvvLDBcXG7xRToawS1y6jXG0Tihv47AykfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.12.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2", + "srcset": "4" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html/node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.13.2.tgz", + "integrity": "sha512-sHk9UmJIPEGil+8ulK+Mi4BArbSuMPTXrY1z3EP4pKGHPCMABNKIRiricngvxCW1eVZrxSokeHQe2jYWJ4tAtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "@parcel/workers": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.13.2.tgz", + "integrity": "sha512-mn5DL+59x0FHeHKWOstZuKcz4rcVnZUAkXMPtERgXa0ggjJ1CgVOc26VD68sszC/aiF6yathz/LJtJpyluniLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.13.2", + "@parcel/workers": "2.13.2", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.6.6", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.14.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.13.2.tgz", + "integrity": "sha512-AiLyWPnHaNvO9sGykYF15S3jzyQY0vSw3xQPj/xhDRv7IXQyt3y1zTtJmQsp/ri9vIzf2CruD42UXiaSPpbA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "json5": "^2.2.0" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-json/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.13.2.tgz", + "integrity": "sha512-srcKQcTaaCGutcvpWeTue4/bScPJK3nXyql2QVNneufqxTQsOZcZg8lFaMc3ma6WjQn/m2emQC26eivr3MOhDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/utils": "2.13.2", + "clone": "^2.1.1", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.13.2.tgz", + "integrity": "sha512-pNvxKp7GWLKSbyV2xRaGWZNV/ut8uetMfbwpcGxboxgq5TV9dqnHxRGzsTvZTo7yHqQ3N6hycoGh+w8L/8sg8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.12.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.13.2.tgz", + "integrity": "sha512-KsTasFp+jwkGjBLrHO6oiqIIwOeiyNPx5NawmIzXUuGvQv6UhTSayk3NnFxteOVXzy5C9GfrQ5W+IBrHe6JWaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.13.2.tgz", + "integrity": "sha512-2UuuzHzpUx8Z0muoM3cETa7PDRJIG9a5nxPaTBZttT5ucprskITakky5pzsd4gabmNzWfZ5raRG5ixV3zOSL5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/utils": "2.13.2", + "react-refresh": ">=0.9 <=0.14" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.13.2.tgz", + "integrity": "sha512-ANwWE4/n4rXrlbmY3iT18ndlxlLP1ubapR1wYL9bpp2cKA8ny2tCe5wlzLxBAfwcZx8cd15N/5v/ZwS6xt6BXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/plugin": "2.13.2", + "@parcel/rust": "2.13.2", + "nullthrows": "^1.1.1", + "posthtml": "^0.16.5", + "posthtml-parser": "^0.12.1", + "posthtml-render": "^3.0.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/types": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.13.2.tgz", + "integrity": "sha512-6ixqjk2pjKELn4sQ/jdvpbCVTeH6xXQTdotkN8Wzk68F2K2MtSPIRAEocumlexScfffbRQplr2MdIf1JJWLogA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/types-internal": "2.13.2", + "@parcel/workers": "2.13.2" + } + }, + "node_modules/@parcel/types-internal": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/types-internal/-/types-internal-2.13.2.tgz", + "integrity": "sha512-j0zb3WNM8O/+d8CArll7/4w4AyBED3Jbo32/unz89EPVN0VklmgBrRCAI5QXDKuJAGdAZSL5/a8bNYbwl7/Wxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/feature-flags": "2.13.2", + "@parcel/source-map": "^2.1.1", + "utility-types": "^3.10.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.13.2.tgz", + "integrity": "sha512-BkFtRo5xenmonwnBy+X4sVbHIRrx+ZHMPpS/6hFqyTvoUUFq2yTFQnfRGVVOOvscVUxpGom+kewnrTG3HHbZoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/codeframe": "2.13.2", + "@parcel/diagnostic": "2.13.2", + "@parcel/logger": "2.13.2", + "@parcel/markdown-ansi": "2.13.2", + "@parcel/rust": "2.13.2", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/workers": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.13.2.tgz", + "integrity": "sha512-P78BpH0yTT9KK09wgK4eabtlb5OlcWAmZebOToN5UYuwWEylKt0gWZx1+d+LPQupvK84/iZ+AutDScsATjgUMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.13.2", + "@parcel/logger": "2.13.2", + "@parcel/profiler": "2.13.2", + "@parcel/types-internal": "2.13.2", + "@parcel/utils": "2.13.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.13.2" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.2.tgz", + "integrity": "sha512-hZ/JhxPIceWaGSEzUZp83/8M49CoxlkuThfTR7t4AoCu5+ZvJ3vktLm60Otww2TXeROB5igiZ8D9oPQh6ckBVg==", + "dev": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" @@ -4513,51 +6253,297 @@ "@sentry/types": "7.108.0" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@swc/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.0.tgz", + "integrity": "sha512-+CuuTCmQFfzaNGg1JmcZvdUVITQXJk9sMnl1C2TiDLzOSVOJRwVD4dNo5dljX/qxpMAN+2BIYlwjlSkoGi6grg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.17" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.10.0", + "@swc/core-darwin-x64": "1.10.0", + "@swc/core-linux-arm-gnueabihf": "1.10.0", + "@swc/core-linux-arm64-gnu": "1.10.0", + "@swc/core-linux-arm64-musl": "1.10.0", + "@swc/core-linux-x64-gnu": "1.10.0", + "@swc/core-linux-x64-musl": "1.10.0", + "@swc/core-win32-arm64-msvc": "1.10.0", + "@swc/core-win32-ia32-msvc": "1.10.0", + "@swc/core-win32-x64-msvc": "1.10.0" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.0.tgz", + "integrity": "sha512-wCeUpanqZyzvgqWRtXIyhcFK3CqukAlYyP+fJpY2gWc/+ekdrenNIfZMwY7tyTFDkXDYEKzvn3BN/zDYNJFowQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.0.tgz", + "integrity": "sha512-0CZPzqTynUBO+SHEl/qKsFSahp2Jv/P2ZRjFG0gwZY5qIcr1+B/v+o74/GyNMBGz9rft+F2WpU31gz2sJwyF4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.0.tgz", + "integrity": "sha512-oq+DdMu5uJOFPtRkeiITc4kxmd+QSmK+v+OBzlhdGkSgoH3yRWZP+H2ao0cBXo93ZgCr2LfjiER0CqSKhjGuNA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.0.tgz", + "integrity": "sha512-Y6+PC8knchEViRxiCUj3j8wsGXaIhuvU+WqrFqV834eiItEMEI9+Vh3FovqJMBE3L7d4E4ZQtgImHCXjrHfxbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.0.tgz", + "integrity": "sha512-EbrX9A5U4cECCQQfky7945AW9GYnTXtCUXElWTkTYmmyQK87yCyFfY8hmZ9qMFIwxPOH6I3I2JwMhzdi8Qoz7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.0.tgz", + "integrity": "sha512-TaxpO6snTjjfLXFYh5EjZ78se69j2gDcqEM8yB9gguPYwkCHi2Ylfmh7iVaNADnDJFtjoAQp0L41bTV/Pfq9Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.0.tgz", + "integrity": "sha512-IEGvDd6aEEKEyZFZ8oCKuik05G5BS7qwG5hO5PEMzdGeh8JyFZXxsfFXbfeAqjue4UaUUrhnoX+Ze3M2jBVMHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.0.tgz", + "integrity": "sha512-UkQ952GSpY+Z6XONj9GSW8xGSkF53jrCsuLj0nrcuw7Dvr1a816U/9WYZmmcYS8tnG2vHylhpm6csQkyS8lpCw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" } }, - "node_modules/@sentry/types": { - "version": "5.30.0", + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.0.tgz", + "integrity": "sha512-a2QpIZmTiT885u/mUInpeN2W9ClCnqrV2LnMqJR1/Fgx1Afw/hAtiDZPtQ0SqS8yDJ2VR5gfNZo3gpxWMrqdVA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/@sentry/utils": { - "version": "5.30.0", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.0.tgz", + "integrity": "sha512-tZcCmMwf483nwsEBfUk5w9e046kMa1iSik4bP9Kwi2FGtOfHuDfIcwW4jek3hdcgF5SaBW1ktnK/lgQLDi5AtA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "node_modules/@swc/types": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", "dev": true, - "license": "(Unlicense OR Apache-2.0)" + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", @@ -4575,6 +6561,18 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.8", "dev": true, @@ -6833,6 +8831,16 @@ "streamx": "^2.16.1" } }, + "node_modules/base-x": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -6984,6 +8992,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -7010,6 +9027,39 @@ "dev": true, "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/btoa-lite": { "version": "1.0.0", "license": "MIT" @@ -7287,6 +9337,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001686", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", + "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chai": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.0.tgz", @@ -7432,6 +9503,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, "node_modules/chromium-bidi": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.17.tgz", @@ -7805,6 +9886,33 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/create-require": { "version": "1.1.1", "dev": true, @@ -7826,6 +9934,98 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0", + "optional": true, + "peer": true + }, "node_modules/cssstyle": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", @@ -8069,6 +10269,19 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/devtools-protocol": { "version": "0.0.1273771", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1273771.tgz", @@ -8092,18 +10305,106 @@ "path-type": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", "dependencies": { - "esutils": "^2.0.2" + "dotenv": "^16.4.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/duplexer": { @@ -8121,6 +10422,13 @@ "version": "1.1.1", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", + "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "license": "MIT" @@ -8171,6 +10479,19 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -8186,6 +10507,16 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/errorstacks": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.1.tgz", @@ -8699,7 +11030,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" @@ -9909,6 +12242,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-stream": { "version": "5.2.0", "license": "MIT", @@ -10336,6 +12679,74 @@ "dev": true, "license": "MIT" }, + "node_modules/htmlnano": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.1.1.tgz", + "integrity": "sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "posthtml": "^0.16.5", + "timsort": "^0.3.0" + }, + "peerDependencies": { + "cssnano": "^7.0.0", + "postcss": "^8.3.11", + "purgecss": "^6.0.0", + "relateurl": "^0.2.7", + "srcset": "5.0.1", + "svgo": "^3.0.2", + "terser": "^5.10.0", + "uncss": "^0.17.3" + }, + "peerDependenciesMeta": { + "cssnano": { + "optional": true + }, + "postcss": { + "optional": true + }, + "purgecss": { + "optional": true + }, + "relateurl": { + "optional": true + }, + "srcset": { + "optional": true + }, + "svgo": { + "optional": true + }, + "terser": { + "optional": true + }, + "uncss": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, "node_modules/http-assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", @@ -10662,6 +13073,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10830,6 +13248,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true, + "license": "ISC" + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -11239,6 +13664,13 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-migrate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", @@ -11422,113 +13854,392 @@ "koa-send": "^5.0.0" }, "engines": { - "node": ">= 7.6.0" + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/koa/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/lightningcss": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.28.2.tgz", + "integrity": "sha512-ePLRrbt3fgjXI5VFZOLbvkLD5ZRuxGKm+wJ3ujCqBtL3NanDHPo/5zicR5uEKAPiIjBYF99BM4K4okvMznjkVA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.28.2", + "lightningcss-darwin-x64": "1.28.2", + "lightningcss-freebsd-x64": "1.28.2", + "lightningcss-linux-arm-gnueabihf": "1.28.2", + "lightningcss-linux-arm64-gnu": "1.28.2", + "lightningcss-linux-arm64-musl": "1.28.2", + "lightningcss-linux-x64-gnu": "1.28.2", + "lightningcss-linux-x64-musl": "1.28.2", + "lightningcss-win32-arm64-msvc": "1.28.2", + "lightningcss-win32-x64-msvc": "1.28.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.28.2.tgz", + "integrity": "sha512-/8cPSqZiusHSS+WQz0W4NuaqFjquys1x+NsdN/XOHb+idGHJSoJ7SoQTVl3DZuAgtPZwFZgRfb/vd1oi8uX6+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.28.2.tgz", + "integrity": "sha512-R7sFrXlgKjvoEG8umpVt/yutjxOL0z8KWf0bfPT3cYMOW4470xu5qSHpFdIOpRWwl3FKNMUdbKtMUjYt0h2j4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.28.2.tgz", + "integrity": "sha512-l2qrCT+x7crAY+lMIxtgvV10R8VurzHAoUZJaVFSlHrN8kRLTvEg9ObojIDIexqWJQvJcVVV3vfzsEynpiuvgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.28.2.tgz", + "integrity": "sha512-DKMzpICBEKnL53X14rF7hFDu8KKALUJtcKdFUCW5YOlGSiwRSgVoRjM97wUm/E0NMPkzrTi/rxfvt7ruNK8meg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.28.2.tgz", + "integrity": "sha512-nhfjYkfymWZSxdtTNMWyhFk2ImUm0X7NAgJWFwnsYPOfmtWQEapzG/DXZTfEfMjSzERNUNJoQjPAbdqgB+sjiw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/koa/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.28.2.tgz", + "integrity": "sha512-1SPG1ZTNnphWvAv8RVOymlZ8BDtAg69Hbo7n4QxARvkFVCJAt0cgjAw1Fox0WEhf4PwnyoOBaVH0Z5YNgzt4dA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "2.1.2" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0" + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/koa/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.28.2.tgz", + "integrity": "sha512-ZhQy0FcO//INWUdo/iEdbefntTdpPVQ0XJwwtdbBuMQe+uxqZoytm9M+iqR9O5noWFaxK+nbS2iR/I80Q2Ofpg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.28.2.tgz", + "integrity": "sha512-alb/j1NMrgQmSFyzTbN1/pvMPM+gdDw7YBuQ5VSgcFDypN3Ah0BzC2dTZbzwzaMdUVDszX6zH5MzjfVN1oGuww==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.28.2.tgz", + "integrity": "sha512-WnwcjcBeAt0jGdjlgbT9ANf30pF0C/QMb1XnLnH272DQU8QXh+kmpi24R55wmWBwaTtNAETZ+m35ohyeMiNt+g==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.28.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.28.2.tgz", + "integrity": "sha512-3piBifyT3avz22o6mDKywQC/OisH2yDK+caHWkiMsF82i3m5wDBadyCjlCQ5VNgzYkxrWZgiaxHDdd5uxsi0/A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } + "license": "MIT" }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/lmdb": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", + "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "msgpackr": "^1.9.5", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.8.5", + "@lmdb/lmdb-darwin-x64": "2.8.5", + "@lmdb/lmdb-linux-arm": "2.8.5", + "@lmdb/lmdb-linux-arm64": "2.8.5", + "@lmdb/lmdb-linux-x64": "2.8.5", + "@lmdb/lmdb-win32-x64": "2.8.5" } }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT" }, "node_modules/locate-path": { "version": "6.0.0", @@ -11790,6 +14501,15 @@ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0", + "optional": true, + "peer": true + }, "node_modules/media-typer": { "version": "0.3.0", "license": "MIT", @@ -12275,6 +14995,66 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/msgpackr": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/msgpackr-extract/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/nanocolors": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", @@ -12383,6 +15163,13 @@ "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-cleanup": { "version": "2.1.2", "dev": true, @@ -12430,6 +15217,31 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages/node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/node-gyp/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -12536,6 +15348,13 @@ "win32" ] }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, "node_modules/noms": { "version": "0.0.0", "dev": true, @@ -12616,6 +15435,28 @@ "node": ">=4" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "license": "MIT" + }, "node_modules/number-is-nan": { "version": "1.0.1", "dev": true, @@ -12921,6 +15762,13 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/ordered-binary": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz", + "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==", + "dev": true, + "license": "MIT" + }, "node_modules/os-name": { "version": "3.1.0", "license": "MIT", @@ -13060,19 +15908,63 @@ "netmask": "^2.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parcel": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.13.2.tgz", + "integrity": "sha512-ROp1Lf6cihWYzdkieXH+KWVkjlqiUMqW18MBMNZQ3sQitnXWGozTgSYIfpUFLQqaHLgBfm5inOwdqmbzExdpYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/config-default": "2.13.2", + "@parcel/core": "2.13.2", + "@parcel/diagnostic": "2.13.2", + "@parcel/events": "2.13.2", + "@parcel/feature-flags": "2.13.2", + "@parcel/fs": "2.13.2", + "@parcel/logger": "2.13.2", + "@parcel/package-manager": "2.13.2", + "@parcel/reporter-cli": "2.13.2", + "@parcel/reporter-dev-server": "2.13.2", + "@parcel/reporter-tracer": "2.13.2", + "@parcel/utils": "2.13.2", + "chalk": "^4.1.2", + "commander": "^12.1.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true - }, - "node_modules/pako": { - "version": "1.0.11", - "license": "(MIT AND Zlib)" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -13085,6 +15977,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -13097,18 +16008,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "license": "MIT", @@ -13203,10 +16102,11 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -13275,6 +16175,155 @@ "ms": "^2.1.1" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/posthtml": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", + "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.12.1.tgz", + "integrity": "sha512-rYFmsDLfYm+4Ts2Oh4DCDSZPtdC1BLnRXAobypVzX9alj28KGl65dIFtgDY9zB57D0TC4Qxqrawuq/2et1P0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "htmlparser2": "^9.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/posthtml/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/posthtml/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/posthtml/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/posthtml/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/posthtml/node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/posthtml/node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -13293,6 +16342,15 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "license": "MIT" @@ -13587,6 +16645,44 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", + "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.25.0" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "license": "MIT", @@ -13625,6 +16721,13 @@ "node": ">= 0.10" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", @@ -13929,6 +17032,12 @@ "node": ">=v12.22.7" } }, + "node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -14354,6 +17463,18 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -14381,6 +17502,21 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/srcset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.1.tgz", + "integrity": "sha512-/P1UYbGfJVlxZag7aABNRrulEXAwCSDo7fklafOQrantuPTDmYgijJMks2zusPCVzgW9+4P69mq7w6pYuZpgxw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -14667,6 +17803,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -14808,6 +17984,19 @@ "node": ">=10" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -14841,6 +18030,13 @@ "xtend": "~4.0.1" } }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -15009,9 +18205,10 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -15674,6 +18871,37 @@ "node": ">=8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "dev": true, @@ -15702,6 +18930,16 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "license": "MIT", @@ -15773,6 +19011,13 @@ "node": ">=18" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" From 3ec6f854c26ef23c2aa2447e6370a47377dd8b4d Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 16 Dec 2024 15:19:33 -0600 Subject: [PATCH 03/20] =?UTF-8?q?chore(developer):=20update=20README=20and?= =?UTF-8?q?=20package.json=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build fix Fixes: #12789 --- developer/src/vscode-plugin/README.md | 3 +-- developer/src/vscode-plugin/package.json | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/developer/src/vscode-plugin/README.md b/developer/src/vscode-plugin/README.md index 4d0ae643b86..5d34fde4e5f 100644 --- a/developer/src/vscode-plugin/README.md +++ b/developer/src/vscode-plugin/README.md @@ -21,8 +21,7 @@ There is also a `build.sh` which works the usual way. - Open this directory (`vscode-plugin`) in VSCode - From the Run and Debug toolbar, click Run Extension -- A terminal will automatically open with `npm run watch` recompiling the project. -- Choose a directory containing a .kpj file, and choose the **Terminal > Run Task…** menu item, or the **Tasks: Run Task** command. Select "kpj" and the name, and the compilation should occur in a terminal window. +- Choose a directory containing an .xml LDML file - You can use the **Developer: Reload Window** command to reload the `[extension development]` window with a new version of the plugin. diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index d76597388ff..f6dd1644922 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -31,7 +31,7 @@ "scripts": { "vscode:prepublish": "npm run compile", "compile": "tsc -b ./ && npm run build", - "watch": "tsc -watch -b ./", + "watch": "tsc -b ./ --watch", "pretest": "npm run compile && npm run lint", "lint": "eslint src", "test": "echo use 'ui-test' to run the test - TODO-LDML-EDITOR", From d758a3b53fbad8bb1a0ad21639ad6b863d4b24c7 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 20 Dec 2024 16:57:17 -0600 Subject: [PATCH 04/20] =?UTF-8?q?chore(developer):=20ldml-editor:=20unbrea?= =?UTF-8?q?k:=20add=20version=20number=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - without this, the extension inexplicably stops working - This probably got dropped in the merge - Was noted in #12835 but wasn't clear this blocked extension operation Fixes: #12789 --- developer/src/vscode-plugin/package.json | 1 + package-lock.json | 1 + 2 files changed, 2 insertions(+) diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index f6dd1644922..96ac3b3f7dd 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -2,6 +2,7 @@ "name": "@keymanapp/keyman-developer-vscode", "displayName": "Keyman Developer for VSCode", "description": "Plugin for compiling Keyman projects in VSCode", + "version": "18.0.0-ALPHA", "engines": { "vscode": "^1.93.0" }, diff --git a/package-lock.json b/package-lock.json index 9818fd013b7..6b5f6134f94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2142,6 +2142,7 @@ }, "developer/src/vscode-plugin": { "name": "@keymanapp/keyman-developer-vscode", + "version": "18.0.0-ALPHA", "license": "MIT", "dependencies": { "@keymanapp/common-types": "*", From e79e92c971682575496845fdbf5fa2d577936d25 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 20 Dec 2024 16:58:30 -0600 Subject: [PATCH 05/20] chore(developer): add an LDMLCompilerManager - use an abstraction because of ESModule vs commonjs --- .../src/kmcLdmlCompilerManager.mts | 20 +++++++++++++++++++ .../vscode-plugin/src/ldmlCompilerManager.ts | 18 +++++++++++++++++ developer/src/vscode-plugin/src/ldmleditor.ts | 5 +++++ 3 files changed, 43 insertions(+) create mode 100644 developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts create mode 100644 developer/src/vscode-plugin/src/ldmlCompilerManager.ts diff --git a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts new file mode 100644 index 00000000000..0fc0c813199 --- /dev/null +++ b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts @@ -0,0 +1,20 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +// import { NodeCompilerCallbacks } from "@keymanapp/kmc"; +import { LDMLCompilerManager } from "./ldmlCompilerManager.js"; + +/** + * TODO-LDML-EDITOR: should use vscode.workspace.fs.readFile which can read from remote workspaces. + */ + +export class KmcLdmlManager implements LDMLCompilerManager { + async init(): Promise { + console.log("Initting KmcLdmlManager…"); + // new NodeCompilerCallbacks({ + // }); + console.log("KmcLdmlManager okay!"); + } + +}; diff --git a/developer/src/vscode-plugin/src/ldmlCompilerManager.ts b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts new file mode 100644 index 00000000000..05a0dfb070a --- /dev/null +++ b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts @@ -0,0 +1,18 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +/** + * interface for class to manage the compiler. + * This is abstract because the ES module needs to be loaded asynchronously. + */ +export interface LDMLCompilerManager { + /** validate that everything loaded properly */ + init() : Promise; +}; + +/** load concrete instance from module */ +export async function getLDMLCompilerManager() : Promise { + const { KmcLdmlManager } = await import('./kmcLdmlCompilerManager.mjs'); + return new KmcLdmlManager(); +} diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index f211e11cdd1..11fc4b58db1 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import * as crypto from 'crypto'; +import { getLDMLCompilerManager } from './ldmlCompilerManager'; interface LdmlDocumentDelegate { getFileData(): Promise; @@ -68,6 +69,7 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { throw new Error('Method not implemented.'); // TODO-LDML-EDITOR } async openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken): Promise { + console.log(`openCustom ${uri}`); const document : LdmlDocument = await LdmlDocument.create(uri, openContext.backupId, { getFileData: async() => { return new Uint8Array(); // TODO-LDML-EDITOR @@ -94,6 +96,9 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { } async resolveCustomTextEditor(document: vscode.TextDocument, webviewPanel: vscode.WebviewPanel, token: vscode.CancellationToken): Promise { + // temporary - testing linkage + await (await getLDMLCompilerManager()).init(); + webviewPanel.webview.options = { enableScripts: true, }; From 079270fbbb500b58bcaebd9d171f0107c103321f Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 24 Dec 2024 07:37:27 -0600 Subject: [PATCH 06/20] =?UTF-8?q?chore(developer):=20ldml-editor:=20use=20?= =?UTF-8?q?NodeCompilerCallbacks=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - add an extension point to NodeCompilerCallbacks to support changing message target - add an LDMLCompilerManager to simplify the CommonJS/ESM boundary Fixes: #12789 --- .../src/kmc/src/util/NodeCompilerCallbacks.ts | 11 +++-- developer/src/vscode-plugin/app/App.tsx | 14 ++++++ .../vscode-plugin/src/extensionCallbacks.mts | 25 ++++++++++ .../src/kmcLdmlCompilerManager.mts | 48 +++++++++++++++++-- .../vscode-plugin/src/ldmlCompilerManager.ts | 4 +- developer/src/vscode-plugin/src/ldmleditor.ts | 16 ++++++- 6 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 developer/src/vscode-plugin/src/extensionCallbacks.mts diff --git a/developer/src/kmc/src/util/NodeCompilerCallbacks.ts b/developer/src/kmc/src/util/NodeCompilerCallbacks.ts index fd5f29d2122..de80ba62f27 100644 --- a/developer/src/kmc/src/util/NodeCompilerCallbacks.ts +++ b/developer/src/kmc/src/util/NodeCompilerCallbacks.ts @@ -193,6 +193,11 @@ export class NodeCompilerCallbacks implements CompilerCallbacks { this.printMessage(event); } + /** Bottleneck for output */ + protected writeString(str: string) { + process.stdout.write(str); + } + private printMessage(event: CompilerEvent) { if(this.options.logFormat == 'tsv') { this.printTsvMessage(event); @@ -202,7 +207,7 @@ export class NodeCompilerCallbacks implements CompilerCallbacks { } private printTsvMessage(event: CompilerEvent) { - process.stdout.write([ + this.writeString([ CompilerError.formatFilename(event.filename, {fullPath:true, forwardSlashes:false}), CompilerError.formatLine(event.line), CompilerError.formatSeverity(event.code), @@ -214,7 +219,7 @@ export class NodeCompilerCallbacks implements CompilerCallbacks { private printFormattedMessage(event: CompilerEvent) { const severityColor = severityColors[CompilerError.severity(event.code)] ?? color.reset; const messageColor = this.messageSpecialColor(event) ?? color.reset; - process.stdout.write( + this.writeString( ( event.filename ? color.cyan(CompilerError.formatFilename(event.filename)) + @@ -228,7 +233,7 @@ export class NodeCompilerCallbacks implements CompilerCallbacks { if(event.code == InfrastructureMessages.INFO_ProjectBuiltSuccessfully) { // Special case: we'll add a blank line after project builds - process.stdout.write('\n'); + this.writeString('\n'); } } diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index f109b9973be..db87a86beb5 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -7,6 +7,20 @@ function count() : number { return (++a); } +let kmxplus = null; +let text = null; + +window.addEventListener('message', event => { + const message = event.data; + switch (message.command) { + case 'update': + kmxplus = message.kmxplus; + text = message.text; + break; + } +}); + + function App() { return (
diff --git a/developer/src/vscode-plugin/src/extensionCallbacks.mts b/developer/src/vscode-plugin/src/extensionCallbacks.mts new file mode 100644 index 00000000000..e0c0fa7c6b9 --- /dev/null +++ b/developer/src/vscode-plugin/src/extensionCallbacks.mts @@ -0,0 +1,25 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +import * as process from 'node:process'; +import { CompilerCallbackOptions } from "@keymanapp/developer-utils"; +import { NodeCompilerCallbacks } from "@keymanapp/kmc/build/src/util/NodeCompilerCallbacks.js"; + +export class ExtensionCallbacks extends NodeCompilerCallbacks { + /** + * @param options options to pass to NodeCompilerCallbacks + * @param msg callback to write to the console + */ + constructor(options: CompilerCallbackOptions, private msg?: (m: string)=>void) { + super(options); + } + + protected writeString(str: string) { + if (this.msg) { + this.msg(str); + } else { + process.stdout.write(str); + } + } +} diff --git a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts index 0fc0c813199..7ffd930d926 100644 --- a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts +++ b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts @@ -2,19 +2,59 @@ * Keyman is copyright (C) SIL Global. MIT License. */ -// import { NodeCompilerCallbacks } from "@keymanapp/kmc"; import { LDMLCompilerManager } from "./ldmlCompilerManager.js"; - +import { CompilerCallbackOptions, CompilerCallbacks, defaultCompilerOptions } from "@keymanapp/developer-utils"; +import { LdmlCompilerOptions, LdmlKeyboardCompiler } from "@keymanapp/kmc-ldml"; +import { ExtensionCallbacks } from "./extensionCallbacks.mjs"; +import { KMXPlus } from "@keymanapp/common-types"; /** * TODO-LDML-EDITOR: should use vscode.workspace.fs.readFile which can read from remote workspaces. + * + * TODO-LDML-EDITOR: naming can be improved. */ export class KmcLdmlManager implements LDMLCompilerManager { + calloptions?: CompilerCallbackOptions; + callbacks?: CompilerCallbacks; + compoptions?: LdmlCompilerOptions; + async init(): Promise { + if (this.callbacks) { + return; // already initted + } console.log("Initting KmcLdmlManager…"); - // new NodeCompilerCallbacks({ - // }); + this.calloptions = { + logLevel: "debug" + }; + this.callbacks = new ExtensionCallbacks(this.calloptions); // TODO-EPIC-LDML: capture output console.log("KmcLdmlManager okay!"); + console.log('Initted'); + } + + async compile(filename: string): Promise { + if (!this.callbacks) { + throw Error(`Must call init() first.`); + } + const k = new LdmlKeyboardCompiler(); + this.compoptions = { + ...defaultCompilerOptions, + readerOptions: { + // TODO-EPIC-LDML: need to use global path + importsPath: "/Users/srl295/src/cldr/keyboards/import/", + } + }; + await k.init(this.callbacks, this.compoptions); + const source = await k.load(filename); + console.log(`loaded ${filename}`); + if (!source) { + throw Error(`Could not load ${filename}`); + } + const compiled = await k.compile(source); + if (!compiled) { + throw Error(`Could not compile ${filename}`); + } + console.log(`compiled ${filename}`); + return compiled; } }; diff --git a/developer/src/vscode-plugin/src/ldmlCompilerManager.ts b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts index 05a0dfb070a..2cc81a44159 100644 --- a/developer/src/vscode-plugin/src/ldmlCompilerManager.ts +++ b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts @@ -7,8 +7,10 @@ * This is abstract because the ES module needs to be loaded asynchronously. */ export interface LDMLCompilerManager { - /** validate that everything loaded properly */ + /** validate that everything loaded properly. idempotent */ init() : Promise; + /** Compile a file. Returns KMXPlus file. */ + compile(filename: string) : Promise; }; /** load concrete instance from module */ diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index 11fc4b58db1..8d3d7bff686 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode'; import * as crypto from 'crypto'; -import { getLDMLCompilerManager } from './ldmlCompilerManager'; +import { getLDMLCompilerManager, LDMLCompilerManager } from './ldmlCompilerManager'; interface LdmlDocumentDelegate { getFileData(): Promise; @@ -41,8 +41,17 @@ class LdmlDocument implements vscode.CustomDocument { } export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { + private compiler? : LDMLCompilerManager; private static readonly viewType = 'keyman.ldml'; // sync w/ package.json + private async getCompiler() : Promise { + if (!this.compiler) { + this.compiler = await getLDMLCompilerManager(); + } + await this.compiler.init(); + return this.compiler; + } + constructor(private readonly context: vscode.ExtensionContext) { } static register(context: vscode.ExtensionContext): vscode.Disposable { const provider = new LdmlEditorProvider(context); @@ -96,8 +105,10 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { } async resolveCustomTextEditor(document: vscode.TextDocument, webviewPanel: vscode.WebviewPanel, token: vscode.CancellationToken): Promise { + // make sure we have a compiler + const compiler = await this.getCompiler(); // temporary - testing linkage - await (await getLDMLCompilerManager()).init(); + const kmxPlus = await compiler.compile(document.fileName); webviewPanel.webview.options = { enableScripts: true, @@ -142,6 +153,7 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { webviewPanel.webview.postMessage({ type: 'update', text: document.getText(), + kmxPlus, }); } From b2167fe43d9325a2edaaa83053417d094b1b8005 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 24 Dec 2024 07:54:56 -0600 Subject: [PATCH 07/20] chore(developer): update for update from master - use correct imports paths - user gets a fatal error if the keyboard file doesn't compile. But at least it compiles! Fixes: #12789 --- .../src/vscode-plugin/src/kmcLdmlCompilerManager.mts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts index 7ffd930d926..2f541cc8dac 100644 --- a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts +++ b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts @@ -3,10 +3,13 @@ */ import { LDMLCompilerManager } from "./ldmlCompilerManager.js"; -import { CompilerCallbackOptions, CompilerCallbacks, defaultCompilerOptions } from "@keymanapp/developer-utils"; +import { CompilerCallbackOptions, CompilerCallbacks, defaultCompilerOptions, LDMLKeyboardXMLSourceFileReader } from "@keymanapp/developer-utils"; import { LdmlCompilerOptions, LdmlKeyboardCompiler } from "@keymanapp/kmc-ldml"; import { ExtensionCallbacks } from "./extensionCallbacks.mjs"; import { KMXPlus } from "@keymanapp/common-types"; +import { fileURLToPath } from 'url'; +import { dirname } from 'node:path'; + /** * TODO-LDML-EDITOR: should use vscode.workspace.fs.readFile which can read from remote workspaces. * @@ -39,8 +42,8 @@ export class KmcLdmlManager implements LDMLCompilerManager { this.compoptions = { ...defaultCompilerOptions, readerOptions: { - // TODO-EPIC-LDML: need to use global path - importsPath: "/Users/srl295/src/cldr/keyboards/import/", + cldrImportsPath: fileURLToPath(new URL(...LDMLKeyboardXMLSourceFileReader.defaultImportsURL)), + localImportsPaths: [ dirname(filename) ], // local dir } }; await k.init(this.callbacks, this.compoptions); From ed94bba38f2d57d3ead21c6b7d738ec77a5c3ecb Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 24 Dec 2024 10:09:45 -0600 Subject: [PATCH 08/20] feat(developer): update React side to show if the keyboard loaded or not Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 48 +++++++++++++++++-------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index db87a86beb5..d00d7f20a63 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -1,30 +1,48 @@ import React from 'react'; import './App.css'; -let a : number = 3; +const vsCode = (global as any).acquireVsCodeApi(); -function count() : number { - return (++a); -} +function Keyboard() { + const [kmxPlus, setKmxPlus] = React.useState({loaded: false, text: null}); + + window.addEventListener('message', event => { + const message = event.data; + switch (message.type) { + case 'update': + const { kmxPlus, text } = message; + console.log('Got Data'); + setKmxPlus({ loaded: true, text }); + break; + default: + console.error(`Unknown message ${message.type}`); + } + }); -let kmxplus = null; -let text = null; + const loaded = (kmxPlus as any)?.loaded; -window.addEventListener('message', event => { - const message = event.data; - switch (message.command) { - case 'update': - kmxplus = message.kmxplus; - text = message.text; - break; + if (!loaded) { + return ( +
+

LDML Keyboard

+ no KMX+ yet +
+ ); } -}); + return ( +
+

LDML Keyboard

+
{ kmxPlus?.text }
+
+ ); +} function App() { return (
- Hello world!! 2+2 = ${count()} +

App

+
); } From a8fd0dc38e52fe89589e5cfcb94b62ac33594a75 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Thu, 26 Dec 2024 15:17:54 -0600 Subject: [PATCH 09/20] feat(developer): use index.html from parcel - fixup index.html from parcel and use it. this avoids hard coded hex ids - also, fix vscode-test.mjs to support correct .tests. name Fixes: #12789 --- developer/src/vscode-plugin/.vscode-test.mjs | 2 +- developer/src/vscode-plugin/app/index.html | 6 +- developer/src/vscode-plugin/package.json | 5 +- developer/src/vscode-plugin/src/indexFixer.ts | 58 ++++++ developer/src/vscode-plugin/src/ldmleditor.ts | 52 ++--- .../src/test/extensions.tests.ts | 4 +- .../src/test/indexFixer.tests.ts | 54 ++++++ package-lock.json | 178 +++++++++++++++++- 8 files changed, 315 insertions(+), 44 deletions(-) create mode 100644 developer/src/vscode-plugin/src/indexFixer.ts create mode 100644 developer/src/vscode-plugin/src/test/indexFixer.tests.ts diff --git a/developer/src/vscode-plugin/.vscode-test.mjs b/developer/src/vscode-plugin/.vscode-test.mjs index b62ba25f015..74a5fcf8dee 100644 --- a/developer/src/vscode-plugin/.vscode-test.mjs +++ b/developer/src/vscode-plugin/.vscode-test.mjs @@ -1,5 +1,5 @@ import { defineConfig } from '@vscode/test-cli'; export default defineConfig({ - files: 'out/test/**/*.test.js', + files: 'out/test/**/*.tests.js', }); diff --git a/developer/src/vscode-plugin/app/index.html b/developer/src/vscode-plugin/app/index.html index 6bdf5f16289..4df8622a6b8 100644 --- a/developer/src/vscode-plugin/app/index.html +++ b/developer/src/vscode-plugin/app/index.html @@ -3,8 +3,10 @@ - Editor - + LDML Editor + + + diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index 96ac3b3f7dd..5360abe70e3 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -37,14 +37,17 @@ "lint": "eslint src", "test": "echo use 'ui-test' to run the test - TODO-LDML-EDITOR", "ui-test": "vscode-test", - "build": "parcel build --target=default --cache-dir=.parcel-cache --no-content-hash" + "build": "parcel build --target=default --cache-dir=.parcel-cache", + "ui-watch": "parcel watch --target=default --cache-dir=.parcel-cache" }, "devDependencies": { + "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.0", "@types/node": "20.4.1", "@types/vscode": "^1.93.0", "@vscode/test-cli": "^0.0.10", "@vscode/test-electron": "^2.4.1", + "jsdom": "^25.0.1", "parcel": "^2.13.2" }, "license": "MIT", diff --git a/developer/src/vscode-plugin/src/indexFixer.ts b/developer/src/vscode-plugin/src/indexFixer.ts new file mode 100644 index 00000000000..56134144b5c --- /dev/null +++ b/developer/src/vscode-plugin/src/indexFixer.ts @@ -0,0 +1,58 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +const jsdom = require("jsdom"); +const { JSDOM } = jsdom; + +export function fixupUrl(s: string, buildUri: string) : string { + if (s.startsWith('/')) { + // trim off leading / + s = s.slice(1); + } else { + throw Error(`Fixup: URL ${s} didn't start with ./`); + } + if (!buildUri.endsWith('/')) { + buildUri = buildUri + '/'; + } + const u : URL = new URL(s, buildUri); + return u.toString(); +} + +export function fixupElementAttribute(e : Element, attr: string, buildUri: string) : Element { + const v = e.getAttribute(attr); + if (!v) { + throw Error(`Could not find attribute ${attr}= on ${e.outerHTML}`); + } + const n = fixupUrl(v, buildUri); + e.setAttribute(attr, n); + return e; +} + +export function fixupElementByTag(doc: Document, tag: string, attr: string, buildUri: string) { + const list = doc.getElementsByTagName(tag); + if (!list.length) { + throw Error(`Expected at least one <${tag}/> but found ${list.length}`); + } + for (const e of list) { + fixupElementAttribute(e, attr, buildUri); + } +} + +/** + * + * @param html index.html source + * @param buildUri index to extensionUri/build + * @param nonce to replace `@NONCE@` + * @param cspSource to replace `@CSPSOURCE@` + */ +export function fixupIndexHtml(html : string, buildUri : string, nonce : string, cspSource : string) : string { + const dom = new JSDOM(html); + const doc = dom.window.document; + fixupElementByTag(doc, 'link', 'href', buildUri); + fixupElementByTag(doc, 'script', 'src', buildUri); + // serialize, and substitute + return doc.documentElement.outerHTML + .replace(/@NONCE@/g, nonce) + .replace(/@CSPSOURCE@/g, cspSource); +} diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index 8d3d7bff686..4dd0a22c0d6 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -7,6 +7,7 @@ import * as vscode from 'vscode'; import * as crypto from 'crypto'; import { getLDMLCompilerManager, LDMLCompilerManager } from './ldmlCompilerManager'; +import { fixupIndexHtml } from './indexFixer'; interface LdmlDocumentDelegate { getFileData(): Promise; @@ -116,38 +117,25 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { const { webview } = webviewPanel; - // these are fixed IDs as parcel is set to not do content hashing - const styleUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'build', 'index.89a9d63e.css')); - const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'build', 'index.2f8490e0.js')); - - const nonce = crypto.randomUUID().toString(); - - // TODO-LDML-EDITOR move to React function - webview.html = ` - - - - - - - - - - - - - LDML - - - -
- - - - `.trim(); + + try { + // we read this file, and munge it a bit. + const indexUri = vscode.Uri.joinPath(this.context.extensionUri, 'build', 'index.html'); + // pass this as an argument to fixup URLs + const buildUri = webview.asWebviewUri(vscode.Uri.joinPath(this.context.extensionUri, 'build')); + + const nonce = crypto.randomUUID().toString(); + + console.dir({indexUri}); + const indexRaw = await vscode.workspace.fs.readFile(indexUri); + const indexText = new TextDecoder('UTF-8').decode(indexRaw); + const html = fixupIndexHtml(indexText, buildUri.toString(), nonce, webview.cspSource); + console.log(html); + webview.html = html; + } catch(e) { + console.error(e); + webview.html = `error: ${e}`; + } function updateWebview() { webviewPanel.webview.postMessage({ diff --git a/developer/src/vscode-plugin/src/test/extensions.tests.ts b/developer/src/vscode-plugin/src/test/extensions.tests.ts index fad135bdec6..93388219f4a 100644 --- a/developer/src/vscode-plugin/src/test/extensions.tests.ts +++ b/developer/src/vscode-plugin/src/test/extensions.tests.ts @@ -4,9 +4,9 @@ import * as assert from 'assert'; -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it import * as vscode from 'vscode'; + +// TODO-LDML-EDITOR: import extension // import * as myExtension from '../../extension'; suite('Extension Test Suite', () => { diff --git a/developer/src/vscode-plugin/src/test/indexFixer.tests.ts b/developer/src/vscode-plugin/src/test/indexFixer.tests.ts new file mode 100644 index 00000000000..a7768fd648b --- /dev/null +++ b/developer/src/vscode-plugin/src/test/indexFixer.tests.ts @@ -0,0 +1,54 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +import * as assert from 'assert'; +import { fixupIndexHtml, fixupUrl } from '../indexFixer.js'; + +suite('indexFixer Test Suite', () => { + + test('fixupUrl test', () => { + const s = '/index.BA426DDA.css'; + const buildUri = 'file://foo/bar/baz/build'; + const u = fixupUrl(s, buildUri); + assert.equal(u, 'file://foo/bar/baz/build/index.BA426DDA.css'); + }); + + test('fixup HTML test', () => { + const s = ` + + + + + LDML Editor + + + + + + +
+ + +`; + // the HTMl gets normalized a little bit + const expect = ` + + LDML Editor + + + + + + +
+ + +
`; + const buildUri = 'file://foo/bar/baz/build'; + const cspSource = 'C-S-P-SOURCE'; + const nonce = '00-00-00'; + const actual = fixupIndexHtml(s, buildUri, nonce, cspSource); + assert.equal(actual, expect); + }); +}); diff --git a/package-lock.json b/package-lock.json index 6b5f6134f94..10dbc9527c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2155,11 +2155,13 @@ "react-dom": "^19.0.0" }, "devDependencies": { + "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.0", "@types/node": "20.4.1", "@types/vscode": "^1.93.0", "@vscode/test-cli": "^0.0.10", "@vscode/test-electron": "^2.4.1", + "jsdom": "^25.0.1", "parcel": "^2.13.2" }, "engines": { @@ -2179,6 +2181,133 @@ "integrity": "sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg==", "dev": true }, + "developer/src/vscode-plugin/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "developer/src/vscode-plugin/node_modules/cssstyle": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "dev": true, + "dependencies": { + "rrweb-cssom": "^0.7.1" + }, + "engines": { + "node": ">=18" + } + }, + "developer/src/vscode-plugin/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "developer/src/vscode-plugin/node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "developer/src/vscode-plugin/node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true + }, + "developer/src/vscode-plugin/node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "developer/src/vscode-plugin/node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "developer/src/vscode-plugin/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "developer/src/vscode-plugin/node_modules/whatwg-url": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@75lb/deep-merge": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.2.tgz", @@ -6780,6 +6909,18 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -6925,6 +7066,13 @@ "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/vscode": { "version": "1.95.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", @@ -15467,9 +15615,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true }, "node_modules/object-assign": { @@ -18038,6 +18186,24 @@ "dev": true, "license": "MIT" }, + "node_modules/tldts": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.70.tgz", + "integrity": "sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==", + "dev": true, + "dependencies": { + "tldts-core": "^6.1.70" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.70.tgz", + "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==", + "dev": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -19276,9 +19442,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, From 900ec9ace8d7a3cc70242d7ad1ca984278a51ea6 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 12:57:20 -0600 Subject: [PATCH 10/20] =?UTF-8?q?feat(developer):=20initial=20views=20?= =?UTF-8?q?=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - keybag - layer list with key ids Fixes: #12789 --- developer/src/vscode-plugin/app/App.css | 50 ++++- developer/src/vscode-plugin/app/App.tsx | 253 +++++++++++++++++++++++- 2 files changed, 291 insertions(+), 12 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.css b/developer/src/vscode-plugin/app/App.css index 493161332b3..53f49a7a71d 100644 --- a/developer/src/vscode-plugin/app/App.css +++ b/developer/src/vscode-plugin/app/App.css @@ -1,3 +1,49 @@ -.App { - text-align: center; +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + +.App pre.code { + text-align: left; + +} + +.Key { + margin: 0.25em; + display: flow flex-shrink; + flex-grow: 1; + flex-basis: 3em; + white-space-collapse: preserve-spaces; +} + +.chosenKey { + background-color: navy; + color: white; +} + +/* +kbd.unchosenKey { +} +*/ + +/* .keyBagContainer { + border: 2px solid blue; +} */ + +.keyList { + border: 1px solid gray; + padding: 0.25em; + width: 50em; + height: 11em; + display: flex; + flex-wrap: wrap; + overflow-y: scroll; +} + +.selectedLayoutListButton { + background-color: navy; + color: white; +} + +.layoutList kbd { + margin: 0.25em; } diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index d00d7f20a63..58ce47ab4a1 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -1,25 +1,255 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + */ + import React from 'react'; import './App.css'; +import { KMXPlus } from '@keymanapp/common-types'; +import KMXPlusFile = KMXPlus.KMXPlusFile; +import { constants } from '@keymanapp/ldml-keyboard-constants'; + +interface LoadedData { + loaded: boolean; + text?: string; + kmxPlus?: KMXPlusFile; +} const vsCode = (global as any).acquireVsCodeApi(); +function RawSource({ text }) { + const [shown, setShown] = React.useState(false); + function show() { + setShown(true); + } + if (!text) return; + if (!shown) return ( + + ); + return ( +
+ +

Raw Source

+
{text}
+
+ ); +} + +function Key({ k, kmxPlus, chosenKey, setChosenKey }: { + k: KMXPlus.KeysKeys, + kmxPlus: KMXPlusFile, + chosenKey: string, + setChosenKey: any, /* setter */ + key: string, /* special prop */ +}) { + const id = k.id.value; + const chosen = (chosenKey == id); + const className = chosen ? "Key chosenKey" : "Key unchosenKey"; + // const onClick = chosen ? () => setChosenKey(k.id.value) : setChosenKey(id); + const onClick = () => {}; + if (k.to.value === '') { + return ( + setChosenKey(id)} className={className} title={id}>{id} + ) + } + return ( + setChosenKey(id)} className={className} title={id}>{k.to.value} + ); +} + +function KeyList({ keys, kmxPlus, chosenKey, setChosenKey }: + { keys: KMXPlus.KeysKeys[], kmxPlus: KMXPlusFile, chosenKey: string, setChosenKey: any /* setter */ }) { + return ( +
+ {keys?.map((k) => ())} +
+ ); +} + +/** detail editor */ +function KeyDetails({ chosenKey, kmxPlus } : { chosenKey : string, kmxPlus : KMXPlusFile}) { + if (!chosenKey) return; + const chosenKeys = kmxPlus.kmxplus.keys?.keys.filter(({id}) => id.value == chosenKey); + if (!chosenKeys?.length) { + return; // no key selecte4d + } else if (chosenKeys?.length > 1) { + throw Error(`more than one key with id ${chosenKey}`); + } + + const k = chosenKeys[0]; + + const {flags} = k; + const isGap = flags & constants.keys_key_flags_gap; + + return ( +
+
Details
+

ID: {k.id.value}

+

To: {k.to.value}

+

Width: {k.width}

+

Gap? {isGap ? 'Yes' : 'No'}

+

flags? 0x{k.flags.toString(16)}

+
+ ); +} + +/** the main editor for keys */ +function KeyBag({ kmxPlus } : { kmxPlus : KMXPlusFile}) { + const keys = kmxPlus?.kmxplus?.keys?.keys || []; + /** string id of selected key */ + const [ chosenKey, setChosenKey ] = React.useState(keys[0]?.id?.value); + if (!kmxPlus) return; // get out + return ( + <> +

Key Bag

+
Chosen: {chosenKey}
+
+ +
+ + + ); +} + +/** treat hardware as width -1 for sorting */ +const WIDTH_HARDWARE = -1; + +/** get an index for a LayrList */ +function touchWidth( list: KMXPlus.LayrList ) : number { + if (list.hardware.value === constants.layr_list_hardware_touch) { + return list.minDeviceWidth; + } else { + return -1; + } +} + +function LayoutListButton({curWidth, setCurWidth, kmxPlus, list} : + { + curWidth: number, + setCurWidth: any, + kmxPlus: KMXPlusFile, + list: KMXPlus.LayrList, + key: string, + } +) { + const myWidth = touchWidth(list); + const selected = (curWidth === myWidth); + const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); + const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; + const className = selected ? 'layoutListButton selectedLayoutListButton' : 'layoutListButton unselectedLayoutListButton'; + return ( + + ); +} + +function modToStr(mod : number) { + if (mod === constants.keys_mod_none) { + return 'none'; + } + let ret : string[] = []; + constants.keys_mod_map.forEach((mask, name) => { + if(mod & mask) { + ret.push(name); + } + }); + ret.sort(); // make it deterministic + return ret.join(','); +} + +function layerTitle(layer : KMXPlus.LayrEntry) { + if (layer.id.value) return layer.id.value + modToStr(layer.mod); + return modToStr(layer.mod); +} + +function Row({row, kmxPlus} : { + row: KMXPlus.LayrRow, + kmxPlus: KMXPlusFile, + key: string, +}) { + return ( + <> + {row.keys.map(({value})=>( + {value} + ))} +
+ + ) +} + +function Layer({layer, kmxPlus} : { + layer: KMXPlus.LayrEntry, + kmxPlus: KMXPlusFile, + key: string, +}) { + return ( + <> +
{layerTitle(layer)}
+ {layer.rows.map((row,index)=> ())} + + ); +} + +function LayoutList({curWidth, setCurWidth, kmxPlus, list} : + { + curWidth: number, + setCurWidth: any, + kmxPlus: KMXPlusFile, + list: KMXPlus.LayrList, + key: string, + } +) { + const myWidth = touchWidth(list); + const selected = (curWidth === myWidth); + if (!selected) return; // for now: hide collapsed layouts + const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); + const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; + return ( +
+
{title}
+ {list.layers.map((layer)=> ())} +
+ ); +} + +function KeyLayouts({ kmxPlus} : { kmxPlus : KMXPlusFile}) { + const lists = [...(kmxPlus.kmxplus.layr?.lists || [])]; // copy the list + const [curWidth, setCurWidth] = React.useState(WIDTH_HARDWARE); + lists.sort((a,b)=>touchWidth(a)-touchWidth(b)); // sort by width + return ( +
+

Layouts

+ {lists.map((list) => ())} + {lists.map((list) => ())} +
+ ); +} + function Keyboard() { - const [kmxPlus, setKmxPlus] = React.useState({loaded: false, text: null}); + const initialData: LoadedData = { + loaded: false, + text: undefined, + kmxPlus: undefined, + }; + const [data, setData] = React.useState(initialData); window.addEventListener('message', event => { const message = event.data; switch (message.type) { - case 'update': - const { kmxPlus, text } = message; - console.log('Got Data'); - setKmxPlus({ loaded: true, text }); - break; - default: - console.error(`Unknown message ${message.type}`); + case 'update': + const { kmxPlus, text } = message; + console.log('Got Data'); + const newData: LoadedData = { + loaded: true, kmxPlus, text + }; + setData(newData); + break; + default: + console.error(`Unknown message ${message.type}`); } }); - const loaded = (kmxPlus as any)?.loaded; + const loaded = (data as any)?.loaded; if (!loaded) { return ( @@ -33,7 +263,10 @@ function Keyboard() { return (

LDML Keyboard

-
{ kmxPlus?.text }
+ + +
+
); } From 7ba82fbb29ec0a546a5950db66160a07aaf96ffe Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 15:00:08 -0600 Subject: [PATCH 11/20] =?UTF-8?q?feat(developer):=20use=20react=20context?= =?UTF-8?q?=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 52 +++++++++++++------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 58ce47ab4a1..85f50279ce2 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -14,6 +14,10 @@ interface LoadedData { kmxPlus?: KMXPlusFile; } +const noKmxPlusFile : KMXPlusFile = undefined as unknown as KMXPlusFile; + +const KmxPlusContext = React.createContext(noKmxPlusFile); + const vsCode = (global as any).acquireVsCodeApi(); function RawSource({ text }) { @@ -34,9 +38,8 @@ function RawSource({ text }) { ); } -function Key({ k, kmxPlus, chosenKey, setChosenKey }: { +function Key({ k, chosenKey, setChosenKey }: { k: KMXPlus.KeysKeys, - kmxPlus: KMXPlusFile, chosenKey: string, setChosenKey: any, /* setter */ key: string, /* special prop */ @@ -56,17 +59,18 @@ function Key({ k, kmxPlus, chosenKey, setChosenKey }: { ); } -function KeyList({ keys, kmxPlus, chosenKey, setChosenKey }: - { keys: KMXPlus.KeysKeys[], kmxPlus: KMXPlusFile, chosenKey: string, setChosenKey: any /* setter */ }) { +function KeyList({ keys, chosenKey, setChosenKey }: + { keys: KMXPlus.KeysKeys[], chosenKey: string, setChosenKey: any /* setter */ }) { return (
- {keys?.map((k) => ())} + {keys?.map((k) => ())}
); } /** detail editor */ -function KeyDetails({ chosenKey, kmxPlus } : { chosenKey : string, kmxPlus : KMXPlusFile}) { +function KeyDetails({ chosenKey } : { chosenKey : string }) { + const kmxPlus = React.useContext(KmxPlusContext); if (!chosenKey) return; const chosenKeys = kmxPlus.kmxplus.keys?.keys.filter(({id}) => id.value == chosenKey); if (!chosenKeys?.length) { @@ -93,7 +97,8 @@ function KeyDetails({ chosenKey, kmxPlus } : { chosenKey : string, kmxPlus : KMX } /** the main editor for keys */ -function KeyBag({ kmxPlus } : { kmxPlus : KMXPlusFile}) { +function KeyBag() { + const kmxPlus = React.useContext(KmxPlusContext); const keys = kmxPlus?.kmxplus?.keys?.keys || []; /** string id of selected key */ const [ chosenKey, setChosenKey ] = React.useState(keys[0]?.id?.value); @@ -103,9 +108,9 @@ function KeyBag({ kmxPlus } : { kmxPlus : KMXPlusFile}) {

Key Bag

Chosen: {chosenKey}
- +
- + ); } @@ -122,11 +127,10 @@ function touchWidth( list: KMXPlus.LayrList ) : number { } } -function LayoutListButton({curWidth, setCurWidth, kmxPlus, list} : +function LayoutListButton({curWidth, setCurWidth, list} : { curWidth: number, setCurWidth: any, - kmxPlus: KMXPlusFile, list: KMXPlus.LayrList, key: string, } @@ -162,9 +166,8 @@ function layerTitle(layer : KMXPlus.LayrEntry) { return modToStr(layer.mod); } -function Row({row, kmxPlus} : { +function Row({row} : { row: KMXPlus.LayrRow, - kmxPlus: KMXPlusFile, key: string, }) { return ( @@ -177,24 +180,22 @@ function Row({row, kmxPlus} : { ) } -function Layer({layer, kmxPlus} : { +function Layer({layer} : { layer: KMXPlus.LayrEntry, - kmxPlus: KMXPlusFile, key: string, }) { return ( <>
{layerTitle(layer)}
- {layer.rows.map((row,index)=> ())} + {layer.rows.map((row,index)=> ())} ); } -function LayoutList({curWidth, setCurWidth, kmxPlus, list} : +function LayoutList({curWidth, setCurWidth, list} : { curWidth: number, setCurWidth: any, - kmxPlus: KMXPlusFile, list: KMXPlus.LayrList, key: string, } @@ -207,20 +208,21 @@ function LayoutList({curWidth, setCurWidth, kmxPlus, list} : return (
{title}
- {list.layers.map((layer)=> ())} + {list.layers.map((layer)=> ())}
); } -function KeyLayouts({ kmxPlus} : { kmxPlus : KMXPlusFile}) { +function KeyLayouts() { + const kmxPlus = React.useContext(KmxPlusContext); const lists = [...(kmxPlus.kmxplus.layr?.lists || [])]; // copy the list const [curWidth, setCurWidth] = React.useState(WIDTH_HARDWARE); lists.sort((a,b)=>touchWidth(a)-touchWidth(b)); // sort by width return (

Layouts

- {lists.map((list) => ())} - {lists.map((list) => ())} + {lists.map((list) => ())} + {lists.map((list) => ())}
); } @@ -263,8 +265,10 @@ function Keyboard() { return (

LDML Keyboard

- - + + + +
From ea7dc33457ed964bd06c2885e1577a1d60fff372 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 15:17:11 -0600 Subject: [PATCH 12/20] feat(developer): use index.html from parcel - add antd - not sure this is a sustainable way to add css inline content Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 3 +- developer/src/vscode-plugin/app/index.html | 2 +- developer/src/vscode-plugin/package.json | 1 + package-lock.json | 973 ++++++++++++++++++++- 4 files changed, 976 insertions(+), 3 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 85f50279ce2..233468f2228 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -7,6 +7,7 @@ import './App.css'; import { KMXPlus } from '@keymanapp/common-types'; import KMXPlusFile = KMXPlus.KMXPlusFile; import { constants } from '@keymanapp/ldml-keyboard-constants'; +import { Button } from 'antd'; interface LoadedData { loaded: boolean; @@ -27,7 +28,7 @@ function RawSource({ text }) { } if (!text) return; if (!shown) return ( - + ); return (
diff --git a/developer/src/vscode-plugin/app/index.html b/developer/src/vscode-plugin/app/index.html index 4df8622a6b8..2fe46d8ea08 100644 --- a/developer/src/vscode-plugin/app/index.html +++ b/developer/src/vscode-plugin/app/index.html @@ -6,7 +6,7 @@ LDML Editor - + diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index 5360abe70e3..de4ede93945 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -57,6 +57,7 @@ "@keymanapp/kmc-kmn": "*", "@keymanapp/kmc-ldml": "*", "@keymanapp/kmc-package": "*", + "antd": "^5.22.7", "process": "^0.11.10", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/package-lock.json b/package-lock.json index 10dbc9527c5..1eeb589c494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2150,6 +2150,7 @@ "@keymanapp/kmc-kmn": "*", "@keymanapp/kmc-ldml": "*", "@keymanapp/kmc-package": "*", + "antd": "^5.22.7", "process": "^0.11.10", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -2361,6 +2362,96 @@ "tunnel": "^0.0.6" } }, + "node_modules/@ant-design/colors": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.1.0.tgz", + "integrity": "sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==", + "dependencies": { + "@ctrl/tinycolor": "^3.6.1" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.22.1.tgz", + "integrity": "sha512-SLuXM4wiEE1blOx94iXrkOgseMZHzdr4ngdFu3VVDq6AOWh7rlwqTkMAtJho3EsBF6x/eUGOtK53VZXGQG7+sQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.5.2.tgz", + "integrity": "sha512-xc53rjVBl9v2BqFxUjZGti/RfdDeA8/6KYglmInM2PNqSXc/WfuGDTifJI/ZsokJK0aeKvOIbXc9y2g8ILAhEA==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -2460,6 +2551,17 @@ "node": ">=4" } }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "dev": true, @@ -2478,6 +2580,24 @@ "node": ">=12" } }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -5724,6 +5844,146 @@ "node": ">=12" } }, + "node_modules/@rc-component/async-validator": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.0.4.tgz", + "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.0.0.tgz", + "integrity": "sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==", + "dependencies": { + "@babel/runtime": "^7.24.7", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.2.6.tgz", + "integrity": "sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", @@ -8744,6 +9004,70 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antd": { + "version": "5.22.7", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.22.7.tgz", + "integrity": "sha512-koT5QMliDgXc21yNcs4Uyuq6TeB5AJbzGZ2qjNExzE7Tjr8yYIX6sJsQfunsEV80wC1mpF7m9ldKuNj+PafcFA==", + "dependencies": { + "@ant-design/colors": "^7.1.0", + "@ant-design/cssinjs": "^1.21.1", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/icons": "^5.5.2", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.25.7", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.0.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.2.6", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.30.0", + "rc-checkbox": "~3.3.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.2.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.0", + "rc-image": "~7.11.0", + "rc-input": "~1.6.4", + "rc-input-number": "~9.3.0", + "rc-mentions": "~2.17.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.2", + "rc-pagination": "~5.0.0", + "rc-picker": "~4.8.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.0", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.5.0", + "rc-select": "~14.16.4", + "rc-slider": "~11.1.7", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.49.0", + "rc-tabs": "~15.4.0", + "rc-textarea": "~1.8.2", + "rc-tooltip": "~6.2.1", + "rc-tree": "~5.10.1", + "rc-tree-select": "~5.24.5", + "rc-upload": "~4.8.1", + "rc-util": "^5.44.3", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/anymatch": { "version": "3.1.2", "dev": true, @@ -9676,6 +10000,11 @@ "devtools-protocol": "*" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -9925,6 +10254,11 @@ "node": ">=4.0.0" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==" + }, "node_modules/concat-map": { "version": "0.0.1", "dev": true, @@ -9992,6 +10326,14 @@ "node": ">= 0.8" } }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, "node_modules/copyfiles": { "version": "2.4.1", "dev": true, @@ -10187,6 +10529,11 @@ "node": ">=14" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", @@ -10243,6 +10590,11 @@ "node": ">=18" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -13841,6 +14193,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -16794,6 +17154,577 @@ "node": ">= 0.8" } }, + "node_modules/rc-cascader": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.30.0.tgz", + "integrity": "sha512-rrzSbk1Bdqbu+pDwiLCLHu72+lwX9BZ28+JKzoi0DWZ4N29QYFeip8Gctl33QVd2Xg3Rf14D3yAOG76ElJw16w==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.3.0.tgz", + "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.2.0.tgz", + "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.0.tgz", + "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.11.0.tgz", + "integrity": "sha512-aZkTEZXqeqfPZtnSdNUnKQA0N/3MbgR7nUnZ+/4MfSFWPFHZau4p5r5ShaI0KPEMnNjv4kijSCFq/9wtJpwykw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.6.4.tgz", + "integrity": "sha512-lBZhfRD4NSAUW0zOKLUeI6GJuXkxeZYi0hr8VcJgJpyTNOvHw1ysrKWAHcEOAAHj7guxgmWYSi6xWrEdfrSAsA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.3.0.tgz", + "integrity": "sha512-JQ363ywqRyxwgVxpg2z2kja3CehTpYdqR7emJ/6yJjRdbvo+RvfE83fcpBCIJRq3zLp8SakmEXq60qzWyZ7Usw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.6.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.17.0.tgz", + "integrity": "sha512-sfHy+qLvc+p8jx8GUsujZWXDOIlIimp6YQz7N5ONQ6bHsa2kyG+BLa5k2wuxgebBbH97is33wxiyq5UkiXRpHA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.6.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.8.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.0.tgz", + "integrity": "sha512-vAL0yqPkmXWk3+YKRkmIR8TYj3RVdEt3ptG2jCJXWNAvQbT0VJJdRyHZ7kG/l1JsZlB+VJq/VcYOo69VR4oD+w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.2.tgz", + "integrity": "sha512-Id4IYMoii3zzrG0lB0gD6dPgJx4Iu95Xu0BQrhHIbp7ZnAZbLqdqQ73aIWH0d0UFcElxwaKjnzNovTjo7kXz7g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.0.0.tgz", + "integrity": "sha512-QjrPvbAQwps93iluvFM62AEYglGYhWW2q/nliQqmvkTi4PXP4HHoh00iC1Sa5LLVmtWQHmG73fBi2x6H6vFHRg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.8.3.tgz", + "integrity": "sha512-hJ45qoEs4mfxXPAJdp1n3sKwADul874Cd0/HwnsEOE60H+tgiJUGgbOD62As3EG/rFVNS5AWRfBCDJJfmRqOVQ==", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.0.tgz", + "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.5.0.tgz", + "integrity": "sha512-B28Fe3J9iUFOhFJET3RoXAPFJ2u47QvLSYcZWC4tFYNGPEjug5LAxEasZlA/PpAxhdOPqGWsGbSj7ftneukJnw==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.4", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.4.tgz", + "integrity": "sha512-jP6qf7+vjnxGvPpfPWbGYfFlSl3h8L2XcD4O7g2GYXmEeBC0mw+nPD7i++OOE8v3YGqP8xtYjRKAWCMLfjgxlw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.7", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.7.tgz", + "integrity": "sha512-ytYbZei81TX7otdC0QvoYD72XSlxvTihNth5OeZ6PMXyEDq/vHdWFulQmfDGyXK1NwKwSlKgpvINOa88uT5g2A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.49.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.49.0.tgz", + "integrity": "sha512-/FoPLX94muAQOxVpi1jhnpKjOIqUbT81eELQPAzSXOke4ky4oCWYUXOcVpL31ZCO90xScwVSXRd7coqtgtB1Ng==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.41.0", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.4.0.tgz", + "integrity": "sha512-llKuyiAVqmXm2z7OrmhX5cNb2ueZaL8ZyA2P4R+6/72NYYcbEgOXibwHiQCFY2RiN3swXl53SIABi2CumUS02g==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.8.2.tgz", + "integrity": "sha512-UFAezAqltyR00a8Lf0IPAyTd29Jj9ee8wt8DqXyDMal7r/Cg/nDt3e1OOv3Th4W6mKaZijjgwuPXhAfVNTN8sw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.6.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.1.tgz", + "integrity": "sha512-rws0duD/3sHHsD905Nex7FvoUGy2UBQRhTkKxeEvr2FB+r21HsOxcDJI0TzyO8NHhnAA8ILr8pfbSBg5Jj5KBg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.10.1.tgz", + "integrity": "sha512-FPXb3tT/u39mgjr6JNlHaUTYfHkVGW56XaGDahDpEFLGsnPxGcVLNTjcqoQb/GNbSCycl7tD7EvIymwOTP0+Yw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.24.5.tgz", + "integrity": "sha512-PnyR8LZJWaiEFw0SHRqo4MNQWyyZsyMs8eNmo68uXZWjxc7QqeWcjPPoONN0rc90c3HZqGF9z+Roz+GLzY5GXA==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.10.1", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.8.1.tgz", + "integrity": "sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.3", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.3.tgz", + "integrity": "sha512-q6KCcOFk3rv/zD3MckhJteZxb0VjAIFuf622B7ElK4vfrZdAzs16XR5p3VTdy3+U5jfJU5ACz4QnhLSuAGe5dA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.16.1.tgz", + "integrity": "sha512-algM5UsB7vrlPNr9lsZEH8s9KHkP8XbT/Y0qylyPkiM8mIOlSJLjBNADcmbYPEQCm4zW82mZRJuVHNzqqN0EAQ==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, "node_modules/react": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", @@ -16822,6 +17753,11 @@ "dev": true, "license": "MIT" }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -16874,7 +17810,6 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, "license": "MIT" }, "node_modules/regexp.prototype.flags": { @@ -16927,6 +17862,11 @@ "dev": true, "license": "MIT" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -17187,6 +18127,14 @@ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", "license": "MIT" }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -17751,6 +18699,11 @@ "node": ">=0.6.19" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/string-width": { "version": "1.0.2", "dev": true, @@ -17931,6 +18884,11 @@ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "license": "MIT" }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + }, "node_modules/supports-color": { "version": "7.2.0", "license": "MIT", @@ -18165,6 +19123,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, "node_modules/through": { "version": "2.3.8", "dev": true, @@ -18216,6 +19182,11 @@ "node": ">=8.0" } }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", From ca78a258800fabae5810f9e0db4ff7cb97465455 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 15:18:53 -0600 Subject: [PATCH 13/20] feat(developer): reduce log verbosity Fixes: #12789 --- developer/src/vscode-plugin/src/ldmleditor.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index 4dd0a22c0d6..4e81477480d 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -79,7 +79,6 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { throw new Error('Method not implemented.'); // TODO-LDML-EDITOR } async openCustomDocument(uri: vscode.Uri, openContext: vscode.CustomDocumentOpenContext, token: vscode.CancellationToken): Promise { - console.log(`openCustom ${uri}`); const document : LdmlDocument = await LdmlDocument.create(uri, openContext.backupId, { getFileData: async() => { return new Uint8Array(); // TODO-LDML-EDITOR @@ -126,11 +125,9 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { const nonce = crypto.randomUUID().toString(); - console.dir({indexUri}); const indexRaw = await vscode.workspace.fs.readFile(indexUri); const indexText = new TextDecoder('UTF-8').decode(indexRaw); const html = fixupIndexHtml(indexText, buildUri.toString(), nonce, webview.cspSource); - console.log(html); webview.html = html; } catch(e) { console.error(e); From 685fdfb9c8562bee4bd9f909ecd094d673f51aa8 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 15:25:48 -0600 Subject: [PATCH 14/20] feat(developer): abandon hashes for style sheets Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 2 +- developer/src/vscode-plugin/app/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 233468f2228..8e75b90eed7 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -32,7 +32,7 @@ function RawSource({ text }) { ); return (
- +

Raw Source

{text}
diff --git a/developer/src/vscode-plugin/app/index.html b/developer/src/vscode-plugin/app/index.html index 2fe46d8ea08..49a2f0484f2 100644 --- a/developer/src/vscode-plugin/app/index.html +++ b/developer/src/vscode-plugin/app/index.html @@ -6,7 +6,7 @@ LDML Editor - + From 57cafb322b50e8c83940b67cbce5ddd0b981ca65 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 27 Dec 2024 16:40:34 -0600 Subject: [PATCH 15/20] =?UTF-8?q?feat(developer):=20pass=20up=20messages?= =?UTF-8?q?=20to=20UI=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 67 ++++++++++++++----- .../src/kmcLdmlCompilerManager.mts | 12 +++- .../vscode-plugin/src/ldmlCompilerManager.ts | 2 + developer/src/vscode-plugin/src/ldmleditor.ts | 15 ++++- 4 files changed, 73 insertions(+), 23 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 8e75b90eed7..f95dee01d0d 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -7,12 +7,13 @@ import './App.css'; import { KMXPlus } from '@keymanapp/common-types'; import KMXPlusFile = KMXPlus.KMXPlusFile; import { constants } from '@keymanapp/ldml-keyboard-constants'; -import { Button } from 'antd'; +import { Button, Input, InputNumber, Checkbox, Card, Segmented, Skeleton, Alert } from 'antd'; interface LoadedData { loaded: boolean; text?: string; kmxPlus?: KMXPlusFile; + messages?: string[]; } const noKmxPlusFile : KMXPlusFile = undefined as unknown as KMXPlusFile; @@ -86,14 +87,14 @@ function KeyDetails({ chosenKey } : { chosenKey : string }) { const isGap = flags & constants.keys_key_flags_gap; return ( -
+
Details
-

ID: {k.id.value}

-

To: {k.to.value}

-

Width: {k.width}

-

Gap? {isGap ? 'Yes' : 'No'}

+ ID:
+ To:
+ Width:
+ Gap

flags? 0x{k.flags.toString(16)}

-
+ ); } @@ -107,7 +108,6 @@ function KeyBag() { return ( <>

Key Bag

-
Chosen: {chosenKey}
@@ -193,6 +193,13 @@ function Layer({layer} : { ); } +function listTitle(list : KMXPlus.LayrList) { + const myWidth = touchWidth(list); + const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); + const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; + return title; +} + function LayoutList({curWidth, setCurWidth, list} : { curWidth: number, @@ -204,11 +211,8 @@ function LayoutList({curWidth, setCurWidth, list} : const myWidth = touchWidth(list); const selected = (curWidth === myWidth); if (!selected) return; // for now: hide collapsed layouts - const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); - const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; return (
-
{title}
{list.layers.map((layer)=> ())}
); @@ -219,20 +223,38 @@ function KeyLayouts() { const lists = [...(kmxPlus.kmxplus.layr?.lists || [])]; // copy the list const [curWidth, setCurWidth] = React.useState(WIDTH_HARDWARE); lists.sort((a,b)=>touchWidth(a)-touchWidth(b)); // sort by width + const listWidthAndTitle = lists.map((list) => [listTitle(list),touchWidth(list)]); + const listTitles = listWidthAndTitle.map(([t])=>t); // just titles + // search listWidthAndTitle for the width + function findWidth(title) { + return listWidthAndTitle.filter(([t])=>t == title)[0][1]; + } return (

Layouts

- {lists.map((list) => ())} + + options={listTitles} + onChange={(value)=>setCurWidth(findWidth(value))} /> {lists.map((list) => ())}
); } +function Messages({messages} : {messages: string[]}) { + if (!messages) return; + return ( +
    + {messages.map((msg,key) => (
  • {msg}
  • ))} +
+ ); +} + function Keyboard() { const initialData: LoadedData = { loaded: false, text: undefined, kmxPlus: undefined, + messages: [], }; const [data, setData] = React.useState(initialData); @@ -240,10 +262,10 @@ function Keyboard() { const message = event.data; switch (message.type) { case 'update': - const { kmxPlus, text } = message; + const { kmxPlus, text, messages } = message; console.log('Got Data'); const newData: LoadedData = { - loaded: true, kmxPlus, text + loaded: true, kmxPlus, text, messages }; setData(newData); break; @@ -258,15 +280,24 @@ function Keyboard() { return (

LDML Keyboard

- no KMX+ yet +
); } + if (!data.kmxPlus) { + return ( +
+ + +
+ ) + } + return (
-

LDML Keyboard

- + + @@ -279,7 +310,7 @@ function Keyboard() { function App() { return (
-

App

+

LDML Editor

); diff --git a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts index 2f541cc8dac..b6bb24da46a 100644 --- a/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts +++ b/developer/src/vscode-plugin/src/kmcLdmlCompilerManager.mts @@ -3,7 +3,7 @@ */ import { LDMLCompilerManager } from "./ldmlCompilerManager.js"; -import { CompilerCallbackOptions, CompilerCallbacks, defaultCompilerOptions, LDMLKeyboardXMLSourceFileReader } from "@keymanapp/developer-utils"; +import { CompilerCallbackOptions, CompilerError, defaultCompilerOptions, LDMLKeyboardXMLSourceFileReader } from "@keymanapp/developer-utils"; import { LdmlCompilerOptions, LdmlKeyboardCompiler } from "@keymanapp/kmc-ldml"; import { ExtensionCallbacks } from "./extensionCallbacks.mjs"; import { KMXPlus } from "@keymanapp/common-types"; @@ -18,7 +18,7 @@ import { dirname } from 'node:path'; export class KmcLdmlManager implements LDMLCompilerManager { calloptions?: CompilerCallbackOptions; - callbacks?: CompilerCallbacks; + callbacks?: ExtensionCallbacks; compoptions?: LdmlCompilerOptions; async init(): Promise { @@ -38,6 +38,7 @@ export class KmcLdmlManager implements LDMLCompilerManager { if (!this.callbacks) { throw Error(`Must call init() first.`); } + this.callbacks.clear(); // clear each time const k = new LdmlKeyboardCompiler(); this.compoptions = { ...defaultCompilerOptions, @@ -60,4 +61,11 @@ export class KmcLdmlManager implements LDMLCompilerManager { return compiled; } + getMessages() : string[] { + if (!this.callbacks) { + throw Error(`Must call init() first.`); + } + return this.callbacks.messages.map(m => CompilerError.formatEvent(m)); + } + }; diff --git a/developer/src/vscode-plugin/src/ldmlCompilerManager.ts b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts index 2cc81a44159..1bdce8f5e38 100644 --- a/developer/src/vscode-plugin/src/ldmlCompilerManager.ts +++ b/developer/src/vscode-plugin/src/ldmlCompilerManager.ts @@ -11,6 +11,8 @@ export interface LDMLCompilerManager { init() : Promise; /** Compile a file. Returns KMXPlus file. */ compile(filename: string) : Promise; + /** Return messages as an array of strings */ + getMessages() : string[]; }; /** load concrete instance from module */ diff --git a/developer/src/vscode-plugin/src/ldmleditor.ts b/developer/src/vscode-plugin/src/ldmleditor.ts index 4e81477480d..21bc4b0942e 100644 --- a/developer/src/vscode-plugin/src/ldmleditor.ts +++ b/developer/src/vscode-plugin/src/ldmleditor.ts @@ -107,8 +107,16 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { async resolveCustomTextEditor(document: vscode.TextDocument, webviewPanel: vscode.WebviewPanel, token: vscode.CancellationToken): Promise { // make sure we have a compiler const compiler = await this.getCompiler(); - // temporary - testing linkage - const kmxPlus = await compiler.compile(document.fileName); + let kmxPlus : any = null; + + try { + kmxPlus = await compiler.compile(document.fileName); + } catch(e) { + console.error(e); + } + + // always get the messages- may be hints, etc. + const messages = compiler.getMessages(); webviewPanel.webview.options = { enableScripts: true, @@ -131,7 +139,7 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { webview.html = html; } catch(e) { console.error(e); - webview.html = `error: ${e}`; + webview.html = `error loading editor: ${e}`; } function updateWebview() { @@ -139,6 +147,7 @@ export class LdmlEditorProvider implements vscode.CustomTextEditorProvider { type: 'update', text: document.getText(), kmxPlus, + messages, }); } From acad88456c662ca5ca63548e82d9e11413c08668 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 30 Dec 2024 11:38:39 -0600 Subject: [PATCH 16/20] =?UTF-8?q?chore(developer):=20ldml-editor:=20refact?= =?UTF-8?q?or,=20cleanup,=20comment=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - refactor, cleanup, and comment - use @parcel/transformer-typescript-tsc for compilation Fixes: #12789 --- developer/src/vscode-plugin/.parcelrc | 6 + developer/src/vscode-plugin/app/App.tsx | 184 +++++++++-------------- developer/src/vscode-plugin/app/utils.ts | 57 +++++++ developer/src/vscode-plugin/package.json | 1 + package-lock.json | 44 ++++++ 5 files changed, 180 insertions(+), 112 deletions(-) create mode 100644 developer/src/vscode-plugin/.parcelrc create mode 100644 developer/src/vscode-plugin/app/utils.ts diff --git a/developer/src/vscode-plugin/.parcelrc b/developer/src/vscode-plugin/.parcelrc new file mode 100644 index 00000000000..a808df4c00f --- /dev/null +++ b/developer/src/vscode-plugin/.parcelrc @@ -0,0 +1,6 @@ +{ + "extends": "@parcel/config-default", + "transformers": { + "*.{ts,tsx}": ["@parcel/transformer-typescript-tsc"] + } +} diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index f95dee01d0d..dc27b4a36b6 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -1,27 +1,36 @@ /* * Keyman is copyright (C) SIL Global. MIT License. + * + * Visual editor app */ import React from 'react'; import './App.css'; import { KMXPlus } from '@keymanapp/common-types'; import KMXPlusFile = KMXPlus.KMXPlusFile; -import { constants } from '@keymanapp/ldml-keyboard-constants'; -import { Button, Input, InputNumber, Checkbox, Card, Segmented, Skeleton, Alert } from 'antd'; +import { Button, Card, Input, InputNumber, Checkbox, Segmented, Skeleton, Alert } from 'antd'; +import { isGapKey, layerTitle, listTitle, touchWidth, WIDTH_HARDWARE } from './utils.js'; +/** + * Used to get the VSCode global. Can only call this once. + */ +const vsCode = (global as any).acquireVsCodeApi(); +/** This is used to track data as it is loaded. */ interface LoadedData { + /** true if we think we're loaded */ loaded: boolean; + /** full XML source text */ text?: string; + /** the entire KMXPlusFile */ kmxPlus?: KMXPlusFile; + /** messages serialized to strings */ messages?: string[]; } -const noKmxPlusFile : KMXPlusFile = undefined as unknown as KMXPlusFile; - -const KmxPlusContext = React.createContext(noKmxPlusFile); - -const vsCode = (global as any).acquireVsCodeApi(); +/** this context will have the KMXPlusFile. We won't use it until the KMXPlusFile is valid. */ +const KmxPlusContext = React.createContext(undefined as unknown as KMXPlusFile) +/** The "show raw source" panel */ function RawSource({ text }) { const [shown, setShown] = React.useState(false); function show() { @@ -29,17 +38,19 @@ function RawSource({ text }) { } if (!text) return; if (!shown) return ( - + + + ); return ( -
- -

Raw Source

+ +
{text}
-
+ ); } +/** An individual key in the keybag. */ function Key({ k, chosenKey, setChosenKey }: { k: KMXPlus.KeysKeys, chosenKey: string, @@ -50,7 +61,7 @@ function Key({ k, chosenKey, setChosenKey }: { const chosen = (chosenKey == id); const className = chosen ? "Key chosenKey" : "Key unchosenKey"; // const onClick = chosen ? () => setChosenKey(k.id.value) : setChosenKey(id); - const onClick = () => {}; + const onClick = () => { }; if (k.to.value === '') { return ( setChosenKey(id)} className={className} title={id}>{id} @@ -61,6 +72,7 @@ function Key({ k, chosenKey, setChosenKey }: { ); } +/** The list of keys in the keybag */ function KeyList({ keys, chosenKey, setChosenKey }: { keys: KMXPlus.KeysKeys[], chosenKey: string, setChosenKey: any /* setter */ }) { return ( @@ -70,11 +82,11 @@ function KeyList({ keys, chosenKey, setChosenKey }: ); } -/** detail editor */ -function KeyDetails({ chosenKey } : { chosenKey : string }) { - const kmxPlus = React.useContext(KmxPlusContext); +/** keybag detail editor */ +function KeyDetails({ chosenKey }: { chosenKey: string }) { + const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; if (!chosenKey) return; - const chosenKeys = kmxPlus.kmxplus.keys?.keys.filter(({id}) => id.value == chosenKey); + const chosenKeys = kmxPlus.kmxplus.keys?.keys.filter(({ id }) => id.value == chosenKey); if (!chosenKeys?.length) { return; // no key selecte4d } else if (chosenKeys?.length > 1) { @@ -83,16 +95,16 @@ function KeyDetails({ chosenKey } : { chosenKey : string }) { const k = chosenKeys[0]; - const {flags} = k; - const isGap = flags & constants.keys_key_flags_gap; + const { flags } = k; + const isGap = isGapKey(k); return (
Details
- ID:
- To:
- Width:
- Gap
+ ID:
+ To:
+ Width:
+ Gap

flags? 0x{k.flags.toString(16)}

); @@ -103,104 +115,48 @@ function KeyBag() { const kmxPlus = React.useContext(KmxPlusContext); const keys = kmxPlus?.kmxplus?.keys?.keys || []; /** string id of selected key */ - const [ chosenKey, setChosenKey ] = React.useState(keys[0]?.id?.value); + const [chosenKey, setChosenKey] = React.useState(keys[0]?.id?.value); if (!kmxPlus) return; // get out return ( - <> -

Key Bag

+
- - - ); -} - -/** treat hardware as width -1 for sorting */ -const WIDTH_HARDWARE = -1; - -/** get an index for a LayrList */ -function touchWidth( list: KMXPlus.LayrList ) : number { - if (list.hardware.value === constants.layr_list_hardware_touch) { - return list.minDeviceWidth; - } else { - return -1; - } -} - -function LayoutListButton({curWidth, setCurWidth, list} : - { - curWidth: number, - setCurWidth: any, - list: KMXPlus.LayrList, - key: string, - } -) { - const myWidth = touchWidth(list); - const selected = (curWidth === myWidth); - const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); - const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; - const className = selected ? 'layoutListButton selectedLayoutListButton' : 'layoutListButton unselectedLayoutListButton'; - return ( - + +
); } -function modToStr(mod : number) { - if (mod === constants.keys_mod_none) { - return 'none'; - } - let ret : string[] = []; - constants.keys_mod_map.forEach((mask, name) => { - if(mod & mask) { - ret.push(name); - } - }); - ret.sort(); // make it deterministic - return ret.join(','); -} - -function layerTitle(layer : KMXPlus.LayrEntry) { - if (layer.id.value) return layer.id.value + modToStr(layer.mod); - return modToStr(layer.mod); -} - -function Row({row} : { +/** row in the layer list */ +function Row({ row }: { row: KMXPlus.LayrRow, key: string, }) { return ( <> - {row.keys.map(({value})=>( + {row.keys.map(({ value }) => ( {value} ))} -
+
) } -function Layer({layer} : { +/** single layer */ +function Layer({ layer }: { layer: KMXPlus.LayrEntry, key: string, }) { return ( <>
{layerTitle(layer)}
- {layer.rows.map((row,index)=> ())} + {layer.rows.map((row, index) => ())} ); } -function listTitle(list : KMXPlus.LayrList) { - const myWidth = touchWidth(list); - const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); - const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; - return title; -} - -function LayoutList({curWidth, setCurWidth, list} : +/** a list of layouts (i.e. a form type or width) */ +function LayoutList({ curWidth, setCurWidth, list }: { curWidth: number, setCurWidth: any, @@ -213,43 +169,47 @@ function LayoutList({curWidth, setCurWidth, list} : if (!selected) return; // for now: hide collapsed layouts return (
- {list.layers.map((layer)=> ())} + {list.layers.map((layer) => ())}
); } +/** The list of Layouts */ function KeyLayouts() { const kmxPlus = React.useContext(KmxPlusContext); const lists = [...(kmxPlus.kmxplus.layr?.lists || [])]; // copy the list const [curWidth, setCurWidth] = React.useState(WIDTH_HARDWARE); - lists.sort((a,b)=>touchWidth(a)-touchWidth(b)); // sort by width - const listWidthAndTitle = lists.map((list) => [listTitle(list),touchWidth(list)]); - const listTitles = listWidthAndTitle.map(([t])=>t); // just titles + lists.sort((a, b) => touchWidth(a) - touchWidth(b)); // sort by width + const listWidthAndTitle = lists.map((list) => [listTitle(list), touchWidth(list)]); + const listTitles = listWidthAndTitle.map(([t]) => t); // just titles // search listWidthAndTitle for the width function findWidth(title) { - return listWidthAndTitle.filter(([t])=>t == title)[0][1]; + return listWidthAndTitle.filter(([t]) => t == title)[0][1]; } return (
-

Layouts

- + + options={listTitles} - onChange={(value)=>setCurWidth(findWidth(value))} /> - {lists.map((list) => ())} + onChange={(value) => setCurWidth(findWidth(value))} /> + {lists.map((list) => ())} +
); } -function Messages({messages} : {messages: string[]}) { +/** this shows any error or warning messages from the compiler */ +function Messages({ messages }: { messages: string[] }) { if (!messages) return; return (
    - {messages.map((msg,key) => (
  • {msg}
  • ))} + {messages.map((msg, key) => (
  • {msg}
  • ))}
); } -function Keyboard() { +/** This is the main Keyboard File object. */ +function KeyboardFile() { const initialData: LoadedData = { loaded: false, text: undefined, @@ -280,7 +240,7 @@ function Keyboard() { return (

LDML Keyboard

- +
); } @@ -289,29 +249,29 @@ function Keyboard() { return (
- +
) } return ( -
- - + <> + +
-
+ ); } +/** The outer App. TODO-EPIC-LDML this may be */ function App() { return (
-

LDML Editor

- +
); } diff --git a/developer/src/vscode-plugin/app/utils.ts b/developer/src/vscode-plugin/app/utils.ts new file mode 100644 index 00000000000..641088fe9b4 --- /dev/null +++ b/developer/src/vscode-plugin/app/utils.ts @@ -0,0 +1,57 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Utility functions + */ + +import { KMXPlus } from '@keymanapp/common-types'; +import { constants } from '@keymanapp/ldml-keyboard-constants'; + +/** + * @returns true if this is a gap key + */ +export function isGapKey(key: KMXPlus.KeysKeys) { + const {flags} = key; + return flags & constants.keys_key_flags_gap; +} + +/** convert a modifier number to a string */ +export function modToStr(mod: number) { + if (mod === constants.keys_mod_none) { + return 'none'; + } + let ret: string[] = []; + constants.keys_mod_map.forEach((mask, name) => { + if (mod & mask) { + ret.push(name); + } + }); + ret.sort(); // make it deterministic + return ret.join(','); +} + +/** treat hardware as width -1 for sorting */ +export const WIDTH_HARDWARE = -1; + +/** get an index for a LayrList */ +export function touchWidth(list: KMXPlus.LayrList): number { + if (list.hardware.value === constants.layr_list_hardware_touch) { + return list.minDeviceWidth; + } else { + return -1; + } +} + +/** convert a layer entry to a title */ +export function layerTitle(layer: KMXPlus.LayrEntry) { + if (layer.id.value) return layer.id.value + modToStr(layer.mod); + return modToStr(layer.mod); +} +/** convert a LayrList to a title */ +export function listTitle(list: KMXPlus.LayrList) { + const myWidth = touchWidth(list); + const isTouch = (list.hardware.value === constants.layr_list_hardware_touch); + const title = isTouch ? `Touch>${list.minDeviceWidth}px` : `${list.hardware.value}`; + return title; +} + diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index de4ede93945..d7342fc27f8 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -41,6 +41,7 @@ "ui-watch": "parcel watch --target=default --cache-dir=.parcel-cache" }, "devDependencies": { + "@parcel/transformer-typescript-tsc": "^2.13.2", "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.0", "@types/node": "20.4.1", diff --git a/package-lock.json b/package-lock.json index 1eeb589c494..088c55a7a9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2156,6 +2156,7 @@ "react-dom": "^19.0.0" }, "devDependencies": { + "@parcel/transformer-typescript-tsc": "^2.13.2", "@types/jsdom": "^21.1.7", "@types/mocha": "^10.0.0", "@types/node": "20.4.1", @@ -5313,6 +5314,49 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@parcel/transformer-typescript-tsc": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-tsc/-/transformer-typescript-tsc-2.13.2.tgz", + "integrity": "sha512-bJq/7QeLbj7IpDCiEWM+jf1b8lMWvongM9/fYIJtm1mTGsBBIYQ0vd1jbtdtfb4fNIRK3qV2++GUvE2CgEZs9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.13.2", + "@parcel/source-map": "^2.1.1", + "@parcel/ts-utils": "2.13.2" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.13.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/ts-utils": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.13.2.tgz", + "integrity": "sha512-wj6trzSaZ7nHDzx5zVQfs467WrA3p7g6bos7Opr8nTw5V1qACXa03C9ccRiEUmR0i+Bk8kEZKUunswhjBiPuHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, "node_modules/@parcel/types": { "version": "2.13.2", "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.13.2.tgz", From 6bd82e1d10c148d143e208ef259f81c6b2dbec99 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 31 Dec 2024 13:47:40 -0600 Subject: [PATCH 17/20] =?UTF-8?q?feat(developer):=20ldml-editor:=20reperto?= =?UTF-8?q?ire=20viewer=20=F0=9F=97=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - some refactoring still - disabled the raw XML view Fixes: #12789 --- developer/src/vscode-plugin/app/App.css | 17 +- developer/src/vscode-plugin/app/App.tsx | 175 ++++++++++++++---- developer/src/vscode-plugin/app/FixedCard.tsx | 18 ++ developer/src/vscode-plugin/app/RawSource.tsx | 31 ++++ .../src/vscode-plugin/app/fakerepertoire.ts | 28 +++ developer/src/vscode-plugin/app/index.js | 9 +- 6 files changed, 238 insertions(+), 40 deletions(-) create mode 100644 developer/src/vscode-plugin/app/FixedCard.tsx create mode 100644 developer/src/vscode-plugin/app/RawSource.tsx create mode 100644 developer/src/vscode-plugin/app/fakerepertoire.ts diff --git a/developer/src/vscode-plugin/app/App.css b/developer/src/vscode-plugin/app/App.css index 53f49a7a71d..5c69792d0f5 100644 --- a/developer/src/vscode-plugin/app/App.css +++ b/developer/src/vscode-plugin/app/App.css @@ -29,7 +29,7 @@ kbd.unchosenKey { border: 2px solid blue; } */ -.keyList { +.keyList, .repertoire { border: 1px solid gray; padding: 0.25em; width: 50em; @@ -39,6 +39,21 @@ kbd.unchosenKey { overflow-y: scroll; } +.repertoireItem { + padding: 1em; + background-color: gainsboro; + margin: 0.25em; + vertical-align: middle; + box-shadow: .15em .15em gray; + border: 2px solid gray; + font-size: large; + display: flow flex-shrink; + flex-grow: 1; + flex-basis: 1em; + white-space-collapse: preserve-spaces; +} + + .selectedLayoutListButton { background-color: navy; color: white; diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index dc27b4a36b6..abe917ed317 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -8,48 +8,106 @@ import React from 'react'; import './App.css'; import { KMXPlus } from '@keymanapp/common-types'; import KMXPlusFile = KMXPlus.KMXPlusFile; -import { Button, Card, Input, InputNumber, Checkbox, Segmented, Skeleton, Alert } from 'antd'; +import { Button, Input, InputNumber, Checkbox, Segmented, Skeleton, Alert, Collapse, TabsProps, Tabs, Spin } from 'antd'; +/** Ant's Card had an import problem, so we use this workaround */ +import { FixedCard as Card } from './FixedCard.js'; import { isGapKey, layerTitle, listTitle, touchWidth, WIDTH_HARDWARE } from './utils.js'; +import { FakeRepertoire, RepertoireEntry, SAMPLE_REPERTOIRE } from './fakerepertoire.js'; +// import { RawSource } from './RawSource'; + /** * Used to get the VSCode global. Can only call this once. */ const vsCode = (global as any).acquireVsCodeApi(); -/** This is used to track data as it is loaded. */ -interface LoadedData { - /** true if we think we're loaded */ - loaded: boolean; - /** full XML source text */ - text?: string; - /** the entire KMXPlusFile */ - kmxPlus?: KMXPlusFile; - /** messages serialized to strings */ - messages?: string[]; -} - /** this context will have the KMXPlusFile. We won't use it until the KMXPlusFile is valid. */ const KmxPlusContext = React.createContext(undefined as unknown as KMXPlusFile) -/** The "show raw source" panel */ -function RawSource({ text }) { - const [shown, setShown] = React.useState(false); - function show() { - setShown(true); - } - if (!text) return; - if (!shown) return ( - - - +// -------- repertoire ------------- + +function RepertoireItem({ item } : { item : RepertoireEntry, key?: any}) { + return ( + {item} ); +} + +function AddCldrSldr() { + const [ loading, setLoading ] = React.useState(false); + return ( - - -
{text}
-
+ <> + Locale:
+ + {loading && ()} + + ) +} + +function AddUnicodeRange() { + return ( + <> + + … + +
+ + + ); +} + +function AddRepertoire() { + const items : TabsProps['items'] = [ + { + key: 'sldr', + label: 'SLDR', + children: (), + }, + { + key: 'cldr', + label: 'CLDR', + children: (), + }, + { + key: 'range', + label: 'Unicode Range', + children: (), + }, + { + key: 'corpus', + label: 'Corpus', + children: (), + }, + ]; + return (); +} + +function Repertoire({ repertoire }: { repertoire : FakeRepertoire}) { + + // the 'add' panel + const addItems = ([ + { + key: 'add', + label: 'Add…', + children: ( + + ), + } + ]); + + return ( + <> +
+ {repertoire.map((s, key) => ( + + ))} +
+ + ); } +// -------- keybag ------------- + /** An individual key in the keybag. */ function Key({ k, chosenKey, setChosenKey }: { k: KMXPlus.KeysKeys, @@ -118,15 +176,18 @@ function KeyBag() { const [chosenKey, setChosenKey] = React.useState(keys[0]?.id?.value); if (!kmxPlus) return; // get out return ( - + <>
-
+ ); } +// -------- layer ------------- + + /** row in the layer list */ function Row({ row }: { row: KMXPlus.LayrRow, @@ -188,16 +249,16 @@ function KeyLayouts() { } return (
- options={listTitles} onChange={(value) => setCurWidth(findWidth(value))} /> {lists.map((list) => ())} -
); } +// -------- err messages ------------- + /** this shows any error or warning messages from the compiler */ function Messages({ messages }: { messages: string[] }) { if (!messages) return; @@ -208,6 +269,20 @@ function Messages({ messages }: { messages: string[] }) { ); } +// -------- main editor ------------- + +/** This is used to track data as it is loaded. */ +interface LoadedData { + /** true if we think we're loaded */ + loaded: boolean; + /** full XML source text */ + text?: string; + /** the entire KMXPlusFile */ + kmxPlus?: KMXPlusFile; + /** messages serialized to strings */ + messages?: string[]; +} + /** This is the main Keyboard File object. */ function KeyboardFile() { const initialData: LoadedData = { @@ -240,6 +315,7 @@ function KeyboardFile() { return (

LDML Keyboard

+ {/* show something while waiting */}
); @@ -254,20 +330,45 @@ function KeyboardFile() { ) } + const items = [ + { + key: 'repertoire', + label: 'Character Repertoire', + children: (), + }, + { + key: 'key', + label: 'Key Bag', + children: (), + }, + { + key: 'layouts', + label: 'Layouts', + children: (), + }, + ]; + return ( <> - - + -
- + {/* + TODO-EPIC-LDML: raw source isn't really needed. + Users can use the system editor view if needed. +
+ */} ); } -/** The outer App. TODO-EPIC-LDML this may be */ +/** The outer App. TODO-EPIC-LDML this may be unneeded */ function App() { return (
diff --git a/developer/src/vscode-plugin/app/FixedCard.tsx b/developer/src/vscode-plugin/app/FixedCard.tsx new file mode 100644 index 00000000000..b0db787b432 --- /dev/null +++ b/developer/src/vscode-plugin/app/FixedCard.tsx @@ -0,0 +1,18 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Visual editor app + */ + +import { Card } from 'antd'; +import React from 'react'; + +/** workaround Card TS linkage (and also make the border always set) */ +export function FixedCard({ title, bordered, children } : { title: string, bordered?: boolean, children?: any }) { + return ( + // TODO-EPIC-LDML: why the red squiggle on the next line? + + {children} + + ); + } diff --git a/developer/src/vscode-plugin/app/RawSource.tsx b/developer/src/vscode-plugin/app/RawSource.tsx new file mode 100644 index 00000000000..46ca6daad61 --- /dev/null +++ b/developer/src/vscode-plugin/app/RawSource.tsx @@ -0,0 +1,31 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * the Raw Source view + */ + +import React from 'react'; +import { Button } from 'antd'; +/** Ant's Card had an import problem, so we use this workaround */ +import { FixedCard as Card } from './FixedCard.js'; + + +/** The "show raw source" panel */ +export function RawSource({ text }) { + const [shown, setShown] = React.useState(false); + function show() { + setShown(true); + } + if (!text) return; + if (!shown) return ( + + + + ); + return ( + + +
{text}
+
+ ); + } diff --git a/developer/src/vscode-plugin/app/fakerepertoire.ts b/developer/src/vscode-plugin/app/fakerepertoire.ts new file mode 100644 index 00000000000..fbc920042eb --- /dev/null +++ b/developer/src/vscode-plugin/app/fakerepertoire.ts @@ -0,0 +1,28 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Placeholder for a dynamic repertoire object. + */ + +export type RepertoireEntry = string; + +export class FakeRepertoire implements Iterable { + constructor(private items: RepertoireEntry[]) { + + } + + // allow `for (x of repertoire)` + [Symbol.iterator](): Iterator { + // use the string array's iterator + return this.items[Symbol.iterator](); + } + + // allow `repertoire.map` + map(callbackfn: (value: string, index: number, array: string[]) => any, thisArg?: any): any { + return this.items.map(callbackfn); + } +} + +export const SAMPLE_REPERTOIRE = new FakeRepertoire([ + ..."abcdefghijklmnopqrstuvwxyz".split(''), +]); diff --git a/developer/src/vscode-plugin/app/index.js b/developer/src/vscode-plugin/app/index.js index 3e6650df5de..3203c836092 100644 --- a/developer/src/vscode-plugin/app/index.js +++ b/developer/src/vscode-plugin/app/index.js @@ -1,9 +1,14 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * This is top level JS code used to bootstrap the React app + */ + import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; -// bootstrap react app - +/** find the id="root" element from ./index.html */ const root = ReactDOM.createRoot(document.getElementById('root')); root.render( From 4c73a24a89458367d0c44029c3e8e798b4ec89a8 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 31 Dec 2024 14:38:01 -0600 Subject: [PATCH 18/20] feat(developer): ldml-editor: add info panel Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 80 ++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index abe917ed317..3cbf290568a 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -8,7 +8,7 @@ import React from 'react'; import './App.css'; import { KMXPlus } from '@keymanapp/common-types'; import KMXPlusFile = KMXPlus.KMXPlusFile; -import { Button, Input, InputNumber, Checkbox, Segmented, Skeleton, Alert, Collapse, TabsProps, Tabs, Spin } from 'antd'; +import { Button, Input, InputNumber, Checkbox, Segmented, Skeleton, Alert, Collapse, TabsProps, Tabs, Spin, Space } from 'antd'; /** Ant's Card had an import problem, so we use this workaround */ import { FixedCard as Card } from './FixedCard.js'; import { isGapKey, layerTitle, listTitle, touchWidth, WIDTH_HARDWARE } from './utils.js'; @@ -23,6 +23,73 @@ const vsCode = (global as any).acquireVsCodeApi(); /** this context will have the KMXPlusFile. We won't use it until the KMXPlusFile is valid. */ const KmxPlusContext = React.createContext(undefined as unknown as KMXPlusFile) +// -------- info ------------- + +const names = new Intl.DisplayNames(['en'], {type: 'language'}); + +function langName(l : string) { + try { + return names.of(l); + } catch(e) { + return ''; + } +} + +function LanguageList({ list }: { list: string[] }) { + const [langs, setLangs] = React.useState(list); + const [addingLang, setAddingLang] = React.useState(''); + function addLanguage(l : string) { + if (!l) return; + setLangs((langs) => [...(langs.filter((ll: string) => ll !== l)), l].sort()); + } + function removeLanguage(l : string) { + if (!l) return; + if (langs.length <= 1) return; // cannot delete last + // set the list to all but this one + setLangs(langs => langs.filter((lang: string) => lang !== l)); + } + const addInput = addLanguage(e.target.value)} onChange={(e) => setAddingLang(e.target.value)} placeholder="locale code" />; + return ( + <> + + { addInput } + + +
    + {(langs as string[]).map((lang, key) => ( +
  • + {lang} — {langName(lang)} + {(langs.length) && } +
  • + ))} +
+ + ); +} + +function KeyboardInfo() { + const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; + + const { meta, loca } = kmxPlus.kmxplus; + // modelled after Keyman Developer + return ( + <> + Keyboard Name: + +
+ Author: + +
+ Version: + +
+ Supported Languages: + l.value)]}/> +
+ + ); +} + // -------- repertoire ------------- function RepertoireItem({ item } : { item : RepertoireEntry, key?: any}) { @@ -170,7 +237,7 @@ function KeyDetails({ chosenKey }: { chosenKey: string }) { /** the main editor for keys */ function KeyBag() { - const kmxPlus = React.useContext(KmxPlusContext); + const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; const keys = kmxPlus?.kmxplus?.keys?.keys || []; /** string id of selected key */ const [chosenKey, setChosenKey] = React.useState(keys[0]?.id?.value); @@ -237,7 +304,7 @@ function LayoutList({ curWidth, setCurWidth, list }: /** The list of Layouts */ function KeyLayouts() { - const kmxPlus = React.useContext(KmxPlusContext); + const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; const lists = [...(kmxPlus.kmxplus.layr?.lists || [])]; // copy the list const [curWidth, setCurWidth] = React.useState(WIDTH_HARDWARE); lists.sort((a, b) => touchWidth(a) - touchWidth(b)); // sort by width @@ -331,6 +398,11 @@ function KeyboardFile() { } const items = [ + { + key: 'info', + label: 'Info', + children: (), + }, { key: 'repertoire', label: 'Character Repertoire', @@ -354,6 +426,8 @@ function KeyboardFile() { Date: Tue, 31 Dec 2024 14:44:17 -0600 Subject: [PATCH 19/20] feat(developer): ldml-editor: deselect key by default Fixes: #12789 --- developer/src/vscode-plugin/app/App.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 3cbf290568a..0d29d03448c 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -185,15 +185,14 @@ function Key({ k, chosenKey, setChosenKey }: { const id = k.id.value; const chosen = (chosenKey == id); const className = chosen ? "Key chosenKey" : "Key unchosenKey"; - // const onClick = chosen ? () => setChosenKey(k.id.value) : setChosenKey(id); - const onClick = () => { }; + const clickToChose = chosen ? '' : id; if (k.to.value === '') { return ( - setChosenKey(id)} className={className} title={id}>{id} + setChosenKey(clickToChose)} className={className} title={id}>{id} ) } return ( - setChosenKey(id)} className={className} title={id}>{k.to.value} + setChosenKey(clickToChose)} className={className} title={id}>{k.to.value} ); } @@ -240,7 +239,7 @@ function KeyBag() { const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; const keys = kmxPlus?.kmxplus?.keys?.keys || []; /** string id of selected key */ - const [chosenKey, setChosenKey] = React.useState(keys[0]?.id?.value); + const [chosenKey, setChosenKey] = React.useState('' /*keys[0]?.id?.value*/); if (!kmxPlus) return; // get out return ( <> From 11354b66a8442b4cfdd6904732a78a4958d1012a Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 31 Dec 2024 15:25:10 -0600 Subject: [PATCH 20/20] feat(developer): ldml-editor: unify key objects Fixes: #12789 --- developer/src/vscode-plugin/app/App.css | 14 ++-- developer/src/vscode-plugin/app/App.tsx | 77 +++++++++++++++------ developer/src/vscode-plugin/package.json | 2 + package-lock.json | 86 +++++++++++++++++++++++- 4 files changed, 152 insertions(+), 27 deletions(-) diff --git a/developer/src/vscode-plugin/app/App.css b/developer/src/vscode-plugin/app/App.css index 5c69792d0f5..3ea044a8ca9 100644 --- a/developer/src/vscode-plugin/app/App.css +++ b/developer/src/vscode-plugin/app/App.css @@ -13,6 +13,10 @@ flex-grow: 1; flex-basis: 3em; white-space-collapse: preserve-spaces; + border: 2px solid gray; + border-radius: 0.25em; + background-color: azure; + padding: 0.25em; } .chosenKey { @@ -53,12 +57,8 @@ kbd.unchosenKey { white-space-collapse: preserve-spaces; } - -.selectedLayoutListButton { - background-color: navy; - color: white; +.layoutRow { + display: flex; + width: fit-content; } -.layoutList kbd { - margin: 0.25em; -} diff --git a/developer/src/vscode-plugin/app/App.tsx b/developer/src/vscode-plugin/app/App.tsx index 0d29d03448c..442f2dcd8c7 100644 --- a/developer/src/vscode-plugin/app/App.tsx +++ b/developer/src/vscode-plugin/app/App.tsx @@ -14,6 +14,15 @@ import { FixedCard as Card } from './FixedCard.js'; import { isGapKey, layerTitle, listTitle, touchWidth, WIDTH_HARDWARE } from './utils.js'; import { FakeRepertoire, RepertoireEntry, SAMPLE_REPERTOIRE } from './fakerepertoire.js'; // import { RawSource } from './RawSource'; +import { useDrag } from 'react-dnd'; +import { DndProvider } from 'react-dnd' +import { HTML5Backend } from 'react-dnd-html5-backend' + +/** items that can be dragged */ +export const DragTypes = { + REPERTOIRE_ITEM: 'repertoireItem', + KEY_ITEM: 'keyItem', +} /** * Used to get the VSCode global. Can only call this once. @@ -92,9 +101,20 @@ function KeyboardInfo() { // -------- repertoire ------------- -function RepertoireItem({ item } : { item : RepertoireEntry, key?: any}) { +function RepertoireItem({ item, isDragging } : { isDragging?: boolean, item : RepertoireEntry, key?: any}) { + const [, dragRef] = useDrag( + () => ({ + type: DragTypes.REPERTOIRE_ITEM, + item, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + // opacity: monitor.isDragging() ? 0.5 : 1 + }) + }), + [] + ) return ( - {item} + {item} ); } @@ -176,23 +196,40 @@ function Repertoire({ repertoire }: { repertoire : FakeRepertoire}) { // -------- keybag ------------- /** An individual key in the keybag. */ -function Key({ k, chosenKey, setChosenKey }: { - k: KMXPlus.KeysKeys, - chosenKey: string, - setChosenKey: any, /* setter */ +function Key({ kid, chosenKey, setChosenKey, isDragging }: { + kid: string, + chosenKey?: string, + setChosenKey?: any, /* setter */ key: string, /* special prop */ + isDragging?: boolean, }) { - const id = k.id.value; + const id = kid; + const kmxPlus = React.useContext(KmxPlusContext) as KMXPlus.KMXPlusFile; + // extract the key from the file + const foundKey = kmxPlus.kmxplus.keys?.keys.filter(({id}) => id.value === kid)[0]; + if (!foundKey) return ({kid}); // missing + const k : KMXPlus.KeysKeys = foundKey; const chosen = (chosenKey == id); const className = chosen ? "Key chosenKey" : "Key unchosenKey"; const clickToChose = chosen ? '' : id; - if (k.to.value === '') { - return ( - setChosenKey(clickToChose)} className={className} title={id}>{id} - ) - } + + const [, dragRef] = useDrag( + () => ({ + type: DragTypes.KEY_ITEM, + k, + chosenKey, + setChosenKey, + collect: (monitor) => ({ + isDragging: monitor.isDragging(), + // opacity: monitor.isDragging() ? 0.5 : 1 + }) + }), + [] + ) + const label = (k.to.value === '') ? id : k.to.value; + return ( - setChosenKey(clickToChose)} className={className} title={id}>{k.to.value} +
setChosenKey(clickToChose)} className={className} title={id}>{label}
); } @@ -201,7 +238,7 @@ function KeyList({ keys, chosenKey, setChosenKey }: { keys: KMXPlus.KeysKeys[], chosenKey: string, setChosenKey: any /* setter */ }) { return (
- {keys?.map((k) => ())} + {keys?.map((k) => ())}
); } @@ -259,13 +296,13 @@ function Row({ row }: { row: KMXPlus.LayrRow, key: string, }) { + // TODO-EPIC-LDML: need to have chosen keys here return ( - <> +
{row.keys.map(({ value }) => ( - {value} + {}} /> ))} -
- +
) } @@ -445,7 +482,9 @@ function KeyboardFile() { function App() { return (
- + + +
); } diff --git a/developer/src/vscode-plugin/package.json b/developer/src/vscode-plugin/package.json index d7342fc27f8..350fc817bfb 100644 --- a/developer/src/vscode-plugin/package.json +++ b/developer/src/vscode-plugin/package.json @@ -61,6 +61,8 @@ "antd": "^5.22.7", "process": "^0.11.10", "react": "^19.0.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", "react-dom": "^19.0.0" }, "targets": { diff --git a/package-lock.json b/package-lock.json index 088c55a7a9b..d353b56ffe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2153,6 +2153,8 @@ "antd": "^5.22.7", "process": "^0.11.10", "react": "^19.0.0", + "react-dnd": "^16.0.1", + "react-dnd-html5-backend": "^16.0.1", "react-dom": "^19.0.0" }, "devDependencies": { @@ -6028,6 +6030,21 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@react-dnd/asap": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", + "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" + }, + "node_modules/@react-dnd/invariant": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", + "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", + "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", @@ -10853,6 +10870,16 @@ "node": ">=8" } }, + "node_modules/dnd-core": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", + "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", + "dependencies": { + "@react-dnd/asap": "^5.0.1", + "@react-dnd/invariant": "^4.0.1", + "redux": "^4.2.0" + } + }, "node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -12429,7 +12456,6 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, "license": "MIT" }, "node_modules/fast-fifo": { @@ -13202,6 +13228,19 @@ "node": ">=10.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hpagent": { "version": "0.1.2", "license": "MIT", @@ -17778,6 +17817,43 @@ "node": ">=0.10.0" } }, + "node_modules/react-dnd": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", + "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", + "dependencies": { + "@react-dnd/invariant": "^4.0.1", + "@react-dnd/shallowequal": "^4.0.1", + "dnd-core": "^16.0.1", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" + }, + "peerDependencies": { + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-dnd-html5-backend": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", + "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", + "dependencies": { + "dnd-core": "^16.0.1" + } + }, "node_modules/react-dom": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", @@ -17850,6 +17926,14 @@ "node": ">= 0.10" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",