diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a8cb8f28..35338da3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,58 @@ # Change Log +## v1.10.6 (954) + +### New Features +- **Install State for Plugins**: Added an install state to improve plugin updates (#1026) by @alMukaafih, further enhanced by @bajrangCoder. +- **Selection Mode in File Browser**: Introduced a selection mode in the file browser by @bajrangCoder. +- **Persistent Notification System**: Added a persistent notification system with toast notifications by @bajrangCoder. +- **In-App Browser Command**: Added a command to open an in-app browser with a given URL by @angeloyana. +- **Font Size Shortcut Keys**: Added new key shortcuts for changing font size by @bajrangCoder: + - Increase Font Size: `Ctrl - +` or `Ctrl - =` + - Decrease Font Size: `Ctrl + -` or `Ctrl - _` +- **Command Palette Enhancements**: + - "Open Plugin Page" command for quick access to plugin pages, especially for keyboard users. + - "Copy Device Info" command to share device information for troubleshooting. +- **GitHub Alert Support**: Added GitHub alert support in plugin descriptions by @bajrangCoder. +- **File Tab Drop Behavior**: Dropping a file tab into any input or editor now inserts its path by @bajrangCoder. +- **File Browser Context Menu**: Added a "Copy URI" option in the file browser context menu by @bajrangCoder. +- **Project Import as ZIP**: Added the option to import projects as ZIP files by @bajrangCoder. +- **Backup Plugins**: You can now back up plugins, whether they are paid or free by @bajrangCoder. +- **Task List Markdown Support**: Added support for task lists (`- [x]`) in the plugin page markdown by @bajrangCoder. +- **Install as Plugin for ZIP Files**: Added the "Install as Plugin" option in the sidebar files section for ZIP files containing a `plugin.json` in the root directory by @bajrangCoder. +- **`acode.installPlugin` API**: Introduced an API for plugins to install other plugins with user consent by @bajrangCoder(available from versionCode: `954`). +- **View Changelogs in Settings**: Added an option in the settings page to view changelogs directly inside the app by @bajrangCoder. +- **App Update Checker**: Implemented an app update checker that runs on startup by @bajrangCoder. + +### Fixes +- **Plugin Loading Failures**: Improved handling of plugin loading failures by @bajrangCoder: + - Prevents the app from crashing when plugins fail to load. + - Shows user feedback for each failed plugin while continuing to load others. +- **Internal URL Navigation**: Replaced browser navigation with scroll behavior for internal links in plugin descriptions. Links to the same markdown now scroll instead of opening a browser by @bajrangCoder. +- **Pro Version Ads Issue**: Fixed an issue where plugin context menu actions displayed ads even if the Pro version was purchased by @UnschooledGamer. +- **Termux Private URI Operations**: Resolved issues with deleting folders/files and renaming files in Termux private URI file systems. +- **Logger Enhancements**: Improved the logger to automatically detect failures and use `console.error` in Acode. +- **Preview and Server Port Issue**: Fixed an issue where the browser did not open on the given port when the preview port and server port differed. +- **Font Persistence**: Resolved an issue where fonts did not persist after restarting the app. +- **Markdown Linking**: Fixed issues with linking to headings within the same page in markdown. +- **Search Bar in File Browser**: Fixed a bug where the search bar in the file browser would get stuck and become unclosable. +- **Theme Page Issues**: Addressed issues with theme plugins, including preview rendering and checkbox state changes. +- **Formatter Mode Selection**: Fixed the formatter ignoring the selected mode for files by @alMukaafih. + +### Others +- **Plugin Refactor**: Migrated the old plugin update icon to a new toast-like notification widget. + +### Translators +- Updated translations for specific languages contributed by: + - **@Micha-he**: `de-de.json` + - **@LaunchLee**: `zh-cn.json` and `zh-hant.json` + - **@andrewczm**: `pl-pl.json` + - **@Nekitori17**: `vi-vn` + - **@s4ntiksu**: `ru-ru.json` + - **@summoner001**: `hu-hu.json` + +--- + ## [1.10.5] (953) - New diff --git a/config.xml b/config.xml index 262c6d392..5ef2ec9a2 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - diff --git a/package-lock.json b/package-lock.json index 9ddbe71e8..ea845e437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,9 @@ "js-base64": "^3.7.7", "jszip": "^3.10.1", "markdown-it": "^14.1.0", + "markdown-it-anchor": "^9.2.0", + "markdown-it-github-alerts": "^0.3.0", + "markdown-it-task-lists": "^2.1.1", "mime-types": "^2.1.35", "minimatch": "^9.0.4", "mustache": "^4.2.0", @@ -53,7 +56,6 @@ "cordova-plugin-server": "file:src/plugins/server", "cordova-plugin-sftp": "file:src/plugins/sftp", "cordova-plugin-system": "file:src/plugins/system", - "cspell": "^8.14.2", "css-loader": "^7.1.2", "mini-css-extract-plugin": "^2.9.0", "path-browserify": "^1.0.1", @@ -2118,543 +2120,6 @@ "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", "dev": true }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-8.14.2.tgz", - "integrity": "sha512-Kv2Utj/RTSxfufGXkkoTZ/3ErCsYWpCijtDFr/FwSsM7mC0PzLpdlcD9xjtgrJO5Kwp7T47iTG21U4Mwddyi8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-ada": "^4.0.2", - "@cspell/dict-aws": "^4.0.3", - "@cspell/dict-bash": "^4.1.3", - "@cspell/dict-companies": "^3.1.4", - "@cspell/dict-cpp": "^5.1.12", - "@cspell/dict-cryptocurrencies": "^5.0.0", - "@cspell/dict-csharp": "^4.0.2", - "@cspell/dict-css": "^4.0.13", - "@cspell/dict-dart": "^2.0.3", - "@cspell/dict-django": "^4.1.0", - "@cspell/dict-docker": "^1.1.7", - "@cspell/dict-dotnet": "^5.0.2", - "@cspell/dict-elixir": "^4.0.3", - "@cspell/dict-en_us": "^4.3.23", - "@cspell/dict-en-common-misspellings": "^2.0.4", - "@cspell/dict-en-gb": "1.1.33", - "@cspell/dict-filetypes": "^3.0.4", - "@cspell/dict-fonts": "^4.0.0", - "@cspell/dict-fsharp": "^1.0.1", - "@cspell/dict-fullstack": "^3.2.0", - "@cspell/dict-gaming-terms": "^1.0.5", - "@cspell/dict-git": "^3.0.0", - "@cspell/dict-golang": "^6.0.9", - "@cspell/dict-google": "^1.0.1", - "@cspell/dict-haskell": "^4.0.1", - "@cspell/dict-html": "^4.0.5", - "@cspell/dict-html-symbol-entities": "^4.0.0", - "@cspell/dict-java": "^5.0.7", - "@cspell/dict-julia": "^1.0.1", - "@cspell/dict-k8s": "^1.0.6", - "@cspell/dict-latex": "^4.0.0", - "@cspell/dict-lorem-ipsum": "^4.0.0", - "@cspell/dict-lua": "^4.0.3", - "@cspell/dict-makefile": "^1.0.0", - "@cspell/dict-monkeyc": "^1.0.6", - "@cspell/dict-node": "^5.0.1", - "@cspell/dict-npm": "^5.0.18", - "@cspell/dict-php": "^4.0.8", - "@cspell/dict-powershell": "^5.0.5", - "@cspell/dict-public-licenses": "^2.0.7", - "@cspell/dict-python": "^4.2.4", - "@cspell/dict-r": "^2.0.1", - "@cspell/dict-ruby": "^5.0.2", - "@cspell/dict-rust": "^4.0.5", - "@cspell/dict-scala": "^5.0.3", - "@cspell/dict-software-terms": "^4.0.6", - "@cspell/dict-sql": "^2.1.5", - "@cspell/dict-svelte": "^1.0.2", - "@cspell/dict-swift": "^2.0.1", - "@cspell/dict-terraform": "^1.0.0", - "@cspell/dict-typescript": "^3.1.6", - "@cspell/dict-vue": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-8.14.2.tgz", - "integrity": "sha512-TZavcnNIZKX1xC/GNj80RgFVKHCT4pHT0qm9jCsQFH2QJfyCrUlkEvotKGSQ04lAyCwWg6Enq95qhouF8YbKUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "8.14.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-8.14.2.tgz", - "integrity": "sha512-aWMoXZAXEre0/M9AYWOW33YyOJZ06i4vvsEpWBDWpHpWQEmsR/7cMMgld8Pp3wlEjIUclUAKTYmrZ61PFWU/og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-resolver": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-8.14.2.tgz", - "integrity": "sha512-pSyBsAvslaN0dx0pHdvECJEuFDDBJGAD6G8U4BVbIyj2OPk0Ox0HrZIj6csYxxoJERAgNO/q7yCPwa4j9NNFXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-8.14.2.tgz", - "integrity": "sha512-WUF7xf3YgXYIqjmBwLcVugYIrYL4WfXchgSo9rmbbnOcAArzsK+HKfzb4AniZAJ1unxcIQ0JnVlRmnCAKPjjLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-8.14.2.tgz", - "integrity": "sha512-MRY8MjBNOKGMDSkxAKueYAgVL43miO+lDcLCBBP+7cNXqHiUFMIZteONcGp3kJT0dWS04dN6lKAXvaNF0aWcng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/dict-ada": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.0.2.tgz", - "integrity": "sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-aws": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.3.tgz", - "integrity": "sha512-0C0RQ4EM29fH0tIYv+EgDQEum0QI6OrmjENC9u98pB8UcnYxGG/SqinuPxo+TgcEuInj0Q73MsBpJ1l5xUnrsw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-bash": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.1.3.tgz", - "integrity": "sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-companies": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.1.4.tgz", - "integrity": "sha512-y9e0amzEK36EiiKx3VAA+SHQJPpf2Qv5cCt5eTUSggpTkiFkCh6gRKQ97rVlrKh5GJrqinDwYIJtTsxuh2vy2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-cpp": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.1.15.tgz", - "integrity": "sha512-5X8SouN/qIUrBTcDEevnKU6G3cRSm3Vm7dQEcjHaptIWp+/2YMknIfYbnhKeR1G9V/sbQaY4CVsVAKEaehY+7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-cryptocurrencies": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.0.tgz", - "integrity": "sha512-Z4ARIw5+bvmShL+4ZrhDzGhnc9znaAGHOEMaB/GURdS/jdoreEDY34wdN0NtdLHDO5KO7GduZnZyqGdRoiSmYA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-csharp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.2.tgz", - "integrity": "sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-css": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.13.tgz", - "integrity": "sha512-WfOQkqlAJTo8eIQeztaH0N0P+iF5hsJVKFuhy4jmARPISy8Efcv8QXk2/IVbmjJH0/ZV7dKRdnY5JFVXuVz37g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-dart": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.0.3.tgz", - "integrity": "sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-data-science": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.1.tgz", - "integrity": "sha512-xeutkzK0eBe+LFXOFU2kJeAYO6IuFUc1g7iRLr7HeCmlC4rsdGclwGHh61KmttL3+YHQytYStxaRBdGAXWC8Lw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-django": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.0.tgz", - "integrity": "sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-docker": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.7.tgz", - "integrity": "sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-dotnet": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.3.tgz", - "integrity": "sha512-q8+b8YWYv+9Q+AbU3mH/RHE9aovhCuGtMuNSsx+YnTofEhVQkJR3vdrYjhOBg3epIiZVUS83VP0vxPLPa+UTug==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-elixir": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.3.tgz", - "integrity": "sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-en_us": { - "version": "4.3.23", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.3.23.tgz", - "integrity": "sha512-l0SoEQBsi3zDSl3OuL4/apBkxjuj4hLIg/oy6+gZ7LWh03rKdF6VNtSZNXWAmMY+pmb1cGA3ouleTiJIglbsIg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.4.tgz", - "integrity": "sha512-lvOiRjV/FG4pAGZL3PN2GCVHSTCE92cwhfLGGkOsQtxSmef6WCHfHwp9auafkBlX0yFQSKDfq6/TlpQbjbJBtQ==", - "dev": true, - "license": "CC BY-SA 4.0" - }, - "node_modules/@cspell/dict-en-gb": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb/-/dict-en-gb-1.1.33.tgz", - "integrity": "sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-filetypes": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.4.tgz", - "integrity": "sha512-IBi8eIVdykoGgIv5wQhOURi5lmCNJq0we6DvqKoPQJHthXbgsuO1qrHSiUVydMiQl/XvcnUWTMeAlVUlUClnVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fonts": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.0.tgz", - "integrity": "sha512-t9V4GeN/m517UZn63kZPUYP3OQg5f0OBLSd3Md5CU3eH1IFogSvTzHHnz4Wqqbv8NNRiBZ3HfdY/pqREZ6br3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fsharp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.0.1.tgz", - "integrity": "sha512-23xyPcD+j+NnqOjRHgW3IU7Li912SX9wmeefcY0QxukbAxJ/vAN4rBpjSwwYZeQPAn3fxdfdNZs03fg+UM+4yQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fullstack": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.0.tgz", - "integrity": "sha512-sIGQwU6G3rLTo+nx0GKyirR5dQSFeTIzFTOrURw51ISf+jKG9a3OmvsVtc2OANfvEAOLOC9Wfd8WYhmsO8KRDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-gaming-terms": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.0.5.tgz", - "integrity": "sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-git": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.0.tgz", - "integrity": "sha512-simGS/lIiXbEaqJu9E2VPoYW1OTC2xrwPPXNXFMa2uo/50av56qOuaxDrZ5eH1LidFXwoc8HROCHYeKoNrDLSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-golang": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.11.tgz", - "integrity": "sha512-BMFIDGh1HaFUe1cYBT1dotqyIQG2j3VkNntGQTBa/7i0aBnC5PBJDiAXnUeBHi0AVrz0hyAc7xtcK5KyKCEzwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-google": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.1.tgz", - "integrity": "sha512-dQr4M3n95uOhtloNSgB9tYYGXGGEGEykkFyRtfcp5pFuEecYUa0BSgtlGKx9RXVtJtKgR+yFT/a5uQSlt8WjqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-haskell": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.1.tgz", - "integrity": "sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-html": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.5.tgz", - "integrity": "sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-html-symbol-entities": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.0.tgz", - "integrity": "sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-java": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.7.tgz", - "integrity": "sha512-ejQ9iJXYIq7R09BScU2y5OUGrSqwcD+J5mHFOKbduuQ5s/Eh/duz45KOzykeMLI6KHPVxhBKpUPBWIsfewECpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-julia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.0.1.tgz", - "integrity": "sha512-4JsCLCRhhLMLiaHpmR7zHFjj1qOauzDI5ZzCNQS31TUMfsOo26jAKDfo0jljFAKgw5M2fEG7sKr8IlPpQAYrmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-k8s": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.6.tgz", - "integrity": "sha512-srhVDtwrd799uxMpsPOQqeDJY+gEocgZpoK06EFrb4GRYGhv7lXo9Fb+xQMyQytzOW9dw4DNOEck++nacDuymg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-latex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.0.tgz", - "integrity": "sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-lorem-ipsum": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.0.tgz", - "integrity": "sha512-1l3yjfNvMzZPibW8A7mQU4kTozwVZVw0AvFEdy+NcqtbxH+TvbSkNMqROOFWrkD2PjnKG0+Ea0tHI2Pi6Gchnw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-lua": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.3.tgz", - "integrity": "sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-makefile": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.0.tgz", - "integrity": "sha512-3W9tHPcSbJa6s0bcqWo6VisEDTSN5zOtDbnPabF7rbyjRpNo0uHXHRJQF8gAbFzoTzBBhgkTmrfSiuyQm7vBUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-monkeyc": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.6.tgz", - "integrity": "sha512-oO8ZDu/FtZ55aq9Mb67HtaCnsLn59xvhO/t2mLLTHAp667hJFxpp7bCtr2zOrR1NELzFXmKln/2lw/PvxMSvrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-node": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.1.tgz", - "integrity": "sha512-lax/jGz9h3Dv83v8LHa5G0bf6wm8YVRMzbjJPG/9rp7cAGPtdrga+XANFq+B7bY5+jiSA3zvj10LUFCFjnnCCg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-npm": { - "version": "5.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.0.18.tgz", - "integrity": "sha512-weMTyxWpzz19q4wv9n183BtFvdD5fCjtze+bFKpl+4rO/YlPhHL2cXLAeexJz/VDSBecwX4ybTZYoknd1h2J4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-php": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.0.8.tgz", - "integrity": "sha512-TBw3won4MCBQ2wdu7kvgOCR3dY2Tb+LJHgDUpuquy3WnzGiSDJ4AVelrZdE1xu7mjFJUr4q48aB21YT5uQqPZA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-powershell": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.5.tgz", - "integrity": "sha512-3JVyvMoDJesAATYGOxcUWPbQPUvpZmkinV3m8HL1w1RrjeMVXXuK7U1jhopSneBtLhkU+9HKFwgh9l9xL9mY2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.8.tgz", - "integrity": "sha512-Sup+tFS7cDV0fgpoKtUqEZ6+fA/H+XUgBiqQ/Fbs6vUE3WCjJHOIVsP+udHuyMH7iBfJ4UFYOYeORcY4EaKdMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-python": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.4.tgz", - "integrity": "sha512-sCtLBqMreb+8zRW2bXvFsfSnRUVU6IFm4mT6Dc4xbz0YajprbaPPh/kOUTw5IJRP8Uh+FFb7Xp2iH03CNWRq/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-data-science": "^2.0.1" - } - }, - "node_modules/@cspell/dict-r": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.0.1.tgz", - "integrity": "sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-ruby": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.2.tgz", - "integrity": "sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-rust": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.5.tgz", - "integrity": "sha512-DIvlPRDemjKQy8rCqftAgGNZxY5Bg+Ps7qAIJjxkSjmMETyDgl0KTVuaJPt7EK4jJt6uCZ4ILy96npsHDPwoXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-scala": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.3.tgz", - "integrity": "sha512-4yGb4AInT99rqprxVNT9TYb1YSpq58Owzq7zi3ZS5T0u899Y4VsxsBiOgHnQ/4W+ygi+sp+oqef8w8nABR2lkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-software-terms": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-4.0.10.tgz", - "integrity": "sha512-FwFwPnTlzyjtndCxUnaVHk7wYpWRC4EqY9/Q5q2pROKt1rQILRmutjIqzHLH6WX9sb/+wVNb7UKwKO32eflp4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-sql": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.1.5.tgz", - "integrity": "sha512-FmxanytHXss7GAWAXmgaxl3icTCW7YxlimyOSPNfm+njqeUDjw3kEv4mFNDDObBJv8Ec5AWCbUDkWIpkE3IpKg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-svelte": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.2.tgz", - "integrity": "sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-swift": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.1.tgz", - "integrity": "sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-terraform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.0.0.tgz", - "integrity": "sha512-Ak+vy4HP/bOgzf06BAMC30+ZvL9mzv21xLM2XtfnBLTDJGdxlk/nK0U6QT8VfFLqJ0ZZSpyOxGsUebWDCTr/zQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.1.6.tgz", - "integrity": "sha512-1beC6O4P/j23VuxX+i0+F7XqPVc3hhiAzGJHEKqnWf5cWAXQtg0xz3xQJ5MvYx2a7iLaSa+lu7+05vG9UHyu9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-vue": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.0.tgz", - "integrity": "sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dynamic-import": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-8.14.2.tgz", - "integrity": "sha512-5MbqtIligU7yPwHWU/5yFCgMvur4i1bRAF1Cy8y2dDtHsa204S/w/SaXs+51EFLp2eNbCiBisCBrwJFT7R1RxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-meta-resolve": "^4.1.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@cspell/filetypes": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-8.14.2.tgz", - "integrity": "sha512-ZevArA0mWeVTTqHicxCPZIAeCibpY3NwWK/x6d1Lgu7RPk/daoGAM546Q2SLChFu+r10tIH7pRG212A6Q9ihPA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/strong-weak-map": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-8.14.2.tgz", - "integrity": "sha512-7sRzJc392CQYNNrtdPEfOHJdRqsqf6nASCtbS5A9hL2UrdWQ4uN7r/D+Y1HpuizwY9eOkZvarcFfsYt5wE0Pug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@cspell/url": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-8.14.2.tgz", - "integrity": "sha512-YmWW+B/2XQcCynLpiAQF77Bitm5Cynw3/BICZkbdveKjJkUzEmXB+U2qWuwXOyU8xUYuwkP63YM8McnI567rUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0" - } - }, "node_modules/@deadlyjack/ajax": { "version": "1.2.6", "license": "MIT" @@ -3328,6 +2793,31 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/node": { "version": "20.11.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.13.tgz", @@ -3789,13 +3279,6 @@ "version": "1.1.1", "license": "MIT" }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true, - "license": "MIT" - }, "node_modules/array-union": { "version": "2.1.0", "license": "MIT", @@ -4327,35 +3810,6 @@ "node": ">=4" } }, - "node_modules/chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/chalk/node_modules/escape-string-regexp": { "version": "1.0.5", "license": "MIT", @@ -4441,46 +3895,6 @@ "node": ">=6" } }, - "node_modules/clear-module": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", - "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^2.0.0", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clear-module/node_modules/parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clear-module/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cli-cursor": { "version": "2.1.0", "license": "MIT", @@ -4570,23 +3984,6 @@ "node": ">= 6" } }, - "node_modules/comment-json": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", - "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/common-ancestor-path": { "version": "1.0.1", "license": "ISC" @@ -5272,408 +4669,123 @@ "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/cordova/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cordova/node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cordova/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/core-js": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", - "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.30.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "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, - "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/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cspell": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-8.14.2.tgz", - "integrity": "sha512-ii/W7fwO4chNQVYl1C/8k7RW8EXzLb69rvg08p8mSJx8B2UasVJ9tuJpTH2Spo1jX6N3H0dKPWUbd1fAmdAhPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-json-reporter": "8.14.2", - "@cspell/cspell-pipe": "8.14.2", - "@cspell/cspell-types": "8.14.2", - "@cspell/dynamic-import": "8.14.2", - "@cspell/url": "8.14.2", - "chalk": "^5.3.0", - "chalk-template": "^1.1.0", - "commander": "^12.1.0", - "cspell-dictionary": "8.14.2", - "cspell-gitignore": "8.14.2", - "cspell-glob": "8.14.2", - "cspell-io": "8.14.2", - "cspell-lib": "8.14.2", - "fast-glob": "^3.3.2", - "fast-json-stable-stringify": "^2.1.0", - "file-entry-cache": "^9.0.0", - "get-stdin": "^9.0.0", - "semver": "^7.6.3", - "strip-ansi": "^7.1.0" - }, - "bin": { - "cspell": "bin.mjs", - "cspell-esm": "bin.mjs" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" - } - }, - "node_modules/cspell-config-lib": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-8.14.2.tgz", - "integrity": "sha512-yHP1BdcH5dbjb8qiZr6+bxEnJ+rxTULQ00wBz3eBPWCghJywEAYYvMWoYuxVtPpndlkKYC1wJAHsyNkweQyepA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "8.14.2", - "comment-json": "^4.2.5", - "yaml": "^2.5.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell-dictionary": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-8.14.2.tgz", - "integrity": "sha512-gWuAvf6queGGUvGbfAxxUq55cZ0OevWPbjnCrSB0PpJ4tqdFd8dLcvVrIKzoE2sBXKPw2NDkmoEngs6iGavC0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "8.14.2", - "@cspell/cspell-types": "8.14.2", - "cspell-trie-lib": "8.14.2", - "fast-equals": "^5.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell-gitignore": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-8.14.2.tgz", - "integrity": "sha512-lrO/49NaKBpkR7vFxv4OOY+oHmsG5+gNQejrBBWD9Nv9vvjJtz/G36X/rcN6M6tFcQQMWwa01kf04nxz8Ejuhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "8.14.2", - "cspell-glob": "8.14.2", - "cspell-io": "8.14.2", - "find-up-simple": "^1.0.0" - }, - "bin": { - "cspell-gitignore": "bin.mjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell-glob": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-8.14.2.tgz", - "integrity": "sha512-9Q1Kgoo1ev3fKTpp9y5n8M4RLxd8B0f5o4y5FQe4dBU0j/bt+/YDrLZNWDm77JViV606XQ6fimG1FTTq6pT9/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "8.14.2", - "micromatch": "^4.0.7" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell-grammar": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-8.14.2.tgz", - "integrity": "sha512-eYwceVP80FGYVJenE42ALnvEKOXaXjq4yVbb1Ni1umO/9qamLWNCQ1RP6rRACy5e/cXviAbhrQ5Mtw6n+pyPEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "8.14.2", - "@cspell/cspell-types": "8.14.2" - }, - "bin": { - "cspell-grammar": "bin.mjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell-io": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-8.14.2.tgz", - "integrity": "sha512-uaKpHiY3DAgfdzgKMQml6U8F8o9udMuYxGqYa5FVfN7D5Ap7B2edQzSLTUYwxrFEn4skSfp6XY73+nzJvxzH4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-service-bus": "8.14.2", - "@cspell/url": "8.14.2" - }, - "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/cspell-lib": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-8.14.2.tgz", - "integrity": "sha512-d2oiIXHXnADmnhIuFLOdNE63L7OUfzgpLbYaqAWbkImCUDkevfGrOgnX8TJ03fUgZID4nvQ+3kgu/n2j4eLZjQ==", - "dev": true, - "license": "MIT", + "node_modules/cordova/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", "dependencies": { - "@cspell/cspell-bundled-dicts": "8.14.2", - "@cspell/cspell-pipe": "8.14.2", - "@cspell/cspell-resolver": "8.14.2", - "@cspell/cspell-types": "8.14.2", - "@cspell/dynamic-import": "8.14.2", - "@cspell/filetypes": "8.14.2", - "@cspell/strong-weak-map": "8.14.2", - "@cspell/url": "8.14.2", - "clear-module": "^4.1.2", - "comment-json": "^4.2.5", - "cspell-config-lib": "8.14.2", - "cspell-dictionary": "8.14.2", - "cspell-glob": "8.14.2", - "cspell-grammar": "8.14.2", - "cspell-io": "8.14.2", - "cspell-trie-lib": "8.14.2", - "env-paths": "^3.0.0", - "fast-equals": "^5.0.1", - "gensequence": "^7.0.0", - "import-fresh": "^3.3.0", - "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-uri": "^3.0.8", - "xdg-basedir": "^5.1.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "node_modules/cspell-lib/node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node_modules/cordova/node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-lib/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/cspell-lib/node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, + "node_modules/cordova/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/core-js": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.1.tgz", + "integrity": "sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==", + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/cspell-trie-lib": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-8.14.2.tgz", - "integrity": "sha512-rZMbaEBGoyy4/zxKECaMyVyGLbuUxYmZ5jlEgiA3xPtEdWwJ4iWRTo5G6dWbQsXoxPYdAXXZ0/q0GQ2y6Jt0kw==", + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-pipe": "8.14.2", - "@cspell/cspell-types": "8.14.2", - "gensequence": "^7.0.0" + "browserslist": "^4.23.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/cspell/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/core-js-pure": { + "version": "3.30.2", "dev": true, + "hasInstallScript": true, "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/cspell/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/core-util-is": { + "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": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/cspell/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, + "node_modules/cross-spawn": { + "version": "7.0.3", "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/cspell/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/cspell/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, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/css-loader": { @@ -6301,16 +5413,6 @@ "version": "3.1.3", "license": "MIT" }, - "node_modules/fast-equals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", - "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6367,19 +5469,6 @@ "node": ">=0.8.0" } }, - "node_modules/file-entry-cache": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/filesize": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.2.tgz", @@ -6543,40 +5632,6 @@ "node": ">=8" } }, - "node_modules/find-up-simple": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", - "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, "node_modules/foreground-child": { "version": "3.1.1", "license": "ISC", @@ -6728,16 +5783,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/gensequence": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-7.0.0.tgz", - "integrity": "sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -6771,19 +5816,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "license": "MIT", @@ -6854,22 +5886,6 @@ "node": "*" } }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -6975,16 +5991,6 @@ "node": ">=4" } }, - "node_modules/has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -7223,17 +6229,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "license": "MIT", @@ -7260,16 +6255,6 @@ "version": "2.0.4", "license": "ISC" }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/init-package-json": { "version": "5.0.0", "license": "ISC", @@ -7746,13 +6731,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, @@ -7847,16 +6825,6 @@ "version": "5.5.0", "license": "MIT" }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -8047,6 +7015,34 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-it-anchor": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", + "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it-github-alerts": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-github-alerts/-/markdown-it-github-alerts-0.3.0.tgz", + "integrity": "sha512-qyIuDyfdrVGHhY+E/44yMyNA3ZnayaT/KKT2VgkIz1nmrgiuPkdgPUh4YBZwgJ9VKEGJvGd82Ndrc4oGftrJWg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "markdown-it": "^14.0.0" + } + }, + "node_modules/markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==", + "license": "ISC" + }, "node_modules/md5-file": { "version": "5.0.0", "license": "MIT", @@ -9830,16 +8826,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -11073,20 +10059,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true, - "license": "MIT" - }, "node_modules/walk-up-path": { "version": "3.0.1", "license": "ISC" @@ -11486,19 +10458,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "17.7.2", "license": "MIT", diff --git a/package.json b/package.json index 5bb6cfbfa..edb72cae9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "com.foxdebug.acode", "displayName": "Acode", - "version": "1.10.5", + "version": "1.10.6", "description": "Acode is a code editor for android", "scripts": { "lang": "node ./utils/lang.js", @@ -107,4 +107,4 @@ "yargs": "^17.7.2" }, "browserslist": "cover 100%,not android < 5" -} +} \ No newline at end of file diff --git a/src/ace/commands.js b/src/ace/commands.js index cfb447270..3980110c8 100644 --- a/src/ace/commands.js +++ b/src/ace/commands.js @@ -1,3 +1,4 @@ +import prompt from "dialogs/prompt"; import fsOperation from "fileSystem"; import actions from "handlers/quickTools"; import keyBindings from "lib/keyBindings"; @@ -119,6 +120,19 @@ const commands = [ }, readOnly: true, }, + { + name: "openInAppBrowser", + description: "Open In-App Browser", + async exec() { + const url = await prompt("Enter url", "", "url", { + placeholder: "http://", + match: /^https?:\/\/.+/, + }); + if (url) { + acode.exec("open-inapp-browser", url); + } + }, + }, { name: "toggleFullscreen", description: "Toggle full screen mode", diff --git a/src/lang/ar-ye.json b/src/lang/ar-ye.json index 7698a8821..9166d7feb 100644 --- a/src/lang/ar-ye.json +++ b/src/lang/ar-ye.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/be-by.json b/src/lang/be-by.json index 4ff5d259e..3f15d31b8 100644 --- a/src/lang/be-by.json +++ b/src/lang/be-by.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/bn-bd.json b/src/lang/bn-bd.json index e0ad93c77..071a97fab 100644 --- a/src/lang/bn-bd.json +++ b/src/lang/bn-bd.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/cs-cz.json b/src/lang/cs-cz.json index c8df43032..45d461315 100644 --- a/src/lang/cs-cz.json +++ b/src/lang/cs-cz.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/de-de.json b/src/lang/de-de.json index 78e945752..4c3d22d59 100644 --- a/src/lang/de-de.json +++ b/src/lang/de-de.json @@ -387,5 +387,8 @@ "copy uri": "URI kopieren", "delete entries": "Sind sie sicher, das Sie {count} Einträge löschen wollen?", "deleting items": "Löschen von {count} Einträgen...", - "import project zip": "Projekt(-Zip) importieren" + "import project zip": "Projekt(-Zip) importieren", + "changelog": "Änderungsbericht", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index 6dcdedcf3..288181481 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -388,5 +388,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/es-sv.json b/src/lang/es-sv.json index 3642574ee..d76718ca2 100644 --- a/src/lang/es-sv.json +++ b/src/lang/es-sv.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/fr-fr.json b/src/lang/fr-fr.json index 12ea16b56..4c3de3f87 100644 --- a/src/lang/fr-fr.json +++ b/src/lang/fr-fr.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/hi-in.json b/src/lang/hi-in.json index 5c70d0a4d..1f9f55d62 100644 --- a/src/lang/hi-in.json +++ b/src/lang/hi-in.json @@ -388,5 +388,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/hu-hu.json b/src/lang/hu-hu.json index b087d65c6..71f044bee 100644 --- a/src/lang/hu-hu.json +++ b/src/lang/hu-hu.json @@ -387,5 +387,8 @@ "copy uri": "Uri másolása", "delete entries": "Biztosan töröl {count} elemet?", "deleting items": "{count} elem törlése…", - "import project zip": "Project(zip) importálása" + "import project zip": "Projekt importálása zip-ből", + "changelog": "Változáslista", + "notifications": "Értesítések", + "no_unread_notifications": "Nincsenek olvasatlan értesítések" } diff --git a/src/lang/id-id.json b/src/lang/id-id.json index e706eb6ed..b41eedeae 100644 --- a/src/lang/id-id.json +++ b/src/lang/id-id.json @@ -389,5 +389,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/ir-fa.json b/src/lang/ir-fa.json index 4a4a5a6c7..531413a5e 100644 --- a/src/lang/ir-fa.json +++ b/src/lang/ir-fa.json @@ -388,5 +388,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/it-it.json b/src/lang/it-it.json index 5365dc498..e73d8f05b 100644 --- a/src/lang/it-it.json +++ b/src/lang/it-it.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/ja-jp.json b/src/lang/ja-jp.json index 325841185..7f37d338e 100644 --- a/src/lang/ja-jp.json +++ b/src/lang/ja-jp.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/ko-kr.json b/src/lang/ko-kr.json index 9b12d2a67..8f6b5cf6e 100644 --- a/src/lang/ko-kr.json +++ b/src/lang/ko-kr.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/ml-in.json b/src/lang/ml-in.json index b4eb7fde3..b800a32b8 100644 --- a/src/lang/ml-in.json +++ b/src/lang/ml-in.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/mm-unicode.json b/src/lang/mm-unicode.json index 389f2f0e4..79f349a6f 100644 --- a/src/lang/mm-unicode.json +++ b/src/lang/mm-unicode.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/mm-zawgyi.json b/src/lang/mm-zawgyi.json index 0f313316f..28e219e86 100644 --- a/src/lang/mm-zawgyi.json +++ b/src/lang/mm-zawgyi.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/pl-pl.json b/src/lang/pl-pl.json index 7cc0c7e44..a4ae54a04 100644 --- a/src/lang/pl-pl.json +++ b/src/lang/pl-pl.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/pt-br.json b/src/lang/pt-br.json index d26b9a0e8..002a5d29e 100644 --- a/src/lang/pt-br.json +++ b/src/lang/pt-br.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/pu-in.json b/src/lang/pu-in.json index ef4d102c6..0e820ca2d 100644 --- a/src/lang/pu-in.json +++ b/src/lang/pu-in.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/ru-ru.json b/src/lang/ru-ru.json index 816dea8ec..1e9c7f684 100644 --- a/src/lang/ru-ru.json +++ b/src/lang/ru-ru.json @@ -388,5 +388,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/tl-ph.json b/src/lang/tl-ph.json index 03466c176..2e8b6f1ef 100644 --- a/src/lang/tl-ph.json +++ b/src/lang/tl-ph.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/tr-tr.json b/src/lang/tr-tr.json index ea58999be..c0bf553ff 100644 --- a/src/lang/tr-tr.json +++ b/src/lang/tr-tr.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/uk-ua.json b/src/lang/uk-ua.json index 53051d3e9..68fc10565 100644 --- a/src/lang/uk-ua.json +++ b/src/lang/uk-ua.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/uz-uz.json b/src/lang/uz-uz.json index 14d07bb18..60728f7c5 100644 --- a/src/lang/uz-uz.json +++ b/src/lang/uz-uz.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/vi-vn.json b/src/lang/vi-vn.json index 71bb5dfde..cc1a2559f 100644 --- a/src/lang/vi-vn.json +++ b/src/lang/vi-vn.json @@ -384,9 +384,12 @@ "newly_added": "Mới được thêm vào", "top_rated": "Đánh giá cao nhất", "rename not supported": "Đổi tên trên thư mục Termux không được hỗ trợ", - "compress": "Compress", - "copy uri": "Copy Uri", - "delete entries": "Are you sure you want to delete {count} items?", - "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "compress": "Nén lại", + "copy uri": "Sao chép Uri", + "delete entries": "Bạn có chắc muốn xoá {count} mục?", + "deleting items": "Đang xoá {count} mục...", + "import project zip": "Nhập Dự Án(zip)", + "changelog": "Nhật Ký Thay Đổi", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index c23a80cc2..da2107015 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/zh-hant.json b/src/lang/zh-hant.json index 93973ec24..006f2fb0f 100644 --- a/src/lang/zh-hant.json +++ b/src/lang/zh-hant.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index fdef46ae6..4de70f9b4 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -387,5 +387,8 @@ "copy uri": "Copy Uri", "delete entries": "Are you sure you want to delete {count} items?", "deleting items": "Deleting {count} items...", - "import project zip": "Import Project(zip)" + "import project zip": "Import Project(zip)", + "changelog": "Change Log", + "notifications": "Notifications", + "no_unread_notifications": "No unread notifications" } diff --git a/src/lib/acode.js b/src/lib/acode.js index deee5ff93..238a2c064 100644 --- a/src/lib/acode.js +++ b/src/lib/acode.js @@ -22,6 +22,7 @@ import commands from "lib/commands"; import EditorFile from "lib/editorFile"; import files from "lib/fileList"; import fonts from "lib/fonts"; +import NotificationManager from "lib/notificationManager"; import openFolder from "lib/openFolder"; import projects from "lib/projects"; import selectionMenu from "lib/selectionMenu"; @@ -36,6 +37,7 @@ import Color from "utils/color"; import encodings from "utils/encodings"; import helpers from "utils/helpers"; import KeyboardEvent from "utils/keyboardEvent"; +import constants from "./constants"; import { addMode, removeMode } from "ace/modelist"; import { addIntentHandler, removeIntentHandler } from "handlers/intent"; @@ -157,6 +159,77 @@ export default class Acode { } } + /** + * Installs an Acode plugin from registry + * @param {string} pluginId id of the plugin to install + * @param {string} installerPluginName Name of plugin attempting to install + * @returns {Promise} + */ + installPlugin(pluginId, installerPluginName) { + return new Promise(async (resolve, reject) => { + try { + const confirmation = await confirm( + strings["install"], + `Do you want to install plugin '${pluginId}'${installerPluginName ? ` requested by ${installerPluginName}` : ""}?`, + ); + + if (!confirmation) { + reject(new Error("User cancelled installation")); + return; + } + + const isPluginExists = await fsOperation( + Url.join(PLUGIN_DIR, pluginId), + ).exists(); + if (isPluginExists) { + reject(new Error("PLugin already installed")); + return; + } + + let purchaseToken = null; + + const pluginUrl = Url.join(constants.API_BASE, `plugin/${pluginId}`); + const remotePlugin = await fsOperation(pluginUrl) + .readFile("json") + .catch(() => { + reject(new Error("Failed to fetch plugin details")); + return null; + }); + + if (remotePlugin) { + if (Number.parseFloat(remotePlugin.price) > 0) { + try { + const [product] = await helpers.promisify(iap.getProducts, [ + remotePlugin.sku, + ]); + if (product) { + async function getPurchase(sku) { + const purchases = await helpers.promisify(iap.getPurchases); + const purchase = purchases.find((p) => + p.productIds.includes(sku), + ); + return purchase; + } + const purchase = await getPurchase(product.productId); + purchaseToken = purchase?.purchaseToken; + } + } catch (error) { + helpers.error(error); + reject(new Error("Failed to validate purchase")); + return; + } + } + } + + const { default: installPlugin } = await import("lib/installPlugin"); + await installPlugin(pluginId, remotePlugin.name, purchaseToken); + resolve(); + } catch (error) { + reject(error); + } + }); + } + get exitAppMessage() { const numFiles = editorManager.hasUnsavedFiles(); if (numFiles) { @@ -344,4 +417,29 @@ export default class Acode { url = await helpers.toInternalUri(url); return url; } + /** + * Push a notification + * @param {string} title Title of the notification + * @param {string} message Message body of the notification + * @param {Object} options Notification options + * @param {string} [options.icon] Icon for the notification, can be a URL or a base64 encoded image or icon class or svg string + * @param {boolean} [options.autoClose=true] Whether notification should auto close + * @param {Function} [options.action=null] Action callback when notification is clicked + * @param {('info'|'warning'|'error'|'success')} [options.type='info'] Type of notification + */ + pushNotification( + title, + message, + { icon, autoClose = true, action = null, type = "info" } = {}, + ) { + const nm = new NotificationManager(); + nm.pushNotification({ + title, + message, + icon, + autoClose, + action, + type, + }); + } } diff --git a/src/lib/commands.js b/src/lib/commands.js index 8c9080272..651b4b28f 100644 --- a/src/lib/commands.js +++ b/src/lib/commands.js @@ -13,6 +13,7 @@ import changeEncoding from "palettes/changeEncoding"; import changeMode from "palettes/changeMode"; import commandPalette from "palettes/commandPalette"; import findFile from "palettes/findFile"; +import browser from "plugins/browser"; import help from "settings/helpSettings"; import mainSettings from "settings/mainSettings"; import Url from "utils/Url"; @@ -236,7 +237,9 @@ export default { "resize-editor"() { editorManager.editor.resize(true); }, - + "open-inapp-browser"(url) { + browser.open(url); + }, run() { editorManager.activeFile[ appSettings.value.useCurrentFileForPreview ? "runFile" : "run" diff --git a/src/lib/main.js b/src/lib/main.js index 5d48caf4a..471f54734 100644 --- a/src/lib/main.js +++ b/src/lib/main.js @@ -50,6 +50,7 @@ import { setKeyBindings } from "ace/commands"; import { initModes } from "ace/modelist"; import { keydownState } from "handlers/keyboard"; import { initFileList } from "lib/fileList"; +import NotificationManager from "lib/notificationManager"; import { addedFolder } from "lib/openFolder"; import { getEncoding, initEncodings } from "utils/encodings"; import constants from "./constants"; @@ -369,34 +370,12 @@ async function loadApp() { }); //#endregion - window.log("info", "Started app and services..."); + const notificationManager = new NotificationManager(); + notificationManager.init(); - new EditorFile(); - - checkPluginsUpdate() - .then((updates) => { - if (!updates.length) return; - const $icon = ( - { - plugins(updates); - $icon.remove(); - }} - attr-action="" - style={{ fontSize: "1.2rem" }} - className="icon notifications" - > - ); + window.log("info", "Started app and its services..."); - if ($editMenuToggler.isConnected) { - $header.insertBefore($icon, $editMenuToggler); - } else if ($runBtn.isConnected) { - $header.insertBefore($icon, $runBtn); - } else { - $header.insertBefore($icon, $menuToggler); - } - }) - .catch(console.error); + new EditorFile(); //load plugins try { @@ -429,6 +408,58 @@ async function loadApp() { initFileList(); + checkPluginsUpdate() + .then((updates) => { + if (!updates.length) return; + acode.pushNotification( + "Plugin Updates", + `${updates.length} plugin${updates.length > 1 ? "s" : ""} ${updates.length > 1 ? "have" : "has"} new version${updates.length > 1 ? "s" : ""} available.`, + { + icon: "extension", + action: () => { + plugins(updates); + }, + }, + ); + }) + .catch(console.error); + + // Check for app updates + if (navigator.onLine) { + fetch("https://api.github.com/repos/deadlyjack/Acode/releases/latest") + .then((res) => res.json()) + .then((release) => { + // assuming version is in format v1.2.3 + const latestVersion = release.tag_name + .replace("v", "") + .split(".") + .map(Number); + const currentVersion = BuildInfo.version.split(".").map(Number); + + const hasUpdate = latestVersion.some( + (num, i) => num > currentVersion[i], + ); + + if (hasUpdate) { + acode.pushNotification( + "Update Available", + `Acode ${release.tag_name} is now available! Click here to checkout.`, + { + icon: "update", + type: "warning", + action: () => { + system.openInBrowser(release.html_url); + }, + }, + ); + } + }) + .catch((err) => { + window.log("error", "Failed to check for updates"); + window.log("error", err); + }); + } + /** * * @param {MouseEvent} e diff --git a/src/lib/notificationManager.js b/src/lib/notificationManager.js new file mode 100644 index 000000000..3d23fa5f3 --- /dev/null +++ b/src/lib/notificationManager.js @@ -0,0 +1,250 @@ +import sidebarApps from "sidebarApps"; + +// Singleton instance +let instance = null; + +export default class NotificationManager { + DEFAULT_ICON = ``; + MAX_NOTIFICATIONS = 20; + notifications = []; + REFRESH_INTERVAL = 60000; // 1 minute refresh interval + timeUpdateInterval = null; + + constructor() { + if (instance) { + return instance; + } + this.notifications = this.loadNotifications(); + instance = this; + } + + init() { + document.body.appendChild( +
, + ); + this.renderNotifications(); + this.startTimeUpdates(); + + sidebarApps + .get("notification") + ?.querySelector(".notifications-container") + .addEventListener("click", this.handleClick.bind(this)); + } + + startTimeUpdates() { + if (this.timeUpdateInterval) { + clearInterval(this.timeUpdateInterval); + } + + this.timeUpdateInterval = setInterval(() => { + this.updateNotificationTimes(); + }, this.REFRESH_INTERVAL); + } + + updateNotificationTimes() { + const container = sidebarApps + .get("notification") + ?.querySelector(".notifications-container"); + + if (!container) return; + + container.querySelectorAll(".notification-time").forEach((timeElement) => { + const notificationItem = timeElement.closest(".notification-item"); + const id = notificationItem?.dataset.id; + if (!id) return; + + const notification = this.notifications.find( + (n) => n.id === Number.parseInt(id), + ); + if (notification) { + timeElement.textContent = this.formatTime(notification.time); + } + }); + } + + loadNotifications() { + try { + const notifications = + JSON.parse(localStorage.getItem("notifications")) || []; + return notifications.map((n) => ({ + ...n, + time: new Date(n.time), + })); + } catch { + return []; + } + } + + saveNotifications() { + localStorage.setItem("notifications", JSON.stringify(this.notifications)); + } + + renderNotifications() { + const container = sidebarApps + .get("notification") + ?.querySelector(".notifications-container"); + if (!container) return; + + if (this.notifications.length === 0) { + container.innerHTML = `
${strings["no_unread_notifications"]}
`; + return; + } + + container.innerHTML = ""; + this.notifications.forEach((notification) => { + container.appendChild(this.createNotificationElement(notification)); + }); + } + + handleClick(e) { + const dismissButton = e.target.closest(".action-button"); + if (!dismissButton) return; + + e.stopPropagation(); + const notificationElement = dismissButton.closest(".notification-item"); + if (!notificationElement) return; + + const id = notificationElement.dataset.id; + if (id) { + const index = this.notifications.findIndex( + (n) => n.id === Number.parseInt(id), + ); + if (index > -1) { + notificationElement.remove(); + this.notifications.splice(index, 1); + this.saveNotifications(); + this.renderNotifications(); + } + } + } + + createNotificationElement(notification) { + const element = ( +
+ ); + element.innerHTML = ` +
+ ${this.parseIcon(notification.icon)} +
+
+
+ ${notification.title} + ${this.formatTime(notification.time)} +
+
${notification.message}
+
+
Dismiss
+
+
+ `; + if (notification.action) { + element.addEventListener("click", () => + notification.action(notification), + ); + } + return element; + } + + createToastNotification(notification) { + const element = ( +
+ ); + element.innerHTML = ` +
${this.parseIcon(notification.icon)}
+
+
+ ${notification.title} +
+
${notification.message}
+
+ ${notification.autoClose ? "" : ``} + `; + if (notification.action) { + element.addEventListener("click", () => + notification.action(notification), + ); + } + if (notification.autoClose) { + setTimeout(() => { + element.classList.add("hiding"); + setTimeout(() => element.remove(), 300); + }, 5000); + } + return element; + } + + addNotification(notification) { + this.notifications.unshift(notification); + + // Remove oldest if exceeding limit + if (this.notifications.length > this.MAX_NOTIFICATIONS) { + this.notifications.pop(); + } + + this.saveNotifications(); + + this.renderNotifications(); + + // show toast notification + document + .querySelector(".notification-toast-container") + ?.appendChild(this.createToastNotification(notification)); + } + + pushNotification({ + title, + message, + icon, + autoClose = true, + action = null, + type = "info", + }) { + const notification = { + id: Date.now(), + title, + message, + icon, + action, + autoClose, + type, + time: new Date(), + }; + this.addNotification(notification); + } + + parseIcon(icon) { + if (!icon) return this.DEFAULT_ICON; + if (icon.startsWith("`; + return ``; + } + + formatTime(date) { + const now = new Date(); + const diff = Math.floor((now - date) / 1000); + + if (diff < 60) return "Just now"; + if (diff < 3600) return `${Math.floor(diff / 60)}m`; + if (diff < 86400) return `${Math.floor(diff / 3600)}h`; + if (diff < 604800) return `${Math.floor(diff / 86400)}d`; + + return date.toLocaleDateString(); + } + + clearAll() { + this.notifications = []; + this.saveNotifications(); + this.renderNotifications(); + if (this.timeUpdateInterval) { + clearInterval(this.timeUpdateInterval); + this.timeUpdateInterval = null; + } + } +} diff --git a/src/lib/openFolder.js b/src/lib/openFolder.js index 7c04b3fc6..b207fc161 100644 --- a/src/lib/openFolder.js +++ b/src/lib/openFolder.js @@ -1,6 +1,7 @@ import collapsableList from "components/collapsableList"; import Sidebar from "components/sidebar"; import tile from "components/tile"; +import toast from "components/toast"; import alert from "dialogs/alert"; import confirm from "dialogs/confirm"; import prompt from "dialogs/prompt"; @@ -45,7 +46,7 @@ import appSettings from "./settings"; /**@type {Folder[]} */ export const addedFolder = []; - +const ACODE_PLUGIN_MANIFEST_FILE = "plugin.json"; /** * Open a folder in the sidebar * @param {string} _path @@ -269,11 +270,24 @@ async function handleContextmenu(type, url, name, $target) { const OPEN_FOLDER = ["open-folder", strings["open folder"], "folder"]; const INSERT_FILE = ["insert-file", strings["insert file"], "file_copy"]; const CLOSE_FOLDER = ["close", strings["close"], "folder-remove"]; + const INSTALL_PLUGIN = [ + "install-plugin", + strings["install as plugin"] || "Install as Plugin", + "extension", + ]; let options; if (helpers.isFile(type)) { options = [COPY, CUT, RENAME, REMOVE]; + if ( + url.toLowerCase().endsWith(".zip") && + (await fsOperation( + Url.dirname(url) + ACODE_PLUGIN_MANIFEST_FILE, + ).exists()) + ) { + options.push(INSTALL_PLUGIN); + } } else if (helpers.isDir(type)) { options = [ COPY, @@ -305,7 +319,7 @@ async function handleContextmenu(type, url, name, $target) { /** * @param {"dir"|"file"|"root"} type - * @param {"copy"|"cut"|"delete"|"rename"|"paste"|"new file"|"new folder"|"cancel"|"open-folder"} action + * @param {"copy"|"cut"|"delete"|"rename"|"paste"|"new file"|"new folder"|"cancel"|"open-folder"|"install-plugin"} action * @param {string} url target url * @param {HTMLElement} $target target element * @param {string} name Name of file or folder @@ -344,6 +358,25 @@ function execOperation(type, action, url, $target, name) { case "close": return remove(); + + case "install-plugin": + return installPlugin(); + } + + async function installPlugin() { + try { + const manifest = JSON.parse( + await fsOperation( + Url.dirname(url) + ACODE_PLUGIN_MANIFEST_FILE, + ).readFile("utf8"), + ); + const { default: installPlugin } = await import("lib/installPlugin"); + await installPlugin(url, manifest.name); + toast(strings["success"], 3000); + } catch (error) { + helpers.error(error); + console.error(error); + } } async function deleteFile() { diff --git a/src/pages/changelog/changelog.js b/src/pages/changelog/changelog.js new file mode 100644 index 000000000..fb5a21b85 --- /dev/null +++ b/src/pages/changelog/changelog.js @@ -0,0 +1,42 @@ +import "./style.scss"; +import Page from "components/page"; +import actionStack from "lib/actionStack"; +import markdownIt from "markdown-it"; +import markdownItTaskLists from "markdown-it-task-lists"; +import helpers from "utils/helpers"; + +export default async function Changelog() { + const CHANGELOG_URL = + "https://raw.githubusercontent.com/deadlyjack/Acode/main/CHANGELOG.md"; + const $page = Page(strings["changelog"]); + const $content =
; + + $content.innerHTML = '
Loading changelog...
'; + + $page.content = $content; + app.append($page); + + try { + const changeLog = await fetch(CHANGELOG_URL); + const changeLogText = await changeLog.text(); + + const cleanedText = changeLogText.replace(/^#\s*Change\s*Log\s*\n*/i, ""); + + const htmlContent = markdownIt({ html: true }) + .use(markdownItTaskLists) + .render(cleanedText); + + $content.innerHTML = htmlContent; + } catch (error) { + $content.innerHTML = '
Failed to load changelog
'; + } + + $page.onhide = function () { + actionStack.remove("changelog"); + }; + + actionStack.push({ + id: "changelog", + action: $page.hide, + }); +} diff --git a/src/pages/changelog/index.js b/src/pages/changelog/index.js new file mode 100644 index 000000000..10168e12a --- /dev/null +++ b/src/pages/changelog/index.js @@ -0,0 +1,8 @@ +function plugin({ id, installed }, onInstall, onUninstall) { + import(/* webpackChunkName: "changelog" */ "./changelog").then((res) => { + const Changelog = res.default; + Changelog(); + }); +} + +export default plugin; diff --git a/src/pages/changelog/style.scss b/src/pages/changelog/style.scss new file mode 100644 index 000000000..ae38bc3c2 --- /dev/null +++ b/src/pages/changelog/style.scss @@ -0,0 +1,21 @@ +#changelog { + max-width: 800px; + margin: auto; + overflow: auto; +} + +.loading { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + color: var(--primary-text-color); + font-size: 1.2em; + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0% { opacity: 0.6; } + 50% { opacity: 1; } + 100% { opacity: 0.6; } +} diff --git a/src/settings/mainSettings.js b/src/settings/mainSettings.js index 4f0d62be9..07c5924e3 100644 --- a/src/settings/mainSettings.js +++ b/src/settings/mainSettings.js @@ -6,6 +6,7 @@ import openFile from "lib/openFile"; import removeAds from "lib/removeAds"; import appSettings from "lib/settings"; import settings from "lib/settings"; +import Changelog from "pages/changelog/changelog"; import Donate from "pages/donate"; import plugins from "pages/plugins"; import themeSetting from "pages/themeSetting"; @@ -91,6 +92,11 @@ export default function mainSettings() { text: `${strings["edit"]} settings.json`, icon: "edit", }, + { + key: "changeLog", + text: `${strings["changelog"]}`, + icon: "update", + }, ]; if (IS_FREE_VERSION) { @@ -165,6 +171,10 @@ export default function mainSettings() { } break; + case "changeLog": + Changelog(); + break; + default: break; } diff --git a/src/sidebarApps/extensions/index.js b/src/sidebarApps/extensions/index.js index 1111e1e36..14e57d4be 100644 --- a/src/sidebarApps/extensions/index.js +++ b/src/sidebarApps/extensions/index.js @@ -368,7 +368,9 @@ async function uninstall(id) { state.delete(state.storeUrl), ]); acode.unmountPlugin(id); - if (!IS_FREE_VERSION && (await window.iad?.isLoaded())) { + + // Show Ad If Its Free Version, interstitial Ad(iad) is loaded. + if (IS_FREE_VERSION && (await window.iad?.isLoaded())) { window.iad.show(); } } catch (err) { diff --git a/src/sidebarApps/index.js b/src/sidebarApps/index.js index 8990ad0ce..ae8fb56ec 100644 --- a/src/sidebarApps/index.js +++ b/src/sidebarApps/index.js @@ -73,6 +73,7 @@ async function loadApps() { add(...(await import("./files")).default); add(...(await import("./searchInFiles")).default); add(...(await import("./extensions")).default); + add(...(await import("./notification")).default); } /** diff --git a/src/sidebarApps/notification/index.js b/src/sidebarApps/notification/index.js new file mode 100644 index 000000000..ea72b599e --- /dev/null +++ b/src/sidebarApps/notification/index.js @@ -0,0 +1,60 @@ +import NotificationManager from "lib/notificationManager"; +import "./style.scss"; +import Sidebar from "components/sidebar"; + +/**@type {HTMLElement} */ +let container; +/** @type {HTMLElement} */ +let $notificationContainer = null; + +let notificationManager; + +export default [ + "notifications", // icon + "notification", // id + strings["notifications"], // title + initApp, // init function + false, // prepend + onSelected, // onSelected function +]; + +const $header = ( +
+
+ {strings["notifications"]} + notificationManager.clearAll()} + > +
+
+); + +/** + * Initialize files app + * @param {HTMLElement} el + */ +function initApp(el) { + container = el; + container.classList.add("notifications"); + container.content = $header; + $notificationContainer = ( +
+ ); + container.append($notificationContainer); + + notificationManager = new NotificationManager(); + + Sidebar.on("show", onSelected); +} + +/** + * On selected handler for files app + * @param {HTMLElement} el + */ +function onSelected(el) { + const $scrollableLists = container.getAll(":scope .scroll[data-scroll-top]"); + $scrollableLists.forEach(($el) => { + $el.scrollTop = $el.dataset.scrollTop; + }); +} diff --git a/src/sidebarApps/notification/style.scss b/src/sidebarApps/notification/style.scss new file mode 100644 index 000000000..2a13ef239 --- /dev/null +++ b/src/sidebarApps/notification/style.scss @@ -0,0 +1,142 @@ +.container.notifications{ + display: flex; + flex-direction: column; + + .header{ + padding: 10px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid var(--border-color); + + .title { + font-size: 20px; + font-weight: 600; + color: var(--primary-text-color); + display: flex; + align-items: center; + gap: 4px; + } + + .clear-all { + font-size: 12px; + color: var(--secondary-text-color); + background: none; + padding: 5px; + } + } + + .notifications-container { + flex: 1; + overflow-y: auto; + padding: 12px; + display: flex; + flex-direction: column; + gap: 8px; + + .empty-state { + text-align: center; + color: var(--secondary-text-color); + padding: 20px; + font-size: 14px; + } + .notification-item { + padding: 10px 12px; + border-radius: 6px; + background: var(--popup-background-color); + display: flex; + gap: 10px; + align-items: flex-start; + animation: slideIn 0.3s ease-out; + border: 1px solid var(--popup-border-color); + transition: all 0.2s ease; + + &:hover { + background: rgba($color: #000000, $alpha: 0.2); + border-color: var(--popup-border-color); + } + .notification-icon { + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: var(--primary-text-color); + } + .notification-content { + flex: 1; + min-width: 0; + + .notification-title { + font-size: 13px; + font-weight: 500; + margin-bottom: 4px; + white-space: nowrap; + overflow: hidden; + word-wrap: break-word; + color: var(--primary-text-color); + display: flex; + justify-content: space-between; + align-items: center; + + .notification-time { + font-size: 11px; + color: var(--secondary-text-color); + } + } + .notification-message { + font-size: 12px; + color: var(--secondary-text-color); + line-height: 1.4; + } + .notification-actions { + margin-top: 8px; + display: flex; + justify-content: flex-end; + + .action-button { + font-size: 11px; + padding: 6px 12px; + border-radius: 4px; + background: transparent; + color: var(--secondary-text-color); + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid var(--border-color); + display: flex; + align-items: center; + gap: 4px; + + &:hover { + background: rgba($color: var(--border-color), $alpha: 0.6); + color: var(--primary-text-color); + border-color: var(--border-color); + } + &:active { + transform: translateY(1px); + } + &::before { + content: '×'; + font-size: 14px; + line-height: 1; + opacity: 0.8; + } + } + } + } + } + } +} + + +@keyframes slideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} diff --git a/src/styles/main.scss b/src/styles/main.scss index ac193c466..1884d5160 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -710,4 +710,122 @@ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-results-button, input[type="search"]::-webkit-search-results-decoration { -webkit-appearance: none; -} \ No newline at end of file +} + +.notification-toast-container { + position: absolute; + bottom: 20px; + right: 20px; + display: flex; + flex-direction: column; + gap: 8px; + z-index: 1000; + + .notification-toast { + padding: 12px; + border-radius: 6px; + background: var(--secondary-color); + min-width: 300px; + max-width: 400px; + display: flex; + gap: 12px; + align-items: flex-start; + box-shadow: 0 4px 12px var(--box-shadow-color); + animation: toastSlideIn 0.3s ease-out; + transition: all 0.3s ease; + border: 1px solid var(--border-color); + word-break: break-word; + white-space: normal; + + &.hiding { + transform: translateX(120%); + opacity: 0; + } + + .close-icon { + cursor: pointer; + font-size: 14px; + color: var(--secondary-text-color); + margin-left: auto; + + &:hover { + color: var(--button-background-color); + } + } + + .notification-icon { + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + color: var(--primary-text-color); + } + + .notification-content { + flex: 1; + min-width: 0; + + .notification-title { + font-size: 13px; + font-weight: 500; + margin-bottom: 4px; + color: var(--primary-text-color); + display: flex; + justify-content: space-between; + align-items: center; + } + + .notification-message { + font-size: 12px; + color: var(--secondary-text-color); + line-height: 1.4; + overflow-wrap: break-word; + hyphens: auto; + } + } + + &.success { + .notification-icon { + color: #48c158; + } + } + + &.warning { + .notification-icon { + color: var(--danger-text-color); + } + } + + &.error { + .notification-icon { + color: var(--error-text-color); + } + } + + &.info { + .notification-icon { + color: var(--primary-text-color); + } + } + } + + @media (max-width: 768px) { + .notification-toast { + min-width: auto; + max-width: calc(100vw - 40px); + } + } +} + +@keyframes toastSlideIn { + from { + transform: translateX(120%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} diff --git a/src/styles/markdown.scss b/src/styles/markdown.scss index 0a258716c..8011a1261 100644 --- a/src/styles/markdown.scss +++ b/src/styles/markdown.scss @@ -390,16 +390,47 @@ color: var(--color-caution); } .task-list-item { - list-style-type: none; - label { - font-weight: 400; + list-style-type: none; + + label { + font-weight: 400; + } + + &.enabled label { + cursor: pointer; + } + + &+.task-list-item { + margin-top: 0.25rem; + } + + .handle { + display: none; + } + + &-checkbox { + margin: 0 0.2em 0.25em -1.4em; + vertical-align: middle; + border-radius: 4px; + cursor: pointer; + } } - &+.task-list-item { - margin-top: 0.25rem; + + + ul:dir(rtl) .task-list-item-checkbox, + ol:dir(rtl) .task-list-item-checkbox { + margin: 0 -1.6em 0.25em 0.2em; + } + + .contains-task-list { + + &:hover .task-list-item-convert-container, + &:focus-within .task-list-item-convert-container { + display: block; + width: auto; + height: 24px; + overflow: visible; + clip: auto; + } } - } - ul:dir(rtl) .task-list-item-checkbox, - ol:dir(rtl) .task-list-item-checkbox { - margin: 0 -1.6em 0.25em 0.2em; - } }