diff --git a/.editorconfig b/.editorconfig
index 01b3e9f..e810a54 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,11 +1,15 @@
-root = true
-
-[*]
-charset = utf-8
-indent_style = space
-indent_size = 4
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.json]
-indent_size = 2
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.min.js]
+insert_final_newline = false
+
+[*.json]
+indent_size = 2
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..0f4d80c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,10 @@
+*.js text eol=lf
+*.ts text eol=lf
+*.json text eol=lf
+*.html text eol=lf
+*.md text eol=lf
+*.yml text eol=lf
+.editorconfig text eol=lf
+.gitattributes text eol=lf
+.gitignore text eol=lf
+LICENSE text eol=lf
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 2c024cf..9d0cbe2 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -1,51 +1,51 @@
-name: Publish
-
-on:
- push:
- tags:
- - "[0-9]+.[0-9]+.[0-9]+"
- - "[0-9]+.[0-9]+.[0-9]+-[a-z]+.[0-9]+"
-
-permissions:
- contents: write
-
-jobs:
- publish:
- if: github.repository == 'rameel/ramstack.hotkey.js'
- name: "Publish Packages"
- runs-on: ubuntu-latest
-
- steps:
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: "20"
- registry-url: "https://registry.npmjs.org"
-
- - name: Checkout
- uses: actions/checkout@v4
-
- - name: Install dependencies
- run: npm i
-
- - name: Build packages
- run: npm run build
-
- - name: Publish packages
- run: npm publish --access public
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- - name: Archive packages (.zip)
- run: zip -r ramstack.hotkey-${{ github.ref_name }}.zip ./dist/*
-
- - name: Archive packages (.tar.gz)
- run: tar -czvf ramstack.hotkey-${{ github.ref_name }}.tar.gz ./dist
-
- - name: Create release
- uses: softprops/action-gh-release@v2
- with:
- draft: true
- files: |
- ramstack.hotkey-${{ github.ref_name }}.zip
- ramstack.hotkey-${{ github.ref_name }}.tar.gz
+name: Publish
+
+on:
+ push:
+ tags:
+ - "[0-9]+.[0-9]+.[0-9]+"
+ - "[0-9]+.[0-9]+.[0-9]+-[a-z]+.[0-9]+"
+
+permissions:
+ contents: write
+
+jobs:
+ publish:
+ if: github.repository == 'rameel/ramstack.hotkey.js'
+ name: "Publish Packages"
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+ registry-url: "https://registry.npmjs.org"
+
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ run: npm i
+
+ - name: Build packages
+ run: npm run build
+
+ - name: Publish packages
+ run: npm publish --access public
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Archive packages (.zip)
+ run: zip -r ramstack.hotkey-${{ github.ref_name }}.zip ./dist/*
+
+ - name: Archive packages (.tar.gz)
+ run: tar -czvf ramstack.hotkey-${{ github.ref_name }}.tar.gz ./dist
+
+ - name: Create release
+ uses: softprops/action-gh-release@v2
+ with:
+ draft: true
+ files: |
+ ramstack.hotkey-${{ github.ref_name }}.zip
+ ramstack.hotkey-${{ github.ref_name }}.tar.gz
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9b4a3b0..4aa389c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,8 +1,8 @@
-## [1.1.0]
-Add `trusted` option
-
-## [1.0.2]
-Improve README
-
-## [1.0.1]
-Preserve the user-defined hotkey in the error message
+## [1.1.0]
+Add `trusted` option
+
+## [1.0.2]
+Improve README
+
+## [1.0.1]
+Preserve the user-defined hotkey in the error message
diff --git a/LICENSE b/LICENSE
index 6666765..92e3431 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,9 +1,9 @@
-MIT License
-
-Copyright 2024 Rameel (https://github.com/rameel)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+MIT License
+
+Copyright 2024 Rameel (https://github.com/rameel)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index 7192dea..9425263 100644
--- a/README.md
+++ b/README.md
@@ -1,213 +1,213 @@
-# Hotkey
-[](https://www.npmjs.com/package/@ramstack/hotkey)
-[](https://github.com/rameel/ramstack.hotkey.js/blob/main/LICENSE)
-
-The `@ramstack/hotkey` package is a very small and lightweight library for handling hotkeys.
-The library weighs around 1.3KB and approximately 750 bytes when gzipped.
-
-## Installation
-
-### Using via NPM
-```sh
-npm install --save @ramstack/hotkey
-```
-
-### Using via CDN
-```html
-
-```
-
-### Using ES module build
-
-```html
-
-```
-
-## Quick start
-You can specify either the element itself or its selector as the target for key events.
-For global listening across the entire page, use `window` or `document`.
-
-```js
-registerHotkey("#app", "Ctrl + K", e => {
- e.preventDefault();
- console.log("Search...");
-});
-```
-The function returns a cleanup function that allows you to unsubscribe from event listening.
-
-```js
-const cleanup = registerHotkey(...);
-...
-
-// Unregister the hotkey when they are no longer needed
-cleanup();
-```
-
-### Exclude elements from hotkey handling
-
-If you wish to prevent hotkey handling on certain elements, add the `data-hotkey-ignore` attribute
-to the respective element.
-```html
-
- ...
-
-
-
-```
-
-Alternatively, apply it to the parent if you want to exclude
-an entire group of elements at once.
-```html
-
- ...
-
-
-
-```
-
-## API
-
-```ts
-/**
- * Registers a hotkey on the specified target element.
- *
- * @param {EventTarget | string} target - The target element on which the hotkey will be registered.
- * @param {string} hotkey - The combination of keys for the hotkey, e.g., "Ctrl+Alt+Delete".
- * @param {(e: KeyboardEvent) => void} handler - The function to be called when the hotkey is triggered.
- * @param {string} [eventName="keydown"] - The name of the event to listen for (default is "keydown").
- * @param {HotkeyEventListenerOptions | boolean | undefined} [options] - Additional options for the event listener.
- *
- * @returns {() => void} - A function to unregister the hotkey.
- */
-function registerHotkey(
- target: EventTarget | string,
- hotkey: string,
- handler: (e: KeyboardEvent) => void,
- eventName?: string,
- options?: HotkeyEventListenerOptions | boolean | undefined): () => void;
-```
-**Parameters**
-
-#### target (required)
-The target element on which the hotkey will be registered. Use `window` or `document` for global hotkeys.
-```js
-registerHotkey(window, "Win + PgUp", e => {
- console.log("Do something");
-});
-```
-
-#### hotkey (required)
-The combination of keys for the hotkey, e.g., `Ctrl + Alt + Delete`
-The hotkey description is a case-insensitive. Spaces are not important. Standard key names are used.
-You can find them here [Key values for keyboard events](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values)
-
-In addition, there are also aliases for some key names:
-
-```js
-const aliases: Record = {
- "esc" : "escape",
- "ins" : "insert",
- "del" : "delete",
- "up" : "arrowup",
- "down" : "arrowdown",
- "right" : "arrowright",
- "left" : "arrowleft",
- "pgup" : "pageup",
- "pgdn" : "pagedown",
- "break" : "pause",
- "scroll" : "scrolllock",
- "scrlk" : "scrolllock",
- "prtscr" : "printscreen",
- "win" : "meta",
- "windows" : "meta",
- "cmd" : "meta",
- "command" : "meta",
- "comma" : ",",
- "period" : ".",
- "quote" : "\"",
- "singlequote" : "'",
- "colon" : ":",
- "semicolon" : ";",
- "plus" : "+",
- "minus" : "-",
- "tilde" : "~",
- "equal" : "=",
- "slash" : "/"
-};
-```
-
-#### handler (required)
-The function to be called when the hotkey is triggered.
-
-The value of `this` inside the handler will be a reference to the element.
-It will be the same as the value of the `currentTarget` property of the event argument that is passed to the handler.
-
-```js
-registerHotkey("#el", "Ctrl + K", function(e) {
- console.log(e.currentTarget === this); // logs true
-});
-```
-As a reminder, arrow functions do not have their own this context.
-```js
-registerHotkey("#el", "Ctrl + K", e => {
- console.log(e.currentTarget === this); // logs false
-});
-```
-
-#### eventName (optional, default: 'keydown')
-The name of the event to listen for.
-You can subscribe to events on `keydown` (used by default) or `keyup`.
-
-```js
-registerHotkey(window, "Ctrl + Up", e => {
- e.preventDefault();
- ...
-}, "keyup");
-```
-
-#### options (optional)
-Additional options for the event listener. See [Options](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options).
-
-```ts
-/**
- * Extended options for hotkey event listeners.
- */
-export interface HotkeyEventListenerOptions extends AddEventListenerOptions {
- /**
- * If specified, ensures that only trusted events are handled.
- */
- trusted?: boolean;
-}
-```
-The `trusted` option ensures that only events marked as trusted are handled.
-This can help prevent synthetic or untrusted events from triggering hotkeys.
-
-```js
-registerHotkey(window, "Ctrl + S", e => {
- e.preventDefault();
- console.log("Saving...");
-}, "keydown", { trusted: true });
-```
-In this example, the hotkey will only trigger for events that are marked as trusted, preventing manually dispatched or synthetic events from interfering.
-
-#### Returns
-A function that, when called, unregisters the hotkey.
-
-```js
-const cleanup = registerHotkey(...);
-...
-
-// Unregister the hotkey when they are no longer needed
-cleanup();
-```
-
-## Contributions
-Bug reports and contributions are welcome.
-
-## License
-This package is released as open source under the **MIT License**.
-See the [LICENSE](https://github.com/rameel/ramstack.hotkey.js/blob/main/LICENSE) file for more details.
+# Hotkey
+[](https://www.npmjs.com/package/@ramstack/hotkey)
+[](https://github.com/rameel/ramstack.hotkey.js/blob/main/LICENSE)
+
+The `@ramstack/hotkey` package is a very small and lightweight library for handling hotkeys.
+The library weighs around 1.3KB and approximately 750 bytes when gzipped.
+
+## Installation
+
+### Using via NPM
+```sh
+npm install --save @ramstack/hotkey
+```
+
+### Using via CDN
+```html
+
+```
+
+### Using ES module build
+
+```html
+
+```
+
+## Quick start
+You can specify either the element itself or its selector as the target for key events.
+For global listening across the entire page, use `window` or `document`.
+
+```js
+registerHotkey("#app", "Ctrl + K", e => {
+ e.preventDefault();
+ console.log("Search...");
+});
+```
+The function returns a cleanup function that allows you to unsubscribe from event listening.
+
+```js
+const cleanup = registerHotkey(...);
+...
+
+// Unregister the hotkey when they are no longer needed
+cleanup();
+```
+
+### Exclude elements from hotkey handling
+
+If you wish to prevent hotkey handling on certain elements, add the `data-hotkey-ignore` attribute
+to the respective element.
+```html
+
+ ...
+
+
+
+```
+
+Alternatively, apply it to the parent if you want to exclude
+an entire group of elements at once.
+```html
+
+ ...
+
+
+
+```
+
+## API
+
+```ts
+/**
+ * Registers a hotkey on the specified target element.
+ *
+ * @param {EventTarget | string} target - The target element on which the hotkey will be registered.
+ * @param {string} hotkey - The combination of keys for the hotkey, e.g., "Ctrl+Alt+Delete".
+ * @param {(e: KeyboardEvent) => void} handler - The function to be called when the hotkey is triggered.
+ * @param {string} [eventName="keydown"] - The name of the event to listen for (default is "keydown").
+ * @param {HotkeyEventListenerOptions | boolean | undefined} [options] - Additional options for the event listener.
+ *
+ * @returns {() => void} - A function to unregister the hotkey.
+ */
+function registerHotkey(
+ target: EventTarget | string,
+ hotkey: string,
+ handler: (e: KeyboardEvent) => void,
+ eventName?: string,
+ options?: HotkeyEventListenerOptions | boolean | undefined): () => void;
+```
+**Parameters**
+
+#### target (required)
+The target element on which the hotkey will be registered. Use `window` or `document` for global hotkeys.
+```js
+registerHotkey(window, "Win + PgUp", e => {
+ console.log("Do something");
+});
+```
+
+#### hotkey (required)
+The combination of keys for the hotkey, e.g., `Ctrl + Alt + Delete`
+The hotkey description is a case-insensitive. Spaces are not important. Standard key names are used.
+You can find them here [Key values for keyboard events](https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values)
+
+In addition, there are also aliases for some key names:
+
+```js
+const aliases: Record = {
+ "esc" : "escape",
+ "ins" : "insert",
+ "del" : "delete",
+ "up" : "arrowup",
+ "down" : "arrowdown",
+ "right" : "arrowright",
+ "left" : "arrowleft",
+ "pgup" : "pageup",
+ "pgdn" : "pagedown",
+ "break" : "pause",
+ "scroll" : "scrolllock",
+ "scrlk" : "scrolllock",
+ "prtscr" : "printscreen",
+ "win" : "meta",
+ "windows" : "meta",
+ "cmd" : "meta",
+ "command" : "meta",
+ "comma" : ",",
+ "period" : ".",
+ "quote" : "\"",
+ "singlequote" : "'",
+ "colon" : ":",
+ "semicolon" : ";",
+ "plus" : "+",
+ "minus" : "-",
+ "tilde" : "~",
+ "equal" : "=",
+ "slash" : "/"
+};
+```
+
+#### handler (required)
+The function to be called when the hotkey is triggered.
+
+The value of `this` inside the handler will be a reference to the element.
+It will be the same as the value of the `currentTarget` property of the event argument that is passed to the handler.
+
+```js
+registerHotkey("#el", "Ctrl + K", function(e) {
+ console.log(e.currentTarget === this); // logs true
+});
+```
+As a reminder, arrow functions do not have their own this context.
+```js
+registerHotkey("#el", "Ctrl + K", e => {
+ console.log(e.currentTarget === this); // logs false
+});
+```
+
+#### eventName (optional, default: 'keydown')
+The name of the event to listen for.
+You can subscribe to events on `keydown` (used by default) or `keyup`.
+
+```js
+registerHotkey(window, "Ctrl + Up", e => {
+ e.preventDefault();
+ ...
+}, "keyup");
+```
+
+#### options (optional)
+Additional options for the event listener. See [Options](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#options).
+
+```ts
+/**
+ * Extended options for hotkey event listeners.
+ */
+export interface HotkeyEventListenerOptions extends AddEventListenerOptions {
+ /**
+ * If specified, ensures that only trusted events are handled.
+ */
+ trusted?: boolean;
+}
+```
+The `trusted` option ensures that only events marked as trusted are handled.
+This can help prevent synthetic or untrusted events from triggering hotkeys.
+
+```js
+registerHotkey(window, "Ctrl + S", e => {
+ e.preventDefault();
+ console.log("Saving...");
+}, "keydown", { trusted: true });
+```
+In this example, the hotkey will only trigger for events that are marked as trusted, preventing manually dispatched or synthetic events from interfering.
+
+#### Returns
+A function that, when called, unregisters the hotkey.
+
+```js
+const cleanup = registerHotkey(...);
+...
+
+// Unregister the hotkey when they are no longer needed
+cleanup();
+```
+
+## Contributions
+Bug reports and contributions are welcome.
+
+## License
+This package is released as open source under the **MIT License**.
+See the [LICENSE](https://github.com/rameel/ramstack.hotkey.js/blob/main/LICENSE) file for more details.
diff --git a/package-lock.json b/package-lock.json
index d4bb566..3f6109f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,51 +1,48 @@
{
"name": "@ramstack/hotkey",
- "version": "1.0.2",
+ "version": "1.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@ramstack/hotkey",
- "version": "1.0.2",
+ "version": "1.1.0",
"license": "MIT",
- "dependencies": {
- "@rollup/rollup-linux-x64-gnu": "*"
- },
"devDependencies": {
- "@playwright/test": "^1.50.1",
- "@rollup/plugin-node-resolve": "^16.0.0",
+ "@playwright/test": "^1.57.0",
+ "@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-terser": "^0.4.4",
- "@rollup/plugin-typescript": "^12.1.2",
- "@types/node": "^22.13.9",
- "cross-env": "^7.0.3",
- "rimraf": "^6.0.1",
- "rollup": "^4.34.9",
+ "@rollup/plugin-typescript": "^12.3.0",
+ "rimraf": "^6.1.2",
+ "rollup": "^4.55.1",
"rollup-plugin-bundle-size": "^1.0.3",
"strip-comments": "^2.0.1",
- "terser": "^5.39.0",
+ "terser": "^5.44.1",
"tslib": "^2.8.1",
- "typescript": "^5.8.2"
- },
- "optionalDependencies": {
- "@rollup/rollup-linux-x64-gnu": "^4.34.9"
+ "typescript": "^5.9.3"
}
},
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ "@isaacs/balanced-match": "^4.0.1"
},
"engines": {
- "node": ">=12"
+ "node": "20 || >=22"
}
},
"node_modules/@jridgewell/gen-mapping": {
@@ -107,13 +104,13 @@
}
},
"node_modules/@playwright/test": {
- "version": "1.50.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz",
- "integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==",
+ "version": "1.57.0",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz",
+ "integrity": "sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright": "1.50.1"
+ "playwright": "1.57.0"
},
"bin": {
"playwright": "cli.js"
@@ -123,9 +120,9 @@
}
},
"node_modules/@rollup/plugin-node-resolve": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz",
- "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==",
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz",
+ "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -170,9 +167,9 @@
}
},
"node_modules/@rollup/plugin-typescript": {
- "version": "12.1.2",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz",
- "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==",
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz",
+ "integrity": "sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -218,23 +215,262 @@
}
}
},
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz",
+ "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz",
+ "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz",
+ "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz",
+ "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz",
+ "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz",
+ "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz",
+ "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz",
+ "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz",
+ "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz",
+ "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz",
+ "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz",
+ "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz",
+ "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz",
+ "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz",
+ "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz",
+ "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz",
+ "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz",
+ "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==",
"cpu": [
"x64"
],
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz",
+ "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==",
"cpu": [
"x64"
],
@@ -242,85 +478,117 @@
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "linux"
]
},
- "node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz",
+ "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
},
- "node_modules/@types/node": {
- "version": "22.13.9",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz",
- "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==",
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz",
+ "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
"license": "MIT",
- "dependencies": {
- "undici-types": "~6.20.0"
- }
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
},
- "node_modules/@types/resolve": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
- "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
- "dev": true
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz",
+ "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz",
+ "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz",
+ "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz",
+ "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "node_modules/@types/resolve": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
+ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
}
},
"node_modules/buffer-from": {
@@ -375,65 +643,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "node_modules/cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "bin": {
- "cross-env": "src/bin/cross-env.js",
- "cross-env-shell": "src/bin/cross-env-shell.js"
- },
- "engines": {
- "node": ">=10.14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -449,20 +664,6 @@
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -491,23 +692,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/foreground-child": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
- "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "cross-spawn": "^7.0.6",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -533,22 +717,16 @@
}
},
"node_modules/glob": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
- "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
+ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^4.0.1",
- "minimatch": "^10.0.0",
+ "minimatch": "^10.1.1",
"minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
"path-scurry": "^2.0.0"
},
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
"engines": {
"node": "20 || >=22"
},
@@ -613,50 +791,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "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,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
"integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
"dev": true
},
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/jackspeak": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz",
- "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/lru-cache": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
- "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
+ "version": "11.2.4",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
+ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
}
@@ -677,13 +823,13 @@
}
},
"node_modules/minimatch": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
- "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@isaacs/brace-expansion": "^5.0.0"
},
"engines": {
"node": "20 || >=22"
@@ -727,15 +873,6 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -743,9 +880,9 @@
"dev": true
},
"node_modules/path-scurry": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
- "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -772,13 +909,13 @@
}
},
"node_modules/playwright": {
- "version": "1.50.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz",
- "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==",
+ "version": "1.57.0",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz",
+ "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright-core": "1.50.1"
+ "playwright-core": "1.57.0"
},
"bin": {
"playwright": "cli.js"
@@ -791,9 +928,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.50.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz",
- "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==",
+ "version": "1.57.0",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz",
+ "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -842,14 +979,14 @@
}
},
"node_modules/rimraf": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
- "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.2.tgz",
+ "integrity": "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "glob": "^11.0.0",
- "package-json-from-dist": "^1.0.0"
+ "glob": "^13.0.0",
+ "package-json-from-dist": "^1.0.1"
},
"bin": {
"rimraf": "dist/esm/bin.mjs"
@@ -862,13 +999,13 @@
}
},
"node_modules/rollup": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz",
- "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==",
+ "version": "4.55.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz",
+ "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.6"
+ "@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -878,25 +1015,31 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.34.9",
- "@rollup/rollup-android-arm64": "4.34.9",
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-freebsd-arm64": "4.34.9",
- "@rollup/rollup-freebsd-x64": "4.34.9",
- "@rollup/rollup-linux-arm-gnueabihf": "4.34.9",
- "@rollup/rollup-linux-arm-musleabihf": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-loongarch64-gnu": "4.34.9",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9",
- "@rollup/rollup-linux-riscv64-gnu": "4.34.9",
- "@rollup/rollup-linux-s390x-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-ia32-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9",
+ "@rollup/rollup-android-arm-eabi": "4.55.1",
+ "@rollup/rollup-android-arm64": "4.55.1",
+ "@rollup/rollup-darwin-arm64": "4.55.1",
+ "@rollup/rollup-darwin-x64": "4.55.1",
+ "@rollup/rollup-freebsd-arm64": "4.55.1",
+ "@rollup/rollup-freebsd-x64": "4.55.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.55.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.55.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.55.1",
+ "@rollup/rollup-linux-arm64-musl": "4.55.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.55.1",
+ "@rollup/rollup-linux-loong64-musl": "4.55.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.55.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.55.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.55.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.55.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.55.1",
+ "@rollup/rollup-linux-x64-gnu": "4.55.1",
+ "@rollup/rollup-linux-x64-musl": "4.55.1",
+ "@rollup/rollup-openbsd-x64": "4.55.1",
+ "@rollup/rollup-openharmony-arm64": "4.55.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.55.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.55.1",
+ "@rollup/rollup-win32-x64-gnu": "4.55.1",
+ "@rollup/rollup-win32-x64-msvc": "4.55.1",
"fsevents": "~2.3.2"
}
},
@@ -939,40 +1082,6 @@
"randombytes": "^2.1.0"
}
},
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/smob": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz",
@@ -998,110 +1107,6 @@
"source-map": "^0.6.0"
}
},
- "node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/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,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/string-width-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/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,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/strip-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz",
@@ -1133,14 +1138,14 @@
}
},
"node_modules/terser": {
- "version": "5.39.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
- "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
+ "version": "5.44.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz",
+ "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
+ "acorn": "^8.15.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
@@ -1159,9 +1164,9 @@
"license": "0BSD"
},
"node_modules/typescript": {
- "version": "5.8.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
- "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -1171,126 +1176,6 @@
"engines": {
"node": ">=14.17"
}
- },
- "node_modules/undici-types": {
- "version": "6.20.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
- "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/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,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/wrap-ansi-cjs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
}
}
}
diff --git a/package.json b/package.json
index 9339f85..2a94ea6 100644
--- a/package.json
+++ b/package.json
@@ -1,50 +1,50 @@
{
"name": "@ramstack/hotkey",
"version": "1.1.0",
- "description": "A lightweight Javascript library for handling hotkeys. No external dependencies.",
+ "description": "A lightweight library for handling hotkeys. No external dependencies.",
"type": "module",
- "main": "dist/hotkey.esm.js",
- "module": "dist/hotkey.esm.js",
- "types": "dist/types/hotkey.d.ts",
+ "author": "rameel ",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/rameel/ramstack.hotkey.js.git"
+ },
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/types/hotkey.d.ts",
+ "default": "./dist/hotkey.esm.js"
+ }
+ }
+ },
"files": [
"dist",
"README.md",
"LICENSE"
],
- "author": "rameel ",
- "license": "MIT",
"scripts": {
"build": "rollup -c",
"prebuild": "npm run clean",
"clean": "rimraf dist",
- "test": "cross-env NODE_OPTIONS=--no-warnings playwright test",
+ "test": "playwright test",
"pretest": "npm run build"
},
- "repository": {
- "type": "git",
- "url": "git+https://github.com/rameel/ramstack.hotkey.js.git"
- },
"keywords": [
"hotkey",
"shortkey",
"shortcut"
],
"devDependencies": {
- "@playwright/test": "^1.50.1",
- "@rollup/plugin-node-resolve": "^16.0.0",
+ "@playwright/test": "^1.57.0",
+ "@rollup/plugin-node-resolve": "^16.0.3",
"@rollup/plugin-terser": "^0.4.4",
- "@rollup/plugin-typescript": "^12.1.2",
- "@types/node": "^22.13.9",
- "cross-env": "^7.0.3",
- "rimraf": "^6.0.1",
- "rollup": "^4.34.9",
+ "@rollup/plugin-typescript": "^12.3.0",
+ "rimraf": "^6.1.2",
+ "rollup": "^4.55.1",
"rollup-plugin-bundle-size": "^1.0.3",
"strip-comments": "^2.0.1",
- "terser": "^5.39.0",
+ "terser": "^5.44.1",
"tslib": "^2.8.1",
- "typescript": "^5.8.2"
- },
- "optionalDependencies": {
- "@rollup/rollup-linux-x64-gnu": "^4.34.9"
+ "typescript": "^5.9.3"
}
}
diff --git a/rollup.config.mjs b/rollup.config.js
similarity index 95%
rename from rollup.config.mjs
rename to rollup.config.js
index fcc30b6..6e295b4 100644
--- a/rollup.config.mjs
+++ b/rollup.config.js
@@ -1,78 +1,78 @@
-import path from "node:path";
-import resolve from "@rollup/plugin-node-resolve";
-import size from "rollup-plugin-bundle-size";
-import strip_comments from "strip-comments";
-import terser from "@rollup/plugin-terser";
-import typescript from '@rollup/plugin-typescript';
-
-const terser_options = {
- output: {
- comments: false
- },
- compress: {
- passes: 5,
- ecma: 2020,
- drop_console: false,
- drop_debugger: true,
- pure_getters: true,
- arguments: true,
- unsafe_comps: true,
- unsafe_math: true,
- unsafe_methods: true
- }
-};
-
-const plugins = [
- resolve(),
- typescript(),
- remove_comments(),
- trim_ws(),
- size()
-];
-
-export default [{
- input: "src/hotkey.ts",
- output: [{
- file: "dist/hotkey.esm.js",
- format: "esm"
- }, {
- file: "dist/hotkey.esm.min.js",
- format: "esm",
- plugins: [terser(terser_options)]
- }, {
- name: "window",
- file: "dist/hotkey.js",
- format: "iife",
- extend: true
- }, {
- name: "window",
- file: "dist/hotkey.min.js",
- format: "iife",
- extend: true,
- plugins: [terser(terser_options)]
- }],
- plugins
-}]
-
-function remove_comments() {
- return {
- name: "strip",
- transform(source) {
- return {
- code: strip_comments(source, {})
- };
- }
- };
-}
-
-function trim_ws() {
- return {
- name: "trim-ws",
- generateBundle(options, bundle) {
- if (options.file.match(/\.js$/)) {
- const key = path.basename(options.file);
- bundle[key].code = bundle[key].code.trim();
- }
- }
- };
-}
+import path from "node:path";
+import resolve from "@rollup/plugin-node-resolve";
+import size from "rollup-plugin-bundle-size";
+import strip_comments from "strip-comments";
+import terser from "@rollup/plugin-terser";
+import typescript from '@rollup/plugin-typescript';
+
+const terser_options = {
+ output: {
+ comments: false
+ },
+ compress: {
+ passes: 5,
+ ecma: 2020,
+ drop_console: false,
+ drop_debugger: true,
+ pure_getters: true,
+ arguments: true,
+ unsafe_comps: true,
+ unsafe_math: true,
+ unsafe_methods: true
+ }
+};
+
+const plugins = [
+ resolve(),
+ typescript(),
+ remove_comments(),
+ trim_ws(),
+ size()
+];
+
+export default [{
+ input: "src/hotkey.ts",
+ output: [{
+ file: "dist/hotkey.esm.js",
+ format: "esm"
+ }, {
+ file: "dist/hotkey.esm.min.js",
+ format: "esm",
+ plugins: [terser(terser_options)]
+ }, {
+ name: "window",
+ file: "dist/hotkey.js",
+ format: "iife",
+ extend: true
+ }, {
+ name: "window",
+ file: "dist/hotkey.min.js",
+ format: "iife",
+ extend: true,
+ plugins: [terser(terser_options)]
+ }],
+ plugins
+}]
+
+function remove_comments() {
+ return {
+ name: "strip",
+ transform(source) {
+ return {
+ code: strip_comments(source, {})
+ };
+ }
+ };
+}
+
+function trim_ws() {
+ return {
+ name: "trim-ws",
+ generateBundle(options, bundle) {
+ if (options.file.match(/\.js$/)) {
+ const key = path.basename(options.file);
+ bundle[key].code = bundle[key].code.trim();
+ }
+ }
+ };
+}
diff --git a/src/hotkey.ts b/src/hotkey.ts
index 566041f..ac03df2 100644
--- a/src/hotkey.ts
+++ b/src/hotkey.ts
@@ -1,137 +1,137 @@
-const aliases: Record = {
- "esc": "escape",
- "ins": "insert",
- "del": "delete",
- "up": "arrowup",
- "down": "arrowdown",
- "right": "arrowright",
- "left": "arrowleft",
- "pgup": "pageup",
- "pgdn": "pagedown",
- "break": "pause",
- "scroll": "scrolllock",
- "scrlk": "scrolllock",
- "prtscr": "printscreen",
- "win": "meta",
- "windows": "meta",
- "cmd": "meta",
- "command": "meta",
- "comma": ",",
- "period": ".",
- "quote": "\"",
- "singlequote": "'",
- "colon": ":",
- "semicolon": ";",
- "plus": "+",
- "minus": "-",
- "tilde": "~",
- "equal": "=",
- "slash": "/"
-};
-
-const control_keys: string[] = [
- "ctrlKey",
- "altKey",
- "shiftKey",
- "metaKey"
-];
-
-interface Hotkey {
- code: string;
- ctrlKey: boolean;
- altKey: boolean;
- shiftKey: boolean;
- metaKey: boolean;
-}
-
-/**
- * Extended options for hotkey event listeners.
- */
-export interface HotkeyEventListenerOptions extends AddEventListenerOptions {
- /**
- * If specified, ensures that only trusted events are handled.
- */
- trusted?: boolean;
-}
-
-/**
- * Registers a hotkey on the specified target element.
- *
- * @param {EventTarget | string} target - The target element on which the hotkey will be registered.
- * @param {string} hotkey - The combination of keys for the hotkey, e.g., "Ctrl+Alt+Delete".
- * @param {(e: KeyboardEvent) => void} handler - The function to be called when the hotkey is triggered.
- * @param {string} [eventName="keydown"] - The name of the event to listen for (default is "keydown").
- * @param {HotkeyEventListenerOptions | boolean | undefined} [options] - Additional options for the event listener.
- *
- * @returns {() => void} - A function to unregister the hotkey.
- */
-export function registerHotkey(
- target: EventTarget | string,
- hotkey: string,
- handler: (e: KeyboardEvent) => void,
- eventName: string = "keydown",
- options?: HotkeyEventListenerOptions | boolean | undefined): () => void {
-
- const info = describe(hotkey);
-
- if (typeof target === "string") {
- target = document.querySelector(target) ?? error(`No element found for selector '${target}'`);
- }
-
- return listen(target, eventName, function (this: EventTarget, e: KeyboardEvent) {
- if (!(options as HotkeyEventListenerOptions)?.trusted || e.isTrusted) {
- if (!(e.target as HTMLElement)?.closest("[data-hotkey-ignore]")) {
- if (info.code === e.code.toUpperCase()) {
- if (control_keys.every(n => info[n as keyof Hotkey] === e[n as keyof KeyboardEvent])) {
- handler.call(this, e);
- }
- }
- }
- }
- } as EventListener, options);
-}
-
-function describe(hotkey: string): Hotkey {
- const keys = hotkey.replace(/\s+/g, "").toLowerCase().split("+");
- const info = keys.reduce((data, k) => {
- k = aliases[k] ?? k;
- switch (k) {
- case "ctrl":
- case "alt":
- case "shift":
- case "meta":
- data[`${k}Key`] = true;
- break;
-
- default:
- k.length || error_invalid_key(hotkey);
- k = k.toUpperCase();
-
- data.code = k.length === 1 && k >= 'A' && k <= 'Z' ? `KEY${k}` : k;
- break;
- }
- return data;
- }, {
- code: "",
- ctrlKey: false,
- altKey: false,
- shiftKey: false,
- metaKey: false
- });
-
- info.code || error_invalid_key(hotkey);
- return info;
-}
-
-function listen(target: EventTarget, type: string, callback: EventListener | null, options?: AddEventListenerOptions | boolean | undefined): () => void {
- target.addEventListener(type, callback, options);
- return () => target.removeEventListener(type, callback, options);
-}
-
-function error_invalid_key(hotkey: string): never {
- error(`Invalid hotkey: '${hotkey}'`);
-}
-
-function error(message: string): never {
- throw new Error(message);
-}
+const aliases: Record = {
+ "esc": "escape",
+ "ins": "insert",
+ "del": "delete",
+ "up": "arrowup",
+ "down": "arrowdown",
+ "right": "arrowright",
+ "left": "arrowleft",
+ "pgup": "pageup",
+ "pgdn": "pagedown",
+ "break": "pause",
+ "scroll": "scrolllock",
+ "scrlk": "scrolllock",
+ "prtscr": "printscreen",
+ "win": "meta",
+ "windows": "meta",
+ "cmd": "meta",
+ "command": "meta",
+ "comma": ",",
+ "period": ".",
+ "quote": "\"",
+ "singlequote": "'",
+ "colon": ":",
+ "semicolon": ";",
+ "plus": "+",
+ "minus": "-",
+ "tilde": "~",
+ "equal": "=",
+ "slash": "/"
+};
+
+const control_keys: string[] = [
+ "ctrlKey",
+ "altKey",
+ "shiftKey",
+ "metaKey"
+];
+
+interface Hotkey {
+ code: string;
+ ctrlKey: boolean;
+ altKey: boolean;
+ shiftKey: boolean;
+ metaKey: boolean;
+}
+
+/**
+ * Extended options for hotkey event listeners.
+ */
+export interface HotkeyEventListenerOptions extends AddEventListenerOptions {
+ /**
+ * If specified, ensures that only trusted events are handled.
+ */
+ trusted?: boolean;
+}
+
+/**
+ * Registers a hotkey on the specified target element.
+ *
+ * @param {EventTarget | string} target - The target element on which the hotkey will be registered.
+ * @param {string} hotkey - The combination of keys for the hotkey, e.g., "Ctrl+Alt+Delete".
+ * @param {(e: KeyboardEvent) => void} handler - The function to be called when the hotkey is triggered.
+ * @param {string} [eventName="keydown"] - The name of the event to listen for (default is "keydown").
+ * @param {HotkeyEventListenerOptions | boolean | undefined} [options] - Additional options for the event listener.
+ *
+ * @returns {() => void} - A function to unregister the hotkey.
+ */
+export function registerHotkey(
+ target: EventTarget | string,
+ hotkey: string,
+ handler: (e: KeyboardEvent) => void,
+ eventName: string = "keydown",
+ options?: HotkeyEventListenerOptions | boolean | undefined): () => void {
+
+ const info = describe(hotkey);
+
+ if (typeof target === "string") {
+ target = document.querySelector(target) ?? error(`No element found for selector '${target}'`);
+ }
+
+ return listen(target, eventName, function (this: EventTarget, e: KeyboardEvent) {
+ if (!(options as HotkeyEventListenerOptions)?.trusted || e.isTrusted) {
+ if (!(e.target as HTMLElement)?.closest("[data-hotkey-ignore]")) {
+ if (info.code === e.code.toUpperCase()) {
+ if (control_keys.every(n => info[n as keyof Hotkey] === e[n as keyof KeyboardEvent])) {
+ handler.call(this, e);
+ }
+ }
+ }
+ }
+ } as EventListener, options);
+}
+
+function describe(hotkey: string): Hotkey {
+ const keys = hotkey.replace(/\s+/g, "").toLowerCase().split("+");
+ const info = keys.reduce((data, k) => {
+ k = aliases[k] ?? k;
+ switch (k) {
+ case "ctrl":
+ case "alt":
+ case "shift":
+ case "meta":
+ data[`${k}Key`] = true;
+ break;
+
+ default:
+ k.length || error_invalid_key(hotkey);
+ k = k.toUpperCase();
+
+ data.code = k.length === 1 && k >= 'A' && k <= 'Z' ? `KEY${k}` : k;
+ break;
+ }
+ return data;
+ }, {
+ code: "",
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false
+ });
+
+ info.code || error_invalid_key(hotkey);
+ return info;
+}
+
+function listen(target: EventTarget, type: string, callback: EventListener | null, options?: AddEventListenerOptions | boolean | undefined): () => void {
+ target.addEventListener(type, callback, options);
+ return () => target.removeEventListener(type, callback, options);
+}
+
+function error_invalid_key(hotkey: string): never {
+ error(`Invalid hotkey: '${hotkey}'`);
+}
+
+function error(message: string): never {
+ throw new Error(message);
+}
diff --git a/tests/generic.html b/tests/generic.html
index 5996730..bebbcd2 100644
--- a/tests/generic.html
+++ b/tests/generic.html
@@ -1,21 +1,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tsconfig.json b/tsconfig.json
index 782a0f9..67f4785 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,12 +1,12 @@
-{
- "compilerOptions": {
- "target": "ES2020",
- "module": "ES2020",
- "strict": true,
- "declaration": true,
- "declarationDir": "./dist/types"
- },
- "files": [
- "src/hotkey.ts"
- ]
-}
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ES2020",
+ "strict": true,
+ "declaration": true,
+ "declarationDir": "./dist/types"
+ },
+ "files": [
+ "src/hotkey.ts"
+ ]
+}