From c282c3eda206409de192262590310ac0ca4a3dd4 Mon Sep 17 00:00:00 2001 From: "Kenneth G. Franqueiro" Date: Fri, 14 Jul 2023 17:00:07 -0400 Subject: [PATCH] Upgrade to Electron 25.3 + Forge 6.2 --- .eslintrc.js | 19 + .gitignore | 17 +- .jscsrc | 69 - .jshintrc | 72 - .prettierrc.json | 3 + Gruntfile.js | 90 - README.md | 39 +- bin/run | 35 - bin/run.cmd | 1 - forge.config.js | 25 + package-lock.json | 6800 +++++++++++++++++++++ package.json | 54 +- src/app/archive.js | 28 - src/app/dialogs.js | 350 +- src/app/grid/article.js | 181 +- src/app/grid/feed.js | 179 +- src/app/main.js | 177 +- src/app/nls/main.js | 88 +- src/app/opml/import.js | 60 +- src/app/refresh.js | 74 +- src/app/resize.js | 80 +- src/app/retrieveFeed.js | 204 +- src/app/store/FsMemory.js | 110 +- src/app/store/article.js | 107 +- src/app/store/feed.js | 164 +- src/app/store/util.js | 174 +- src/app/util.js | 140 +- src/app/widget/articlePane.js | 242 +- src/app/widget/form/Add.js | 52 +- src/app/widget/form/Feed.js | 103 +- src/app/widget/form/Folder.js | 18 +- src/app/widget/form/Preferences.js | 22 +- src/app/widget/form/Search.js | 36 +- src/app/widget/form/_Base.js | 153 +- src/app/widget/form/_Confirm.js | 27 +- src/app/widget/form/_FeedBase.js | 87 +- src/app/widget/form/_ParentFolderMixin.js | 68 +- src/app/widget/form/modal.js | 281 +- src/browser/archive.js | 111 +- src/browser/main.js | 119 +- src/browser/menu.js | 259 +- src/browser/preload-handlers.js | 60 + src/browser/preload.js | 18 + src/common/userConfig.js | 125 +- src/index.html | 44 +- src/package.json | 8 - src/resources/button.styl | 20 - src/resources/grid.styl | 78 - src/resources/main.styl | 55 - src/resources/widget/ArticlePane.styl | 40 - src/resources/widget/Form.styl | 115 - src/scss/button.scss | 20 + src/scss/grid.scss | 79 + src/scss/main.scss | 55 + src/scss/widget/ArticlePane.scss | 40 + src/scss/widget/Form.scss | 115 + tasks/electron-download.js | 36 - tasks/electron-packager.js | 10 - 58 files changed, 9209 insertions(+), 2627 deletions(-) create mode 100644 .eslintrc.js delete mode 100644 .jscsrc delete mode 100644 .jshintrc create mode 100644 .prettierrc.json delete mode 100644 Gruntfile.js delete mode 100755 bin/run delete mode 100644 bin/run.cmd create mode 100644 forge.config.js create mode 100644 package-lock.json delete mode 100644 src/app/archive.js create mode 100644 src/browser/preload-handlers.js create mode 100644 src/browser/preload.js delete mode 100644 src/package.json delete mode 100644 src/resources/button.styl delete mode 100644 src/resources/grid.styl delete mode 100644 src/resources/main.styl delete mode 100644 src/resources/widget/ArticlePane.styl delete mode 100644 src/resources/widget/Form.styl create mode 100644 src/scss/button.scss create mode 100644 src/scss/grid.scss create mode 100644 src/scss/main.scss create mode 100644 src/scss/widget/ArticlePane.scss create mode 100644 src/scss/widget/Form.scss delete mode 100644 tasks/electron-download.js delete mode 100644 tasks/electron-packager.js diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..dac33da --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,19 @@ +module.exports = { + env: { + browser: true, + es2021: true, + node: true, + }, + extends: ["eslint:recommended", "prettier"], + globals: { + define: "readonly", + electronApi: "readonly", + }, + parserOptions: { + ecmaVersion: "latest", + }, + plugins: ["prettier"], + rules: { + "prettier/prettier": "error", + }, +}; diff --git a/.gitignore b/.gitignore index 7f43727..5265d7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -dist -electron -node_modules -src/dojo -src/dijit -src/dgrid -src/dstore -src/font-awesome -src/resources/**/*.css +node_modules/ +out/ +src/css/ +src/dojo/ +src/dijit/ +src/dgrid/ +src/dstore/ +src/font-awesome/ diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index d965461..0000000 --- a/.jscsrc +++ /dev/null @@ -1,69 +0,0 @@ -{ - "requireCurlyBraces": [ - "if", "else", "for", "while", "do", "try", - "catch" - ], - "requireSpaceAfterKeywords": [ - "if", "else", "for", "while", "do", "switch", - "return", "try", "catch" - ], - "requireSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "requireSpacesInAnonymousFunctionExpression": { - "allExcept": [ "shorthand" ], - "beforeOpeningRoundBrace": true, - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInNamedFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "requireSpacesInFunctionDeclaration": { - "beforeOpeningCurlyBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "disallowMultipleVarDecl": true, - "requireBlocksOnNewline": true, - "disallowEmptyBlocks": true, - "requireSpacesInsideObjectBrackets": "allButNested", - "requireSpacesInsideArrayBrackets": "allButNested", - "disallowQuotedKeysInObjects": "allButReserved", - "disallowSpaceAfterObjectKeys": true, - "requireCommaBeforeLineBreak": true, - "requireOperatorBeforeLineBreak": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceAfterBinaryOperators": true, - "disallowImplicitTypeConversion": [ - "binary" - ], - "requireCamelCaseOrUpperCaseIdentifiers": true, - "disallowKeywords": [ - "with" - ], - "disallowMultipleLineStrings": true, - "disallowMultipleLineBreaks": true, - "validateQuoteMarks": { - "mark": "'", - "escape": true - }, - "validateIndentation": "\t", - "disallowMixedSpacesAndTabs": "smart", - "disallowTrailingWhitespace": true, - "disallowTrailingComma": true, - "requireKeywordsOnNewLine": [ - "else" - ], - "requireLineFeedAtFileEnd": true, - "maximumLineLength": 120, - "requireCapitalizedConstructors": true, - "requireDotNotation": true, - "disallowYodaConditions": true, - "requireSpaceAfterLineComment": true -} diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 36c944f..0000000 --- a/.jshintrc +++ /dev/null @@ -1,72 +0,0 @@ -{ - "asi": false, - "bitwise": false, - "boss": false, - "browser": true, - "camelcase": true, - "couch": false, - "curly": true, - "debug": false, - "devel": true, - "dojo": false, - "eqeqeq": true, - "eqnull": true, - "esversion": 6, - "evil": false, - "expr": true, - "forin": false, - "funcscope": true, - "gcl": false, - "globalstrict": false, - "immed": true, - "iterator": false, - "jquery": false, - "lastsemic": false, - "latedef": false, - "laxbreak": true, - "laxcomma": false, - "loopfunc": true, - "mootools": false, - "moz": false, - "multistr": false, - "newcap": true, - "noarg": true, - "node": true, - "noempty": false, - "nonew": true, - "nonstandard": false, - "nomen": false, - "onecase": false, - "onevar": false, - "passfail": false, - "phantom": false, - "plusplus": false, - "proto": false, - "prototypejs": false, - "regexdash": true, - "regexp": false, - "rhino": false, - "scripturl": true, - "shadow": false, - "shelljs": false, - "smarttabs": true, - "strict": false, - "sub": false, - "supernew": false, - "trailing": true, - "undef": true, - "unused": true, - "validthis": true, - "withstmt": false, - "white": true, - "worker": false, - "wsh": false, - "yui": false, - - "maxlen": 120, - "indent": 4, - "maxerr": 250, - "predef": [ "require", "define" ], - "quotmark": "single", - "maxcomplexity": 10 -} diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..de753c5 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "printWidth": 100 +} diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 970fe91..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,90 +0,0 @@ -module.exports = function (grunt) { - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-stylus'); - grunt.loadNpmTasks('grunt-contrib-watch'); - - grunt.loadTasks('tasks'); - - var packageConfig = grunt.file.readJSON('package.json'); - - grunt.initConfig({ - appName: 'Electern', - appVersion: packageConfig.version, - electronVersion: '1.0.2', - - 'electron-download': { - options: { - out: 'electron', - version: '<%= electronVersion %>' - } - }, - - 'electron-packager': { - options: { - name: '<%= appName %>', - dir: 'src', - out: 'dist', - asar: true, - prune: true, - version: '<%= electronVersion %>' - }, - darwin: { - options: { - arch: 'x64', - platform: 'darwin' - } - }, - win32: { - options: { - arch: 'ia32', - platform: 'win32' - } - }, - release: { - options: { - arch: 'ia32,x64', - platform: 'darwin,linux,win32' - } - } - }, - - clean: { - css: { - src: [ 'src/resources/**/*.css' ] - }, - electron: { - src: [ 'electron' ] - }, - release: { - src: [ 'dist' ] - } - }, - - stylus: { - options: { - atBegin: true, - compress: true, - 'resolve url': true - }, - - compile: { - files: { - 'src/resources/main.css': 'src/resources/main.styl' - } - } - }, - - watch: { - stylus: { - files: [ 'src/resources/**/*.styl' ], - tasks: [ 'stylus' ] - } - } - }); - - grunt.registerTask('default', [ 'stylus', 'watch' ]); - grunt.registerTask('dev', [ 'electron-download', 'stylus' ]); - grunt.registerTask('release', [ 'stylus', 'clean:release', 'electron-packager:release' ]); - grunt.registerTask('release-darwin', [ 'stylus', 'clean:release', 'electron-packager:darwin' ]); - grunt.registerTask('release-win32', [ 'stylus', 'clean:release', 'electron-packager:win32' ]); -}; diff --git a/README.md b/README.md index e40be21..760147c 100644 --- a/README.md +++ b/README.md @@ -4,44 +4,39 @@ Electern is an Atom/RSS feed reader built using Electron and dgrid. # Features -* Organize feeds in nested folders -* Import feeds from OPML (export not supported at this time) -* Pin articles to store them indefinitely -* Download individual articles as complete web pages to read offline (using icon in top right) -* RegExp search within article titles and content -* Configure how many articles to keep, how often to update, and whether to display images - * Defaults can be configured globally (via Preferences), then overridden per-feed -* Supports portable mode via `--portable` command-line flag - * On Mac OS X, you can run `open Electern.app --args --portable`; user data will be saved under the +- Organize feeds in nested folders +- Import feeds from OPML (export not supported at this time) +- Pin articles to store them indefinitely +- Download individual articles as complete web pages to read offline (using icon in top right) +- RegExp search within article titles and content +- Configure how many articles to keep, how often to update, and whether to display images + - Defaults can be configured globally (via Preferences), then overridden per-feed +- Zip distributions support portable mode via `--portable` command-line flag + - On Mac OS X, you can run `open Electern.app --args --portable`; user data will be saved under the `Contents/MacOS` folder within the app. # Build Instructions ## Requirements -You will need `bower` and `grunt-cli` installed globally (i.e. `npm i -g bower grunt-cli`). +You will need `bower` installed globally (i.e. `npm i -g bower`). ## Development 1. Clone this repository -1. `npm install` (which will in turn run `bower install`, then `npm install` inside of `src`) -1. `grunt dev` +1. `npm i` (which will in turn run `bower install`) +1. `npm start` +1. If you will be editing SCSS, also run `npm run scss:watch` ## Release -Run `grunt release` +It is possible to build for all platforms from OS X. -# Usage +`brew install fakeroot dpkg wine-stable` to install prequisites -## Running the Application +`npm run make-all` to build for all platforms under `out` subfolder -### Development - -Run `bin/run` (or `bin\run.cmd` on Windows). - -### Release - -Run the application for the respective platform under `dist`. +On other platforms, `npm run make` will build for the current platform only. ## License diff --git a/bin/run b/bin/run deleted file mode 100755 index bff0a08..0000000 --- a/bin/run +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var spawn = require('child_process').spawn; - -var outputDir = 'electron'; -var name = 'Electron'; -var cwd = path.resolve(__dirname, '..'); - -// Linux -var cmd = path.join(cwd, outputDir, name.toLowerCase()); - -if (process.platform === 'darwin') { - cmd = path.join(cwd, outputDir, name + '.app', 'Contents', 'MacOS', name); -} - -if (process.platform === 'win32') { - cmd = path.join(cwd, outputDir, name.toLowerCase() + '.exe'); -} - -var env = Object.create(process.env); -env.ELECTRON_APP_DEBUG = 1; -var child = spawn(cmd, [ 'src' ], { - cwd: cwd, - env: env -}); -child.stdout.on('data', function (data) { - console.log(data.toString()); -}); -child.stderr.on('data', function (data) { - console.error(data.toString()); -}); -child.on('close', function (code) { - process.exit(code); -}); diff --git a/bin/run.cmd b/bin/run.cmd deleted file mode 100644 index 9505db6..0000000 --- a/bin/run.cmd +++ /dev/null @@ -1 +0,0 @@ -node "%~dp0\run" %* diff --git a/forge.config.js b/forge.config.js new file mode 100644 index 0000000..cb72c75 --- /dev/null +++ b/forge.config.js @@ -0,0 +1,25 @@ +module.exports = { + packagerConfig: { + asar: true, + }, + rebuildConfig: {}, + makers: [ + { + name: "@electron-forge/maker-zip", + platforms: ["win32", "linux"], + }, + { + name: "@electron-forge/maker-dmg", + }, + { + name: "@electron-forge/maker-deb", + config: {}, + }, + ], + plugins: [ + { + name: "@electron-forge/plugin-auto-unpack-natives", + config: {}, + }, + ], +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7185313 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6800 @@ +{ + "name": "electern", + "version": "0.2.0-rc.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "electern", + "version": "0.2.0-rc.1", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "file-url": "~1.1", + "sanitize-html": "~1.27.5" + }, + "devDependencies": { + "@electron-forge/cli": "^6.2.1", + "@electron-forge/maker-deb": "^6.2.1", + "@electron-forge/maker-dmg": "^6.2.1", + "@electron-forge/maker-zip": "^6.2.1", + "@electron-forge/plugin-auto-unpack-natives": "^6.2.1", + "cross-env": "^7.0.3", + "electron": "^25.3.0", + "eslint": "^8.44.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.8.8", + "sass": "^1.63.6" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@electron-forge/cli": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.2.1.tgz", + "integrity": "sha512-AyCJ1m7LBgttgUTS3kDwiBLhPHJ+6mFwoMSqu847EJ4Fe1DJ1Hi6gnMsSga7Mv4KsF7iA23Ss1fo+3TGZnvrWw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@electron-forge/core": "6.2.1", + "@electron-forge/shared-types": "6.2.1", + "@electron/get": "^2.0.0", + "chalk": "^4.0.0", + "commander": "^4.1.1", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^5.0.3", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.2.1.tgz", + "integrity": "sha512-udjU8r9dzuV/dPMPxONmkWYoqM0uY6ezpdjTLgO9aNdWTbBeBLIOMVT0jdx7GBoTuPu6ul/VhDEFNUaojEOrVA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@electron-forge/core-utils": "6.2.1", + "@electron-forge/maker-base": "6.2.1", + "@electron-forge/plugin-base": "6.2.1", + "@electron-forge/publisher-base": "6.2.1", + "@electron-forge/shared-types": "6.2.1", + "@electron-forge/template-base": "6.2.1", + "@electron-forge/template-vite": "6.2.1", + "@electron-forge/template-webpack": "6.2.1", + "@electron-forge/template-webpack-typescript": "6.2.1", + "@electron/get": "^2.0.0", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "electron-packager": "^17.1.1", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "listr2": "^5.0.3", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "rechoir": "^0.8.0", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core-utils": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.2.1.tgz", + "integrity": "sha512-mJUpy8mZ7/l1BddReFrNZyM5iNEuYwjpeIqZ2E0E/hQPH26QreAV3rPfTj7WhA3V69ftmn++QRt82pNZFhHVEg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "semver": "^7.2.1", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/maker-base": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.2.1.tgz", + "integrity": "sha512-LnvGtTJ/RNojKdUKktYEcbLqPggXdMBs1uscQRgXkI3XnVGdEi+/j5+Eg5ka4d6FnsaUkz//U5yhPtNFhDbNSw==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/maker-deb": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.2.1.tgz", + "integrity": "sha512-y4WeBCGOeu1z5yBHPigzYcVPZAwbaJB60wXZ1VQpuKM5n09nONTq2TFhoJDHys3t9aHsBaX7G6Drv0XPUWQExQ==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "6.2.1", + "@electron-forge/shared-types": "6.2.1" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.0.0" + } + }, + "node_modules/@electron-forge/maker-dmg": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-dmg/-/maker-dmg-6.2.1.tgz", + "integrity": "sha512-Cqy7zFpgqm5pL/2LdRnoSePQTz9DtpVd5YQwSTPi4hnE1EHir77dplg0xkkx876w9YNmusE7sT+xoT3xr8XB/Q==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "6.2.1", + "@electron-forge/shared-types": "6.2.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-dmg": "^4.0.0" + } + }, + "node_modules/@electron-forge/maker-zip": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.2.1.tgz", + "integrity": "sha512-EgKArMT3Njn9/NZ7g2gGrhl8Y3F84Mm9b9Yt5WOziQaUAWvywFdijhUn4Oq631f3wU93xNq/CZbKvYWAK0NjnA==", + "dev": true, + "dependencies": { + "@electron-forge/maker-base": "6.2.1", + "@electron-forge/shared-types": "6.2.1", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/plugin-auto-unpack-natives": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-6.2.1.tgz", + "integrity": "sha512-VLarvnGrA3hX7EWgedp9g+MWGWhJ0A07apkJ28pbrXgegMoLQL5IzSJKIkVMu43AFvc+pMDNSGP7MX9Xh6yoLw==", + "dev": true, + "dependencies": { + "@electron-forge/plugin-base": "6.2.1", + "@electron-forge/shared-types": "6.2.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/plugin-base": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.2.1.tgz", + "integrity": "sha512-8mVbFgTlxQKDZ7jzeHyWrzOSiv/DpE29flPLgpyeFuz/zbC7oLNdxBCYo7WptQgI+HArphqehKUBf1UOkXmRPg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/publisher-base": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.2.1.tgz", + "integrity": "sha512-clrrEPsamoe4543smfyZUBp2IRSZ4EEhdj/bm0zmODS2qs/V1cCEf7y8P29huxMskT5bXDxSzothG72or3b2WQ==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/shared-types": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.2.1.tgz", + "integrity": "sha512-kLazG5XUAqb3Duyhq7XyGluINRwCQRaIiuvHwlvnZYYu6NZQTz9xUm6tQ9v05EtFblUx2iRjY67DJRZSt3dzTQ==", + "dev": true, + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.1", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-base": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.2.1.tgz", + "integrity": "sha512-hSMaefJRptpszPsZLvEfHV22KO6/XK0kJ6Lota1x3xQEFQs4IpCwUv446JE5hde+5Fukw5vZawbK2m937Te24Q==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-vite": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.2.1.tgz", + "integrity": "sha512-t05p8ZWtkixjuUFJpaupq2t+ap8vjPjULO2knKC12TqWTxo53M8lKwx0f7h0zvgyqWdtEGQr8KiVfeFS0Lh3jA==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "@electron-forge/template-base": "6.2.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-webpack": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.2.1.tgz", + "integrity": "sha512-u2/Cm6HjCah07larN1npHDG1dhDZMyqdDnPDh0iQNv+BEV6kCMSHX/8R9Uc7uIpkRVj+uCfcYBnkoKHKbUgKcQ==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "@electron-forge/template-base": "6.2.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-webpack-typescript": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.2.1.tgz", + "integrity": "sha512-8dXu54OsvfeBVGFyHfzVaBlxH+dPFxgLKu+/gsip82OEmLghXWyfvwhpXBw3rhxqG8V2/nbxDYUghSJackWZYA==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.2.1", + "@electron-forge/template-base": "6.2.1", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", + "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "dev": true, + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/get": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", + "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.4.tgz", + "integrity": "sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.13.tgz", + "integrity": "sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.0.0", + "node-api-version": "^0.1.4", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/universal": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", + "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/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, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "optional": true + }, + "node_modules/@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.8.tgz", + "integrity": "sha512-0LNz4EY8B/8xXY86wMrQ4tz6zEHZv9ehFMJPm8u2gq5lQ71cfRKdaKyxfJAx5aUoyzx0qzgURblTisPGgz3d+Q==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" + }, + "bin": { + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", + "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", + "dev": true, + "optional": true, + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + }, + "optionalDependencies": { + "@types/glob": "^7.1.1" + } + }, + "node_modules/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "optional": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base32-encode": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", + "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", + "dev": true, + "optional": true, + "dependencies": { + "to-data-view": "^1.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, + "optional": true + }, + "node_modules/bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "optional": true, + "dependencies": { + "stream-buffers": "~2.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cacache": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", + "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn-windows-exe/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-zip": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.0.tgz", + "integrity": "sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.10" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "optional": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "optional": true + }, + "node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/ds-store": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ds-store/-/ds-store-0.1.6.tgz", + "integrity": "sha512-kY21M6Lz+76OS3bnCzjdsJSF7LBpLYGCVfavW8TgQD2XkcqIZ86W0y9qUDZu6fp7SIZzqosMDW2zi7zVFfv4hw==", + "dev": true, + "optional": true, + "dependencies": { + "bplist-creator": "~0.0.3", + "macos-alias": "~0.2.5", + "tn1150": "^0.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-25.3.0.tgz", + "integrity": "sha512-cyqotxN+AroP5h2IxUsJsmehYwP5LrFAOO7O7k9tILME3Sa1/POAg3shrhx4XEnaAMyMqMLxzGvkzCVxzEErnA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^18.11.18", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-installer-common": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", + "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", + "dev": true, + "optional": true, + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-common/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz", + "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==", + "dev": true, + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^15.0.1" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-debian/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/electron-installer-debian/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "optional": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "optional": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "optional": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-installer-debian/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "optional": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "optional": true + }, + "node_modules/electron-installer-debian/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "optional": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-installer-debian/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "optional": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/electron-installer-dmg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-installer-dmg/-/electron-installer-dmg-4.0.0.tgz", + "integrity": "sha512-g3W6XnyUa7QGrAF7ViewHdt6bXV2KYU1Pm1CY3pZpp+H6mOjCHHAhf/iZAxtaX1ERCb+SQHz7xSsAHuNH9I8ZQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^4.3.2", + "minimist": "^1.1.1" + }, + "bin": { + "electron-installer-dmg": "bin/electron-installer-dmg.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "optionalDependencies": { + "appdmg": "^0.6.4" + } + }, + "node_modules/electron-packager": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.1.tgz", + "integrity": "sha512-r1NDtlajsq7gf2EXgjRfblCVPquvD2yeg+6XGErOKblvxOpDi0iulZLVhgYDP4AEF1P5/HgbX/vwjlkEv7PEIQ==", + "dev": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^2.0.0", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.1", + "@electron/universal": "^1.3.2", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^10.1.0", + "galactus": "^0.2.1", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^3.0.1", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 14.17.5" + }, + "funding": { + "url": "https://github.com/electron/electron-packager?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "optional": true + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-url": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-1.1.0.tgz", + "integrity": "sha512-Kul2nDrif1KcPH8g8bynl3/NtzaDvm3oUY3jS1tJu4fzfb6bUt1HNQ6MmLcK+pU7/ixVWKBokjHQwb83d2ngHw==", + "dependencies": { + "meow": "^3.7.0" + }, + "bin": { + "file-url": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/flora-colossus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", + "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^7.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/flora-colossus/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/flora-colossus/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/flora-colossus/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "optional": true, + "dependencies": { + "imul": "^1.0.0" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", + "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-temp": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", + "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", + "dev": true, + "optional": true, + "dependencies": { + "random-path": "^0.1.0" + } + }, + "node_modules/fs-xattr": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fs-xattr/-/fs-xattr-0.3.1.tgz", + "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha512-mDc8EQJKtxjp9PMYS3PbpjjbX3oXhBTxoGaPahw620XZBIHJ4+nvw5KN/tRtmmSDR9dypstGNvqQ3C29QGoGHQ==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + } + }, + "node_modules/galactus/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/galactus/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/galactus/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/galactus/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "dev": true, + "optional": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "node_modules/get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "dependencies": { + "global-modules": "1.0.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "optional": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/get-package-info/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "optional": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "dev": true, + "optional": true + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "dev": true, + "optional": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true, + "optional": true + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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 + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/macos-alias": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", + "integrity": "sha512-zIUs3+qpml+w3wiRuADutd7XIO8UABqksot10Utl/tji4UxZzLG4fWDC+yJZoO8/Ehg5RqsvSRE/6TS5AEOeWw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.4.0" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/meow/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", + "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/murmur-32": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", + "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", + "dev": true, + "optional": true, + "dependencies": { + "encode-utf8": "^1.0.3", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true, + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", + "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "~0.5.0" + } + }, + "node_modules/parse-color/node_modules/color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==", + "dev": true, + "optional": true + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", + "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", + "dev": true, + "optional": true, + "dependencies": { + "base32-encode": "^0.1.0 || ^1.0.0", + "murmur-32": "^0.1.0 || ^0.2.0" + } + }, + "node_modules/rcedit": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", + "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", + "dev": true, + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "optional": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", + "dev": true, + "dependencies": { + "get-installed-path": "^2.0.3" + }, + "engines": { + "node": ">=4", + "npm": ">=2" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sanitize-html": { + "version": "1.27.5", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.27.5.tgz", + "integrity": "sha512-M4M5iXDAUEcZKLXkmk90zSYWEtk5NH3JmojQxKxV371fnMh+x9t1rqdmXaGoyEHw3z/X/8vnFhKjGL5xFGOJ3A==", + "dependencies": { + "htmlparser2": "^4.1.0", + "lodash": "^4.17.15", + "parse-srcset": "^1.0.2", + "postcss": "^7.0.27" + } + }, + "node_modules/sass": { + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "optional": true + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true, + "optional": true + }, + "node_modules/ssri": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", + "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "dev": true, + "dependencies": { + "minipass": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "dev": true, + "optional": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "optional": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/tn1150": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tn1150/-/tn1150-0.1.0.tgz", + "integrity": "sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==", + "dev": true, + "optional": true, + "dependencies": { + "unorm": "^1.4.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true, + "optional": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "optional": true + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "bin": { + "yarn-or-npm": "bin/index.js", + "yon": "bin/index.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/yarn-or-npm/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/yarn-or-npm/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yarn-or-npm/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 9630cb6..8692fe6 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,38 @@ { - "name": "electern", - "description": "An RSS reader built with Electron and dgrid.", - "version": "0.1.0", - "main": "src/browser/main.js", - "author": "Kenneth G. Franqueiro", - "license": "MIT", - "devDependencies": { - "electron-download": "~1.4.1", - "electron-packager": "5.2.0", - "extract-zip": "~1.4.1", - "grunt": "~0.4.5", - "grunt-contrib-clean": "~0.7.0", - "grunt-contrib-stylus": "~1.1", - "grunt-contrib-watch": "~0.6.1" - }, - "scripts": { - "install": "bower install; cd src; npm install;" - } + "name": "electern", + "description": "An RSS reader built with Electron and dgrid.", + "version": "0.2.0-rc.1", + "main": "src/browser/main.js", + "author": "Kenneth G. Franqueiro", + "license": "MIT", + "dependencies": { + "file-url": "~1.1", + "sanitize-html": "~1.27.5" + }, + "devDependencies": { + "@electron-forge/cli": "^6.2.1", + "@electron-forge/maker-deb": "^6.2.1", + "@electron-forge/maker-dmg": "^6.2.1", + "@electron-forge/maker-zip": "^6.2.1", + "@electron-forge/plugin-auto-unpack-natives": "^6.2.1", + "cross-env": "^7.0.3", + "electron": "^25.3.0", + "eslint": "^8.44.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "prettier": "^2.8.8", + "sass": "^1.63.6" + }, + "scripts": { + "fix": "npm run lint -- --fix", + "lint": "eslint src/app src/browser src/common", + "install": "bower install", + "make": "npm run scss:min && electron-forge make", + "make-all": "npm run scss:min && electron-forge make --platform=darwin && electron-forge make --platform=linux && electron-forge make --platform=win32", + "package": "npm run scss:min && electron-forge package", + "scss": "sass src/scss:src/css", + "scss:watch": "npm run scss -- -w", + "scss:min": "npm run scss -- --style=compressed --no-source-map", + "start": "npm run scss && cross-env ELECTERN_DEV=1 electron-forge start" + } } diff --git a/src/app/archive.js b/src/app/archive.js deleted file mode 100644 index d3e8b19..0000000 --- a/src/app/archive.js +++ /dev/null @@ -1,28 +0,0 @@ -define([ - 'dojo/Deferred' -], function (Deferred) { - var ipc = require('electron').ipcRenderer; - var deferreds = {}; - - ipc.on('archive-downloaded', function (event, url, filename) { - deferreds[url].resolve(filename); - delete deferreds[url]; - }); - - ipc.on('archive-failed', function (event, url, error) { - deferreds[url].reject(error); - delete deferreds[url]; - }); - - return { - download(url, filename) { - var dfd = deferreds[url] = new Deferred(); - ipc.send('download-archive', url, filename); - return dfd.promise; - }, - - view(filename) { - ipc.send('view-archive', filename); - } - }; -}); diff --git a/src/app/dialogs.js b/src/app/dialogs.js index 99faf78..091f0d7 100644 --- a/src/app/dialogs.js +++ b/src/app/dialogs.js @@ -1,168 +1,186 @@ define([ - 'dojo/_base/lang', - 'dojo/promise/all', - 'dojo/topic', - './grid/article', - './grid/feed', - './store/article', - './store/feed', - './store/util', - './widget/form/Add', - './widget/form/Feed', - './widget/form/Folder', - './widget/form/Preferences', - './widget/form/Search', - './widget/form/modal', - './refresh', - './resize', - 'common/userConfig', - 'dojo/i18n!./nls/main' -], function (lang, all, topic, articleGrid, feedGrid, articleStore, feedStore, storeUtil, - AddForm, FeedForm, FolderForm, PreferencesForm, SearchForm, modal, refresh, resize, userConfig, i18n) { - - const ipc = require('electron').ipcRenderer; - - const folderCollection = feedStore.getRootCollection().filter(function (item) { - return feedStore.mayHaveChildren(item); - }); - const addForm = new AddForm({ folderCollection: folderCollection }); - const feedForm = new FeedForm({ folderCollection: folderCollection }); - const folderForm = new FolderForm(); // folderCollection is set when displayed - const searchForm = new SearchForm(); - const preferencesForm = new PreferencesForm(); - - let shouldDelete; - - function findNearestFolderId() { - const selectedId = Object.keys(feedGrid.selection)[0]; - if (selectedId) { - const item = feedStore.getSync(selectedId); - return feedStore.mayHaveChildren(item) ? item.id : item.parent; - } - return null; - } - - function setDelete() { - shouldDelete = true; - } - feedForm.on('delete', setDelete); - folderForm.on('delete', setDelete); - - var dialogs = { - showAddFeed() { - modal.show(addForm).then(function (value) { - return storeUtil.addFeed(value.input, value.parent); - }).then(function (feed) { - feedGrid.focus(feedGrid.row(feed).element); - return all([ - articleStore.persist(), - feedStore.persist() - ]); - }); - // Reset after showing to allow dgrid selection to find element in DOM and decorate properly - addForm.reset('feed', findNearestFolderId()); - }, - - showAddFolder() { - modal.show(addForm).then(function (value) { - feedGrid.focus(feedGrid.row(storeUtil.addFolder(value.input, value.parent)).element); - return feedStore.persist(); - }); - addForm.reset('folder', findNearestFolderId()); - }, - - showEditFeed(item) { - let value = { feed: item }; - let form; - shouldDelete = false; - - if (feedStore.mayHaveChildren(item)) { - form = folderForm; - form.set('folderCollection', folderCollection.filter(function (i) { - return i !== item; - })); - } - else { - form = feedForm; - value.config = userConfig.feedOptions[item.id]; - } - - modal.show(form).then(function (value) { - var isFeedChanged = value.feed.url !== item.url; - - feedStore.put(lang.mixin(item, value.feed)); - - if (isFeedChanged) { - refresh(item); - } - - if (value.config) { - userConfig.setOptions(item.id, value.config); - userConfig.save(); - } - }, function () { - if (shouldDelete) { - if (feedStore.mayHaveChildren(item)) { - const parents = {}; - feedStore.getFeeds(item).forEach(function (feed) { - parents[feed.parent] = true; - storeUtil.removeFeed(feed.id); - }); - - for (let id in parents) { - feedStore.removeSync(id); - } - - feedStore.removeSync(item.id); - } - else { - storeUtil.removeFeed(item.id); - } - } - }).always(function () { - feedGrid.focus(); - }); - - form.set('value', value); - } - }; - - ipc.on('new-feed', dialogs.showAddFeed); - ipc.on('new-folder', dialogs.showAddFolder); - - ipc.on('feed-edit', function () { - var selected = Object.keys(feedGrid.selection)[0]; - if (selected && !feedStore.getSync(selected)._system) { - dialogs.showEditFeed(feedGrid.row(selected).data); - } - }); - - ipc.on('article-search', function () { - searchForm.set('value', { - query: '' - }); - modal.show(searchForm).then(function (value) { - topic.publish('/search', new RegExp(value.query, 'i')); - var searchItem = feedStore.getSync('search'); - searchItem.title = i18n.searchResults + ' - ' + value.query; - feedStore.putSync(searchItem); - feedGrid.clearSelection(); - feedGrid.select('search'); - }); - }); - - ipc.on('preferences', function () { - preferencesForm.set('value', { - config: userConfig.defaultOptions, - uiOptions: userConfig.uiOptions - }); - modal.show(preferencesForm).then(function (value) { - userConfig.defaultOptions = value.config; - lang.mixin(userConfig.uiOptions, value.uiOptions); - userConfig.save(); - resize(); - }); - }); - - return dialogs; + "dojo/_base/lang", + "dojo/promise/all", + "dojo/topic", + "./grid/feed", + "./store/article", + "./store/feed", + "./store/util", + "./widget/form/Add", + "./widget/form/Feed", + "./widget/form/Folder", + "./widget/form/Preferences", + "./widget/form/Search", + "./widget/form/modal", + "./refresh", + "./resize", + "common/userConfig", + "dojo/i18n!./nls/main", +], function ( + lang, + all, + topic, + feedGrid, + articleStore, + feedStore, + storeUtil, + AddForm, + FeedForm, + FolderForm, + PreferencesForm, + SearchForm, + modal, + refresh, + resize, + userConfig, + i18n +) { + const folderCollection = feedStore.getRootCollection().filter(function (item) { + return feedStore.mayHaveChildren(item); + }); + const addForm = new AddForm({ folderCollection: folderCollection }); + const feedForm = new FeedForm({ folderCollection: folderCollection }); + const folderForm = new FolderForm(); // folderCollection is set when displayed + const searchForm = new SearchForm(); + const preferencesForm = new PreferencesForm(); + + let shouldDelete; + + function findNearestFolderId() { + const selectedId = Object.keys(feedGrid.selection)[0]; + if (selectedId) { + const item = feedStore.getSync(selectedId); + return feedStore.mayHaveChildren(item) ? item.id : item.parent; + } + return null; + } + + function setDelete() { + shouldDelete = true; + } + feedForm.on("delete", setDelete); + folderForm.on("delete", setDelete); + + const dialogs = { + showAddFeed() { + modal + .show(addForm) + .then(function (value) { + return storeUtil.addFeed(value.input, value.parent); + }) + .then(function (feed) { + feedGrid.focus(feedGrid.row(feed).element); + return all([articleStore.persist(), feedStore.persist()]); + }); + // Reset after showing to allow dgrid selection to find element in DOM and decorate properly + addForm.reset("feed", findNearestFolderId()); + }, + + showAddFolder() { + modal.show(addForm).then(function (value) { + feedGrid.focus(feedGrid.row(storeUtil.addFolder(value.input, value.parent)).element); + return feedStore.persist(); + }); + addForm.reset("folder", findNearestFolderId()); + }, + + showEditFeed(item) { + let value = { feed: item }; + let form; + shouldDelete = false; + + if (feedStore.mayHaveChildren(item)) { + form = folderForm; + form.set( + "folderCollection", + folderCollection.filter(function (i) { + return i !== item; + }) + ); + } else { + form = feedForm; + value.config = userConfig.feedOptions[item.id]; + } + + modal + .show(form) + .then( + function (value) { + const isFeedChanged = value.feed.url !== item.url; + + feedStore.put(lang.mixin(item, value.feed)); + + if (isFeedChanged) refresh(item); + + if (value.config) { + userConfig.setOptions(item.id, value.config); + userConfig.save(); + } + }, + function () { + if (shouldDelete) { + if (feedStore.mayHaveChildren(item)) { + const parents = {}; + feedStore.getFeeds(item).forEach(function (feed) { + parents[feed.parent] = true; + storeUtil.removeFeed(feed.id); + }); + + for (let id in parents) { + feedStore.removeSync(id); + } + + feedStore.removeSync(item.id); + } else { + storeUtil.removeFeed(item.id); + } + } + } + ) + .always(function () { + feedGrid.focus(); + }); + + form.set("value", value); + }, + }; + + electronApi.on("new-feed", dialogs.showAddFeed); + electronApi.on("new-folder", dialogs.showAddFolder); + + electronApi.on("feed-edit", function () { + const selected = Object.keys(feedGrid.selection)[0]; + if (selected && !feedStore.getSync(selected)._system) { + dialogs.showEditFeed(feedGrid.row(selected).data); + } + }); + + electronApi.on("article-search", function () { + searchForm.set("value", { + query: "", + }); + modal.show(searchForm).then(function (value) { + topic.publish("/search", new RegExp(value.query, "i")); + const searchItem = feedStore.getSync("search"); + searchItem.title = i18n.searchResults + " - " + value.query; + feedStore.putSync(searchItem); + feedGrid.clearSelection(); + feedGrid.select("search"); + }); + }); + + electronApi.on("preferences", function () { + preferencesForm.set("value", { + config: userConfig.defaultOptions, + uiOptions: userConfig.uiOptions, + }); + modal.show(preferencesForm).then(function (value) { + userConfig.defaultOptions = value.config; + lang.mixin(userConfig.uiOptions, value.uiOptions); + userConfig.save(); + resize(); + }); + }); + + return dialogs; }); diff --git a/src/app/grid/article.js b/src/app/grid/article.js index bd385d7..a510100 100644 --- a/src/app/grid/article.js +++ b/src/app/grid/article.js @@ -1,102 +1,105 @@ define([ - 'dojo/_base/declare', - 'dojo/dom-construct', - 'dgrid/extensions/SingleQuery', - 'dgrid/Grid', - 'dgrid/Keyboard', - 'dgrid/Selection', - 'dojo/i18n!../nls/main', - 'dojo/query' // Event delegation + "dojo/_base/declare", + "dojo/dom-construct", + "dgrid/extensions/SingleQuery", + "dgrid/Grid", + "dgrid/Keyboard", + "dgrid/Selection", + "dojo/i18n!../nls/main", + "dojo/query", // Event delegation ], function (declare, domConstruct, SingleQuery, Grid, Keyboard, Selection, i18n) { - const ipc = require('electron').ipcRenderer; - const dateFormatter = new Intl.DateTimeFormat([], - { hour: 'numeric', minute: '2-digit', month: 'numeric', day: 'numeric', year: '2-digit' }); + const dateFormatter = new Intl.DateTimeFormat([], { + hour: "numeric", + minute: "2-digit", + month: "numeric", + day: "numeric", + year: "2-digit", + }); - var ArticleGrid = declare([ Grid, SingleQuery, Keyboard, Selection ], { - cellNavigation: false, - maintainOddEven: false, - tabableHeader: false, + const ArticleGrid = declare([Grid, SingleQuery, Keyboard, Selection], { + cellNavigation: false, + maintainOddEven: false, + tabableHeader: false, - postMixInProperties() { - this.inherited(arguments); - this.columns = { - isPinned: { - renderHeaderCell: function () { - return domConstruct.create('span', { className: 'fa fa-thumb-tack' }); - }, - renderCell: function (item, value) { - return domConstruct.create('span', { - className: value ? 'fa fa-thumb-tack' : '' - }); - }, - sortable: false - }, - title: { - label: i18n.title, - renderCell: function (item, value, cell) { - cell.textContent = cell.title = value; - } - }, - isRead: { - renderHeaderCell: function () { - return domConstruct.create('span', { className: 'fa fa-bolt' }); - }, - renderCell: function (item, value) { - return domConstruct.create('span', { - className: value ? '' : 'fa fa-bolt' - }); - }, - sortable: false - }, - date: { - label: i18n.date, - renderCell: function (item, value, cell) { - cell.textContent = cell.title = dateFormatter.format(value); - } - } - }; - this.sort = [ { property: 'date', descending: true }, { property: 'title' } ]; - }, + postMixInProperties() { + this.inherited(arguments); + this.columns = { + isPinned: { + renderHeaderCell: function () { + return domConstruct.create("span", { className: "fa fa-thumb-tack" }); + }, + renderCell: function (item, value) { + return domConstruct.create("span", { + className: value ? "fa fa-thumb-tack" : "", + }); + }, + sortable: false, + }, + title: { + label: i18n.title, + renderCell: function (item, value, cell) { + cell.textContent = cell.title = value; + }, + }, + isRead: { + renderHeaderCell: function () { + return domConstruct.create("span", { className: "fa fa-bolt" }); + }, + renderCell: function (item, value) { + return domConstruct.create("span", { + className: value ? "" : "fa fa-bolt", + }); + }, + sortable: false, + }, + date: { + label: i18n.date, + renderCell: function (item, value, cell) { + cell.textContent = cell.title = dateFormatter.format(value); + }, + }, + }; + this.sort = [{ property: "date", descending: true }, { property: "title" }]; + }, - postCreate() { - this.inherited(arguments); + postCreate() { + this.inherited(arguments); - var pin = this.toggleFlag.bind(this, 'isPinned'); - var read = this.toggleFlag.bind(this, 'isRead'); + const pin = this.toggleFlag.bind(this, "isPinned"); + const read = this.toggleFlag.bind(this, "isRead"); - this.on('.dgrid-content .field-isPinned:click', pin); - this.on('.dgrid-content .field-isRead:click', read); + this.on(".dgrid-content .field-isPinned:click", pin); + this.on(".dgrid-content .field-isRead:click", read); - ipc.on('feed-mark-all-as-read', () => { - var collection = this.get('collection'); - if (!collection) { - return; - } - collection.forEach(function (item) { - if (!item.isRead) { - item.isRead = true; - collection.putSync(item); - } - }); - }); - }, + electronApi.on("feed-mark-all-as-read", () => { + const collection = this.get("collection"); + if (!collection) return; - highlightRow() {}, + collection.forEach(function (item) { + if (!item.isRead) { + item.isRead = true; + collection.putSync(item); + } + }); + }); + }, - renderRow(item) { - var rowElement = this.inherited(arguments); - if (!item.isRead) { - rowElement.classList.add('unread'); - } - return rowElement; - }, + highlightRow() {}, - toggleFlag(flag, target) { - var item = this.row(target).data; - item[flag] = !item[flag]; - this.collection.putSync(item); - } - }); + renderRow(item) { + const rowElement = this.inherited(arguments); + if (!item.isRead) { + rowElement.classList.add("unread"); + } + return rowElement; + }, - return new ArticleGrid({}, 'articles'); + toggleFlag(flag, target) { + const item = this.row(target).data; + item[flag] = !item[flag]; + this.collection.putSync(item); + }, + }); + + return new ArticleGrid({}, "articles"); }); diff --git a/src/app/grid/feed.js b/src/app/grid/feed.js index 2793151..9016761 100644 --- a/src/app/grid/feed.js +++ b/src/app/grid/feed.js @@ -1,106 +1,105 @@ define([ - 'dojo/_base/declare', - 'dojo/dom-construct', - 'dgrid/extensions/SingleQuery', - 'dgrid/Grid', - 'dgrid/Keyboard', - 'dgrid/Selection', - 'dgrid/Tree' + "dojo/_base/declare", + "dojo/dom-construct", + "dgrid/extensions/SingleQuery", + "dgrid/Grid", + "dgrid/Keyboard", + "dgrid/Selection", + "dgrid/Tree", ], function (declare, domConstruct, SingleQuery, Grid, Keyboard, Selection, Tree) { - function renderCell(item, value, cell) { - if (this.grid.showUnread) { - var unread = this.grid.collection.getUnread(item); - cell.classList.toggle('unread', !!unread); - } + function renderCell(item, value, cell) { + const unread = this.grid.collection.getUnread(item); + if (this.grid.showUnread) cell.classList.toggle("unread", !!unread); - if (!item._system) { - domConstruct.create('span', { - className: 'fa fa-pencil' - }, cell); - } + if (!item._system) { + domConstruct.create( + "span", + { + className: "fa fa-pencil", + }, + cell + ); + } - cell.appendChild(document.createTextNode(value + (unread ? ' (' + unread + ')' : ''))); - } + cell.appendChild(document.createTextNode(value + (unread ? " (" + unread + ")" : ""))); + } - var FeedGrid = declare([ Grid, SingleQuery, Keyboard, Selection, Tree ], { - enableTreeTransitions: false, - maintainOddEven: false, - selectionMode: 'single', - showHeader: false, - tabableHeader: false, - treeIndentWidth: 15, + const FeedGrid = declare([Grid, SingleQuery, Keyboard, Selection, Tree], { + enableTreeTransitions: false, + maintainOddEven: false, + selectionMode: "single", + showHeader: false, + tabableHeader: false, + treeIndentWidth: 15, - /** Whether to display unread counts */ - showUnread: true, + /** Whether to display unread counts */ + showUnread: true, - postMixInProperties() { - this.inherited(arguments); - this.columns = { - title: { - renderCell: this.showUnread ? renderCell : null, - renderExpando(level, hasChildren, expanded, item) { - var node = this.grid._defaultRenderExpando.apply(this, arguments); - if (hasChildren) { - node.className = 'dgrid-expando-icon fa fa-folder'; - } - else { - node.className = 'fa fa-fw fa-' + (item.icon || 'rss'); - } - return node; - } - } - }; - this.sort = [ { property: '_system', descending: true }, { property: 'title' } ]; - }, + postMixInProperties() { + this.inherited(arguments); + this.columns = { + title: { + renderCell: this.showUnread ? renderCell : null, + renderExpando(level, hasChildren, expanded, item) { + const node = this.grid._defaultRenderExpando.apply(this, arguments); + if (hasChildren) { + node.className = "dgrid-expando-icon fa fa-folder"; + } else { + node.className = "fa fa-fw fa-" + (item.icon || "rss"); + } + return node; + }, + }, + }; + this.sort = [{ property: "_system", descending: true }, { property: "title" }]; + }, - postCreate() { - this.inherited(arguments); + postCreate() { + this.inherited(arguments); - // Allow clearing selection by clicking in empty space in content node, - // mainly to make it easier to create top-level feeds/folders (by selecting nothing) - this.on('.dgrid-content:click', (event) => { - if (event.target === this.contentNode) { - this.clearSelection(); - } - }); - }, + // Allow clearing selection by clicking in empty space in content node, + // mainly to make it easier to create top-level feeds/folders (by selecting nothing) + this.on(".dgrid-content:click", (event) => { + if (event.target === this.contentNode) { + this.clearSelection(); + } + }); + }, - highlightRow() {}, + highlightRow() {}, - _cleanupCollection() { - this.inherited(arguments); - if (this._collectionUpdateHandle) { - this._collectionUpdateHandle.remove(); - } - }, + _cleanupCollection() { + this.inherited(arguments); + if (this._collectionUpdateHandle) { + this._collectionUpdateHandle.remove(); + } + }, - _setCollection(collection) { - this.inherited(arguments); + _setCollection(collection) { + this.inherited(arguments); - if (this._collectionUpdateHandle) { - this._collectionUpdateHandle.remove(); - } + if (this._collectionUpdateHandle) { + this._collectionUpdateHandle.remove(); + } - if (this.showUnread && collection) { - this._collectionUpdateHandle = collection.on('update', (event) => { - var item = event.target; - if (item.url) { - // Unread count may have been updated; update unread count displayed on ancestors. - // Re-call refreshCell rather than calling put, which would make the grid - // re-render the entire row _and_ its children. - // (refreshCell loses level information, but that's worked around in renderExpando above.) - while (item.parent != null) { - item = this.collection.getSync(item.parent); - var cell = this.cell(item, 'title'); - if (cell && cell.element) { - this.refreshCell(cell); - } - } - } - }); - } - } - }); + if (this.showUnread && collection) { + this._collectionUpdateHandle = collection.on("update", (event) => { + let item = event.target; + if (item.url) { + // Unread count may have been updated; update unread count displayed on ancestors. + // Re-call refreshCell rather than calling put, which would make the grid + // re-render the entire row _and_ its children. + // (refreshCell loses level information, but that's worked around in renderExpando above.) + while (item.parent != null) { + item = this.collection.getSync(item.parent); + const cell = this.cell(item, "title"); + if (cell && cell.element) this.refreshCell(cell); + } + } + }); + } + }, + }); - return new FeedGrid({}, 'feeds'); + return new FeedGrid({}, "feeds"); }); diff --git a/src/app/main.js b/src/app/main.js index d980d9e..1ec6c7c 100644 --- a/src/app/main.js +++ b/src/app/main.js @@ -1,97 +1,102 @@ -'use strict'; +"use strict"; define([ - 'dojo/on', - 'dojo/topic', - 'dgrid/util/misc', - './dialogs', - './grid/article', - './grid/feed', - './widget/articlePane', - './store/article', - './store/feed', - './store/util', - './refresh', - './resize', - './opml/import' -], function (on, topic, miscUtil, dialogs, articleGrid, feedGrid, articlePane, articleStore, feedStore, - storeUtil, refresh) { + "dojo/on", + "dojo/topic", + "./dialogs", + "./grid/article", + "./grid/feed", + "./widget/articlePane", + "./store/article", + "./store/feed", + "./store/util", + "./refresh", + "./resize", + "./opml/import", +], function ( + on, + topic, + dialogs, + articleGrid, + feedGrid, + articlePane, + articleStore, + feedStore, + storeUtil, + refresh +) { + const userDataDir = electronApi.getUserDataPath("userData"); - const pathUtil = require('path'); - const userDataDir = require('electron').remote.app.getPath('userData'); + feedStore.setFilename(electronApi.resolve(userDataDir, "feeds.json")); + articleStore.setFilename(electronApi.resolve(userDataDir, "articles.json")); - feedStore.setFilename(pathUtil.resolve(userDataDir, 'feeds.json')); - articleStore.setFilename(pathUtil.resolve(userDataDir, 'articles.json')); + // Wait until after setting filenames to run first refresh cycle + refresh.tick(); - // Wait until after setting filenames to run first refresh cycle - refresh.tick(); + feedGrid.set("collection", feedStore.getRootCollection()); + // Collection is assigned to articleGrid when a feed is selected - feedGrid.set('collection', feedStore.getRootCollection()); - // Collection is assigned to articleGrid when a feed is selected + let searchRx; + topic.subscribe("/search", function (rx) { + searchRx = rx; + }); - let searchRx; - topic.subscribe('/search', function (rx) { - searchRx = rx; - }); + feedGrid.on(".fa-pencil:click", function (event) { + dialogs.showEditFeed(feedGrid.row(event).data); + }); - feedGrid.on('.fa-pencil:click', function (event) { - dialogs.showEditFeed(feedGrid.row(event).data); - }); + feedGrid.on("dgrid-select", function (event) { + let collection; + const item = feedGrid.row(event.rows[0]).data; + if (item.id === "pinned") { + collection = articleStore.filter({ isPinned: true }); + } else if (item.id === "unread") { + collection = articleStore.filter(function (article) { + return !article.isRead; + }); + } else if (item.id === "search") { + collection = searchRx + ? articleStore.filter(function (article) { + return searchRx.test(article.title) || searchRx.test(article.content); + }) + : null; + } else if (!feedStore.mayHaveChildren(item)) { + collection = articleStore.filter({ feedId: item.id }); + } else { + const feedMap = {}; + feedStore.getFeeds(item).forEach(function (feed) { + feedMap[feed.id] = true; + }); + collection = articleStore.filter(function (article) { + return feedMap[article.feedId]; + }); + } + articleGrid.set("collection", collection); + }); - feedGrid.on('dgrid-select', function (event) { - let collection; - const item = feedGrid.row(event.rows[0]).data; - if (item.id === 'pinned') { - collection = articleStore.filter({ isPinned: true }); - } - else if (item.id === 'unread') { - collection = articleStore.filter(function (article) { - return !article.isRead; - }); - } - else if (item.id === 'search') { - collection = searchRx ? articleStore.filter(function (article) { - return searchRx.test(article.title) || searchRx.test(article.content); - }) : null; - } - else if (!feedStore.mayHaveChildren(item)) { - collection = articleStore.filter({ feedId: item.id }); - } - else { - const feedMap = {}; - feedStore.getFeeds(item).forEach(function (feed) { - feedMap[feed.id] = true; - }); - collection = articleStore.filter(function (article) { - return feedMap[article.feedId]; - }); - } - articleGrid.set('collection', collection); - }); + feedGrid.on("dgrid-deselect", function () { + articleGrid.set("collection", null); + articlePane.set("article", null); + }); - feedGrid.on('dgrid-deselect', function () { - articleGrid.set('collection', null); - articlePane.set('article', null); - }); + articleGrid.on("dgrid-select,dgrid-deselect", function () { + const keys = Object.keys(articleGrid.selection); + if (keys.length === 1) { + const article = articleStore.getSync(keys[0]); + if (!article.isRead) { + article.isRead = true; + storeUtil.incrementUnread(article.feedId, -1); + } + // Selectively refresh rather than put, to avoid glitches due to select firing on mousedown. + // This also effectively avoids items in the Unread filter immediately disappearing upon select. + const cell = articleGrid.cell(article, "isRead"); + cell.row.element.classList.remove("unread"); + articleGrid.refreshCell(cell); + articlePane.set("article", article); + } + }); - articleGrid.on('dgrid-select,dgrid-deselect', function () { - const keys = Object.keys(articleGrid.selection); - if (keys.length === 1) { - const article = articleStore.getSync(keys[0]); - if (!article.isRead) { - article.isRead = true; - storeUtil.incrementUnread(article.feedId, -1); - } - // Selectively refresh rather than put, to avoid glitches due to select firing on mousedown. - // This also effectively avoids items in the Unread filter immediately disappearing upon select. - const cell = articleGrid.cell(article, 'isRead'); - cell.row.element.classList.remove('unread'); - articleGrid.refreshCell(cell); - articlePane.set('article', article); - } - }); - - window.onunload = function () { - articleStore.persistSync(); - feedStore.persistSync(); - }; + window.onunload = function () { + articleStore.persistSync(); + feedStore.persistSync(); + }; }); diff --git a/src/app/nls/main.js b/src/app/nls/main.js index c4308e8..84bd035 100644 --- a/src/app/nls/main.js +++ b/src/app/nls/main.js @@ -1,45 +1,47 @@ define({ - root: { - addFeed: 'Add Feed', - addFolder: 'Add Folder', - areYouSure: 'Are You Sure?', - articles: 'Articles', - cancel: 'Cancel', - create: 'Create', - date: 'Date', - defaultFeedSettings: 'Default Feed Settings', - defaultFeedSettingsDescription: 'These can be overridden on a per-feed basis in the feed settings.', - delete: 'Delete', - deleteFeedPrompt: 'Deleting this feed will remove it and all of its articles.', - deleteFolderPrompt: 'Deleting this folder will also delete all child folders and feeds!', - downloadCompletePage: 'Download complete page to read offline', - editFeed: 'Edit Feed', - editFolder: 'Edit Folder', - feeds: 'Feeds', - feedUrl: 'Feed URL', - findArticles: 'Find Articles', - folderName: 'Folder Name', - makeTopLevel: 'Make Top-level', - maxArticles: 'Maximum Articles', - move: 'Move', - name: 'Name', - newFeed: 'New Feed', - newFolder: 'New Folder', - no: 'No', - openArchivedPage: 'Open archived page', - overrides: 'Overrides', - parentFolder: 'Parent Folder', - pinned: 'Pinned', - preferences: 'Preferences', - regionSizes: 'Region Sizes (in Percent)', - save: 'Save', - search: 'Search', - searchQuery: 'Search Query (supports RegExp)', - searchResults: 'Search Results', - showImages: 'Show Images', - title: 'Title', - unread: 'Unread', - updateInterval: 'Update Interval', - yes: 'Yes' - } + root: { + addFeed: "Add Feed", + addFolder: "Add Folder", + areYouSure: "Are You Sure?", + articles: "Articles", + cancel: "Cancel", + create: "Create", + date: "Date", + defaultFeedSettings: "Default Feed Settings", + defaultFeedSettingsDescription: + "These can be overridden on a per-feed basis in the feed settings.", + delete: "Delete", + deleteFeedPrompt: "Deleting this feed will remove it and all of its articles.", + deleteFolderPrompt: "Deleting this folder will also delete all child folders and feeds!", + downloadCompletePage: "Download complete page to read offline", + downloading: "Downloading...", + editFeed: "Edit Feed", + editFolder: "Edit Folder", + feeds: "Feeds", + feedUrl: "Feed URL", + findArticles: "Find Articles", + folderName: "Folder Name", + makeTopLevel: "Make Top-level", + maxArticles: "Maximum Articles", + move: "Move", + name: "Name", + newFeed: "New Feed", + newFolder: "New Folder", + no: "No", + openArchivedPage: "Open archived page", + overrides: "Overrides", + parentFolder: "Parent Folder", + pinned: "Pinned", + preferences: "Preferences", + regionSizes: "Region Sizes (in Percent)", + save: "Save", + search: "Search", + searchQuery: "Search Query (supports RegExp)", + searchResults: "Search Results", + showImages: "Show Images", + title: "Title", + unread: "Unread", + updateInterval: "Update Interval", + yes: "Yes", + }, }); diff --git a/src/app/opml/import.js b/src/app/opml/import.js index efa3afc..0e6e29c 100644 --- a/src/app/opml/import.js +++ b/src/app/opml/import.js @@ -1,34 +1,30 @@ -'use strict'; -define([ - '../store/article', - '../store/feed', - '../store/util', - '../util' -], function (articleStore, feedStore, storeUtil, util) { - const ipc = require('electron').ipcRenderer; - const readFile = util.promisify(require('fs').readFile); +"use strict"; +define(["../store/article", "../store/feed", "../store/util", "../util"], function ( + articleStore, + feedStore, + storeUtil, + util +) { + function processOutline(outline, parent) { + const length = outline.children.length; + if (length) { + const folder = storeUtil.addFolder(outline.getAttribute("text"), parent); + for (let i = 0; i < length; i++) { + processOutline(outline.children[i], folder.id); + } + } else { + return storeUtil.addFeed(outline.getAttribute("xmlUrl"), parent); + } + } - function processOutline(outline, parent) { - const length = outline.children.length; - if (length) { - const folder = storeUtil.addFolder(outline.getAttribute('text'), parent); - for (let i = 0; i < length; i++) { - processOutline(outline.children[i], folder.id); - } - } - else { - return storeUtil.addFeed(outline.getAttribute('xmlUrl'), parent); - } - } - - ipc.on('opml-import', function (event, filename) { - readFile(filename, 'utf8').then(function (opml) { - const doc = util.parseXml(opml); - Array.from(doc.querySelectorAll('body > outline')).forEach(function (outline) { - processOutline(outline, null); - }); - articleStore.persist(); - feedStore.persist(); - }); - }); + electronApi.on("opml-import", function (event, filename) { + electronApi.readFile(filename, "utf8").then(function (opml) { + const doc = util.parseXml(opml); + Array.from(doc.querySelectorAll("body > outline")).forEach(function (outline) { + processOutline(outline, null); + }); + articleStore.persist(); + feedStore.persist(); + }); + }); }); diff --git a/src/app/refresh.js b/src/app/refresh.js index e29eddd..80ca481 100644 --- a/src/app/refresh.js +++ b/src/app/refresh.js @@ -1,45 +1,47 @@ define([ - 'dojo/promise/all', - './store/article', - './store/feed', - './store/util', - './retrieveFeed' + "dojo/promise/all", + "./store/article", + "./store/feed", + "./store/util", + "./retrieveFeed", ], function (all, articleStore, feedStore, storeUtil, retrieveFeed) { - const TICK_INTERVAL = 150000; + const TICK_INTERVAL = 150000; - function refresh(feed) { - return retrieveFeed(feed.url).then(function (data) { - feed.downloadedDate = data.metadata.downloadedDate; - feedStore.putSync(feed); - storeUtil.addArticles(data.articles, feed); - }).then(function () { - articleStore.prune(feed.id); - }); - } + function refresh(feed) { + return retrieveFeed(feed.url) + .then((data) => { + feed.downloadedDate = data.metadata.downloadedDate; + feedStore.putSync(feed); + storeUtil.addArticles(data.articles, feed); + }) + .then(() => { + articleStore.prune(feed.id); + }); + } - function tick() { - const promises = []; - feedStore.getFeeds().forEach(function (feed) { - if (feed.downloadedDate < new Date() - feedStore.getOptions(feed).updateInterval * 60000) { - promises.push(refresh(feed)); - } - }); + function tick() { + const promises = []; + feedStore.getFeeds().forEach(function (feed) { + if (feed.downloadedDate < new Date() - feedStore.getOptions(feed).updateInterval * 60000) { + promises.push(refresh(feed)); + } + }); - all(promises).always(function () { - articleStore.persist(); - feedStore.persist(); - }); - } + all(promises).always(function () { + articleStore.persist(); + feedStore.persist(); + }); + } - refresh.tick = tick; - setInterval(tick, TICK_INTERVAL); + refresh.tick = tick; + setInterval(tick, TICK_INTERVAL); - require('electron').ipcRenderer.on('feed-refresh-all', function () { - feedStore.getFeeds().forEach(function (feed) { - feed.downloadedDate = 0; - }); - tick(); - }); + electronApi.on("feed-refresh-all", function () { + feedStore.getFeeds().forEach(function (feed) { + feed.downloadedDate = 0; + }); + tick(); + }); - return refresh; + return refresh; }); diff --git a/src/app/resize.js b/src/app/resize.js index d71e898..d3a7584 100644 --- a/src/app/resize.js +++ b/src/app/resize.js @@ -1,40 +1,48 @@ -'use strict'; +"use strict"; define([ - 'dojo/on', - 'dgrid/util/misc', - './grid/article', - './grid/feed', - 'common/userConfig' + "dojo/on", + "dgrid/util/misc", + "./grid/article", + "./grid/feed", + "common/userConfig", ], function (on, miscUtil, articleGrid, feedGrid, userConfig) { - on(window, 'resize', miscUtil.debounce(function () { - userConfig.uiOptions.size = require('electron').remote.BrowserWindow.getFocusedWindow().getSize(); - userConfig.save(); - }, null, 250)); - - let regionStyles = []; - - function resizeRegions() { - regionStyles.forEach(function (style) { - style.remove(); - }); - - regionStyles = []; - - const sizes = userConfig.uiOptions.regionSizes; - let total = 0; - - for (let key in sizes) { - total += sizes[key]; - regionStyles.push(miscUtil.addCssRule('.' + key, 'width: ' + sizes[key] + '%')); - } - regionStyles.push(miscUtil.addCssRule('.article', 'width: ' + (100 - total) + '%')); - - articleGrid.resize(); - feedGrid.resize(); - } - - resizeRegions(); - - return resizeRegions; + on( + window, + "resize", + miscUtil.debounce( + async () => { + userConfig.uiOptions.size = await electronApi.getWindowSize(); + userConfig.save(); + }, + null, + 250 + ) + ); + + let regionStyles = []; + + function resizeRegions() { + regionStyles.forEach(function (style) { + style.remove(); + }); + + regionStyles = []; + + const sizes = userConfig.uiOptions.regionSizes; + let total = 0; + + for (let key in sizes) { + total += sizes[key]; + regionStyles.push(miscUtil.addCssRule("." + key, "width: " + sizes[key] + "%")); + } + regionStyles.push(miscUtil.addCssRule(".article", "width: " + (100 - total) + "%")); + + articleGrid.resize(); + feedGrid.resize(); + } + + resizeRegions(); + + return resizeRegions; }); diff --git a/src/app/retrieveFeed.js b/src/app/retrieveFeed.js index ed4d7f6..14a9de3 100644 --- a/src/app/retrieveFeed.js +++ b/src/app/retrieveFeed.js @@ -1,113 +1,113 @@ -'use strict'; -define([ - 'dojo/request', - './util' -], function (request, util) { - const slice = Array.prototype.slice; +"use strict"; +define(["dojo/request", "./util"], function (request, util) { + const slice = Array.prototype.slice; - function getElementHtml(parent, selector) { - const element = parent.querySelector(selector); - return element ? element.innerHTML : ''; - } + function getElementHtml(parent, selector) { + const element = parent.querySelector(selector); + return element ? element.innerHTML : ""; + } - function getElementText(parent, selector) { - const element = parent.querySelector(selector); - return element ? element.textContent : ''; - } + function getElementText(parent, selector) { + const element = parent.querySelector(selector); + return element ? element.textContent : ""; + } - function getElementAttribute(parent, selector, attribute) { - const element = parent.querySelector(selector); - return element ? element.getAttribute(attribute) : ''; - } + function getElementAttribute(parent, selector, attribute) { + const element = parent.querySelector(selector); + return element ? element.getAttribute(attribute) : ""; + } - var feedHandlers = [ - { - name: 'atom', - selector: 'feed entry', - parseArticle: function (element) { - return { - id: getElementText(element, 'id'), - url: getElementAttribute(element, 'link', 'href'), - title: getElementText(element, 'title'), - author: getElementText(element, 'name'), - date: getElementText(element, 'published') || getElementText(element, 'updated'), - content: getElementHtml(element, 'content') || getElementHtml(element, 'summary') - }; - }, - parseMetadata: function (doc) { - const updated = getElementText(doc, 'feed > updated'); - return { - title: getElementText(doc, 'feed > title'), - updatedDate: updated ? new Date(updated) : undefined - }; - } - }, - { - name: 'rss', - selector: 'rss item, rdf\\:RDF item', - parseArticle: function (element) { - return { - id: getElementText(element, 'guid') || - getElementText(element, 'identifier') || getElementText(element, 'link'), // RSSv1 - url: getElementText(element, 'link'), - title: getElementText(element, 'title'), - author: getElementText(element, 'author') || getElementText(element, 'creator'), - date: getElementText(element, 'pubDate') || getElementText(element, 'date'), - content: getElementHtml(element, 'description') - }; - }, - parseMetadata: function (doc) { - const updated = getElementText(doc, 'channel > pubDate') || - getElementText(doc, 'channel > lastBuildDate') || - getElementText(doc, 'channel > syn\\:updateBase'); // RSSv1 + const feedHandlers = [ + { + name: "atom", + selector: "feed entry", + parseArticle: function (element) { + return { + id: getElementText(element, "id"), + url: getElementAttribute(element, "link", "href"), + title: getElementText(element, "title"), + author: getElementText(element, "name"), + date: getElementText(element, "published") || getElementText(element, "updated"), + content: getElementHtml(element, "content") || getElementHtml(element, "summary"), + }; + }, + parseMetadata: function (doc) { + const updated = getElementText(doc, "feed > updated"); + return { + title: getElementText(doc, "feed > title"), + updatedDate: updated ? new Date(updated) : undefined, + }; + }, + }, + { + name: "rss", + selector: "rss item, rdf\\:RDF item", + parseArticle: function (element) { + return { + id: + getElementText(element, "guid") || + getElementText(element, "identifier") || + getElementText(element, "link"), // RSSv1 + url: getElementText(element, "link"), + title: getElementText(element, "title"), + author: getElementText(element, "author") || getElementText(element, "creator"), + date: getElementText(element, "pubDate") || getElementText(element, "date"), + content: getElementHtml(element, "description"), + }; + }, + parseMetadata: function (doc) { + const updated = + getElementText(doc, "channel > pubDate") || + getElementText(doc, "channel > lastBuildDate") || + getElementText(doc, "channel > syn\\:updateBase"); // RSSv1 - return { - title: getElementText(doc, 'channel > title'), - description: getElementText(doc, 'channel > description'), - updatedDate: updated ? new Date(updated) : undefined, - url: getElementText(doc, 'channel > link') - }; - } - } - ]; + return { + title: getElementText(doc, "channel > title"), + description: getElementText(doc, "channel > description"), + updatedDate: updated ? new Date(updated) : undefined, + url: getElementText(doc, "channel > link"), + }; + }, + }, + ]; - function handleFeed(doc, url) { - let elements; - const match = feedHandlers.find(function (obj) { - elements = doc.querySelectorAll(obj.selector); - return elements.length > 0; - }); - if (!match) { - throw new Error('Unrecognized feed format'); - } + function handleFeed(doc, url) { + let elements; + const match = feedHandlers.find(function (obj) { + elements = doc.querySelectorAll(obj.selector); + return elements.length > 0; + }); + if (!match) { + throw new Error("Unrecognized feed format"); + } - const articles = slice.call(elements).map(function (element) { - const article = match.parseArticle(element); - if (article.date) { - article.date = new Date(article.date); - } - return article; - }); + const articles = slice.call(elements).map(function (element) { + const article = match.parseArticle(element); + if (article.date) { + article.date = new Date(article.date); + } + return article; + }); - const metadata = match.parseMetadata(doc); - metadata.downloadedDate = new Date(); - metadata.url = url; + const metadata = match.parseMetadata(doc); + metadata.downloadedDate = new Date(); + metadata.url = url; - return { - articles: articles, - metadata: metadata - }; - } + return { + articles: articles, + metadata: metadata, + }; + } - /** - * Retrieves articles from a feed. - * - * @param {string} url Feed URL to fetch and process - * @return dojo/promise/Promise resolving to an array of items with normalized properties - */ - return function (url) { - return request(url).then(function (xml) { - return handleFeed(util.parseXml(xml), url); - }); - }; + /** + * Retrieves articles from a feed. + * + * @param {string} url Feed URL to fetch and process + * @return dojo/promise/Promise resolving to an array of items with normalized properties + */ + return function (url) { + return request(url).then(function (xml) { + return handleFeed(util.parseXml(xml), url); + }); + }; }); diff --git a/src/app/store/FsMemory.js b/src/app/store/FsMemory.js index 9e4b65c..2237a18 100644 --- a/src/app/store/FsMemory.js +++ b/src/app/store/FsMemory.js @@ -1,64 +1,64 @@ -'use strict'; -define([ - 'dstore/Memory', - '../util' -], function (Memory, util) { - const fs = require('fs'); - const writeFile = util.promisify(fs.writeFile); +"use strict"; +define(["dstore/Memory"], function (Memory) { + /** + * Memory store which persists to / restores from a file in the filesystem. + */ + return Memory.createSubclass({ + /** + * Filename to read/write + */ + filename: "", - /** - * Memory store which persists to / restores from a file in the filesystem. - */ - return Memory.createSubclass({ - /** - * Filename to read/write - */ - filename: '', + constructor() { + if (this.filename) { + this.setFilename(this.filename); + } + }, - constructor() { - if (this.filename) { - this.setFilename(this.filename); - } - }, + _persist(sync) { + if (this.filename) { + return (sync ? electronApi.writeFileSync : electronApi.writeFile)( + this.filename, + JSON.stringify(this, null, "\t") + ); + } + throw new Error("Cannot persist without a filename defined"); + }, - _persist(sync) { - if (this.filename) { - const args = [ this.filename, JSON.stringify(this, null, '\t') ]; - return (sync ? fs.writeFileSync : writeFile).apply(fs, args); - } - throw new Error('Cannot persist without a filename defined'); - }, + persist() { + this._persist(); + }, - persist() { - this._persist(); - }, + persistSync() { + this._persist(true); + }, - persistSync() { - this._persist(true); - }, + setFilename(filename) { + // This uses synchronous methods to enable flowing directly into setData, + // rather than needing to notify of adds afterwards. + // Note that this accepts nonexistent filenames as well, to allow persisting on first run. - setFilename(filename) { - // This uses synchronous methods to enable flowing directly into setData, - // rather than needing to notify of adds afterwards. - // Note that this accepts nonexistent filenames as well, to allow persisting on first run. + if (electronApi.existsSync(filename)) { + this.setData( + JSON.parse( + electronApi.readFileSync(filename, { encoding: "utf8" }), + function (key, value) { + if (key.slice(-4).toLowerCase() === "date") { + return new Date(value); + } + return value; + } + ) + ); + } else { + this.setData([]); + } - if (fs.existsSync(filename)) { - this.setData(JSON.parse(fs.readFileSync(filename, { encoding: 'utf8' }), function (key, value) { - if (key.slice(-4).toLowerCase() === 'date') { - return new Date(value); - } - return value; - })); - } - else { - this.setData([]); - } + this.filename = filename; + }, - this.filename = filename; - }, - - toJSON() { - return this.storage.fullData; - } - }); + toJSON() { + return this.storage.fullData; + }, + }); }); diff --git a/src/app/store/article.js b/src/app/store/article.js index 21ba5f2..95dfc45 100644 --- a/src/app/store/article.js +++ b/src/app/store/article.js @@ -1,51 +1,58 @@ -define([ - 'dstore/Trackable', - './FsMemory', - 'common/userConfig' -], function (Trackable, FsMemory, userConfig) { - var fs = require('fs'); - - var ArticleStore = FsMemory.createSubclass([ Trackable ], { - addSync(item) { - var existingItem = this.getSync(item.id); - if (existingItem) { - // Bail out rather than throwing an error - return existingItem; - } - - return this.inherited(arguments); - }, - - removeSync(id) { - var item = this.getSync(id); - if (item && item.archive) { - require('fs').unlinkSync(item.archive); - } - return this.inherited(arguments); - }, - - prune(feedId) { - 'use strict'; - const data = this.filter(function (article) { - return article.feedId === feedId && !article.isPinned; - }).sort([ { property: 'date' } ]).fetchSync(); - const numToRemove = data.length - userConfig.getOptions(feedId).maxTotal; - - for (let i = 0; i < numToRemove; i++) { - this.removeSync(data[i].id); - } - }, - - setData(data) { - data.forEach(function (article) { - if (article.pdf && !fs.existsSync(article.pdf)) { - delete article.pdf; - } - }); - - this.inherited(arguments); - } - }); - - return new ArticleStore(); +define(["dstore/Trackable", "./FsMemory", "common/userConfig"], function ( + Trackable, + FsMemory, + userConfig +) { + const ArticleStore = FsMemory.createSubclass([Trackable], { + addSync(item) { + const existingItem = this.getSync(item.id); + if (existingItem) { + // Bail out rather than throwing an error + return existingItem; + } + + return this.inherited(arguments); + }, + + removeSync(id) { + const item = this.getSync(id); + if (item && item.archive && electronApi.existsSync(item.archive)) { + electronApi.unlinkSync(item.archive); + } + return this.inherited(arguments); + }, + + prune(feedId) { + "use strict"; + + // Clean up any unreachable archive files + this.filter( + (article) => !!article.archive && !electronApi.existsSync(article.archive) + ).forEach((article) => { + delete article.archive; + }); + + // Remove old unpinned items beyond maximum + const data = this.filter((article) => article.feedId === feedId && !article.isPinned) + .sort([{ property: "date" }]) + .fetchSync(); + const numToRemove = data.length - userConfig.getOptions(feedId).maxTotal; + + for (let i = 0; i < numToRemove; i++) { + this.removeSync(data[i].id); + } + }, + + setData(data) { + data.forEach(function (article) { + if (article.pdf && !electronApi.existsSync(article.pdf)) { + delete article.pdf; + } + }); + + this.inherited(arguments); + }, + }); + + return new ArticleStore(); }); diff --git a/src/app/store/feed.js b/src/app/store/feed.js index cf2e5d9..33c0a7b 100644 --- a/src/app/store/feed.js +++ b/src/app/store/feed.js @@ -1,94 +1,98 @@ define([ - 'dstore/Trackable', - 'dstore/Tree', - './FsMemory', - 'common/userConfig', - 'dojo/i18n!../nls/main' + "dstore/Trackable", + "dstore/Tree", + "./FsMemory", + "common/userConfig", + "dojo/i18n!../nls/main", ], function (Trackable, Tree, FsMemory, userConfig, i18n) { - /** - * Manages hierarchy of categories and feeds. - */ - var FeedStore = FsMemory.createSubclass([ Trackable, Tree ], { - getChildren() { - var subcollection = this.inherited(arguments); - subcollection.queryLog = subcollection.queryLog.concat(this.queryLog.filter(function (args) { - return !('parent' in args.arguments[0]); - })); - return subcollection; - }, + /** + * Manages hierarchy of categories and feeds. + */ + const FeedStore = FsMemory.createSubclass([Trackable, Tree], { + getChildren() { + const subcollection = this.inherited(arguments); + subcollection.queryLog = subcollection.queryLog.concat( + this.queryLog.filter(function (args) { + return !("parent" in args.arguments[0]); + }) + ); + return subcollection; + }, - /** - * Returns a promise resolving to an array containing all feed (not folder) items under a given parent. - * If no parent is passed, returns all feeds in the store. - */ - getFeeds(item) { - var leaves = []; + /** + * Returns a promise resolving to an array containing all feed (not folder) items under a given parent. + * If no parent is passed, returns all feeds in the store. + */ + getFeeds(item) { + const leaves = []; - function processChild(child) { - if (this.mayHaveChildren(child)) { - this.getChildren(child).fetchSync().forEach(processChild, this); - } - else if (!child._system) { - leaves.push(child); - } - } + function processChild(child) { + if (this.mayHaveChildren(child)) { + this.getChildren(child).fetchSync().forEach(processChild, this); + } else if (!child._system) { + leaves.push(child); + } + } - if (item) { - processChild.call(this, item); - } - else { - this.getRootCollection().forEach(processChild, this); - } - return leaves; - }, + if (item) { + processChild.call(this, item); + } else { + this.getRootCollection().forEach(processChild, this); + } + return leaves; + }, - getOptions(item) { - return userConfig.getOptions(item.id); - }, + getOptions(item) { + return userConfig.getOptions(item.id); + }, - getUnread(item) { - // Unread state is maintained when write operations occur; this assumes pre-existing consistency. - return 'unread' in item ? item.unread : this.getFeeds(item).reduce((total, item) => { - return total + item.unread; - }, 0); - }, + getUnread(item) { + // Unread state is maintained when write operations occur; this assumes pre-existing consistency. + return "unread" in item + ? item.unread + : this.getFeeds(item).reduce((total, item) => { + return total + item.unread; + }, 0); + }, - mayHaveChildren(item) { - return !item.url && !item._system; - }, + mayHaveChildren(item) { + return !item.url && !item._system; + }, - setData(data) { - var items = [ { - id: 'pinned', - icon: 'thumb-tack', - parent: null, - title: i18n.pinned - }, { - id: 'unread', - icon: 'bolt', - parent: null, - title: i18n.unread - }, { - id: 'search', - icon: 'search', - parent: null, - title: i18n.searchResults - } ]; + setData(data) { + const items = [ + { + id: "pinned", + icon: "thumb-tack", + parent: null, + title: i18n.pinned, + }, + { + id: "unread", + icon: "bolt", + parent: null, + title: i18n.unread, + }, + { + id: "search", + icon: "search", + parent: null, + title: i18n.searchResults, + }, + ]; - items.forEach(function (item, i) { - Object.defineProperty(item, '_system', { value: items.length - i }); - data.push(item); - }); + items.forEach(function (item, i) { + Object.defineProperty(item, "_system", { value: items.length - i }); + data.push(item); + }); - this.inherited(arguments); - }, + this.inherited(arguments); + }, - toJSON() { - return this.storage.fullData.filter(function (item) { - return !item._system; - }); - } - }); + toJSON() { + return this.storage.fullData.filter((item) => !item._system); + }, + }); - return new FeedStore(); + return new FeedStore(); }); diff --git a/src/app/store/util.js b/src/app/store/util.js index 5efdb46..7ba6cc2 100644 --- a/src/app/store/util.js +++ b/src/app/store/util.js @@ -1,94 +1,104 @@ -'use strict'; -define([ - 'dojo/_base/lang', - 'dojo/aspect', - './article', - './feed', - '../retrieveFeed' -], function (lang, aspect, articleStore, feedStore, retrieveFeed) { - let skipRecalculate = false; +"use strict"; +define(["dojo/_base/lang", "dojo/aspect", "./article", "./feed", "../retrieveFeed"], function ( + lang, + aspect, + articleStore, + feedStore, + retrieveFeed +) { + let skipRecalculate = false; - function recalculateUnread(feedId) { - const feed = feedStore.getSync(feedId); - feed.unread = articleStore.filter({ feedId: feedId }).fetchSync().reduce((total, article) => { - return total + (article.isRead ? 0 : 1); - }, 0); - feedStore.putSync(feed); - } + function recalculateUnread(feedId) { + const feed = feedStore.getSync(feedId); + feed.unread = articleStore + .filter({ feedId: feedId }) + .fetchSync() + .reduce((total, article) => { + return total + (article.isRead ? 0 : 1); + }, 0); + feedStore.putSync(feed); + } - var util = { - incrementUnread(feedId, increment) { - const feed = feedStore.getSync(feedId); - feed.unread += increment; - feedStore.putSync(feed); - }, + const util = { + incrementUnread(feedId, increment) { + const feed = feedStore.getSync(feedId); + feed.unread += increment; + feedStore.putSync(feed); + }, - addArticles(articles, feed) { - skipRecalculate = true; - articles.forEach(function (article) { - articleStore.addSync(lang.mixin(article, { - feedId: feed.id, - id: feed.id + ':' + article.id - })); - }); - skipRecalculate = false; - recalculateUnread(feed.id); - }, + addArticles(articles, feed) { + skipRecalculate = true; + articles.forEach(function (article) { + articleStore.addSync( + lang.mixin(article, { + feedId: feed.id, + id: feed.id + ":" + article.id, + }) + ); + }); + skipRecalculate = false; + recalculateUnread(feed.id); + }, - addFeed(url, parent) { - return retrieveFeed(url).then(function (data) { - const feed = feedStore.addSync(lang.mixin({ - parent: parent, - unread: 0 - }, data.metadata)); - util.addArticles(data.articles, feed); - return feed; - }); - }, + addFeed(url, parent) { + return retrieveFeed(url).then(function (data) { + const feed = feedStore.addSync( + lang.mixin( + { + parent: parent, + unread: 0, + }, + data.metadata + ) + ); + util.addArticles(data.articles, feed); + return feed; + }); + }, - addFolder(name, parent) { - return feedStore.addSync({ title: name, parent: parent }); - }, + addFolder(name, parent) { + return feedStore.addSync({ title: name, parent: parent }); + }, - removeFeed(id) { - const articles = articleStore.filter({ feedId: id }).fetchSync(); - skipRecalculate = true; - for (let i = articles.length; i--;) { - articleStore.removeSync(articles[i].id); - } - skipRecalculate = false; - recalculateUnread(id); - feedStore.removeSync(id); - } - }; + removeFeed(id) { + const articles = articleStore.filter({ feedId: id }).fetchSync(); + skipRecalculate = true; + for (let i = articles.length; i--; ) { + articleStore.removeSync(articles[i].id); + } + skipRecalculate = false; + recalculateUnread(id); + feedStore.removeSync(id); + }, + }; - // Use aspect rather than events to update unread counts in feedStore based on articleStore write operations, - // since dstore doesn't provide enough info in events to be useful (no data in delete) + // Use aspect rather than events to update unread counts in feedStore based on articleStore write operations, + // since dstore doesn't provide enough info in events to be useful (no data in delete) - aspect.after(articleStore, 'addSync', function (article) { - // This handler will be hammered during mass article adding (for new feeds or periodic refreshes), - // so avoid incurring N recalculations when we only need 1 (addArticles calls recalculateUnread). - if (!skipRecalculate && !article.isRead) { - util.incrementUnread(article.feedId, 1); - } - return article; - }); + aspect.after(articleStore, "addSync", function (article) { + // This handler will be hammered during mass article adding (for new feeds or periodic refreshes), + // so avoid incurring N recalculations when we only need 1 (addArticles calls recalculateUnread). + if (!skipRecalculate && !article.isRead) { + util.incrementUnread(article.feedId, 1); + } + return article; + }); - aspect.before(articleStore, 'removeSync', function (id) { - const article = this.getSync(id); - if (!skipRecalculate && article && !article.isRead) { - util.incrementUnread(article.feedId, -1); - } - }); + aspect.before(articleStore, "removeSync", function (id) { + const article = this.getSync(id); + if (!skipRecalculate && article && !article.isRead) { + util.incrementUnread(article.feedId, -1); + } + }); - aspect.before(articleStore, 'putSync', function (article) { - // Unfortunately we need to do a full recount for the feed, since Memory doesn't protect/clone its objects - // (IOW it's typically too late to get the old value by the time `put` is called). - // Fortunately this path is far rarer than the path manually covered in the select handler above. - if (!skipRecalculate) { - recalculateUnread(article.feedId); - } - }); + aspect.before(articleStore, "putSync", function (article) { + // Unfortunately we need to do a full recount for the feed, since Memory doesn't protect/clone its objects + // (IOW it's typically too late to get the old value by the time `put` is called). + // Fortunately this path is far rarer than the path manually covered in the select handler above. + if (!skipRecalculate) { + recalculateUnread(article.feedId); + } + }); - return util; + return util; }); diff --git a/src/app/util.js b/src/app/util.js index 0a01a08..79a968e 100644 --- a/src/app/util.js +++ b/src/app/util.js @@ -1,93 +1,55 @@ -'use strict'; -define([ - 'dojo/_base/lang' -], function (lang) { - const parser = new DOMParser(); - const slice = Array.prototype.slice; +"use strict"; +define(["dojo/_base/lang"], function (lang) { + const parser = new DOMParser(); - return { - /** - * Sets the disabled state of any applicable direct children. - */ - disableChildren(parentNode, disabled) { - disabled = disabled !== false; - for (let i = parentNode.children.length; i--;) { - const child = parentNode.children[i]; - if ('disabled' in child) { - child.disabled = disabled; - } - } - }, + return { + /** + * Parses XML into a document object. Throws on parse error. + */ + parseXml: function (xml) { + xml = xml.slice(xml.indexOf(" { - args = args.concat(function (error, result) { - if (error) { - reject(error); - } - else { - resolve(result); - } - }); - - func.apply(this, args); - }); - }; - }, - - /** - * Flattens any nested objects into top-level keys with dot notation. - */ - flatten(obj) { - const toString = Object.prototype.toString; - let found = true; - while (found) { - found = false; - for (let key in obj) { - const nestedObj = obj[key]; - if (toString.call(nestedObj) !== '[object Object]') { - continue; - } - found = true; - for (let nestedKey in nestedObj) { - obj[key + '.' + nestedKey] = nestedObj[nestedKey]; - } - delete obj[key]; - } - } - return obj; - }, - - /** - * Scans an object for dot-delimited property names, and rearranges them into a nested structure. - */ - unflatten(obj) { - for (let key in obj) { - if (key.includes('.')) { - lang.setObject(key, obj[key], obj); - delete obj[key]; - } - } - return obj; - } - }; + /** + * Scans an object for dot-delimited property names, and rearranges them into a nested structure. + */ + unflatten(obj) { + for (let key in obj) { + if (key.includes(".")) { + lang.setObject(key, obj[key], obj); + delete obj[key]; + } + } + return obj; + }, + }; }); diff --git a/src/app/widget/articlePane.js b/src/app/widget/articlePane.js index 0c94350..97c56f7 100644 --- a/src/app/widget/articlePane.js +++ b/src/app/widget/articlePane.js @@ -1,119 +1,127 @@ -'use strict'; +"use strict"; define([ - 'dojo/on', - 'dijit/_WidgetBase', - 'dijit/_TemplatedMixin', - '../archive', - 'common/userConfig', - '../store/article', - '../store/feed', - 'dojo/i18n!../nls/main', - 'dojo/text!./templates/ArticlePane.html', - 'dojo/query' // Event delegation -], function (on, _WidgetBase, _TemplatedMixin, archive, userConfig, articleStore, feedStore, i18n, template) { - const sanitizeHtml = require('sanitize-html'); - - const activeDownloads = {}; - - var ArticlePane = _WidgetBase.createSubclass([ _TemplatedMixin ], { - baseClass: 'article', - i18n: i18n, - templateString: template, - - postCreate() { - on(this.downloadNode, 'click', this._onDownloadClick.bind(this)); - on(this.domNode, 'a:click', (event) => { - event.preventDefault(); - require('electron').shell.openExternal(event.target.href); - }); - - this.set('article', null); - }, - - _onDownloadClick(event) { - event.preventDefault(); - event.stopPropagation(); - - const article = this.article; - if (this.article.archive) { - archive.view(this.article.archive); - } - else if (!activeDownloads[article.id]) { - var isoDate = article.date.toISOString(); - var filename = isoDate.slice(0, isoDate.lastIndexOf('.')).replace(/:/g, '-') + '-' + - article.title.replace(/\W/g, '-').slice(0, 20) + '.mhtml'; - - activeDownloads[article.id] = archive.download(article.url, filename).then((filename) => { - article.archive = filename; - articleStore.putSync(article); - if (article === this.article) { - this._updateDownloadNode(); - } - }).always(function () { - delete activeDownloads[article.id]; - }); - - this._updateDownloadNode(); - } - }, - - _processHtml(html, sanitizeOptions) { - if (html.startsWith('')) { - html = html.slice(9, -3); - } - else { - html = html.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&'); - } - return sanitizeHtml(html, sanitizeOptions); - }, - - _setArticleAttr(article) { - this._set('article', article); - this.domNode.classList.toggle('hidden', !article); - - if (!article) { - return; - } - - this.domNode.scrollTop = 0; - this.titleNode.innerHTML = '' + this._processHtml(article.title) + ''; - this.metaNode.innerHTML = this._processHtml(article.author) + ' - ' + - this._processHtml(feedStore.getSync(article.feedId).title); - this._updateDownloadNode(); - - const options = userConfig.getOptions(article.feedId).allowImages ? { - allowedTags: sanitizeHtml.defaults.allowedTags.concat([ 'img' ]), - exclusiveFilter: function (frame) { - // Strip duplicated content caused by old TinyMCE bug - // Reference: http://www.electrictoolbox.com/tinymce-mcepaste-divs-webkit-browsers/ - return frame.tag === 'div' && frame.attribs['class'] === 'mcePaste'; - } - } : {}; - this.containerNode.innerHTML = this._processHtml(article.content, options); - - const links = this.domNode.getElementsByTagName('a'); - const numLinks = links.length; - // Iterate from 1 to skip download-to-PDF link - for (let i = 1; i < numLinks; i++) { - if (!links[i].innerHTML) { - // Remove empty links (such as those around images, if images are set to be filtered out) - links[i].remove(); - } - else { - links[i].title = links[i].href; - } - } - }, - - _updateDownloadNode() { - const article = this.article; - const downloadNode = this.downloadNode; - downloadNode.className = 'fa fa-' + (article.archive ? 'book' : - activeDownloads[article.id] ? 'hourglass' : 'download'); - downloadNode.title = article.archive ? i18n.openArchivedPage : - activeDownloads[article.id] ? '' : i18n.downloadCompletePage; - } - }); - - return new ArticlePane({}, 'article'); + "dojo/on", + "dijit/_WidgetBase", + "dijit/_TemplatedMixin", + "common/userConfig", + "../store/article", + "../store/feed", + "dojo/i18n!../nls/main", + "dojo/text!./templates/ArticlePane.html", + "dojo/query", // Event delegation +], function ( + on, + _WidgetBase, + _TemplatedMixin, + userConfig, + articleStore, + feedStore, + i18n, + template +) { + const activeDownloads = {}; + + const ArticlePane = _WidgetBase.createSubclass([_TemplatedMixin], { + baseClass: "article", + i18n: i18n, + templateString: template, + + postCreate() { + on(this.downloadNode, "click", this._onDownloadClick.bind(this)); + this.set("article", null); + }, + + _onDownloadClick(event) { + event.preventDefault(); + event.stopPropagation(); + + const article = this.article; + if (this.article.archive) { + electronApi.viewArchive(this.article.archive); + } else if (!activeDownloads[article.id]) { + const isoDate = article.date.toISOString(); + const filename = + isoDate.slice(0, isoDate.lastIndexOf(".")).replace(/:/g, "-") + + "-" + + article.title.replace(/\W/g, "-").slice(0, 20) + + ".mhtml"; + + activeDownloads[article.id] = electronApi + .downloadArchive(article.url, filename) + .then( + (filename) => { + article.archive = filename; + articleStore.putSync(article); + }, + (error) => { + console.error("Error downloading:", error); + } + ) + .finally(() => { + delete activeDownloads[article.id]; + if (article === this.article) this._updateDownloadNode(); + }); + + this._updateDownloadNode(); + } + }, + + _processHtml(html, allowImages) { + if (html.startsWith("")) { + html = html.slice(9, -3); + } else { + html = html.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&"); + } + return electronApi.sanitizeHtml(html, allowImages); + }, + + _setArticleAttr(article) { + this._set("article", article); + this.domNode.classList.toggle("hidden", !article); + + if (!article) { + return; + } + + this.domNode.scrollTop = 0; + this.titleNode.innerHTML = + '' + this._processHtml(article.title) + ""; + this.metaNode.innerHTML = this._processHtml( + `${article.author} - ${feedStore.getSync(article.feedId).title}` + ); + this._updateDownloadNode(); + + this.containerNode.innerHTML = this._processHtml( + article.content, + userConfig.getOptions(article.feedId).allowImages + ); + + const links = this.domNode.getElementsByTagName("a"); + const numLinks = links.length; + // Iterate from 1 to skip download-to-PDF link + for (let i = 1; i < numLinks; i++) { + if (!links[i].innerHTML) { + // Remove empty links (such as those around images, if images are set to be filtered out) + links[i].remove(); + } else { + links[i].title = links[i].href; + } + } + }, + + _updateDownloadNode() { + const article = this.article; + const downloadNode = this.downloadNode; + downloadNode.className = + "fa fa-" + + (article.archive ? "book" : activeDownloads[article.id] ? "hourglass" : "download"); + downloadNode.title = article.archive + ? i18n.openArchivedPage + : activeDownloads[article.id] + ? i18n.downloading + : i18n.downloadCompletePage; + }, + }); + + return new ArticlePane({}, "article"); }); diff --git a/src/app/widget/form/Add.js b/src/app/widget/form/Add.js index 3f13383..a2fb432 100644 --- a/src/app/widget/form/Add.js +++ b/src/app/widget/form/Add.js @@ -1,31 +1,31 @@ define([ - './_Base', - './_ParentFolderMixin', - 'dojo/i18n!../../nls/main', - 'dojo/text!./templates/Add.html', - 'dojo/text!./templates/partials/parent.html' + "./_Base", + "./_ParentFolderMixin", + "dojo/i18n!../../nls/main", + "dojo/text!./templates/Add.html", + "dojo/text!./templates/partials/parent.html", ], function (_Base, _ParentFolderMixin, i18n, template, parentPartial) { - return _Base.createSubclass([ _ParentFolderMixin ], { - templateString: template, - partials: { - parentPartial: parentPartial - }, + return _Base.createSubclass([_ParentFolderMixin], { + templateString: template, + partials: { + parentPartial: parentPartial, + }, - _getValueAttr: function () { - var obj = this.inherited(arguments); - var selectedParent = Object.keys(this.folderGrid.selection)[0]; - obj.parent = typeof selectedParent === 'undefined' ? null : +selectedParent; - return obj; - }, + _getValueAttr: function () { + const obj = this.inherited(arguments); + const selectedParent = Object.keys(this.folderGrid.selection)[0]; + obj.parent = typeof selectedParent === "undefined" ? null : +selectedParent; + return obj; + }, - reset: function (mode, parent) { - this.headingNode.textContent = i18n[mode === 'feed' ? 'addFeed' : 'addFolder']; - this.labelNode.textContent = i18n[mode === 'feed' ? 'feedUrl' : 'folderName']; - this.inputNode.value = ''; - this.folderGrid.clearSelection(); - if (parent) { - this.folderGrid.select(parent); - } - } - }); + reset: function (mode, parent) { + this.headingNode.textContent = i18n[mode === "feed" ? "addFeed" : "addFolder"]; + this.labelNode.textContent = i18n[mode === "feed" ? "feedUrl" : "folderName"]; + this.inputNode.value = ""; + this.folderGrid.clearSelection(); + if (parent) { + this.folderGrid.select(parent); + } + }, + }); }); diff --git a/src/app/widget/form/Feed.js b/src/app/widget/form/Feed.js index fd2cdf5..c662e94 100644 --- a/src/app/widget/form/Feed.js +++ b/src/app/widget/form/Feed.js @@ -1,60 +1,61 @@ define([ - 'dojo/dom-construct', - 'dojo/on', - './_FeedBase', - 'common/userConfig', - 'dojo/i18n!../../nls/main', - 'dojo/text!./templates/Feed.html' + "dojo/dom-construct", + "dojo/on", + "./_FeedBase", + "common/userConfig", + "dojo/i18n!../../nls/main", + "dojo/text!./templates/Feed.html", ], function (domConstruct, on, _FeedBase, userConfig, i18n, template) { - var slice = Array.prototype.slice; + const slice = Array.prototype.slice; - return _FeedBase.createSubclass({ - templateString: template, - deletePrompt: i18n.deleteFeedPrompt, + return _FeedBase.createSubclass({ + templateString: template, + deletePrompt: i18n.deleteFeedPrompt, - buildRendering() { - this.inherited(arguments); - this._overrideCheckboxes = []; + buildRendering() { + this.inherited(arguments); + this._overrideCheckboxes = []; - // Each input that is overridable per-feed will have a checkbox to enable/disable the override - var nodes = slice.call(this.overridesNode.getElementsByClassName(this.baseClass + '-row')); - nodes.forEach((node) => { - this._overrideCheckboxes.push(domConstruct.create('input', { - type: 'checkbox' - }, node, 'first')); - }); + // Each input that is overridable per-feed will have a checkbox to enable/disable the override + const nodes = slice.call(this.overridesNode.getElementsByClassName(this.baseClass + "-row")); + nodes.forEach((node) => { + this._overrideCheckboxes.push( + domConstruct.create("input", { type: "checkbox" }, node, "first") + ); + }); - this.own(on(this.overridesNode, 'change', function (event) { - var target = event.target; - if (!target.name) { - target.parentNode.lastElementChild.disabled = !target.checked; - } - })); - }, + this.own( + on(this.overridesNode, "change", function (event) { + const target = event.target; + if (!target.name) { + target.parentNode.lastElementChild.disabled = !target.checked; + } + }) + ); + }, - _getValueAttr() { - var value = this.inherited(arguments); - // If none of the overrides are enabled, ensure that feed config is cleared - value.config = value.config || {}; - return value; - }, + _getValueAttr() { + const value = this.inherited(arguments); + // If none of the overrides are enabled, ensure that feed config is cleared + value.config = value.config || {}; + return value; + }, - _setValueAttr(value) { - var defaultOptions = userConfig.getOptions(); - this.inherited(arguments); - this._overrideCheckboxes.forEach(function (checkbox) { - var input = checkbox.parentNode.lastElementChild; - if (input.name in value) { - checkbox.checked = true; - input.disabled = false; - } - else { - var key = input.name.slice(input.name.indexOf('.') + 1); - checkbox.checked = false; - input.disabled = true; - input[input.type === 'checkbox' ? 'checked' : 'value'] = defaultOptions[key]; - } - }, this); - } - }); + _setValueAttr(value) { + const defaultOptions = userConfig.getOptions(); + this.inherited(arguments); + this._overrideCheckboxes.forEach(function (checkbox) { + const input = checkbox.parentNode.lastElementChild; + if (input.name in value) { + checkbox.checked = true; + input.disabled = false; + } else { + const key = input.name.slice(input.name.indexOf(".") + 1); + checkbox.checked = false; + input.disabled = true; + input[input.type === "checkbox" ? "checked" : "value"] = defaultOptions[key]; + } + }, this); + }, + }); }); diff --git a/src/app/widget/form/Folder.js b/src/app/widget/form/Folder.js index d443605..88153f4 100644 --- a/src/app/widget/form/Folder.js +++ b/src/app/widget/form/Folder.js @@ -1,10 +1,10 @@ -define([ - './_FeedBase', - 'dojo/i18n!../../nls/main', - 'dojo/text!./templates/Folder.html' -], function (_FeedBase, i18n, template) { - return _FeedBase.createSubclass({ - templateString: template, - deletePrompt: i18n.deleteFolderPrompt - }); +define(["./_FeedBase", "dojo/i18n!../../nls/main", "dojo/text!./templates/Folder.html"], function ( + _FeedBase, + i18n, + template +) { + return _FeedBase.createSubclass({ + templateString: template, + deletePrompt: i18n.deleteFolderPrompt, + }); }); diff --git a/src/app/widget/form/Preferences.js b/src/app/widget/form/Preferences.js index e4f233d..7dea36e 100644 --- a/src/app/widget/form/Preferences.js +++ b/src/app/widget/form/Preferences.js @@ -1,14 +1,14 @@ define([ - './_Base', - 'dojo/text!./templates/Preferences.html', - 'dojo/text!./templates/partials/actions.html', - 'dojo/text!./templates/partials/overrides.html' + "./_Base", + "dojo/text!./templates/Preferences.html", + "dojo/text!./templates/partials/actions.html", + "dojo/text!./templates/partials/overrides.html", ], function (_Base, template, actionsPartial, overridesPartial) { - return _Base.createSubclass({ - templateString: template, - partials: { - actionsPartial: actionsPartial, - overridesPartial: overridesPartial - } - }); + return _Base.createSubclass({ + templateString: template, + partials: { + actionsPartial: actionsPartial, + overridesPartial: overridesPartial, + }, + }); }); diff --git a/src/app/widget/form/Search.js b/src/app/widget/form/Search.js index 8bacf8e..5562f2d 100644 --- a/src/app/widget/form/Search.js +++ b/src/app/widget/form/Search.js @@ -1,21 +1,19 @@ -define([ - './_Base', - 'dojo/i18n!../../nls/main', - 'dojo/text!./templates/Search.html' -], function (_Base, i18n, template) { - return _Base.createSubclass({ - templateString: template, +define(["./_Base", "dojo/i18n!../../nls/main", "dojo/text!./templates/Search.html"], function ( + _Base, + i18n, + template +) { + return _Base.createSubclass({ + templateString: template, - validate: function () { - var queryInput = this.domNode.elements.query; - try { - // jshint nonew: false - new RegExp(queryInput.value); - } - catch (error) { - return false; - } - return true; - } - }); + validate: function () { + const queryInput = this.domNode.elements.query; + try { + new RegExp(queryInput.value); + } catch (error) { + return false; + } + return true; + }, + }); }); diff --git a/src/app/widget/form/_Base.js b/src/app/widget/form/_Base.js index 748fcc0..c33a83a 100644 --- a/src/app/widget/form/_Base.js +++ b/src/app/widget/form/_Base.js @@ -1,89 +1,90 @@ define([ - 'dojo/_base/declare', - 'dojo/on', - 'dojo/string', - 'dijit/_WidgetBase', - 'dijit/_TemplatedMixin', - '../../util', - 'dojo/i18n!../../nls/main' + "dojo/_base/declare", + "dojo/on", + "dojo/string", + "dijit/_WidgetBase", + "dijit/_TemplatedMixin", + "../../util", + "dojo/i18n!../../nls/main", ], function (declare, on, string, _WidgetBase, _TemplatedMixin, util, i18n) { - /** - * A form widget managing a pure HTML form, rather than input widgets. - */ - return declare([ _WidgetBase, _TemplatedMixin ], { - baseClass: 'Form', - i18n: i18n, + /** + * A form widget managing a pure HTML form, rather than input widgets. + */ + return declare([_WidgetBase, _TemplatedMixin], { + baseClass: "Form", + i18n: i18n, - /** Object containing partial templates to be inserted before _TemplatedMixin#buildRendering is called */ - partials: null, + /** Object containing partial templates to be inserted before _TemplatedMixin#buildRendering is called */ + partials: null, - value: null, + value: null, - buildRendering() { - if (this.partials) { - this.templateString = string.substitute(this.templateString, this.partials, function (value, key) { - // Allow substitutions to fail, to be processed during normal template rendering - return typeof value === 'undefined' ? '${' + key + '}' : value; - }); - } + buildRendering() { + if (this.partials) { + this.templateString = string.substitute( + this.templateString, + this.partials, + function (value, key) { + // Allow substitutions to fail, to be processed during normal template rendering + return typeof value === "undefined" ? "${" + key + "}" : value; + } + ); + } - this.inherited(arguments); + this.inherited(arguments); - this.own( - on(this.domNode, 'submit', function (event) { - event.preventDefault(); - }) - ); - }, + this.own( + on(this.domNode, "submit", function (event) { + event.preventDefault(); + }) + ); + }, - _getValueAttr() { - var elements = this.domNode.elements; - var values = {}; + _getValueAttr() { + const elements = this.domNode.elements; + const values = {}; - // Implement serialization rather than using dojo/dom-form for the following special features: - // * Checkboxes -> booleans, not strings (only ever expect one checkbox per name) - // * Include checkbox fields even if unchecked (set to false) - // * Coerce numeric values to numbers - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - if (!element.name || element.disabled) { - continue; - } - var value = element[element.type === 'checkbox' ? 'checked' : 'value']; - if (typeof value === 'string' && !isNaN(value)) { - value = +value; - } - values[element.name] = value; - } - return util.unflatten(values); - }, + // Implement serialization rather than using dojo/dom-form for the following special features: + // * Checkboxes -> booleans, not strings (only ever expect one checkbox per name) + // * Include checkbox fields even if unchecked (set to false) + // * Coerce numeric values to numbers + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + if (!element.name || element.disabled) { + continue; + } + let value = element[element.type === "checkbox" ? "checked" : "value"]; + if (typeof value === "string" && !isNaN(value)) { + value = +value; + } + values[element.name] = value; + } + return util.unflatten(values); + }, - _setValueAttr(value) { - this.domNode.reset(); - var flattenedValue = util.flatten(value); - for (var key in flattenedValue) { - var input = this.domNode.elements[key]; - if (input) { - this._setInputValue(input, flattenedValue[key]); - } - } - }, + _setValueAttr(value) { + this.domNode.reset(); + const flattenedValue = util.flatten(value); + for (const key in flattenedValue) { + const input = this.domNode.elements[key]; + if (input) this._setInputValue(input, flattenedValue[key]); + } + }, - _setInputValue(input, value) { - // This only has enough code to support cases known to be used in the UI - if (input.type === 'checkbox') { - input.checked = !!value; - } - else { - input.value = value; - } - }, + _setInputValue(input, value) { + // This only has enough code to support cases known to be used in the UI + if (input.type === "checkbox") { + input.checked = !!value; + } else { + input.value = value; + } + }, - _onCancelClick() { - this.emit('cancel', { - bubbles: false, - cancelable: false - }); - } - }); + _onCancelClick() { + this.emit("cancel", { + bubbles: false, + cancelable: false, + }); + }, + }); }); diff --git a/src/app/widget/form/_Confirm.js b/src/app/widget/form/_Confirm.js index 1f790b4..752e67c 100644 --- a/src/app/widget/form/_Confirm.js +++ b/src/app/widget/form/_Confirm.js @@ -1,18 +1,15 @@ -define([ - './_Base', - 'dojo/text!./templates/_Confirm.html' -], function (_Base, template) { - return _Base.createSubclass({ - templateString: template, +define(["./_Base", "dojo/text!./templates/_Confirm.html"], function (_Base, template) { + return _Base.createSubclass({ + templateString: template, - _setMessageAttr: function (message) { - this._set('message', message); - this.messageNode.textContent = message; - }, + _setMessageAttr: function (message) { + this._set("message", message); + this.messageNode.textContent = message; + }, - _setTitleAttr: function (title) { - this._set('title', title); - this.titleNode.textContent = title; - } - }); + _setTitleAttr: function (title) { + this._set("title", title); + this.titleNode.textContent = title; + }, + }); }); diff --git a/src/app/widget/form/_FeedBase.js b/src/app/widget/form/_FeedBase.js index 1f1b87d..c4e6308 100644 --- a/src/app/widget/form/_FeedBase.js +++ b/src/app/widget/form/_FeedBase.js @@ -1,46 +1,53 @@ define([ - './_Base', - './_ParentFolderMixin', - './modal', - 'dojo/i18n!../../nls/main', - 'dojo/text!./templates/partials/actions.html', - 'dojo/text!./templates/partials/overrides.html', - 'dojo/text!./templates/partials/parent.html' -], function (_Base, _ParentFolderMixin, modal, i18n, actionsPartial, overridesPartial, parentPartial) { - return _Base.createSubclass([ _ParentFolderMixin ], { - deletePrompt: '', - folderCollection: null, + "./_Base", + "./_ParentFolderMixin", + "./modal", + "dojo/i18n!../../nls/main", + "dojo/text!./templates/partials/actions.html", + "dojo/text!./templates/partials/overrides.html", + "dojo/text!./templates/partials/parent.html", +], function ( + _Base, + _ParentFolderMixin, + modal, + i18n, + actionsPartial, + overridesPartial, + parentPartial +) { + return _Base.createSubclass([_ParentFolderMixin], { + deletePrompt: "", + folderCollection: null, - partials: { - actionsPartial: actionsPartial, - overridesPartial: overridesPartial, - parentPartial: parentPartial - }, + partials: { + actionsPartial: actionsPartial, + overridesPartial: overridesPartial, + parentPartial: parentPartial, + }, - _onDeleteClick() { - modal.confirm(i18n.areYouSure, this.deletePrompt).then(() => { - this.emit('delete', { - bubbles: false, - cancelable: false - }); - this._onCancelClick(); - }); - }, + _onDeleteClick() { + modal.confirm(i18n.areYouSure, this.deletePrompt).then(() => { + this.emit("delete", { + bubbles: false, + cancelable: false, + }); + this._onCancelClick(); + }); + }, - _getValueAttr() { - var obj = this.inherited(arguments); - var selectedParent = Object.keys(this.folderGrid.selection)[0]; - // Assume obj.feed already includes feed/folder item data e.g. title - obj.feed.parent = typeof selectedParent === 'undefined' ? null : +selectedParent; - return obj; - }, + _getValueAttr() { + const obj = this.inherited(arguments); + const selectedParent = Object.keys(this.folderGrid.selection)[0]; + // Assume obj.feed already includes feed/folder item data e.g. title + obj.feed.parent = typeof selectedParent === "undefined" ? null : +selectedParent; + return obj; + }, - _setValueAttr(value) { - this.folderGrid.clearSelection(); - if (value.feed.parent) { - this.folderGrid.select(value.feed.parent); - } - this.inherited(arguments); - } - }); + _setValueAttr(value) { + this.folderGrid.clearSelection(); + if (value.feed.parent) this.folderGrid.select(value.feed.parent); + + this.inherited(arguments); + }, + }); }); diff --git a/src/app/widget/form/_ParentFolderMixin.js b/src/app/widget/form/_ParentFolderMixin.js index 77de8f8..ccf06a9 100644 --- a/src/app/widget/form/_ParentFolderMixin.js +++ b/src/app/widget/form/_ParentFolderMixin.js @@ -1,41 +1,39 @@ -define([ - 'dojo/_base/declare', - '../../grid/feed' -], function (declare, feedGrid) { - /** Mixin designed for use with the parent partial. */ - return declare(null, { - buildRendering() { - this.inherited(arguments); - var grid = this.folderGrid = new feedGrid.constructor({ - shouldExpand: function () { - return true; - }, - showUnread: false - }, this.folderGridNode); - this.own(grid); - }, +define(["dojo/_base/declare", "../../grid/feed"], function (declare, feedGrid) { + /** Mixin designed for use with the parent partial. */ + return declare(null, { + buildRendering() { + this.inherited(arguments); + const grid = (this.folderGrid = new feedGrid.constructor( + { + shouldExpand: function () { + return true; + }, + showUnread: false, + }, + this.folderGridNode + )); + this.own(grid); + }, - startup() { - if (this._started) { - return; - } + startup() { + if (this._started) return; - this.inherited(arguments); - this.folderGrid.startup(); - }, + this.inherited(arguments); + this.folderGrid.startup(); + }, - resize() { - this.inherited(arguments); - this.folderGrid.resize(); - }, + resize() { + this.inherited(arguments); + this.folderGrid.resize(); + }, - _setFolderCollectionAttr(collection) { - this._set('folderCollection', collection); - this.folderGrid.set('collection', collection); - }, + _setFolderCollectionAttr(collection) { + this._set("folderCollection", collection); + this.folderGrid.set("collection", collection); + }, - _onTopLevelClick() { - this.folderGrid.clearSelection(); - } - }); + _onTopLevelClick() { + this.folderGrid.clearSelection(); + }, + }); }); diff --git a/src/app/widget/form/modal.js b/src/app/widget/form/modal.js index 92bb431..465681b 100644 --- a/src/app/widget/form/modal.js +++ b/src/app/widget/form/modal.js @@ -1,137 +1,146 @@ -'use strict'; -define([ - 'dojo/Deferred', - 'dojo/dom-construct', - 'dojo/on', - './_Confirm' -], function (Deferred, domConstruct, on, Confirm) { - const ipc = require('electron').ipcRenderer; - const slice = Array.prototype.slice; - - function findTabbableElements(parentNode) { - var matches = slice.call(parentNode.querySelectorAll('button,input,select,textarea,a[href],[tabindex]')); - return matches.filter(function (node) { - return node.tabIndex !== -1; - }); - } - - const underlayNode = domConstruct.create('div', { - className: 'modal-underlay' - }); - - const stack = []; - const Z_INCREMENT = 1000; - - let focusListener; - let z = 0; - - function hide() { - var modal = stack.pop(); - modal.listeners.forEach(function (listener) { - listener.remove(); - }); - modal.node.remove(); - z -= Z_INCREMENT; - underlayNode.style.zIndex = z; - - if (!z) { - ipc.send('menu-enable', true); - underlayNode.remove(); - focusListener.remove(); - } - } - - function handleKeys(event) { - if (event.keyCode === 9) { - var info = stack[stack.length - 1]; - if (event.shiftKey && event.target === info.first) { - info.last.focus(); - event.preventDefault(); - } - else if (document.activeElement === document.body || (!event.shiftKey && event.target === info.last)) { - info.first.focus(); - event.preventDefault(); - } - } - else if (event.keyCode === 27) { - stack[stack.length - 1].widget._onCancelClick(); - } - } - - const confirmWidget = new Confirm(); - - var modal = { - /** - * Shows a modal dialog containing a form widget. - * Does not destroy the form widget when the dialog is dismissed. - * - * @param formWidget A widget extending app/widget/form/_Base - * @return Promise resolving if the user submits the form, or rejecting if the user cancels - */ - show(formWidget) { - z += Z_INCREMENT; - if (!stack.length) { - ipc.send('menu-enable', false); - document.body.appendChild(underlayNode); - focusListener = on.pausable(document.body, 'keydown', handleKeys); - } - underlayNode.style.zIndex = z; - - const containerNode = domConstruct.create('div', { - className: 'modal-container' - }, document.body); - const modalNode = domConstruct.create('div', { - class: 'modal', - style: { zIndex: z } - }, containerNode); - modalNode.appendChild(formWidget.domNode); - - if (!formWidget._started) { - formWidget.startup(); - } - else if (formWidget.resize) { - formWidget.resize(); - } - - const tabbableElements = findTabbableElements(modalNode); - const firstTabbableElement = tabbableElements[0]; - const lastTabbableElement = tabbableElements[tabbableElements.length - 1]; - - // This triggers focusin before we've added to the stack, so avoid handling this event - focusListener.pause(); - firstTabbableElement.focus(); - focusListener.resume(); - - const dfd = new Deferred(); - - const listeners = [ - on(formWidget, 'submit', function () { - if (!formWidget.validate || formWidget.validate()) { - dfd.resolve(formWidget.get('value')); - } - }), - on(formWidget, 'cancel', function () { - dfd.reject(); - }) - ]; - - stack.push({ - first: firstTabbableElement, - last: lastTabbableElement, - listeners: listeners, - node: containerNode, - widget: formWidget - }); - - dfd.promise.always(hide); - return dfd.promise; - }, - - confirm(title, message) { - confirmWidget.set('title', title); - confirmWidget.set('message', message); - return modal.show(confirmWidget); - } - }; - return modal; +"use strict"; +define(["dojo/Deferred", "dojo/dom-construct", "dojo/on", "./_Confirm"], function ( + Deferred, + domConstruct, + on, + Confirm +) { + const slice = Array.prototype.slice; + + function findTabbableElements(parentNode) { + const matches = slice.call( + parentNode.querySelectorAll("button,input,select,textarea,a[href],[tabindex]") + ); + return matches.filter(function (node) { + return node.tabIndex !== -1; + }); + } + + const underlayNode = domConstruct.create("div", { + className: "modal-underlay", + }); + + const stack = []; + const Z_INCREMENT = 1000; + + let focusListener; + let z = 0; + + function hide() { + const modal = stack.pop(); + modal.listeners.forEach(function (listener) { + listener.remove(); + }); + modal.node.remove(); + z -= Z_INCREMENT; + underlayNode.style.zIndex = z; + + if (!z) { + electronApi.setMenuEnabled(true); + underlayNode.remove(); + focusListener.remove(); + } + } + + function handleKeys(event) { + if (event.keyCode === 9) { + const info = stack[stack.length - 1]; + if (event.shiftKey && event.target === info.first) { + info.last.focus(); + event.preventDefault(); + } else if ( + document.activeElement === document.body || + (!event.shiftKey && event.target === info.last) + ) { + info.first.focus(); + event.preventDefault(); + } + } else if (event.keyCode === 27) { + stack[stack.length - 1].widget._onCancelClick(); + } + } + + const confirmWidget = new Confirm(); + + const modal = { + /** + * Shows a modal dialog containing a form widget. + * Does not destroy the form widget when the dialog is dismissed. + * + * @param formWidget A widget extending app/widget/form/_Base + * @return Promise resolving if the user submits the form, or rejecting if the user cancels + */ + show(formWidget) { + z += Z_INCREMENT; + if (!stack.length) { + electronApi.setMenuEnabled(false); + document.body.appendChild(underlayNode); + focusListener = on.pausable(document.body, "keydown", handleKeys); + } + underlayNode.style.zIndex = z; + + const containerNode = domConstruct.create( + "div", + { + className: "modal-container", + }, + document.body + ); + const modalNode = domConstruct.create( + "div", + { + class: "modal", + style: { zIndex: z }, + }, + containerNode + ); + modalNode.appendChild(formWidget.domNode); + + if (!formWidget._started) { + formWidget.startup(); + } else if (formWidget.resize) { + formWidget.resize(); + } + + const tabbableElements = findTabbableElements(modalNode); + const firstTabbableElement = tabbableElements[0]; + const lastTabbableElement = tabbableElements[tabbableElements.length - 1]; + + // This triggers focusin before we've added to the stack, so avoid handling this event + focusListener.pause(); + firstTabbableElement.focus(); + focusListener.resume(); + + const dfd = new Deferred(); + + const listeners = [ + on(formWidget, "submit", function () { + if (!formWidget.validate || formWidget.validate()) { + dfd.resolve(formWidget.get("value")); + } + }), + on(formWidget, "cancel", function () { + dfd.reject(); + }), + ]; + + stack.push({ + first: firstTabbableElement, + last: lastTabbableElement, + listeners: listeners, + node: containerNode, + widget: formWidget, + }); + + dfd.promise.always(hide); + return dfd.promise; + }, + + confirm(title, message) { + confirmWidget.set("title", title); + confirmWidget.set("message", message); + return modal.show(confirmWidget); + }, + }; + return modal; }); diff --git a/src/browser/archive.js b/src/browser/archive.js index e104bed..f227aec 100644 --- a/src/browser/archive.js +++ b/src/browser/archive.js @@ -1,69 +1,54 @@ -'use strict'; -const fs = require('fs'); -const join = require('path').join; -const electron = require('electron'); -const BrowserWindow = electron.BrowserWindow; -const fileUrl = require('file-url'); +"use strict"; +const { existsSync, mkdirSync } = require("fs"); +const { join } = require("path"); +const { app, BrowserWindow, shell } = require("electron"); +const fileUrl = require("file-url"); exports.download = function (url, filename) { - let archiveWindow = new BrowserWindow({ - show: false, - webPreferences: { - javascript: false, - nodeIntegration: false - } - }); - let webContents = archiveWindow.webContents; - - const promise = new Promise(function (resolve, reject) { - webContents.once('did-finish-load', function () { - const saveDir = join(electron.app.getPath('userData'), 'downloadedPages'); - if (!fs.existsSync(saveDir)) { - fs.mkdirSync(saveDir); - } - - const absoluteFilename = join(saveDir, filename); - webContents.savePage(absoluteFilename, 'MHTML', function (err) { - if (err) { - return reject(err); - } - resolve(absoluteFilename); - }); - }); - }); - - function closeWindow() { - archiveWindow.destroy(); - archiveWindow = webContents = null; - } - - promise.then(closeWindow, closeWindow); - - archiveWindow.loadURL(url); - return promise; + let archiveWindow = new BrowserWindow({ + show: false, + webPreferences: { + javascript: false, + }, + }); + + return archiveWindow + .loadURL(url) + .then(() => { + const saveDir = join(app.getPath("userData"), "downloadedPages"); + if (!existsSync(saveDir)) mkdirSync(saveDir); + + const absoluteFilename = join(saveDir, filename); + return archiveWindow.webContents + .savePage(absoluteFilename, "MHTML") + .then(() => absoluteFilename); + }) + .finally(() => { + archiveWindow.destroy(); + archiveWindow = null; + }); }; exports.view = function (filename) { - const size = BrowserWindow.getFocusedWindow().getSize(); - - let archiveWindow = new BrowserWindow({ - width: size[0], - height: size[1], - webPreferences: { - javascript: false, - nodeIntegration: false - } - }); - archiveWindow.setMenu(null); - archiveWindow.loadURL(fileUrl(filename)); - - archiveWindow.on('closed', function () { - archiveWindow = null; - }); - - archiveWindow.webContents.on('will-navigate', function (event, url) { - // Open links from downloaded pages in user's default browser - event.preventDefault(); - electron.shell.openExternal(url); - }); + const [width, height] = BrowserWindow.getFocusedWindow().getSize(); + + let archiveWindow = new BrowserWindow({ + width, + height, + webPreferences: { + javascript: false, + }, + }); + archiveWindow.setMenu(null); + archiveWindow.loadURL(fileUrl(filename)); + + archiveWindow.on("closed", function () { + archiveWindow = null; + }); + + archiveWindow.webContents.on("will-navigate", function (event, url) { + // Open links from downloaded pages in user's default browser + event.preventDefault(); + shell.openExternal(url); + }); }; diff --git a/src/browser/main.js b/src/browser/main.js index 1abbeed..7f70008 100644 --- a/src/browser/main.js +++ b/src/browser/main.js @@ -1,81 +1,70 @@ -'use strict'; -const pathUtil = require('path'); +"use strict"; +require("./preload-handlers"); +const pathUtil = require("path"); -const electron = require('electron'); -const app = electron.app; -const BrowserWindow = electron.BrowserWindow; -const Menu = electron.Menu; -const ipc = electron.ipcMain; +const { BrowserWindow, Menu, app, ipcMain, session, shell } = require("electron"); -const archive = require('./archive'); -const menuTemplate = require('./menu'); +const menuTemplate = require("./menu"); -let menu; -let mainWindow; +const isPrimaryInstance = app.requestSingleInstanceLock(); +if (!isPrimaryInstance) app.quit(); -const shouldQuit = app.makeSingleInstance(function () { - if (mainWindow) { - if (mainWindow.isMinimized) { - mainWindow.restore(); - } - mainWindow.focus(); - } -}); - -if (shouldQuit) { - app.quit(); -} - -if (process.argv.indexOf('--portable') > -1) { - app.setPath('userData', pathUtil.join(pathUtil.dirname(app.getPath('exe')), 'userData')); +if (process.argv.indexOf("--portable") > -1) { + app.setPath("userData", pathUtil.join(pathUtil.dirname(app.getPath("exe")), "userData")); } -app.on('window-all-closed', function () { - app.quit(); +app.on("window-all-closed", () => { + app.quit(); }); -app.on('ready', function () { - // Load userConfig after ready event fires with userData folder set, - // so the folder exists and userConfig loads the right file - const userConfig = require('../common/userConfig'); +app.whenReady().then(() => { + session.defaultSession.webRequest.onHeadersReceived((details, cb) => { + cb({ + responseHeaders: { + ...details.responseHeaders, + "Content-Security-Policy": "script-src 'self' 'unsafe-inline' 'unsafe-eval'", + }, + }); + }); - const size = userConfig.uiOptions.size; - mainWindow = new BrowserWindow({ - center: true, - title: 'Electern', - minWidth: 750, - minHeight: 500, - width: size[0], - height: size[1] - }); + // Load userConfig after ready event fires with userData folder set, + // so the folder exists and userConfig loads the right file + const userConfig = require("../common/userConfig"); - menu = Menu.buildFromTemplate(menuTemplate); - Menu.setApplicationMenu(menu); - mainWindow.loadURL('file://' + require('path').resolve(__dirname, '..', 'index.html')); + const size = userConfig.uiOptions.size; + const mainWindow = new BrowserWindow({ + center: true, + title: "Electern", + minWidth: 750, + minHeight: 500, + width: size[0], + height: size[1], + webPreferences: { + preload: pathUtil.join(__dirname, "preload.js"), + }, + }); - mainWindow.on('closed', function () { - mainWindow = null; - }); -}); + mainWindow.webContents.on("will-navigate", function (event, url) { + // Open links in user's default browser + event.preventDefault(); + shell.openExternal(url); + }); -// Disables or enables file and feed menus (except Quit), for when modal dialogs are displayed -ipc.on('menu-enable', function (event, enabled) { - function enable(item) { - item.enabled = enabled; - } + app.on("second-instance", () => { + if (mainWindow.isMinimized) mainWindow.restore(); + mainWindow.focus(); + }); - menu.items[0].submenu.items.slice(0, -1).forEach(enable); - menu.items[2].submenu.items.forEach(enable); -}); + // Disables or enables file and feed menus (except Quit), for when modal dialogs are displayed + ipcMain.on("menu-enable", (_, enabled) => { + const enable = (item) => (item.enabled = enabled); + menu.items[0].submenu.items.slice(0, -1).forEach(enable); + menu.items[2].submenu.items.forEach(enable); + }); -ipc.on('download-archive', function (event, url, filename) { - archive.download(url, filename).then(function (absoluteFilename) { - mainWindow.webContents.send('archive-downloaded', url, absoluteFilename); - }, function (error) { - mainWindow.webContents.send('archive-failed', url, error); - }); -}); + ipcMain.handle("get-window-size", () => mainWindow.getSize()); -ipc.on('view-archive', function (event, filename) { - archive.view(filename); + const menu = Menu.buildFromTemplate(menuTemplate); + Menu.setApplicationMenu(menu); + mainWindow.loadURL("file://" + pathUtil.resolve(__dirname, "..", "index.html")); }); diff --git a/src/browser/menu.js b/src/browser/menu.js index d11065c..1482622 100644 --- a/src/browser/menu.js +++ b/src/browser/menu.js @@ -1,139 +1,132 @@ -'use strict'; -const electron = require('electron'); -const app = electron.app; -const BrowserWindow = electron.BrowserWindow; -const dialog = electron.dialog; +"use strict"; +const { app, dialog } = require("electron"); -const menu = module.exports = []; -const isDarwin = process.platform === 'darwin'; - -function send() { - const webContents = BrowserWindow.getFocusedWindow().webContents; - webContents.send.apply(webContents, arguments); -} +const menu = (module.exports = []); +const isDarwin = process.platform === "darwin"; menu.push( - { - label: '&File', - submenu: [ - { - label: '&New Feed', - accelerator: 'CmdOrCtrl+N', - click() { - send('new-feed'); - } - }, - { - label: 'New &Folder', - accelerator: 'CmdOrCtrl+Shift+N', - click() { - send('new-folder'); - } - }, - { - label: '&Import from OPML...', - click() { - const window = BrowserWindow.getFocusedWindow(); - dialog.showOpenDialog(window, { - filters: [ { name: 'OPML files', extensions: [ 'opml' ] } ], - properties: [ 'openFile' ] - }, function (filename) { - if (filename && filename[0]) { - window.webContents.send('opml-import', filename[0]); - } - }); - } - }, - { - label: '&Preferences', - accelerator: 'CmdOrCtrl+,', - click() { - send('preferences'); - } - }, - { - label: '&Quit', - accelerator: 'CmdOrCtrl+Q', - click() { - app.quit(); - } - } - ] - }, - { - label: '&Edit', - submenu: [ - { - label: 'Cut', - accelerator: 'CmdOrCtrl+X', - role: 'cut' - }, - { - label: '&Copy', - accelerator: 'CmdOrCtrl+C', - role: 'copy' - }, - { - label: '&Paste', - accelerator: 'CmdOrCtrl+V', - role: 'paste' - } - ] - }, - { - label: 'F&eed', - submenu: [ - { - label: 'Find Articles...', - accelerator: 'CmdOrCtrl+F', - click() { - send('article-search'); - } - }, - { - label: 'Mark Feed/Folder as &Read', - accelerator: 'CmdOrCtrl+R', - click() { - send('feed-mark-all-as-read'); - } - }, - { - label: '&Edit Feed/Folder...', - accelerator: 'CmdOrCtrl+E', - click() { - send('feed-edit'); - } - }, - { - label: 'Refresh &All Now', - click() { - send('feed-refresh-all'); - } - } - ] - } + { + label: "&File", + submenu: [ + { + label: "&New Feed", + accelerator: "CmdOrCtrl+N", + click(_, window) { + window.webContents.send("new-feed"); + }, + }, + { + label: "New &Folder", + accelerator: "CmdOrCtrl+Shift+N", + click(_, window) { + window.webContents.send("new-folder"); + }, + }, + { + label: "&Import from OPML...", + click(_, window) { + dialog.showOpenDialog( + window, + { + filters: [{ name: "OPML files", extensions: ["opml"] }], + properties: ["openFile"], + }, + function (filename) { + if (filename && filename[0]) { + window.webContents.send("opml-import", filename[0]); + } + } + ); + }, + }, + { + label: "&Preferences", + accelerator: "CmdOrCtrl+,", + click(_, window) { + window.webContents.send("preferences"); + }, + }, + { + label: "&Quit", + accelerator: "CmdOrCtrl+Q", + click() { + app.quit(); + }, + }, + ], + }, + { + label: "&Edit", + submenu: [ + { + label: "Cut", + accelerator: "CmdOrCtrl+X", + role: "cut", + }, + { + label: "&Copy", + accelerator: "CmdOrCtrl+C", + role: "copy", + }, + { + label: "&Paste", + accelerator: "CmdOrCtrl+V", + role: "paste", + }, + ], + }, + { + label: "Fee&d", + submenu: [ + { + label: "Find Articles...", + accelerator: "CmdOrCtrl+F", + click(_, window) { + window.webContents.send("article-search"); + }, + }, + { + label: "Mark Feed/Folder as &Read", + accelerator: "CmdOrCtrl+R", + click(_, window) { + window.webContents.send("feed-mark-all-as-read"); + }, + }, + { + label: "&Edit Feed/Folder...", + accelerator: "CmdOrCtrl+E", + click(_, window) { + window.webContents.send("feed-edit"); + }, + }, + { + label: "Refresh &All Now", + click(_, window) { + window.webContents.send("feed-refresh-all"); + }, + }, + ], + } ); -if (process.env.ELECTRON_APP_DEBUG) { - menu.push( - { - label: '&Debug', - submenu: [ - { - label: '&Reload', - accelerator: 'F5', - click() { - BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache(); - } - }, - { - label: 'Toggle &Developer Tools', - accelerator: isDarwin ? 'Alt+Cmd+I' : 'Ctrl+Shift+I', - click() { - BrowserWindow.getFocusedWindow().toggleDevTools(); - } - } - ] - } - ); +if (process.env.ELECTERN_DEV) { + menu.push({ + label: "De&bug", + submenu: [ + { + label: "&Reload", + accelerator: isDarwin ? "CmdOrCtrl+Shift+R" : "F5", + click(_, window) { + window.webContents.reloadIgnoringCache(); + }, + }, + { + label: "Toggle &Developer Tools", + accelerator: isDarwin ? "Alt+Cmd+I" : "Ctrl+Shift+I", + click(_, window) { + window.toggleDevTools(); + }, + }, + ], + }); } diff --git a/src/browser/preload-handlers.js b/src/browser/preload-handlers.js new file mode 100644 index 0000000..0df0579 --- /dev/null +++ b/src/browser/preload-handlers.js @@ -0,0 +1,60 @@ +/** @fileoverview Event handlers for node APIs, etc. necessary for preload APIs */ + +const { app, ipcMain } = require("electron"); +const { existsSync, promises, readFileSync, unlinkSync, writeFileSync } = require("fs"); +const { resolve } = require("path"); + +const sanitizeHtml = require("sanitize-html"); + +const archive = require("./archive"); + +ipcMain.on("get-user-data-path", (event) => (event.returnValue = app.getPath("userData"))); + +ipcMain.on("sanitize-html", (event, html, allowImages) => { + event.returnValue = sanitizeHtml(html, { + exclusiveFilter: function (frame) { + // Strip duplicated content caused by old TinyMCE bug + // Reference: http://www.electrictoolbox.com/tinymce-mcepaste-divs-webkit-browsers/ + return frame.tag === "div" && frame.attribs["class"] === "mcePaste"; + }, + ...(allowImages && { allowedTags: sanitizeHtml.defaults.allowedTags.concat(["img"]) }), + }); +}); + +/** + * Determines whehter a path should be permitted for fs operations across the renderer codebase. + * @param {string} path + */ +const isAllowedPath = (path) => + // Allow mhtml access outside of userData path in case data was migrated to/from portable folder + (path.startsWith(app.getPath("userData")) && path.endsWith(".json")) || path.endsWith(".mhtml"); + +ipcMain.on("exists-sync", (event, path) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file read request: ${path}`); + event.returnValue = existsSync(path); +}); +ipcMain.on("unlink-sync", (event, path) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file write request: ${path}`); + event.returnValue = unlinkSync(path); +}); +ipcMain.on("read-file-sync", (event, path, options) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file read request: ${path}`); + event.returnValue = readFileSync(path, options); +}); +ipcMain.on("write-file-sync", (event, path, data) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file write request: ${path}`); + event.returnValue = writeFileSync(path, data); +}); +ipcMain.on("resolve", (event, ...paths) => (event.returnValue = resolve(...paths))); + +ipcMain.handle("read-file", (_, path, options) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file read request: ${path}`); + return promises.readFile(path, options); +}); +ipcMain.handle("write-file", (_, path, data) => { + if (!isAllowedPath(path)) throw new Error(`Forbidden file write request: ${path}`); + return promises.writeFile(path, data); +}); + +ipcMain.handle("download-archive", (_, url, filename) => archive.download(url, filename)); +ipcMain.on("view-archive", (_, filename) => archive.view(filename)); diff --git a/src/browser/preload.js b/src/browser/preload.js new file mode 100644 index 0000000..d06c3f3 --- /dev/null +++ b/src/browser/preload.js @@ -0,0 +1,18 @@ +const { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("electronApi", { + downloadArchive: (url, filename) => ipcRenderer.invoke("download-archive", url, filename), + viewArchive: (filename) => ipcRenderer.send("view-archive", filename), + existsSync: (path) => ipcRenderer.sendSync("exists-sync", path), + getUserDataPath: () => ipcRenderer.sendSync("get-user-data-path"), + getWindowSize: () => ipcRenderer.invoke("get-window-size"), + on: (event, callback) => ipcRenderer.on(event, callback), + readFile: (path, options) => ipcRenderer.invoke("read-file", path, options), + readFileSync: (path, options) => ipcRenderer.sendSync("read-file-sync", path, options), + resolve: (...paths) => ipcRenderer.sendSync("resolve", ...paths), + sanitizeHtml: (html, allowImages) => ipcRenderer.sendSync("sanitize-html", html, allowImages), + setMenuEnabled: (enabled) => ipcRenderer.send("menu-enable", enabled), + unlinkSync: (path) => ipcRenderer.sendSync("unlink-sync", path), + writeFile: (path, data) => ipcRenderer.invoke("write-file", path, data), + writeFileSync: (path, data) => ipcRenderer.sendSync("write-file-sync", path, data), +}); diff --git a/src/common/userConfig.js b/src/common/userConfig.js index f2d2e66..9a19a09 100644 --- a/src/common/userConfig.js +++ b/src/common/userConfig.js @@ -1,75 +1,78 @@ -'use strict'; +"use strict"; -const isAMD = typeof define === 'function' && define.amd; +const isAMD = typeof define === "function" && define.amd; function factory() { - const fs = require('fs'); - const pathUtil = require('path'); - const app = isAMD ? require('electron').remote.app : require('electron').app; - const filename = pathUtil.resolve(app.getPath('userData'), 'userConfig.json'); + const { existsSync, readFileSync, writeFileSync } = isAMD ? electronApi : require("fs"); + const resolve = (isAMD ? electronApi : require("path")).resolve; + const userDataPath = isAMD + ? electronApi.getUserDataPath() + : require("electron").app.getPath("userData"); + const filename = resolve(userDataPath, "userConfig.json"); - const defaultOptions = { - allowImages: false, // Whether to allow images through sanitizeHtml's filter - maxTotal: 50, // Maximum number of articles to keep for a single feed - updateInterval: 60 // Update interval for feeds, in minutes - }; + const defaultOptions = { + allowImages: false, // Whether to allow images through sanitizeHtml's filter + maxTotal: 50, // Maximum number of articles to keep for a single feed + updateInterval: 60, // Update interval for feeds, in minutes + }; - const defaultUiOptions = { - regionSizes: { - feeds: 25, - articles: 35 - }, - size: [ 1000, 600 ] - }; + const defaultUiOptions = { + regionSizes: { + feeds: 25, + articles: 35, + }, + size: [1000, 600], + }; - const Config = function () { - this.load(); - }; + const Config = function () { + this.load(); + }; - Object.assign(Config.prototype, { - /** - * Returns an options object for the given feed ID normalized on top of the defaults, - * or returns just the defaults if no id is passed. - */ - getOptions(id) { - return Object.assign({}, this.defaultOptions, - typeof id === 'undefined' ? null : this.feedOptions[id]); - }, + Object.assign(Config.prototype, { + /** + * Returns an options object for the given feed ID normalized on top of the defaults, + * or returns just the defaults if no id is passed. + */ + getOptions(id) { + return Object.assign( + {}, + this.defaultOptions, + typeof id === "undefined" ? null : this.feedOptions[id] + ); + }, - setOptions(id, options) { - this.feedOptions[id] = options; - }, + setOptions(id, options) { + this.feedOptions[id] = options; + }, - load() { - if (!fs.existsSync(filename)) { - this.defaultOptions = defaultOptions; - this.feedOptions = {}; - this.uiOptions = Object.assign({}, defaultUiOptions); - this.save(); - } - else { - var config = JSON.parse(fs.readFileSync(filename, 'utf8')); - if (!config.uiOptions) { - // Upgrade path from versions before uiOptions was added - config.uiOptions = Object.assign({}, defaultUiOptions); - } - // Underlay built-in defaultOptions to facilitate new options in upgrades w/ existing config - config.defaultOptions = Object.assign({}, defaultOptions, config.defaultOptions); - Object.assign(this, config); - this.save(); - } - }, + load() { + if (!existsSync(filename)) { + this.defaultOptions = defaultOptions; + this.feedOptions = {}; + this.uiOptions = Object.assign({}, defaultUiOptions); + this.save(); + } else { + const config = JSON.parse(readFileSync(filename, "utf8")); + if (!config.uiOptions) { + // Upgrade path from versions before uiOptions was added + config.uiOptions = Object.assign({}, defaultUiOptions); + } + // Underlay built-in defaultOptions to facilitate new options in upgrades w/ existing config + config.defaultOptions = Object.assign({}, defaultOptions, config.defaultOptions); + Object.assign(this, config); + this.save(); + } + }, - save() { - fs.writeFileSync(filename, JSON.stringify(this)); - } - }); - return new Config(); + save() { + writeFileSync(filename, JSON.stringify(this)); + }, + }); + return new Config(); } if (isAMD) { - define([], factory); -} -else { - module.exports = factory(); + define([], factory); +} else { + module.exports = factory(); } diff --git a/src/index.html b/src/index.html index 3ebd4ed..9a552fa 100644 --- a/src/index.html +++ b/src/index.html @@ -1,31 +1,19 @@ - - - - - -
-
-
- - - - + + + + + +
+
+
+ + + diff --git a/src/package.json b/src/package.json deleted file mode 100644 index 011af17..0000000 --- a/src/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "electern", - "main": "browser/main.js", - "dependencies": { - "file-url": "~1.1", - "sanitize-html": "~1.11.3" - } -} diff --git a/src/resources/button.styl b/src/resources/button.styl deleted file mode 100644 index 5dfb19a..0000000 --- a/src/resources/button.styl +++ /dev/null @@ -1,20 +0,0 @@ -button { - $submitBackground = linear-gradient(#3c4 0%, #2b3 100%); - $neutralBackground = linear-gradient(#eee 0%, #d3d3d3 100%); - - background: $submitBackground; - border: 1px solid rgba(0, 0, 0, 0.25); - border-radius: 2px; - color: #fff; - cursor: pointer; - padding: 2px; - - &[type=button] { - background: $neutralBackground; - color: #000; - } - - &.delete { - color: #c34; - } -} diff --git a/src/resources/grid.styl b/src/resources/grid.styl deleted file mode 100644 index 17c385a..0000000 --- a/src/resources/grid.styl +++ /dev/null @@ -1,78 +0,0 @@ -@import '../dgrid/css/base'; - -.dgrid-row:nth-child(2n) { - // Use nth-child rather than dgrid-row-odd so we can disable maintainOddEven for performance. - // (Specify before other styles to let them take precedence) - background: #eee; -} - -.dgrid { - border: none; - height: auto; -} - -.dgrid-header { - background: linear-gradient(#fff 0, #ccc 100%); -} - -.dgrid-cell { - border: none; - cursor: default; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.feeds { - .dgrid-row { - background: transparent; - } - - .fa-folder { - cursor: pointer; - - &:before { - display: inline-block; - width: 15px; - } - } - - .fa-pencil { - cursor: pointer; - display: none; - position: absolute; - right: 2px; - } - - .dgrid-cell:focus .fa-pencil, - .dgrid-cell:hover .fa-pencil { - display: inherit; - } - - .dgrid-row-expanded .fa-folder:before { - content: '\f07c'; // fa-folder-open - } - - .unread { - font-weight: bold; - } -} - -.articles { - .unread { - background-color: #cfc; - } -} - -.dgrid .dgrid-selected { // Extra specificity to override other backgrounds - background: #cdf; -} - -.field-isPinned, -.field-isRead { - text-align: center; - width: 22px; -} -.field-date { - width: 120px; -} diff --git a/src/resources/main.styl b/src/resources/main.styl deleted file mode 100644 index c1e0595..0000000 --- a/src/resources/main.styl +++ /dev/null @@ -1,55 +0,0 @@ -$dividerColor = #ccc; -$fontSize = 14px; - -@import '../font-awesome/css/font-awesome.min.css'; - -html, -body { - font-family: sans-serif; - font-size: $fontSize; - height: 100%; - margin: 0; - padding: 0; -} - -a { - text-decoration: none; -} - -input { - font-size: $fontSize; -} - -@import 'button'; -@import 'grid'; -@import 'widget/ArticlePane'; -@import 'widget/Form'; - -.feeds, -.articles, -.article { - box-sizing: border-box; -} - -.horizontal { - display: flex; - - .feeds, - .articles, - .article { - flex-shrink: 0; - } - - .feeds, - .articles { - border-right: 1px solid $dividerColor; - } -} - -.hidden { - display: none; -} - -.invisible { - visibility: hidden; -} diff --git a/src/resources/widget/ArticlePane.styl b/src/resources/widget/ArticlePane.styl deleted file mode 100644 index ba9b26a..0000000 --- a/src/resources/widget/ArticlePane.styl +++ /dev/null @@ -1,40 +0,0 @@ -.article { - overflow: auto; - - a.fa { - background-color: #333; - border-radius: 4px; - color: #ccc; - float: right; - margin: 0.5em; - padding: 0.5em; - text-decoration: none; - - &-hourglass { - cursor: default; - opacity: 0.5; - } - } - - &-title { - margin: 0; - } - - &-title, - &-meta, - &-container { - padding: 8px; - } - - &-meta { - font-style: italic; - } - - &-container { - border-top: 1px solid #ccc; - } - - img { - max-width: 100%; - } -} diff --git a/src/resources/widget/Form.styl b/src/resources/widget/Form.styl deleted file mode 100644 index cccd28e..0000000 --- a/src/resources/widget/Form.styl +++ /dev/null @@ -1,115 +0,0 @@ -.Form { - $inputWidth = 20em; - - &-row { - margin-top: 1em; - - &--top { - label, - input, - button, - .dgrid { - vertical-align: top; - } - } - - &--actions { - padding: 1em 0; - } - } - - label { - box-sizing: border-box; - display: inline-block; - width: 10em; - } - - input, - .dgrid { - border: 1px solid #ddd; - } - - input { - box-sizing: border-box; - width: $inputWidth; - - &[type=checkbox] { - margin-left: 0; - width: auto; - } - } - - .dgrid { - display: inline-block; - height: 7em; - width: $inputWidth; - } - - &-overrides &-row { - position: relative; - } - - &-overrides label { - padding-left: 1.5em; - } - - &-overrides input:first-child { - // Override checkbox - position: absolute; - } -} - -.modal { - &-underlay, - &-container { - position: absolute; - bottom: 0; - left: 0; - right: 0; - top: 0; - } - - &-underlay { - background-color: #000; - opacity: 0.5; - } - - &-container { - display: flex; - align-items: center; - justify-content: center; - } - - background-color: #fff; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.5); - - h2 { - background: linear-gradient(#eee 0%, #ccc 100%); - margin: 0; - padding: 0.5em; - text-align: center; - } - - h2, - h3, - p, - .Form-row { - padding-left: 16px; - padding-right: 16px; - } - - .Form-row--actions { - background: linear-gradient(#ddd 0%, #eee 100%); - text-align: center; - } - - .Form-row--actions button { - font-size: 14px; - font-weight: bold; - } - - button { - margin: 0 0.5em; - padding: 0.5em; - } -} diff --git a/src/scss/button.scss b/src/scss/button.scss new file mode 100644 index 0000000..b19733f --- /dev/null +++ b/src/scss/button.scss @@ -0,0 +1,20 @@ +$submitBackground: linear-gradient(#3c4 0%, #2b3 100%); +$neutralBackground: linear-gradient(#eee 0%, #d3d3d3 100%); + +button { + background: $submitBackground; + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 2px; + color: #fff; + cursor: pointer; + padding: 2px; + + &[type="button"] { + background: $neutralBackground; + color: #000; + } + + &.delete { + color: #c34; + } +} diff --git a/src/scss/grid.scss b/src/scss/grid.scss new file mode 100644 index 0000000..bf0a87f --- /dev/null +++ b/src/scss/grid.scss @@ -0,0 +1,79 @@ +@import "../dgrid/css/dgrid.css"; + +.dgrid-row:nth-child(2n) { + // Use nth-child rather than dgrid-row-odd so we can disable maintainOddEven for performance. + // (Specify before other styles to let them take precedence) + background: #eee; +} + +.dgrid { + border: none; + height: auto; +} + +.dgrid-header { + background: linear-gradient(#fff 0, #ccc 100%); +} + +.dgrid-cell { + border: none; + cursor: default; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.feeds { + .dgrid-row { + background: transparent; + } + + .fa-folder { + cursor: pointer; + + &:before { + display: inline-block; + width: 15px; + } + } + + .fa-pencil { + cursor: pointer; + display: none; + position: absolute; + right: 2px; + } + + .dgrid-cell:focus .fa-pencil, + .dgrid-cell:hover .fa-pencil { + display: inherit; + } + + .dgrid-row-expanded .fa-folder:before { + content: "\f07c"; // fa-folder-open + } + + .unread { + font-weight: bold; + } +} + +.articles { + .unread { + background-color: #cfc; + } +} + +.dgrid .dgrid-selected { + // Extra specificity to override other backgrounds + background: #cdf; +} + +.field-isPinned, +.field-isRead { + text-align: center; + width: 22px; +} +.field-date { + width: 120px; +} diff --git a/src/scss/main.scss b/src/scss/main.scss new file mode 100644 index 0000000..e5d0875 --- /dev/null +++ b/src/scss/main.scss @@ -0,0 +1,55 @@ +$dividerColor: #ccc; +$fontSize: 14px; + +@import "../font-awesome/css/font-awesome.min.css"; + +html, +body { + font-family: sans-serif; + font-size: $fontSize; + height: 100%; + margin: 0; + padding: 0; +} + +a { + text-decoration: none; +} + +input { + font-size: $fontSize; +} + +@import "button"; +@import "grid"; +@import "widget/ArticlePane"; +@import "widget/Form"; + +.feeds, +.articles, +.article { + box-sizing: border-box; +} + +.horizontal { + display: flex; + + .feeds, + .articles, + .article { + flex-shrink: 0; + } + + .feeds, + .articles { + border-right: 1px solid $dividerColor; + } +} + +.hidden { + display: none; +} + +.invisible { + visibility: hidden; +} diff --git a/src/scss/widget/ArticlePane.scss b/src/scss/widget/ArticlePane.scss new file mode 100644 index 0000000..cd34217 --- /dev/null +++ b/src/scss/widget/ArticlePane.scss @@ -0,0 +1,40 @@ +.article { + overflow: auto; + + a.fa { + background-color: #333; + border-radius: 4px; + color: #ccc; + float: right; + margin: 0.5em; + padding: 0.5em; + text-decoration: none; + + &-hourglass { + cursor: default; + opacity: 0.5; + } + } + + &-title { + margin: 0; + } + + &-title, + &-meta, + &-container { + padding: 8px; + } + + &-meta { + font-style: italic; + } + + &-container { + border-top: 1px solid #ccc; + } + + img { + max-width: 100%; + } +} diff --git a/src/scss/widget/Form.scss b/src/scss/widget/Form.scss new file mode 100644 index 0000000..eca30fb --- /dev/null +++ b/src/scss/widget/Form.scss @@ -0,0 +1,115 @@ +.Form { + $inputWidth: 20em; + + &-row { + margin-top: 1em; + + &--top { + label, + input, + button, + .dgrid { + vertical-align: top; + } + } + + &--actions { + padding: 1em 0; + } + } + + label { + box-sizing: border-box; + display: inline-block; + width: 10em; + } + + input, + .dgrid { + border: 1px solid #ddd; + } + + input { + box-sizing: border-box; + width: $inputWidth; + + &[type="checkbox"] { + margin-left: 0; + width: auto; + } + } + + .dgrid { + display: inline-block; + height: 7em; + width: $inputWidth; + } + + &-overrides &-row { + position: relative; + } + + &-overrides label { + padding-left: 1.5em; + } + + &-overrides input:first-child { + // Override checkbox + position: absolute; + } +} + +.modal { + &-underlay, + &-container { + position: absolute; + bottom: 0; + left: 0; + right: 0; + top: 0; + } + + &-underlay { + background-color: #000; + opacity: 0.5; + } + + &-container { + display: flex; + align-items: center; + justify-content: center; + } + + background-color: #fff; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.5); + + h2 { + background: linear-gradient(#eee 0%, #ccc 100%); + margin: 0; + padding: 0.5em; + text-align: center; + } + + h2, + h3, + p, + .Form-row { + padding-left: 16px; + padding-right: 16px; + } + + .Form-row--actions { + background: linear-gradient(#ddd 0%, #eee 100%); + text-align: center; + } + + .Form-row--actions button { + font-size: 14px; + font-weight: bold; + } + + button { + margin: 0 0.5em; + padding: 0.5em; + } +} diff --git a/tasks/electron-download.js b/tasks/electron-download.js deleted file mode 100644 index d0c344a..0000000 --- a/tasks/electron-download.js +++ /dev/null @@ -1,36 +0,0 @@ -// Based on logic in https://github.com/mafintosh/electron-prebuilt, -// reorganized as a Grunt task. - -var extract = require('extract-zip'); -var download = require('electron-download'); - -module.exports = function (grunt) { - grunt.registerTask('electron-download', 'Download a version of Electron for the host platform.', function () { - var done = this.async(); - var options = this.options(); - - this.requiresConfig(this.name + '.options.out', this.name + '.options.version'); - - require('fs').readFile(require('path').join(options.out, 'version'), { - encoding: 'utf8' - }, function (error, version) { - if (error || version && version.slice(1) !== options.version) { - if (!error) { - // A different version was previously downloaded/extracted - grunt.file.delete(options.out); - } - - download({ version: options.version }, function (error, zipPath) { - if (error) { - return done(error); - } - - extract(zipPath, { dir: options.out }, done); - }); - } - else { - done(error); - } - }); - }); -}; diff --git a/tasks/electron-packager.js b/tasks/electron-packager.js deleted file mode 100644 index f75db85..0000000 --- a/tasks/electron-packager.js +++ /dev/null @@ -1,10 +0,0 @@ -// This is effectively the task from https://github.com/sindresorhus/grunt-electron -// maintained locally to reference an alternate electron-packager version - -var electronPackager = require('electron-packager'); - -module.exports = function (grunt) { - grunt.registerMultiTask('electron-packager', 'Package Electron apps', function () { - electronPackager(this.options(), this.async()); - }); -};