diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb39d6201f..cce285e99a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: os: - - macos-12 + - macos-13 - ubuntu-latest - windows-latest @@ -96,7 +96,7 @@ jobs: CGO_ENABLED: 0 - name: Build Front Mac OS - if: matrix.os == 'macos-12' + if: matrix.os == 'macos-13' uses: samuelmeuli/action-electron-builder@v1 with: github_token: ${{secrets.TOKEN}} @@ -113,7 +113,7 @@ jobs: SENTRY_AUTH_TOKEN: ${{secrets.SENTRY_AUTH_TOKEN}} - name: Build Front Other - if: matrix.os != 'macos-12' + if: matrix.os != 'macos-13' uses: samuelmeuli/action-electron-builder@v1 with: github_token: ${{secrets.TOKEN}} diff --git a/.gitignore b/.gitignore index 89ab2665af..f94947d96f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ docs/* electron/env.json src/json/schema licenses.json +dist/.rsdoctor + +# generated by rspack +/compilation-stats.json # generated by update.sh /linux-amd*/ @@ -25,3 +29,5 @@ licenses.json /darwin-amd*/ /darwin-arm*/ /windows/ +.aider* +.env diff --git a/dist/.gitignore b/dist/.gitignore index 6d2b761cf3..1fa25cfa9d 100644 --- a/dist/.gitignore +++ b/dist/.gitignore @@ -27,4 +27,5 @@ nmh.log extension.crx extension.pem extension.zip -cmaps/* \ No newline at end of file +cmaps/* +bundle-back.js.map \ No newline at end of file diff --git a/dist/extension/css/foreground.css b/dist/extension/css/foreground.css index 7279d1e97a..2200663f0e 100644 --- a/dist/extension/css/foreground.css +++ b/dist/extension/css/foreground.css @@ -3,6 +3,7 @@ #anytypeWebclipper-iframe { position: absolute; z-index: 1; width: 50%; height: 80%; background: #fff; left: 50%; top: 50%; transform: translate3d(-50%,-50%,0px); border-radius: 16px; border: 1px solid rgba(172, 169, 152, 0.12); box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.10); + min-width: 600px; } #anytypeWebclipper-container .dimmer { diff --git a/dist/extension/manifest.json b/dist/extension/manifest.json index d2fbe830b2..65d4768c38 100644 --- a/dist/extension/manifest.json +++ b/dist/extension/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "Anytype Web Clipper", "description": "Save web content to the Anytype — open, encrypted, and local-first application that connects everything as objects.", - "version": "0.0.5", + "version": "0.0.7", "icons": { "16": "img/icon16x16.png", "128": "img/icon128x128.png" diff --git a/dist/img/help/notion/1-1.png b/dist/img/help/notion/1-1.png index 3c7d08c193..221322745c 100644 Binary files a/dist/img/help/notion/1-1.png and b/dist/img/help/notion/1-1.png differ diff --git a/dist/img/help/notion/1-2.png b/dist/img/help/notion/1-2.png index 06f4208fcb..a9a91af7c8 100644 Binary files a/dist/img/help/notion/1-2.png and b/dist/img/help/notion/1-2.png differ diff --git a/dist/img/help/notion/1-3.png b/dist/img/help/notion/1-3.png index b3b8c98497..01867a785f 100644 Binary files a/dist/img/help/notion/1-3.png and b/dist/img/help/notion/1-3.png differ diff --git a/dist/img/help/notion/1-4.png b/dist/img/help/notion/1-4.png index 0389f0784c..9dd6ff1aac 100644 Binary files a/dist/img/help/notion/1-4.png and b/dist/img/help/notion/1-4.png differ diff --git a/dist/img/help/notion/1-5.png b/dist/img/help/notion/1-5.png index 160a18b30d..6273de1aab 100644 Binary files a/dist/img/help/notion/1-5.png and b/dist/img/help/notion/1-5.png differ diff --git a/dist/img/help/notion/1-6.png b/dist/img/help/notion/1-6.png index 2a825f2ca5..d402944f8e 100644 Binary files a/dist/img/help/notion/1-6.png and b/dist/img/help/notion/1-6.png differ diff --git a/dist/img/help/onboarding/object-1-default-object-type.mp4 b/dist/img/help/onboarding/object-1-default-object-type.mp4 deleted file mode 100644 index 57a324f62a..0000000000 Binary files a/dist/img/help/onboarding/object-1-default-object-type.mp4 and /dev/null differ diff --git a/electron/js/lib/installNativeMessagingHost.js b/electron/js/lib/installNativeMessagingHost.js index 08714840c9..d0ad3beacc 100644 --- a/electron/js/lib/installNativeMessagingHost.js +++ b/electron/js/lib/installNativeMessagingHost.js @@ -17,7 +17,7 @@ const { fixPathForAsarUnpack, is } = require('electron-util'); const APP_NAME = 'com.anytype.desktop-dev'; const MANIFEST_FILENAME = `${APP_NAME}.json`; -const EXTENSION_IDS = [ 'jbnammhjiplhpjfncnlejjjejghimdkf', 'jkmhmgghdjjbafmkgjmplhemjjnkligf' ]; +const EXTENSION_IDS = [ 'jbnammhjiplhpjfncnlejjjejghimdkf', 'jkmhmgghdjjbafmkgjmplhemjjnkligf', 'lcamkcmpcofgmbmloefimnelnjpcdpfn' ]; const USER_PATH = app.getPath('userData'); const EXE_PATH = app.getPath('exe'); diff --git a/electron/js/menu.js b/electron/js/menu.js index 6d73917f8a..95fbf2d97b 100644 --- a/electron/js/menu.js +++ b/electron/js/menu.js @@ -3,7 +3,6 @@ const { is } = require('electron-util'); const path = require('path'); const ConfigManager = require('./config.js'); const Util = require('./util.js'); - const Separator = { type: 'separator' }; class MenuManager { @@ -21,6 +20,7 @@ class MenuManager { const Api = require('./api.js'); const WindowManager = require('./window.js'); const UpdateManager = require('./update.js'); + const isAllowedUpdate = UpdateManager.isAllowed(); config.debug = config.debug || {}; config.flagsMw = config.flagsMw || {}; @@ -37,9 +37,8 @@ class MenuManager { { role: 'hideothers', label: Util.translate('electronMenuHideOthers') }, { role: 'unhide', label: Util.translate('electronMenuUnhide') }, - Separator, - - { label: Util.translate('electronMenuCheckUpdates'), click: () => Api.updateCheck(this.win) }, + { type: 'separator', visible: isAllowedUpdate }, + { label: Util.translate('electronMenuCheckUpdates'), click: () => Api.updateCheck(this.win), visible: isAllowedUpdate }, Separator, @@ -235,6 +234,7 @@ class MenuManager { { label: Util.translate('electronMenuDebugProcess'), click: () => Util.send(this.win, 'commandGlobal', 'debugProcess') }, { label: Util.translate('electronMenuDebugStat'), click: () => Util.send(this.win, 'commandGlobal', 'debugStat') }, { label: Util.translate('electronMenuDebugReconcile'), click: () => Util.send(this.win, 'commandGlobal', 'debugReconcile') }, + { label: Util.translate('electronMenuDebugNet'), click: () => Util.send(this.win, 'commandGlobal', 'debugNet') }, Separator, @@ -307,6 +307,8 @@ class MenuManager { const { config } = ConfigManager; const WindowManager = require('./window.js'); const Api = require('./api.js'); + const UpdateManager = require('./update.js'); + const isAllowedUpdate = UpdateManager.isAllowed(); this.destroy(); @@ -325,7 +327,7 @@ class MenuManager { Separator, - { label: Util.translate('electronMenuCheckUpdates'), click: () => { this.winShow(); Api.updateCheck(this.win); } }, + { label: Util.translate('electronMenuCheckUpdates'), click: () => { this.winShow(); Api.updateCheck(this.win); }, visible: isAllowedUpdate }, { label: Util.translate('commonSettings'), submenu: this.menuSettings() }, Separator, diff --git a/electron/js/preload.js b/electron/js/preload.js index 65694204d7..55aaa97744 100644 --- a/electron/js/preload.js +++ b/electron/js/preload.js @@ -20,8 +20,8 @@ contextBridge.exposeInMainWorld('Electron', { userPath: () => app.getPath('userData'), tmpPath, logPath: () => path.join(app.getPath('userData'), 'logs'), - filePath: (...args) => path.join(...args), dirName: fp => path.dirname(fp), + filePath: (...args) => path.join(...args), fileName: fp => path.basename(fp), fileMime: fp => mime.lookup(fp), fileExt: fp => path.extname(fp).replace(/^./, ''), @@ -39,7 +39,7 @@ contextBridge.exposeInMainWorld('Electron', { getGlobal: key => getGlobal(key), showOpenDialog: dialog.showOpenDialog, - webFilePath: file => webUtils.getPathForFile(file), + webFilePath: file => webUtils && webUtils.getPathForFile(file), fileWrite: (name, data, options) => { name = String(name || 'temp'); diff --git a/electron/js/update.js b/electron/js/update.js index 250b5e7c1e..2f30c3da9a 100644 --- a/electron/js/update.js +++ b/electron/js/update.js @@ -100,6 +100,10 @@ class UpdateManager { return false; }; + if (is.macos && (major <= 10)) { + return false; + }; + return true; }; diff --git a/electron/js/util.js b/electron/js/util.js index 8df752c94f..ad031869b7 100644 --- a/electron/js/util.js +++ b/electron/js/util.js @@ -8,7 +8,8 @@ const protocol = 'anytype'; const ConfigManager = require('./config.js'); const Constant = require('../json/constant.json'); -log.transports.rendererConsole.level = 'error'; +log.initialize(); +log.transports.console.level = 'error'; class Util { @@ -240,4 +241,4 @@ class Util { }; -module.exports = new Util(); +module.exports = new Util(); \ No newline at end of file diff --git a/extension/iframe/create.tsx b/extension/iframe/create.tsx index 47ddb26a4f..63483b18af 100644 --- a/extension/iframe/create.tsx +++ b/extension/iframe/create.tsx @@ -40,7 +40,7 @@ const Create = observer(class Create extends React.Component this.node = ref} className="page pageCreate"> - {isLoading ? : ''} + {isLoading ? : ''}
@@ -56,7 +56,7 @@ const Create = observer(class Create extends React.Component -
+
{object ? : ''}
{object ? object.name : translate('commonSelectObject')}
@@ -95,7 +95,6 @@ const Create = observer(class Create extends React.Component { + S.Auth.accountSet(message.account); + S.Common.configSet(message.account.config, false); + S.Common.showVaultSet(false); + + U.Data.onInfo(message.account.info); + + if (onSuccess) { + onSuccess(); + }; + }); }); }; diff --git a/extension/popup/create.tsx b/extension/popup/create.tsx index e2d92a5b22..6fe7a02b31 100644 --- a/extension/popup/create.tsx +++ b/extension/popup/create.tsx @@ -62,7 +62,7 @@ const Create = observer(class Create extends React.Component this.node = ref} className="page pageCreate" > - {isLoading ? : ''} + {isLoading ? : ''}
@@ -164,12 +164,11 @@ const Create = observer(class Create extends React.Component { this.initSpace(); this.initName(); this.initType(); - this.setState({ withContent: Boolean(Storage.get('withContent')) }); }); }; @@ -186,17 +185,9 @@ const Create = observer(class Create extends React.Component it.isPersonal)?.id; - }; - if (spaceId) { - check = spaces.find(it => it.id == spaceId); - }; - - if (!spaceId || !check) { spaceId = spaces[0].id; }; @@ -249,7 +240,7 @@ const Create = observer(class Create extends React.Component layouts.includes(it.recommendedLayout) && (it.spaceId == S.Common.space)). + filter(it => layouts.includes(it.recommendedLayout) && (it.spaceId == S.Common.space) && (it.uniqueKey != J.Constant.typeKey.template)). sort(U.Data.sortByName); }; @@ -362,6 +353,7 @@ const Create = observer(class Create extends React.Component $(element).removeClass('isFocused'), data: { canAdd: true, + canEdit: true, filter: '', value: this.details.tag, maxCount: relation.maxCount, diff --git a/extension/scss/common.scss b/extension/scss/common.scss index 7ffe90835a..6dcb09585e 100644 --- a/extension/scss/common.scss +++ b/extension/scss/common.scss @@ -50,7 +50,6 @@ html.anytypeWebclipper-popup { --color-ice: #2aa7ee; --color-teal: #0fc8ba; --color-lime: #5dd400; - --color-green: #57c600; /* Font */ @@ -98,6 +97,14 @@ html.anytypeWebclipper-popup { --line-height-description: 26px; --letter-spacing-description: -0.28px; + /* Menu */ + --menu-width-common: 224px; + --menu-width-icon: 256px; + --menu-width-value: 288px; + --menu-width-set: 360px; + --menu-width-large: 408px; + --menu-width-add: 480px; + @import "~scss/common"; @import "~scss/form/common"; @import "~scss/component/common"; diff --git a/middleware.version b/middleware.version index 00870da57e..a3c7b05314 100644 --- a/middleware.version +++ b/middleware.version @@ -1 +1 @@ -0.36.0-rc8 \ No newline at end of file +0.37.3 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 74a4898160..95e41e9752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "anytype", - "version": "0.42.46-beta", + "version": "0.43.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "anytype", - "version": "0.42.46-beta", + "version": "0.43.7", "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { @@ -19,15 +19,14 @@ "amplitude-js": "^5.11.0", "array-move": "^2.2.2", "blueimp-load-image": "^2.31.0", - "copy-webpack-plugin": "^12.0.2", "d3": "^7.0.1", "d3-force": "^3.0.0", "d3-force-cluster": "^0.1.2", "diff": "^5.2.0", - "dompurify": "^3.0.6", + "dompurify": "3.1.6", "electron-dl": "^1.14.0", "electron-json-storage": "^4.5.0", - "electron-log": "^3.0.9", + "electron-log": "^5.2.0", "electron-updater": "^6.2.1", "electron-util": "^0.12.3", "electron-window-state": "^5.0.3", @@ -45,7 +44,7 @@ "lazy-val": "^1.0.4", "lodash": "^4.17.20", "lodash.isequal": "^4.5.0", - "mermaid": "^10.9.0", + "mermaid": "^11.4.0", "mime-types": "^2.1.35", "mobx": "^6.6.1", "mobx-logger": "^0.7.1", @@ -57,9 +56,9 @@ "prismjs": "^1.21.0", "qrcode.react": "^1.0.1", "raf": "^3.4.1", - "react": "^16.14.0", + "react": "^17.0.2", "react-canvas-confetti": "^1.3.0", - "react-dom": "^16.14.0", + "react-dom": "^17.0.2", "react-minimal-pie-chart": "^8.3.0", "react-pdf": "^6.2.2", "react-router-dom": "^5.2.0", @@ -74,12 +73,16 @@ "systeminformation": "^5.23.5" }, "devDependencies": { - "@electron/notarize": "^2.1.0", + "@electron/notarize": "^2.5.0", + "@rsdoctor/rspack-plugin": "^0.4.8", + "@rspack/cli": "^1.1.0", + "@rspack/core": "^1.1.0", + "@rspack/plugin-react-refresh": "^1.0.0", "@types/history": "^4.7.8", "@types/jquery": "^3.5.14", "@types/katex": "^0.14.0", "@types/lodash": "^4.14.165", - "@types/node": "^12.19.4", + "@types/node": "^22.9.0", "@types/prismjs": "^1.16.1", "@types/raf": "^3.4.0", "@types/react": "^16.14.31", @@ -93,6 +96,7 @@ "electron-builder": "^24.13.3", "eslint": "^8.29.0", "eslint-plugin-react": "^7.31.11", + "fork-ts-checker-webpack-plugin": "^9.0.2", "husky": "^8.0.3", "license-checker": "^25.0.1", "lint-staged": "^13.0.3", @@ -100,19 +104,14 @@ "npm": "^10.5.0", "npm-run-all": "^4.1.5", "patch-package": "^6.4.7", + "react-refresh": "^0.14.2", "sass": "1.77.6", "sass-loader": "^8.0.2", "source-map-loader": "^0.2.4", "style-loader": "^1.2.1", - "ts-loader": "^6.2.2", "typescript": "^5.3.3", "typescript-eslint": "^0.0.1-alpha.0", - "url-loader": "^4.1.1", - "wait-for-localhost-cli": "^3.0.0", - "webpack": "^5.74.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.13.1" + "wait-for-localhost-cli": "^3.0.0" } }, "node_modules/@amplitude/ua-parser-js": { @@ -123,41 +122,55 @@ "node": "*" } }, + "node_modules/@antfu/install-pkg": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", + "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", + "dependencies": { + "package-manager-detector": "^0.2.0", + "tinyexec": "^0.3.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", + "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.9", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -225,12 +238,6 @@ "node": ">=4" } }, - "node_modules/@babel/highlight/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -244,9 +251,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.9.tgz", + "integrity": "sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -255,9 +262,43 @@ } }, "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", + "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", @@ -286,11 +327,12 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", - "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.13.tgz", + "integrity": "sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg==", "dev": true, "dependencies": { + "@types/glob": "^7.1.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -383,9 +425,9 @@ } }, "node_modules/@electron/notarize": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.2.tgz", - "integrity": "sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -524,9 +566,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -578,9 +620,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -592,13 +634,13 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -648,6 +690,25 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + }, + "node_modules/@iconify/utils": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", + "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", + "dependencies": { + "@antfu/install-pkg": "^0.4.0", + "@antfu/utils": "^0.7.10", + "@iconify/types": "^2.0.0", + "debug": "^4.3.6", + "kolorist": "^1.8.0", + "local-pkg": "^0.5.0", + "mlly": "^1.7.1" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -666,9 +727,9 @@ } }, "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -719,6 +780,8 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -732,6 +795,8 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -740,6 +805,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -748,6 +815,8 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -756,17 +825,78 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "peer": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", @@ -810,10 +940,58 @@ "node": ">= 10.0.0" } }, + "node_modules/@mermaid-js/parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.3.0.tgz", + "integrity": "sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==", + "dependencies": { + "langium": "3.0.0" + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, "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" @@ -826,6 +1004,7 @@ "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" } @@ -834,6 +1013,7 @@ "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" @@ -904,307 +1084,1038 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", "dev": true }, - "node_modules/@sentry-internal/feedback": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.118.0.tgz", - "integrity": "sha512-IYOGRcqIqKJJpMwBBv+0JTu0FPpXnakJYvOx/XEa/SNyF5+l7b9gGEjUVWh1ok50kTLW/XPnpnXNAGQcoKHg+w==", + "node_modules/@rsdoctor/client": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/client/-/client-0.4.8.tgz", + "integrity": "sha512-Jj+37B+WFAgsszwE4l65ySM8USW8Z/VqIE5dUMq+os/johgTRF7wafnlABIPdpd2ih8HTbankzEJOMHyJYHTog==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/core": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/core/-/core-0.4.8.tgz", + "integrity": "sha512-I2Hl9D5K/yGQCJaUoyLGFAaMF1vpIXW5s2zeprEbfW1EFN8u59LzvatEg4+wgcfaXPMecAB5dfm6J+D36F4aRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rsdoctor/graph": "0.4.8", + "@rsdoctor/sdk": "0.4.8", + "@rsdoctor/types": "0.4.8", + "@rsdoctor/utils": "0.4.8", + "axios": "^1.7.7", + "enhanced-resolve": "5.12.0", + "filesize": "^10.1.6", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "path-browserify": "1.0.1", + "semver": "^7.6.3", + "source-map": "^0.7.4", + "webpack-bundle-analyzer": "^4.10.2" + } + }, + "node_modules/@rsdoctor/core/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", "dependencies": { - "@sentry/core": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, - "node_modules/@sentry-internal/replay-canvas": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.118.0.tgz", - "integrity": "sha512-XxHlCClvrxmVKpiZetFYyiBaPQNiojoBGFFVgbbWBIAPc+fWeLJ2BMoQEBjn/0NA/8u8T6lErK5YQo/eIx9+XQ==", + "node_modules/@rsdoctor/core/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, + "license": "MIT", "dependencies": { - "@sentry/core": "7.118.0", - "@sentry/replay": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" + "universalify": "^2.0.0" }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rsdoctor/core/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@sentry-internal/tracing": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.118.0.tgz", - "integrity": "sha512-dERAshKlQLrBscHSarhHyUeGsu652bDTUN1FK0m4e3X48M3I5/s+0N880Qjpe5MprNLcINlaIgdQ9jkisvxjfw==", + "node_modules/@rsdoctor/graph": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/graph/-/graph-0.4.8.tgz", + "integrity": "sha512-F6lKNjU1pewVXT8PLPgL7WuxB4Aru7unpZjJ4Hh1vbcNUsK6VNUNHsAviOu2ZrbuKuwbxqjd3p/NIjThUzX7NQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@sentry/core": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" - }, + "@rsdoctor/types": "0.4.8", + "@rsdoctor/utils": "0.4.8", + "lodash": "^4.17.21", + "socket.io": "4.7.2", + "source-map": "^0.7.4" + } + }, + "node_modules/@rsdoctor/graph/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/@sentry/browser": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.118.0.tgz", - "integrity": "sha512-8onDOFV1VLEoBuqA5yaJeR3FF1JNuxr5C7p1oN3OwY724iTVqQnOLmZKZaSnHV3RkY67wKDGQkQIie14sc+42g==", + "node_modules/@rsdoctor/rspack-plugin": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/rspack-plugin/-/rspack-plugin-0.4.8.tgz", + "integrity": "sha512-IIyZ/EhiU7b3n0m+1frPTBKXnmjpB6rKbumjntzTDkmY7+OEub69WA9eqSxx0nPWQxBHwBzCpIVjSjYyARRaNg==", + "dev": true, + "license": "MIT", "dependencies": { - "@sentry-internal/feedback": "7.118.0", - "@sentry-internal/replay-canvas": "7.118.0", - "@sentry-internal/tracing": "7.118.0", - "@sentry/core": "7.118.0", - "@sentry/integrations": "7.118.0", - "@sentry/replay": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" + "@rsdoctor/core": "0.4.8", + "@rsdoctor/graph": "0.4.8", + "@rsdoctor/sdk": "0.4.8", + "@rsdoctor/types": "0.4.8", + "@rsdoctor/utils": "0.4.8", + "lodash": "^4.17.21" }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rsdoctor/sdk": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/sdk/-/sdk-0.4.8.tgz", + "integrity": "sha512-tD14drEa9ZZm5FtKL6BfDsBbOvYbIRbF5aEpQSP5ZQsKa6YfOhHA2dpv+zN7qIUXzd16vKBGNzTT906BT7HvEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rsdoctor/client": "0.4.8", + "@rsdoctor/graph": "0.4.8", + "@rsdoctor/types": "0.4.8", + "@rsdoctor/utils": "0.4.8", + "@types/fs-extra": "^11.0.4", + "body-parser": "1.20.3", + "cors": "2.8.5", + "dayjs": "1.11.13", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "open": "^8.4.2", + "serve-static": "1.16.2", + "socket.io": "4.7.2", + "source-map": "^0.7.4", + "tapable": "2.2.1" + } + }, + "node_modules/@rsdoctor/sdk/node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" + } + }, + "node_modules/@rsdoctor/sdk/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@sentry/cli": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.33.1.tgz", - "integrity": "sha512-dUlZ4EFh98VFRPJ+f6OW3JEYQ7VvqGNMa0AMcmvk07ePNeK/GicAWmSQE4ZfJTTl80ul6HZw1kY01fGQOQlVRA==", - "hasInstallScript": true, + "node_modules/@rsdoctor/sdk/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@sentry/cli-darwin": "2.33.1", - "@sentry/cli-linux-arm": "2.33.1", - "@sentry/cli-linux-arm64": "2.33.1", - "@sentry/cli-linux-i686": "2.33.1", - "@sentry/cli-linux-x64": "2.33.1", - "@sentry/cli-win32-i686": "2.33.1", - "@sentry/cli-win32-x64": "2.33.1" + "node": ">=14.14" } }, - "node_modules/@sentry/cli-darwin": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.33.1.tgz", - "integrity": "sha512-+4/VIx/E1L2hChj5nGf5MHyEPHUNHJ/HoG5RY+B+vyEutGily1c1+DM2bum7RbD0xs6wKLIyup5F02guzSzG8A==", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" + "node_modules/@rsdoctor/sdk/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, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@sentry/cli-linux-arm": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.33.1.tgz", - "integrity": "sha512-zbxEvQju+tgNvzTOt635le4kS/Fbm2XC2RtYbCTs034Vb8xjrAxLnK0z1bQnStUV8BkeBHtsNVrG+NSQDym2wg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@rsdoctor/sdk/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sentry/cli-linux-arm64": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.33.1.tgz", - "integrity": "sha512-DbGV56PRKOLsAZJX27Jt2uZ11QfQEMmWB4cIvxkKcFVE+LJP4MVA+MGGRUL6p+Bs1R9ZUuGbpKGtj0JiG6CoXw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@rsdoctor/sdk/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@sentry/cli-linux-i686": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.33.1.tgz", - "integrity": "sha512-g2LS4oPXkPWOfKWukKzYp4FnXVRRSwBxhuQ9eSw2peeb58ZIObr4YKGOA/8HJRGkooBJIKGaAR2mH2Pk1TKaiA==", - "cpu": [ - "x86", - "ia32" - ], - "optional": true, - "os": [ - "linux", - "freebsd" - ], + "node_modules/@rsdoctor/types": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/types/-/types-0.4.8.tgz", + "integrity": "sha512-yY9OyfRLuOva2GhLccjHy1jDVTfoxeGSXF030DingiorrhFXMi+TJjq98LN4p9ha/awxzHayAUcSwZ3nq1XEXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "3.4.38", + "@types/estree": "1.0.5", + "@types/tapable": "2.2.7", + "source-map": "^0.7.4" + }, + "peerDependencies": { + "@rspack/core": "*", + "webpack": "5.x" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + } + } + }, + "node_modules/@rsdoctor/types/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/types/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/@sentry/cli-linux-x64": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.33.1.tgz", - "integrity": "sha512-IV3dcYV/ZcvO+VGu9U6kuxSdbsV2kzxaBwWUQxtzxJ+cOa7J8Hn1t0koKGtU53JVZNBa06qJWIcqgl4/pCuKIg==", + "node_modules/@rsdoctor/utils": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@rsdoctor/utils/-/utils-0.4.8.tgz", + "integrity": "sha512-5m0dvwkdKAT5mONAf49oG1JEr+FXSThxwo36tfIHrUPNm3pnx8bDXFL3E5rNb9LK8Va7GFYe6hjmxTxyoaveFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.25.7", + "@rsdoctor/types": "0.4.8", + "@types/estree": "1.0.5", + "acorn": "^8.10.0", + "acorn-import-assertions": "1.9.0", + "acorn-walk": "8.3.4", + "chalk": "^4.1.2", + "connect": "3.7.0", + "deep-eql": "4.1.4", + "envinfo": "7.14.0", + "filesize": "^10.1.6", + "fs-extra": "^11.1.1", + "get-port": "5.1.1", + "json-stream-stringify": "3.0.1", + "lines-and-columns": "2.0.4", + "lodash": "^4.17.21", + "rslog": "^1.2.3", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/@rsdoctor/utils/node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@rsdoctor/utils/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/utils/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@rsdoctor/utils/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, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rsdoctor/utils/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@rspack/binding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.0.tgz", + "integrity": "sha512-zLduWacrw/bBYiFvhjN70f+AJxXnTzevywXp54vso8d0Nz7z4KIycdz/Ua5AGRUkG2ZuQw6waypN5pXf48EBcA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.0", + "@rspack/binding-darwin-x64": "1.1.0", + "@rspack/binding-linux-arm64-gnu": "1.1.0", + "@rspack/binding-linux-arm64-musl": "1.1.0", + "@rspack/binding-linux-x64-gnu": "1.1.0", + "@rspack/binding-linux-x64-musl": "1.1.0", + "@rspack/binding-win32-arm64-msvc": "1.1.0", + "@rspack/binding-win32-ia32-msvc": "1.1.0", + "@rspack/binding-win32-x64-msvc": "1.1.0" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-02YmzmtKMNHCSMzVT5sgbJuPDn+HunkrtWq0D95Fh9sGKYap9cs0JOpzTfyAL3KXJ9JzVfOAZA3VgVQOBaQNWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.0.tgz", + "integrity": "sha512-HtBh8p6hml7BWNtZaqWFtGbOFP/tvFDn1uPWmA3R32WTILUXNRWXIsLDY95U3Z2U1Gt3SL58SOpJjXlFIb6wZg==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "linux", - "freebsd" + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.0.tgz", + "integrity": "sha512-Q/i50Pieii3akdv5Q6my6QelV5Dpc8O/Ir4udpjYl0pbSdKamdI8M85fxrMxGAGcoNSD+X52fDvxJujXWMcP0w==", + "cpu": [ + "arm64" ], - "engines": { - "node": ">=10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@sentry/cli-win32-i686": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.33.1.tgz", - "integrity": "sha512-F7cJySvkpzIu7fnLKNHYwBzZYYwlhoDbAUnaFX0UZCN+5DNp/5LwTp37a5TWOsmCaHMZT4i9IO4SIsnNw16/zQ==", + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.0.tgz", + "integrity": "sha512-H7Eu3xC7LWPpxrI47n8X361eEGGpQOjZIWTz8tLdn4oNS2D9kqsBYES7LsuuLTTH4ueHTDuEtDdfZpBsE+qesw==", "cpu": [ - "x86", - "ia32" + "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.0.tgz", + "integrity": "sha512-dIZSutPo2z/OaO2f6SVlcYA6lGBH+4TrRtWmMyPshpTNPrkCGGfDhC43fZ4jCiUj2PO/Hcn8jyKhci4leBsVBA==", + "cpu": [ + "x64" ], - "engines": { - "node": ">=10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@sentry/cli-win32-x64": { - "version": "2.33.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.33.1.tgz", - "integrity": "sha512-8VyRoJqtb2uQ8/bFRKNuACYZt7r+Xx0k2wXRGTyH05lCjAiVIXn7DiS2BxHFty7M1QEWUCMNsb/UC/x/Cu2wuA==", + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.0.tgz", + "integrity": "sha512-f6L2JWgbG9PKWnVw2YNZdntjzia1V2w2Xq458HkCQUDwhnEipWXaZ2zhfD9jcb4UYoMP8/2uD3B96sSFFNTdrQ==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.0.tgz", + "integrity": "sha512-opo6XR4iXh/QkHiauVQBlU2xR2JyjDmSwgkION27oszu81nr+IajTSXQX96x5I6Bq48GQLU4rItHse/doctQDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.0.tgz", + "integrity": "sha512-FBcG+OPJokSE3nPi1+ZamLK2V4IWdNC+GMr0z7LUrBiKc5lO70y5VkldfyPV1Z+doSuroVINlhK+lRHdQgGwYg==", + "cpu": [ + "ia32" ], - "engines": { - "node": ">=10" - } + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@sentry/core": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.118.0.tgz", - "integrity": "sha512-ol0xBdp3/K11IMAYSQE0FMxBOOH9hMsb/rjxXWe0hfM5c72CqYWL3ol7voPci0GELJ5CZG+9ImEU1V9r6gK64g==", - "dependencies": { - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.0.tgz", + "integrity": "sha512-H/6Glp1nZvxWAD5+2hRrp1kBs9f+pLb/un2TdFSUNd2tyXq5GyHCe70+N9psbe/jjGxD8e1vPNQtN/VvkuR0Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@sentry/integrations": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.118.0.tgz", - "integrity": "sha512-C2rR4NvIMjokF8jP5qzSf1o2zxDx7IeYnr8u15Kb2+HdZtX559owALR0hfgwnfeElqMhGlJBaKUWZ48lXJMzCQ==", + "node_modules/@rspack/cli": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.0.tgz", + "integrity": "sha512-+xUJhXyJ0gwP/5cNlXIiETZySUXOXiYf8DKPPHQcSf8MuTXnseX5tdC2mhbdHkaYuni9MqlBD+1ppyuvl/49sw==", + "dev": true, + "license": "MIT", "dependencies": { - "@sentry/core": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0", - "localforage": "^1.8.1" + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" }, - "engines": { - "node": ">=8" + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" } }, - "node_modules/@sentry/replay": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.118.0.tgz", - "integrity": "sha512-boQfCL+1L/tSZ9Huwi00+VtU+Ih1Lcg8HtxBuAsBCJR9pQgUL5jp7ECYdTeeHyCh/RJO7JqV1CEoGTgohe10mA==", - "dependencies": { - "@sentry-internal/tracing": "7.118.0", - "@sentry/core": "7.118.0", - "@sentry/types": "7.118.0", - "@sentry/utils": "7.118.0" - }, + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rspack/cli/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, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10.13.0" } }, - "node_modules/@sentry/types": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.118.0.tgz", - "integrity": "sha512-2drqrD2+6kgeg+W/ycmiti3G4lJrV3hGjY9PpJ3bJeXrh6T2+LxKPzlgSEnKFaeQWkXdZ4eaUbtTXVebMjb5JA==", + "node_modules/@rspack/cli/node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/@sentry/utils": { - "version": "7.118.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.118.0.tgz", - "integrity": "sha512-43qItc/ydxZV1Zb3Kn2M54RwL9XXFa3IAYBO8S82Qvq5YUYmU2AmJ1jgg7DabXlVSWgMA1HntwqnOV3JLaEnTQ==", + "node_modules/@rspack/cli/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, + "license": "MIT", "dependencies": { - "@sentry/types": "7.118.0" + "resolve": "^1.20.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" } }, - "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==", - "engines": { - "node": ">=10" + "node_modules/@rspack/cli/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "engines": { - "node": ">=18" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/@rspack/cli/node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.0" + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" }, "engines": { - "node": ">=10" + "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==", + "node_modules/@rspack/cli/node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", + "node_modules/@rspack/cli/node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@rspack/cli/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "license": "MIT", + "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/@rspack/cli/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, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@rspack/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.0.tgz", + "integrity": "sha512-+IYWSe9D3wB97VVBfaojuWLv3wGIBe9pfJkxNObkorN60Nj3UHYzBLuACrHn4hW2mZjAWrv06ReHXJUEGzQqaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.0", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@rspack/plugin-react-refresh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.0.0.tgz", + "integrity": "sha512-WvXkLewW5G0Mlo5H1b251yDh5FFiH4NDAbYlFpvFjcuXX2AchZRf9zdw57BDE/ADyWsJgA8kixN/zZWBTN3iYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0" + }, + "peerDependencies": { + "react-refresh": ">=0.10.0 <1.0.0" + }, + "peerDependenciesMeta": { + "react-refresh": { + "optional": true + } + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.119.2.tgz", + "integrity": "sha512-bnR1yJWVBZfXGx675nMXE8hCXsxluCBfIFy9GQT8PTN/urxpoS9cGz+5F7MA7Xe3Q06/7TT0Mz3fcDvjkqTu3Q==", + "dependencies": { + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.119.2.tgz", + "integrity": "sha512-Lqo8IFyeKkdOrOGRqm9jCEqeBl8kINe5+c2VqULpkO/I6ql6ISwPSYnmG6yL8cCVIaT1893CLog/pS4FxCv8/Q==", + "dependencies": { + "@sentry/core": "7.119.2", + "@sentry/replay": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.119.2.tgz", + "integrity": "sha512-V2W+STWrafyGJhQv3ulMFXYDwWHiU6wHQAQBShsHVACiFaDrJ2kPRet38FKv4dMLlLlP2xN+ss2e5zv3tYlTiQ==", + "dependencies": { + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/browser": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.119.2.tgz", + "integrity": "sha512-Wb2RzCsJBTNCmS9KPmbVyV5GGzFXjFdUThAN9xlnN5GgemMBwdQjGu/tRYr8yJAVsRb0EOFH8IuJBNKKNnO49g==", + "dependencies": { + "@sentry-internal/feedback": "7.119.2", + "@sentry-internal/replay-canvas": "7.119.2", + "@sentry-internal/tracing": "7.119.2", + "@sentry/core": "7.119.2", + "@sentry/integrations": "7.119.2", + "@sentry/replay": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/cli": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.38.0.tgz", + "integrity": "sha512-ld9+1GdPkDaFr6T4SGocxoMcrBB/K6Z37TvBx8IMrDQC+eJDkBFiyqmHnzrj/8xoj5O220pqjPZCfvqzH268sQ==", + "hasInstallScript": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.38.0", + "@sentry/cli-linux-arm": "2.38.0", + "@sentry/cli-linux-arm64": "2.38.0", + "@sentry/cli-linux-i686": "2.38.0", + "@sentry/cli-linux-x64": "2.38.0", + "@sentry/cli-win32-i686": "2.38.0", + "@sentry/cli-win32-x64": "2.38.0" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.38.0.tgz", + "integrity": "sha512-OvOaV9Vg4+b9ObK2z1oFj3zbRoqOSpD/wSz9t/mtSWwMQi7wlUXj88XGGsL5ZwF7VGBYL+kX59X3Ygl+dHFPlg==", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.38.0.tgz", + "integrity": "sha512-lXMSEX1Sv9F2wXnnAlsS+kwy09iLQTfK10n08xzeJLIvUCLua/OFInwH6WUxNT3tIBPfBVQZPR7iQMRycH4Ilw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.38.0.tgz", + "integrity": "sha512-oUiRTyek0Ixe30zoqNlEFsLY07B9hK3FRXKv5lw341rim9PiTteh5tk5ewpuD63K+QjbEAJqp4f3zM19DEASlg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.38.0.tgz", + "integrity": "sha512-+luFmbQymDON16O7R/A7bmnkUjtnq1nRSehnnRJjuFCtDABCKatZzBjWvan0KNgzHhCquMSvEqHKzfVSptHeHw==", + "cpu": [ + "x86", + "ia32" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.38.0.tgz", + "integrity": "sha512-yY593xXbf2W+afyHKDvO4QJwoWQX97/K0NYUAqnpg3TVmIfLV9DNVid+M1w6vKIif6n8UQgAFWtR1Ys4P75mBg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.38.0.tgz", + "integrity": "sha512-ipDnBvXaMqi0ZbkT/pqB11F4AaicVz5YRoidn5oxi1IJPDUd8qF0mnqabALLH3mAd5TOtKBliY5pllCFG/TvzA==", + "cpu": [ + "x86", + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.38.0.tgz", + "integrity": "sha512-NqlKOqNF8i239mygARkNZK9BPzwWK91j+HPEfCKoHsZKHeBT1JauoipgPykO21qn04erq5pJkA0MsiuNRNQnMA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.119.2.tgz", + "integrity": "sha512-hQr3d2yWq/2lMvoyBPOwXw1IHqTrCjOsU1vYKhAa6w9vGbJZFGhKGGE2KEi/92c3gqGn+gW/PC7cV6waCTDuVA==", + "dependencies": { + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.119.2.tgz", + "integrity": "sha512-dCuXKvbUE3gXVVa696SYMjlhSP6CxpMH/gl4Jk26naEB8Xjsn98z/hqEoXLg6Nab73rjR9c/9AdKqBbwVMHyrQ==", + "dependencies": { + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/replay": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.119.2.tgz", + "integrity": "sha512-nHDsBt0mlJXTWAHjzQdCzDbhV2fv8B62PPB5mu5SpI+G5h+ir3r5lR0lZZrMT8eurVowb/HnLXAs+XYVug3blg==", + "dependencies": { + "@sentry-internal/tracing": "7.119.2", + "@sentry/core": "7.119.2", + "@sentry/types": "7.119.2", + "@sentry/utils": "7.119.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sentry/types": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.119.2.tgz", + "integrity": "sha512-ydq1tWsdG7QW+yFaTp0gFaowMLNVikIqM70wxWNK+u98QzKnVY/3XTixxNLsUtnAB4Y+isAzFhrc6Vb5GFdFeg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.119.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.119.2.tgz", + "integrity": "sha512-TLdUCvcNgzKP0r9YD7tgCL1PEUp42TObISridsPJ5rhpVGQJvpr+Six0zIkfDUxerLYWZoK8QMm9KgFlPLNQzA==", + "dependencies": { + "@sentry/types": "7.119.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "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==", + "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==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, @@ -1257,6 +2168,187 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", @@ -1270,19 +2362,69 @@ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/dompurify": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.2.0.tgz", + "integrity": "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==", + "deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.", + "dependencies": { + "dompurify": "*" + } + }, "node_modules/@types/emoji-mart": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/@types/emoji-mart/-/emoji-mart-3.0.14.tgz", @@ -1292,9 +2434,11 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "peer": true }, "node_modules/@types/express": { "version": "4.17.21", @@ -1309,9 +2453,21 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.5", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", - "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz", + "integrity": "sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, "dependencies": { "@types/node": "*", @@ -1329,6 +2485,21 @@ "@types/node": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "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, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", @@ -1356,9 +2527,9 @@ } }, "node_modules/@types/jquery": { - "version": "3.5.30", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", - "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.32.tgz", + "integrity": "sha512-b9Xbf4CkMqS02YH8zACqN1xzdxc3cO735Qe5AbSUFmyOiaWAbcpqh9Wna+Uk0vgACvoQHpWDg2rGdHkYPLmCiQ==", "dev": true, "dependencies": { "@types/sizzle": "*" @@ -1367,7 +2538,18 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/katex": { "version": "0.14.0", @@ -1384,40 +2566,44 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", - "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.12.tgz", + "integrity": "sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==", "dev": true }, - "node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "dependencies": { - "@types/unist": "^2" - } - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "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 + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true }, "node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.8" + } }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -1432,7 +2618,8 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/plist": { "version": "3.0.5", @@ -1446,20 +2633,20 @@ } }, "node_modules/@types/prismjs": { - "version": "1.26.4", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", - "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==", + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, "node_modules/@types/raf": { @@ -1475,9 +2662,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "16.14.60", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.60.tgz", - "integrity": "sha512-wIFmnczGsTcgwCBeIYOuy2mdXEiKZ5znU/jNOnMZPQyCcIxauMGWlX0TNG4lZ7NxRKj7YUIZRneJQSSdB2jKgg==", + "version": "16.14.62", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.62.tgz", + "integrity": "sha512-BWf7hqninZav6nerxXj+NeZT/mTpDeG6Lk2zREHAy63CrnXoOGPGtNqTFYFN/sqpSaREDP5otVV88axIXmKfGA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "^0.16", @@ -1570,9 +2757,9 @@ } }, "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", + "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", "dev": true }, "node_modules/@types/sockjs": { @@ -1589,10 +2776,15 @@ "resolved": "https://registry.npmjs.org/@types/svg-path-parser/-/svg-path-parser-1.1.6.tgz", "integrity": "sha512-3sw6pk91pEtW6W7hRrJ9ZkAgPiJSaNdh7iY8rVOy7buajpQuy2J9A0ZUaiOVcbFvl0p7J+Ne4012muCE/MB+hQ==" }, - "node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "node_modules/@types/tapable": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.7.tgz", + "integrity": "sha512-D6QzACV9vNX3r8HQQNTOnpG+Bv1rko+yEA82wKs3O9CQ5+XW7HI7TED17/UE7+5dIxyxZIWTxKbsBeF6uKFCwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tapable": "^2.2.0" + } }, "node_modules/@types/verror": { "version": "1.10.10", @@ -1816,14 +3008,16 @@ "dev": true }, "node_modules/@viz-js/viz": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@viz-js/viz/-/viz-3.7.0.tgz", - "integrity": "sha512-+nZ5LWe09ypRDk43pDU09wLW80kLAEonM7xES4s6AWiCUfAy5Vb+rxnQ3hKw79ptdaHJsyNIfwnzpEFtfMIyGA==" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@viz-js/viz/-/viz-3.9.0.tgz", + "integrity": "sha512-bwm18uYf1T7xQPkSzi0yiLS/abykB23PKyMPUKnGUxbUZSIclwBWNb0ywhG26XL2j+GAyvNy0AlOht/mIrY/dA==" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1832,22 +3026,30 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1857,12 +3059,16 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -1874,6 +3080,8 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1882,6 +3090,8 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1889,12 +3099,16 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -1910,6 +3124,8 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1922,6 +3138,8 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -1933,58 +3151,26 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" } }, "node_modules/@xmldom/xmldom": { @@ -1999,12 +3185,16 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -2036,10 +3226,19 @@ "node": ">= 0.6" } }, + "node_modules/accepts/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/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -2047,10 +3246,23 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "deprecated": "package has been renamed to acorn-import-attributes", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-import-attributes": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -2065,9 +3277,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "dependencies": { "acorn": "^8.11.0" @@ -2114,6 +3326,7 @@ "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", @@ -2129,6 +3342,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -2145,6 +3359,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2159,12 +3374,14 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -2643,6 +3860,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2674,9 +3892,9 @@ } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/async-exit-hook": { @@ -2718,6 +3936,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2742,6 +3972,16 @@ } ] }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -2864,21 +4104,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", @@ -2893,6 +4118,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "optional": true }, "node_modules/brace-expansion": { @@ -2907,6 +4133,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -2915,9 +4142,10 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -2932,11 +4160,12 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2991,7 +4220,8 @@ "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==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/builder-util": { "version": "24.13.1", @@ -3056,6 +4286,22 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -3255,6 +4501,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3264,6 +4511,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.3.0", "map-obj": "^4.1.0", @@ -3282,6 +4530,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3294,6 +4543,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3302,9 +4552,10 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3345,15 +4596,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -3362,6 +4604,30 @@ "node": "*" } }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3410,6 +4676,8 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -3511,6 +4779,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -3682,6 +4951,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" + }, "node_modules/config-file-ts": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", @@ -3736,6 +5010,22 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -3745,6 +5035,75 @@ "node": ">=0.8" } }, + "node_modules/connect/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, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3772,9 +5131,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -3786,132 +5145,79 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/copy-webpack-plugin": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", - "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", - "dependencies": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", - "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/copy-webpack-plugin/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" } }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dependencies": { - "layout-base": "^1.0.0" - } - }, "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", @@ -3968,9 +5274,9 @@ } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -3994,6 +5300,7 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "cssesc": "^3.0.0", @@ -4020,11 +5327,31 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/css-loader/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -4034,6 +5361,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -4065,6 +5393,30 @@ "cytoscape": "^3.2.0" } }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", @@ -4479,11 +5831,11 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", "dependencies": { - "d3": "^7.8.2", + "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, @@ -4539,22 +5891,23 @@ } }, "node_modules/dayjs": { - "version": "1.11.12", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", - "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -4580,6 +5933,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4592,6 +5946,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -4608,6 +5963,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4617,22 +5973,11 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -4666,6 +6011,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -4680,6 +6038,46 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", @@ -4819,12 +6217,16 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { @@ -4875,14 +6277,6 @@ "node": ">= 0.8" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -5145,10 +6539,11 @@ } }, "node_modules/electron": { - "version": "31.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.2.tgz", - "integrity": "sha512-55efQ5yfLN+AQHcFC00AXQqtxC3iAGaxX2GQ3EDbFJ0ca9GHNOdSXkcrdBElLleiDrR2hpXNkQxN1bDn0oxe6w==", + "version": "31.7.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.7.5.tgz", + "integrity": "sha512-8zFzVJdhxTRmoPcRiKkEmPW0bJHAUsTQJwEX2YJ8X0BVFIJLwSvHkSlpCjEExVbNCAk+gHnkIYX+2OyCXrRwHQ==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^20.9.0", @@ -5291,9 +6686,12 @@ } }, "node_modules/electron-log": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-3.0.9.tgz", - "integrity": "sha512-kfV4riUqW8uooYLAfrlB3EJW66W29ePipJU4/Fm8UxQekVNcR2qHI/0tiJX3oWM79VdAUiiYqL9V49lhnSIO8g==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.2.0.tgz", + "integrity": "sha512-VjLkvaLmbP3AOGOh5Fob9M8bFU0mmeSAb5G2EoTBx+kQLf2XA/0byzjsVGBTHhikbT+m1AB27NEQUv9wX9nM8w==", + "engines": { + "node": ">= 14" + } }, "node_modules/electron-publish": { "version": "24.13.1", @@ -5337,16 +6735,18 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==" + "version": "1.5.43", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.43.tgz", + "integrity": "sha512-NxnmFBHDl5Sachd2P46O7UJiMaMHMLSofoIWVJq3mj8NJgG0umiSeljAVP9lGzjI0UDLJJ5jjoGjcrB8RSbjLQ==", + "dev": true, + "peer": true }, "node_modules/electron-updater": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.4.tgz", - "integrity": "sha512-uZUo7p1Y53G4tl6Cgw07X1yF8Jlz6zhaL7CQJDZ1fVVkOaBfE2cWtx80avwDVi8jHp+I/FWawrMgTAeCCNIfAg==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.3.9.tgz", + "integrity": "sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==", "dependencies": { - "builder-util-runtime": "9.2.5", + "builder-util-runtime": "9.2.10", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0", "lazy-val": "^1.0.5", @@ -5357,9 +6757,9 @@ } }, "node_modules/electron-updater/node_modules/builder-util-runtime": { - "version": "9.2.5", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.5.tgz", - "integrity": "sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==", + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz", + "integrity": "sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==", "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" @@ -5414,18 +6814,13 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "20.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", - "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "version": "20.16.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.15.tgz", + "integrity": "sha512-DV58qQz9dBMqVVn+qnKwGa51QzCD4YM/tQM16qLKxdf5tqz5W4QwtrMzjSTbabN1cFTSuyxVYBy+QWHjWW8X/g==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, - "node_modules/elkjs": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", - "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==" - }, "node_modules/emoji-mart": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", @@ -5446,9 +6841,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" @@ -5471,18 +6866,82 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, "node_modules/env-paths": { @@ -5494,10 +6953,11 @@ } }, "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -5510,18 +6970,6 @@ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -5531,6 +6979,16 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -5613,9 +7071,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -5625,12 +7083,12 @@ "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", + "iterator.prototype": "^1.1.3", "safe-array-concat": "^1.1.2" }, "engines": { @@ -5640,7 +7098,9 @@ "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -5701,9 +7161,10 @@ "optional": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, "engines": { "node": ">=6" } @@ -5727,16 +7188,17 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -5782,9 +7244,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.35.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", - "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "dependencies": { "array-includes": "^3.1.8", @@ -5792,7 +7254,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -5951,6 +7413,7 @@ "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" }, @@ -5962,6 +7425,7 @@ "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" } @@ -5994,6 +7458,8 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -6038,6 +7504,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -6052,9 +7531,9 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" }, "node_modules/express": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.20.0.tgz", - "integrity": "sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -6062,14 +7541,14 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", @@ -6078,11 +7557,11 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", - "serve-static": "1.16.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -6095,20 +7574,11 @@ }, "node_modules/express/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/express/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "engines": { - "node": ">= 0.8" + "dependencies": { + "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { @@ -6178,12 +7648,14 @@ "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==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6199,6 +7671,7 @@ "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" }, @@ -6209,7 +7682,8 @@ "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==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -6218,23 +7692,16 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -6292,10 +7759,21 @@ "node": ">=10" } }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6304,13 +7782,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -6366,15 +7844,6 @@ "resolved": "https://registry.npmjs.org/findandreplacedomtext/-/findandreplacedomtext-0.4.6.tgz", "integrity": "sha512-CVRIKbEwfWoKTSnLrmyX26WjMY7o0aUUTm0RXN47fF/eHINJa8C+YHZxGagC7gMWVaAEBFwH7uVXuhwZcylWOQ==" }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -6412,9 +7881,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -6468,10 +7937,123 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", + "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^8.2.0", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -6547,7 +8129,8 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -6651,6 +8234,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -6711,6 +8307,7 @@ "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" }, @@ -6721,7 +8318,9 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", @@ -6883,6 +8482,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -6894,6 +8498,7 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6911,6 +8516,7 @@ "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" } @@ -7092,7 +8698,8 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-cache-semantics": { "version": "4.1.1", @@ -7155,9 +8762,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", @@ -7252,6 +8859,16 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -7285,6 +8902,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, + "license": "ISC", "dependencies": { "postcss": "^7.0.14" }, @@ -7317,9 +8935,10 @@ "integrity": "sha512-BFEH2mZyeF6KZKaKLVPZ0wMjIiWOdjvZ7zbx8ENec0qfZhJwKFbX/4jKM5LTKyJEc/GOqUKiiJ2IFKT9yWrZqA==" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, "engines": { "node": ">= 4" } @@ -7351,25 +8970,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -7446,15 +9046,6 @@ "node": ">=12" } }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -7586,9 +9177,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "dependencies": { "hasown": "^2.0.2" @@ -7649,6 +9240,7 @@ "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" } @@ -7692,6 +9284,7 @@ "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" }, @@ -7699,6 +9292,41 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -7728,10 +9356,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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" } @@ -7773,6 +9415,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -7938,9 +9581,9 @@ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/isbinaryfile": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz", - "integrity": "sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.3.tgz", + "integrity": "sha512-VR4gNjFaDP8csJQvzInG20JvBj8MaHYLxNOMXysxRbGM7tcsHZwCjhch3FubFtZBkuDbN55i4dUukGeIrzF+6g==", "dev": true, "engines": { "node": ">= 18.0.0" @@ -7959,14 +9602,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "dependencies": { "define-properties": "^1.2.1", @@ -7974,6 +9618,9 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/jackspeak": { @@ -8035,6 +9682,8 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8048,6 +9697,8 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8103,12 +9754,14 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8116,6 +9769,13 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stream-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.0.1.tgz", + "integrity": "sha512-vuxs3G1ocFDiAQ/SX0okcZbtqXwgj1g71qE9+vrjJ2EkjKQlEFDAcUNRxRU8O+GekV4v5cM2qXP0Wyt/EMDBiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -8226,30 +9886,36 @@ "graceful-fs": "^4.1.11" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" + }, + "node_modules/langium": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.0.0.tgz", + "integrity": "sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, "node_modules/launch-editor": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", - "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, - "node_modules/launch-editor/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", @@ -8537,6 +10203,12 @@ "node": ">=8.6" } }, + "node_modules/lint-staged/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/listr2": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", @@ -8563,9 +10235,9 @@ } }, "node_modules/listr2/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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -8687,6 +10359,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, "engines": { "node": ">=6.11.5" } @@ -8705,6 +10379,21 @@ "node": ">=4.0.0" } }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", @@ -8817,9 +10506,9 @@ } }, "node_modules/log-update/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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -8846,814 +10535,336 @@ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/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/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "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/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "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": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/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==", - "engines": { - "node": ">=12" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "node_modules/log-update/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/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/merge-refs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", - "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/merge-stream": { + "node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz", - "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==", - "dependencies": { - "@braintree/sanitize-url": "^6.0.1", - "@types/d3-scale": "^4.0.3", - "@types/d3-scale-chromatic": "^3.0.0", - "cytoscape": "^3.28.1", - "cytoscape-cose-bilkent": "^4.1.0", - "d3": "^7.4.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "^3.0.5", - "elkjs": "^0.9.0", - "katex": "^0.16.9", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "mdast-util-from-markdown": "^1.3.0", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.3", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" + "node": ">=8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "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": ">= 0.6" + "node": ">=10" } }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/make-cancellable-promise": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", + "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", + "funding": { + "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" } }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/make-event-props": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", + "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", + "funding": { + "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" } }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "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": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/make-fetch-happen/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==", + "engines": { + "node": ">=12" } }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/marked": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", + "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "optional": true, "dependencies": { - "micromark-util-symbol": "^1.0.0" + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz", + "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "node_modules/merge-refs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", + "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", + "funding": { + "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" } }, - "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "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/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/mermaid": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.4.0.tgz", + "integrity": "sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==", + "dependencies": { + "@braintree/sanitize-url": "^7.0.1", + "@iconify/utils": "^2.1.32", + "@mermaid-js/parser": "^0.3.0", + "@types/d3": "^7.4.3", + "@types/dompurify": "^3.0.5", + "cytoscape": "^3.29.2", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.10", + "dompurify": "^3.0.11 <3.1.7", + "katex": "^0.16.9", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^13.0.2", + "roughjs": "^4.6.6", + "stylis": "^4.3.1", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.1" + } }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9726,6 +10937,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -9764,6 +10976,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -9872,10 +11085,21 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, + "node_modules/mlly": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "ufo": "^1.5.4" + } + }, "node_modules/mobx": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.1.tgz", - "integrity": "sha512-ekLRxgjWJr8hVxj9ZKuClPwM/iHckx3euIJ3Np7zLVNtqJvfbbq7l370W/98C8EabdQ1pB5Jd3BbDWxJPNnaOg==", + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.5.tgz", + "integrity": "sha512-/HTWzW2s8J1Gqt+WmUj5Y0mddZk+LInejADc79NJadrWla3rHzmRHki/mnEUH1AvOmbNTZ1BRbKxr8DSgfdjMA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -9942,27 +11166,20 @@ "node": ">=0.10.0" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, + "license": "MIT", "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -9989,9 +11206,9 @@ "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==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "engines": { "node": ">= 0.6" } @@ -9999,7 +11216,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/new-github-issue-url": { "version": "0.2.1", @@ -10016,9 +11234,9 @@ "dev": true }, "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", "dependencies": { "semver": "^7.3.5" }, @@ -10026,6 +11244,13 @@ "node": ">=10" } }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -10181,12 +11406,9 @@ "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "peer": true }, "node_modules/nopt": { "version": "4.0.3", @@ -10249,6 +11471,7 @@ "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" } @@ -10265,9 +11488,9 @@ } }, "node_modules/npm": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz", - "integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.0.tgz", + "integrity": "sha512-ZanDioFylI9helNhl2LNd+ErmVD+H5I53ry41ixlLyCBgkuYb+58CvbAp99hW+zr5L9W4X7CchSoeqKdngOLSw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -10341,73 +11564,73 @@ "dev": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.5.4", - "@npmcli/config": "^8.3.4", - "@npmcli/fs": "^3.1.1", - "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.2.0", - "@npmcli/promise-spawn": "^7.0.2", - "@npmcli/redact": "^2.0.1", - "@npmcli/run-script": "^8.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/config": "^9.0.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", + "@npmcli/promise-spawn": "^8.0.1", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", "@sigstore/tuf": "^2.3.4", - "abbrev": "^2.0.0", + "abbrev": "^3.0.0", "archy": "~1.0.0", - "cacache": "^18.0.3", + "cacache": "^19.0.1", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.4.2", + "glob": "^10.4.5", "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.2", - "ini": "^4.1.3", - "init-package-json": "^6.0.3", + "hosted-git-info": "^8.0.0", + "ini": "^5.0.0", + "init-package-json": "^7.0.1", "is-cidr": "^5.1.0", - "json-parse-even-better-errors": "^3.0.2", - "libnpmaccess": "^8.0.6", - "libnpmdiff": "^6.1.4", - "libnpmexec": "^8.1.3", - "libnpmfund": "^5.0.12", - "libnpmhook": "^10.0.5", - "libnpmorg": "^6.0.6", - "libnpmpack": "^7.0.4", - "libnpmpublish": "^9.0.9", - "libnpmsearch": "^7.0.6", - "libnpmteam": "^6.0.5", - "libnpmversion": "^6.0.3", - "make-fetch-happen": "^13.0.1", + "json-parse-even-better-errors": "^4.0.0", + "libnpmaccess": "^9.0.0", + "libnpmdiff": "^7.0.0", + "libnpmexec": "^9.0.0", + "libnpmfund": "^6.0.0", + "libnpmhook": "^11.0.0", + "libnpmorg": "^7.0.0", + "libnpmpack": "^8.0.0", + "libnpmpublish": "^10.0.0", + "libnpmsearch": "^8.0.0", + "libnpmteam": "^7.0.0", + "libnpmversion": "^7.0.0", + "make-fetch-happen": "^14.0.1", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.1.0", - "nopt": "^7.2.1", - "normalize-package-data": "^6.0.2", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.1.0", - "npm-profile": "^10.0.0", - "npm-registry-fetch": "^17.1.0", - "npm-user-validate": "^2.0.1", + "node-gyp": "^10.2.0", + "nopt": "^8.0.0", + "normalize-package-data": "^7.0.0", + "npm-audit-report": "^6.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-profile": "^11.0.1", + "npm-registry-fetch": "^18.0.1", + "npm-user-validate": "^3.0.0", "p-map": "^4.0.0", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^4.2.0", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", - "read": "^3.0.1", - "semver": "^7.6.2", + "read": "^4.0.0", + "semver": "^7.6.3", "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.1", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" + "validate-npm-package-name": "^6.0.0", + "which": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", @@ -10500,9 +11723,9 @@ "dev": true }, "node_modules/npm-run-all/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==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "dependencies": { "nice-try": "^1.0.4", @@ -10714,6 +11937,18 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/npm/node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", "dev": true, @@ -10721,7 +11956,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.2", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -10733,48 +11968,48 @@ "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.4", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^8.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^19.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", - "ssri": "^10.0.6", + "ssri": "^12.0.0", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, @@ -10782,30 +12017,30 @@ "arborist": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.4", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/package-json": "^5.1.1", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/package-json": "^6.0.1", "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", + "ini": "^5.0.0", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -10813,160 +12048,160 @@ "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.8", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "bin": { "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", + "version": "4.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", + "cacache": "^19.0.0", + "json-parse-even-better-errors": "^4.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.2.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", + "@npmcli/git": "^6.0.0", "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "normalize-package-data": "^7.0.0", + "proc-log": "^5.0.0", "semver": "^7.5.3" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "which": "^4.0.0" + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.1.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/redact": { - "version": "2.0.1", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.1.0", + "version": "9.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" + "proc-log": "^5.0.0", + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@pkgjs/parseargs": { @@ -11026,6 +12261,142 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/cacache": { + "version": "18.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "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": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "13.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "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/npm/node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/ssri": { + "version": "10.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign/node_modules/unique-slug": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/npm/node_modules/@sigstore/tuf": { "version": "2.3.4", "dev": true, @@ -11076,12 +12447,12 @@ } }, "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/agent-base": { @@ -11149,18 +12520,19 @@ "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.4", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" + "cmd-shim": "^7.0.0", + "npm-normalize-package-bin": "^4.0.0", + "proc-log": "^5.0.0", + "read-cmd-shim": "^5.0.0", + "write-file-atomic": "^6.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/binary-extensions": { @@ -11185,12 +12557,12 @@ } }, "node_modules/npm/node_modules/cacache": { - "version": "18.0.3", + "version": "19.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", @@ -11198,13 +12570,88 @@ "minipass-collect": "^2.0.1", "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" + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/p-map": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/tar": { + "version": "7.4.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/cacache/node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, "node_modules/npm/node_modules/chalk": { @@ -11278,12 +12725,12 @@ } }, "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.3", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/color-convert": { @@ -11352,7 +12799,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.5", + "version": "4.3.6", "dev": true, "inBundle": true, "license": "MIT", @@ -11436,7 +12883,7 @@ } }, "node_modules/npm/node_modules/foreground-child": { - "version": "3.2.1", + "version": "3.3.0", "dev": true, "inBundle": true, "license": "ISC", @@ -11464,7 +12911,7 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "10.4.2", + "version": "10.4.5", "dev": true, "inBundle": true, "license": "ISC", @@ -11479,9 +12926,6 @@ "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -11493,7 +12937,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.2", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -11501,7 +12945,7 @@ "lru-cache": "^10.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { @@ -11550,7 +12994,7 @@ } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.5", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -11558,7 +13002,7 @@ "minimatch": "^9.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/imurmurhash": { @@ -11580,30 +13024,30 @@ } }, "node_modules/npm/node_modules/ini": { - "version": "4.1.3", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.3", + "version": "7.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", + "@npmcli/package-json": "^6.0.0", + "npm-package-arg": "^12.0.0", + "promzard": "^2.0.0", + "read": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/ip-address": { @@ -11665,16 +13109,13 @@ "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { - "version": "3.4.0", + "version": "3.4.3", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -11689,12 +13130,12 @@ "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -11728,201 +13169,197 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.6", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.4", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.4", - "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/installed-package-contents": "^3.0.0", "binary-extensions": "^2.3.0", "diff": "^5.1.0", "minimatch": "^9.0.4", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", "tar": "^6.2.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "8.1.3", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.4", - "@npmcli/run-script": "^8.1.0", + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", - "proc-log": "^4.2.0", - "read": "^3.0.1", - "read-package-json-fast": "^3.0.2", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0", + "proc-log": "^5.0.0", + "read": "^4.0.0", + "read-package-json-fast": "^4.0.0", "semver": "^7.3.7", "walk-up-path": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.12", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.4" + "@npmcli/arborist": "^8.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.5", + "version": "11.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.6", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.4", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^7.5.4", - "@npmcli/run-script": "^8.1.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6" + "@npmcli/arborist": "^8.0.0", + "@npmcli/run-script": "^9.0.1", + "npm-package-arg": "^12.0.0", + "pacote": "^19.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.9", + "version": "10.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", + "normalize-package-data": "^7.0.0", + "npm-package-arg": "^12.0.0", + "npm-registry-fetch": "^18.0.1", + "proc-log": "^5.0.0", "semver": "^7.3.7", "sigstore": "^2.2.0", - "ssri": "^10.0.6" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.6", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.5", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" + "npm-registry-fetch": "^18.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.3", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.7", - "@npmcli/run-script": "^8.1.0", - "json-parse-even-better-errors": "^3.0.2", - "proc-log": "^4.2.0", + "@npmcli/git": "^6.0.1", + "@npmcli/run-script": "^9.0.1", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.7" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.2", + "version": "10.4.3", "dev": true, "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.1", + "version": "14.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", + "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", - "proc-log": "^4.2.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "ssri": "^10.0.0" + "ssri": "^12.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/minimatch": { @@ -11962,22 +13399,35 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.5", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, + "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/npm/node_modules/minipass-flush": { "version": "1.0.5", "dev": true, @@ -12094,12 +13544,12 @@ "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/negotiator": { @@ -12108,44 +13558,219 @@ "inBundle": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { + "version": "18.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "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": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { + "version": "13.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { + "version": "3.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "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/npm/node_modules/node-gyp/node_modules/nopt": { + "version": "7.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { + "version": "10.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.1.0", + "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "imurmurhash": "^0.1.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", + "node_modules/npm/node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/nopt": { - "version": "7.2.1", + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12155,47 +13780,56 @@ "bin": { "nopt": "bin/nopt.js" }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/nopt/node_modules/abbrev": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.2", + "version": "7.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", + "hosted-git-info": "^8.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^3.0.0" + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", + "version": "7.1.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -12203,99 +13837,112 @@ "semver": "^7.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.2", + "version": "12.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", + "hosted-git-info": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.4" + "ignore-walk": "^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.1.0", + "version": "10.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", + "npm-install-checks": "^7.1.0", + "npm-normalize-package-bin": "^4.0.0", + "npm-package-arg": "^12.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-profile": { - "version": "10.0.0", + "version": "11.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.0.0" + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "17.1.0", + "version": "18.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/redact": "^2.0.0", + "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", + "make-fetch-happen": "^14.0.0", "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "engines": { + "node": ">= 18" } }, "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.1", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/p-map": { @@ -12320,48 +13967,48 @@ "license": "BlueOak-1.0.0" }, "node_modules/npm/node_modules/pacote": { - "version": "18.0.6", + "version": "19.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "sigstore": "^2.2.0", - "ssri": "^10.0.0", + "ssri": "^12.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", + "json-parse-even-better-errors": "^4.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/path-key": { @@ -12390,7 +14037,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.1.0", + "version": "6.1.2", "dev": true, "inBundle": true, "license": "MIT", @@ -12403,21 +14050,21 @@ } }, "node_modules/npm/node_modules/proc-log": { - "version": "4.2.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/proggy": { - "version": "2.0.0", + "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/promise-all-reject-late": { @@ -12458,15 +14105,15 @@ } }, "node_modules/npm/node_modules/promzard": { - "version": "1.0.2", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "read": "^3.0.1" + "read": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/qrcode-terminal": { @@ -12478,37 +14125,37 @@ } }, "node_modules/npm/node_modules/read": { - "version": "3.0.1", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "mute-stream": "^1.0.0" + "mute-stream": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/retry": { @@ -12520,6 +14167,21 @@ "node": ">= 4" } }, + "node_modules/npm/node_modules/rimraf": { + "version": "5.0.10", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/npm/node_modules/safer-buffer": { "version": "2.1.2", "dev": true, @@ -12528,7 +14190,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.6.2", + "version": "7.6.3", "dev": true, "inBundle": true, "license": "ISC", @@ -12676,7 +14338,7 @@ "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ssri": { - "version": "10.0.6", + "version": "12.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12684,7 +14346,7 @@ "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/string-width": { @@ -12741,117 +14403,253 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "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/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/agent": { + "version": "2.2.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js/node_modules/@npmcli/fs": { + "version": "3.1.1", "dev": true, "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", + "node_modules/npm/node_modules/tuf-js/node_modules/cacache": { + "version": "18.0.4", "dev": true, "inBundle": true, "license": "ISC", "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" + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "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": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/npm/node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" }, "engines": { - "node": ">= 8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", + "node_modules/npm/node_modules/tuf-js/node_modules/proc-log": { + "version": "4.2.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", + "node_modules/npm/node_modules/tuf-js/node_modules/ssri": { + "version": "10.0.6", "dev": true, "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/npm/node_modules/treeverse": { + "node_modules/npm/node_modules/tuf-js/node_modules/unique-filename": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.1", + "node_modules/npm/node_modules/tuf-js/node_modules/unique-slug": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" + "imurmurhash": "^0.1.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "unique-slug": "^4.0.0" + "unique-slug": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12859,7 +14657,7 @@ "imurmurhash": "^0.1.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/util-deprecate": { @@ -12889,12 +14687,12 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.1", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/walk-up-path": { @@ -12904,7 +14702,7 @@ "license": "ISC" }, "node_modules/npm/node_modules/which": { - "version": "4.0.0", + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -12915,7 +14713,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/which/node_modules/isexe": { @@ -13028,7 +14826,7 @@ } }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "6.0.0", "dev": true, "inBundle": true, "license": "ISC", @@ -13037,7 +14835,7 @@ "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/yallist": { @@ -13357,21 +15155,17 @@ "node": ">= 4" } }, - "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/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, + "node_modules/package-manager-detector": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.5.tgz", + "integrity": "sha512-3dS7y28uua+UDbRCLBqltMBrbI+A5U2mI9YuxHRxIWYmLj3DwntEBmERYzIAQ4DMeuCUOBSak7dBHHoXKpOTYQ==" + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -13455,9 +15249,9 @@ "dev": true }, "node_modules/patch-package/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==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "dependencies": { "nice-try": "^1.0.4", @@ -13551,6 +15345,18 @@ "node": ">= 6" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -13631,6 +15437,11 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, "node_modules/pdfjs-dist": { "version": "2.16.105", "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", @@ -13659,15 +15470,17 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -13696,68 +15509,14 @@ "node": ">=4" } }, - "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, + "node_modules/pkg-types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" } }, "node_modules/plist": { @@ -13774,6 +15533,20 @@ "node": ">=10.4.0" } }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -13805,6 +15578,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "dev": true, + "license": "ISC", "dependencies": { "postcss": "^7.0.5" }, @@ -13817,6 +15591,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", "dev": true, + "license": "MIT", "dependencies": { "icss-utils": "^4.1.1", "postcss": "^7.0.32", @@ -13832,6 +15607,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "dev": true, + "license": "ISC", "dependencies": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" @@ -13845,16 +15621,18 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", "dev": true, + "license": "ISC", "dependencies": { "icss-utils": "^4.0.0", "postcss": "^7.0.6" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13867,6 +15645,13 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", "dev": true }, "node_modules/prebuild-install": { @@ -13989,16 +15774,10 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14008,6 +15787,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -14039,12 +15819,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -14070,6 +15850,7 @@ "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", @@ -14108,6 +15889,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -14180,13 +15963,12 @@ } }, "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "object-assign": "^4.1.1" }, "engines": { "node": ">=0.10.0" @@ -14205,17 +15987,16 @@ } }, "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "scheduler": "^0.20.2" }, "peerDependencies": { - "react": "^16.14.0" + "react": "17.0.2" } }, "node_modules/react-is": { @@ -14269,6 +16050,16 @@ } } }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -14425,6 +16216,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0", "read-pkg": "^6.0.0", @@ -14442,6 +16234,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -14457,6 +16250,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14475,6 +16269,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^3.0.2", @@ -14493,6 +16288,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -14567,39 +16363,10 @@ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/rechoir/node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "picomatch": "^2.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.10.0" } }, "node_modules/redent": { @@ -14607,6 +16374,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -14623,6 +16391,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -14668,15 +16437,15 @@ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -14698,6 +16467,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14730,27 +16500,6 @@ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -14828,6 +16577,7 @@ "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" @@ -14873,10 +16623,44 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rslog": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rslog/-/rslog-1.2.3.tgz", + "integrity": "sha512-antALPJaKBRPBU1X2q9t085K4htWDOOv/K1qhTUk7h0l1ePU/KbDqKJn19eKP0dk7PqMioeA0+fu3gyPXCsXxQ==", + "dev": true, + "engines": { + "node": ">=14.17.6" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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", @@ -14900,17 +16684,6 @@ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -15006,6 +16779,7 @@ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "loader-utils": "^1.2.3", @@ -15038,11 +16812,31 @@ } } }, + "node_modules/sass-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/sass-loader/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -15053,32 +16847,67 @@ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" }, "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -15162,6 +16991,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -15174,12 +17012,6 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -15211,6 +17043,8 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } @@ -15294,72 +17128,15 @@ } }, "node_modules/serve-static": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.0.tgz", - "integrity": "sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/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/serve-static/node_modules/debug/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/serve-static/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serve-static/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serve-static/node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -15425,6 +17202,7 @@ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -15545,6 +17323,7 @@ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -15596,6 +17375,72 @@ "npm": ">= 3.0.0" } }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -15668,14 +17513,15 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -15707,6 +17553,7 @@ "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" @@ -15750,9 +17597,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, "node_modules/spdx-ranges": { @@ -15818,6 +17665,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, "node_modules/stat-mode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", @@ -16047,6 +17901,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -16074,6 +17929,7 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.3.0.tgz", "integrity": "sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==", "dev": true, + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^2.7.0" @@ -16094,6 +17950,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -16106,19 +17963,39 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8.9.0" + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" }, "node_modules/sumchecker": { "version": "3.0.1", @@ -16156,9 +18033,9 @@ } }, "node_modules/swiper": { - "version": "11.1.9", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.9.tgz", - "integrity": "sha512-rflu8zvfGa3x1v/aeSufk4zRJffhOQowyvtJlp46sUBnOqAuk1Rdv5Ldj0AWWBV595iZ+ZMk7VB35ZRtRUomtA==", + "version": "11.1.14", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.1.14.tgz", + "integrity": "sha512-VbQLQXC04io6AoAjIUWuZwW4MSYozkcP9KjLdrsG/00Q/yiwvhz9RQyt0nHXV10hi9NVnDNy1/wv7Dzq1lkOCQ==", "funding": [ { "type": "patreon", @@ -16363,10 +18240,11 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -16474,9 +18352,11 @@ } }, "node_modules/terser": { - "version": "5.31.5", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.5.tgz", - "integrity": "sha512-YPmas0L0rE1UyLL/llTWA0SiDOqIcAQYLeUj7cJYzXHlRTAnMSg9pPe4VJ5PlKvTrPQsdVFuiRiwyeNlYgwh2Q==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -16494,6 +18374,8 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -16527,6 +18409,8 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -16543,7 +18427,9 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true }, "node_modules/text-table": { "version": "0.2.0", @@ -16551,6 +18437,19 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, "node_modules/through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", @@ -16597,6 +18496,11 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -16631,6 +18535,7 @@ "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" }, @@ -16652,6 +18557,7 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -16661,6 +18567,23 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/treeify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", @@ -16675,6 +18598,7 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -16710,104 +18634,12 @@ "node": ">=6.10" } }, - "node_modules/ts-loader": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz", - "integrity": "sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==", - "dev": true, - "dependencies": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^4.0.0", - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8.6" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-loader/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ts-loader/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/ts-loader/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/ts-loader/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-loader/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } + "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -16832,6 +18664,16 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -16931,9 +18773,9 @@ } }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -16949,6 +18791,11 @@ "integrity": "sha512-1hNKM37dAWML/2ltRXupOq2uqcdRQyDFphl+341NTPXFLLLiDhErXx8VtaSLh3xP7SyHZdcCgpt9boYYVb3fQg==", "dev": true }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -16965,20 +18812,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unique-filename": { "version": "2.0.1", @@ -17002,18 +18838,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -17052,9 +18876,10 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -17069,9 +18894,10 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -17080,88 +18906,13 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/url-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "punycode": "^2.1.0" } }, "node_modules/utf8-byte-length": { @@ -17201,23 +18952,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, "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", @@ -17257,11 +18991,55 @@ "node": ">=0.6.0" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + }, "node_modules/wait-for-localhost": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/wait-for-localhost/-/wait-for-localhost-4.1.0.tgz", "integrity": "sha512-i3yX7qgAnxFXWOS6Om7SNi19HRygFvCGh0iy0nOsrYOSiIlhUqoUuzLoW4jHVYS4dzNGzRU100uwTyluOMWcjw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -17270,13 +19048,14 @@ } }, "node_modules/wait-for-localhost-cli": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/wait-for-localhost-cli/-/wait-for-localhost-cli-3.2.0.tgz", - "integrity": "sha512-Qeb/137B3PSiQSddXMGS40i7w2G2pWJ/01bJLQ4pk+WZ7V3+i7fIbKajf6/MPcBqYPJvNdYWAuTJ53ahhqZBog==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wait-for-localhost-cli/-/wait-for-localhost-cli-3.0.0.tgz", + "integrity": "sha512-M7oS3qIIeX11Fo5G+z5IX6uS/w03uC6HtM6beHkQ2xh9MSYgJOKdTC6Z488HJ5DAAqdwUaW1x50Inz8KXY1GTQ==", "dev": true, + "license": "MIT", "dependencies": { "meow": "^10.1.1", - "wait-for-localhost": "^4.1.0" + "wait-for-localhost": "^4.0.0" }, "bin": { "wait-for-localhost": "cli.js" @@ -17289,9 +19068,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -17317,20 +19098,17 @@ "node": ">= 8" } }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==" - }, "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==" }, "node_modules/webpack": { - "version": "5.94.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", - "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "dev": true, + "peer": true, "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -17377,6 +19155,7 @@ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", @@ -17398,184 +19177,86 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" + "webpack": "^5.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", + "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -17586,90 +19267,137 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/webpack-dev-server/node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "is-inside-container": "^1.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/webpack-dev-server/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, "node_modules/webpack-dev-server/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, + "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/webpack-dev-server/node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/webpack-dev-server/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "glob": "^10.3.7" }, - "engines": { - "node": ">= 12.13.0" + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/webpack-dev-server/node_modules/ws": { @@ -17677,40 +19405,25 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "webpack": { "optional": true } } }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, "engines": { "node": ">=10.13.0" } @@ -17719,6 +19432,8 @@ "version": "5.17.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -17731,6 +19446,8 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -17743,6 +19460,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -17751,6 +19470,8 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17764,14 +19485,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -17911,12 +19624,6 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -17962,9 +19669,9 @@ } }, "node_modules/wrap-ansi/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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -18122,6 +19829,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } diff --git a/package.json b/package.json index 0a59e1d04f..d70c6a2ff2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "anytype", - "version": "0.42.46-beta", + "version": "0.43.7", "description": "Anytype", "main": "electron.js", "scripts": { @@ -9,26 +9,28 @@ "lint": "eslint .", "electron": "npx electron .", "electron-win": "npx electron.cmd .", - "start:watch": "cross-env-shell webpack-dev-server --progress --mode=development --node-env=development --env SERVER_PORT=$SERVER_PORT --env DATA_PATH=$DATA_PATH --history-api-fallback --cache", - "start:electron-wait-webpack": "cross-env-shell wait-for-localhost $SERVER_PORT && npm run electron", - "start:electron-wait-webpack-win": "cross-env-shell wait-for-localhost $SERVER_PORT && npm run electron-win", - "start:dev": "npm-run-all --parallel start:watch start:electron-wait-webpack", - "start:dev-win": "npm-run-all --parallel start:watch start:electron-wait-webpack-win", - "build": "webpack --mode=production --node-env=production --config webpack.config.js", - "build:dev": "webpack --mode=development --node-env=development --config webpack.config.js", - "build:deps": "webpack --config webpack.node.config.js --stats detailed | grep 'node_modules' | sed -E 's/.*(node_modules[\\/][^\\\\/[:space:]]{1,})[\\\\/].*/\\1/' | uniq | node save-node-deps.js", + "doctor:start:dev": "RSDOCTOR=true npm run start:dev", + "doctor:build:dev": "RSDOCTOR=true npm run build:dev", + "start:watch": "cross-env-shell rspack serve --mode=development --node-env=development --env SERVER_PORT=$SERVER_PORT --env DATA_PATH=$DATA_PATH", + "start:electron-wait-rspack": "cross-env-shell wait-for-localhost $SERVER_PORT && npm run electron", + "start:electron-wait-rspack-win": "cross-env-shell wait-for-localhost $SERVER_PORT && npm run electron-win", + "start:dev": "npm-run-all --parallel start:watch start:electron-wait-rspack", + "start:dev-win": "npm-run-all --parallel start:watch start:electron-wait-rspack-win", + "build": "rspack --mode=production --node-env=production --config rspack.config.js", + "build:dev": "rspack --mode=development --node-env=development --config rspack.config.js", + "build:deps": "rspack build --config rspack.node.config.js --json=compilation-stats.json && cat compilation-stats.json | grep -o '[^\"]\\+node_modules[^\"]\\+' | sed -E 's/.*(node_modules[\\/][^\\\\/[:space:]]{1,})[\\\\/].*/\\1/' | uniq | node save-node-deps.js", "build:nmh": "go build -o dist/nativeMessagingHost ./go/nativeMessagingHost.go", "build:nmh-win": "go build -o dist/nativeMessagingHost.exe ./go/nativeMessagingHost.go", - "dist:mac": "npm run build:deps && webpack --progress --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --arm64 --x64", - "dist:macarm": "npm run build:deps && webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --arm64", - "dist:macamd": "npm run build:deps && webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --x64", - "dist:win": "webpack --mode=production --node-env=production && electron-builder --windows", - "dist:linux": "npm run build:deps && webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --arm64 --x64", - "dist:linuxamd": "npm run build:deps && webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --x64", - "dist:linuxarm": "npm run build:deps && webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --arm64", - "publish:mac": "webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --macos --publish always", - "publish:linux": "webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --linux --publish always", - "publish:win": "webpack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --windows --publish always", + "dist:mac": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --arm64 --x64", + "dist:macarm": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --arm64", + "dist:macamd": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --macos --x64", + "dist:win": "rspack --mode=production --node-env=production && electron-builder --windows", + "dist:linux": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --arm64 --x64", + "dist:linuxamd": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --x64", + "dist:linuxarm": "npm run build:deps && rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` electron-builder --linux --arm64", + "publish:mac": "rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --macos --publish always", + "publish:linux": "rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --linux --publish always", + "publish:win": "rspack --mode=production --node-env=production && DATE=`date '+%Y-%m-%d_%H_%M'` GIT_COMMIT=`git rev-parse --short HEAD` BUILD_NUMBER=`git rev-parse --short HEAD` electron-builder --windows --publish always", "postinstall": "npx patch-package && electron-builder install-app-deps", "prepare": "husky install", "update:locale": "node ./electron/hook/locale.js" @@ -47,12 +49,16 @@ }, "homepage": "https://anytype.io", "devDependencies": { - "@electron/notarize": "^2.1.0", + "@electron/notarize": "^2.5.0", + "@rsdoctor/rspack-plugin": "^0.4.8", + "@rspack/cli": "^1.1.0", + "@rspack/core": "^1.1.0", + "@rspack/plugin-react-refresh": "^1.0.0", "@types/history": "^4.7.8", "@types/jquery": "^3.5.14", "@types/katex": "^0.14.0", "@types/lodash": "^4.14.165", - "@types/node": "^12.19.4", + "@types/node": "^22.9.0", "@types/prismjs": "^1.16.1", "@types/raf": "^3.4.0", "@types/react": "^16.14.31", @@ -66,6 +72,7 @@ "electron-builder": "^24.13.3", "eslint": "^8.29.0", "eslint-plugin-react": "^7.31.11", + "fork-ts-checker-webpack-plugin": "^9.0.2", "husky": "^8.0.3", "license-checker": "^25.0.1", "lint-staged": "^13.0.3", @@ -73,19 +80,14 @@ "npm": "^10.5.0", "npm-run-all": "^4.1.5", "patch-package": "^6.4.7", + "react-refresh": "^0.14.2", "sass": "1.77.6", "sass-loader": "^8.0.2", "source-map-loader": "^0.2.4", "style-loader": "^1.2.1", - "ts-loader": "^6.2.2", "typescript": "^5.3.3", "typescript-eslint": "^0.0.1-alpha.0", - "url-loader": "^4.1.1", - "wait-for-localhost-cli": "^3.0.0", - "webpack": "^5.74.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.13.1" + "wait-for-localhost-cli": "^3.0.0" }, "dependencies": { "@electron/remote": "^2.1.2", @@ -97,15 +99,14 @@ "amplitude-js": "^5.11.0", "array-move": "^2.2.2", "blueimp-load-image": "^2.31.0", - "copy-webpack-plugin": "^12.0.2", "d3": "^7.0.1", "d3-force": "^3.0.0", "d3-force-cluster": "^0.1.2", "diff": "^5.2.0", - "dompurify": "^3.0.6", + "dompurify": "3.1.6", "electron-dl": "^1.14.0", "electron-json-storage": "^4.5.0", - "electron-log": "^3.0.9", + "electron-log": "^5.2.0", "electron-updater": "^6.2.1", "electron-util": "^0.12.3", "electron-window-state": "^5.0.3", @@ -123,7 +124,7 @@ "lazy-val": "^1.0.4", "lodash": "^4.17.20", "lodash.isequal": "^4.5.0", - "mermaid": "^10.9.0", + "mermaid": "^11.4.0", "mime-types": "^2.1.35", "mobx": "^6.6.1", "mobx-logger": "^0.7.1", @@ -135,9 +136,9 @@ "prismjs": "^1.21.0", "qrcode.react": "^1.0.1", "raf": "^3.4.1", - "react": "^16.14.0", + "react": "^17.0.2", "react-canvas-confetti": "^1.3.0", - "react-dom": "^16.14.0", + "react-dom": "^17.0.2", "react-minimal-pie-chart": "^8.3.0", "react-pdf": "^6.2.2", "react-router-dom": "^5.2.0", diff --git a/webpack.config.js b/rspack.config.js similarity index 51% rename from webpack.config.js rename to rspack.config.js index e624e6222d..b8674b866b 100644 --- a/webpack.config.js +++ b/rspack.config.js @@ -1,14 +1,16 @@ const path = require('path'); const process = require('process'); -const webpack = require('webpack'); -const CopyWebpackPlugin = require('copy-webpack-plugin'); -const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; +const rspack = require('@rspack/core'); +const ReactRefreshPlugin = require('@rspack/plugin-react-refresh'); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); +const { RsdoctorRspackPlugin } = require('@rsdoctor/rspack-plugin'); const pdfjsDistPath = path.dirname(require.resolve('pdfjs-dist/package.json')); const cMapsDir = path.join(pdfjsDistPath, 'cmaps'); module.exports = (env, argv) => { const port = process.env.SERVER_PORT; + const prod = argv.mode === 'production'; return { mode: 'development', @@ -44,6 +46,7 @@ module.exports = (env, argv) => { Interface: path.resolve(__dirname, 'src/ts/interface'), Model: path.resolve(__dirname, 'src/ts/model'), Docs: path.resolve(__dirname, 'src/ts/docs'), + Hook: path.resolve(__dirname, 'src/ts/hook'), }, modules: [ path.resolve('./src/'), @@ -52,16 +55,18 @@ module.exports = (env, argv) => { path.resolve('./node_modules') ] }, + + watchOptions: { + ignored: /node_modules/, + poll: false, + }, devServer: { hot: true, - static: { - directory: path.join(__dirname, 'dist'), - watch: { - ignored: [ - path.resolve(__dirname, 'dist'), - path.resolve(__dirname, 'node_modules') - ], + static: ['dist'], + watchFiles: { + paths: ['src'], + options: { usePolling: false, }, }, @@ -70,15 +75,64 @@ module.exports = (env, argv) => { port, client: { progress: false, + overlay: { + runtimeErrors: (error) => { + if (error.message === 'ResizeObserver loop completed with undelivered notifications.') { + return false; + } + + return true; + }, + }, }, }, module: { rules: [ { - test: /\.ts(x?)$/, - exclude: /node_modules/, - loader: 'ts-loader' + test: /\.(j|t)s$/, + exclude: [/[\\/]node_modules[\\/]/], + loader: 'builtin:swc-loader', + options: { + jsc: { + parser: { + syntax: 'typescript', + }, + transform: { + react: { + runtime: 'automatic', + development: !prod, + refresh: !prod, + }, + }, + }, + env: { + targets: 'Chrome >= 48', + }, + }, + }, + { + test: /\.(j|t)sx$/, + loader: 'builtin:swc-loader', + exclude: [/[\\/]node_modules[\\/]/], + options: { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + development: !prod, + refresh: !prod, + }, + }, + }, + env: { + targets: 'Chrome >= 48', // browser compatibility + }, + }, }, { enforce: 'pre', @@ -87,11 +141,11 @@ module.exports = (env, argv) => { }, { test: /\.(eot|ttf|otf|woff|woff2)$/, - loader: 'url-loader' + type: 'asset/inline' }, { test: /\.(jpe?g|png|gif|svg)$/, - loader: 'url-loader' + type: 'asset/inline' }, { test: /\.s?css/, @@ -103,18 +157,26 @@ module.exports = (env, argv) => { } ] }, + plugins: [ - //new BundleAnalyzerPlugin(), + !prod && new ReactRefreshPlugin(), + process.env.RSDOCTOR && new RsdoctorRspackPlugin({}), + + new ForkTsCheckerWebpackPlugin(), + + // new rspack.IgnorePlugin({ + // resourceRegExp: /osx-temperature-sensor/, + // }), - new webpack.optimize.LimitChunkCountPlugin({ + new rspack.optimize.LimitChunkCountPlugin({ maxChunks: 1, }), - new CopyWebpackPlugin({ + new rspack.CopyRspackPlugin({ patterns: [ { from: cMapsDir, to: './cmaps/' }, ], }), - ], + ].filter(Boolean), }; }; \ No newline at end of file diff --git a/webpack.node.config.js b/rspack.node.config.js similarity index 68% rename from webpack.node.config.js rename to rspack.node.config.js index 6d06015a9f..2ea88fd4eb 100644 --- a/webpack.node.config.js +++ b/rspack.node.config.js @@ -1,3 +1,5 @@ +const rspack = require('@rspack/core'); + module.exports = (env) => { return { target: 'node', @@ -18,7 +20,14 @@ module.exports = (env) => { rules: [ { test: /\.node$/, loader: 'node-loader' }, ] - } - + }, + + plugins: [ + new rspack.IgnorePlugin({ + resourceRegExp: /osx-temperature-sensor/, + }), + ], + + stats: 'detailed', }; }; \ No newline at end of file diff --git a/src/img/arrow/button/grey.svg b/src/img/arrow/button/grey.svg index 263b0647d4..6c56aec70b 100644 --- a/src/img/arrow/button/grey.svg +++ b/src/img/arrow/button/grey.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/img/arrow/chatFormAttachment.svg b/src/img/arrow/chatFormAttachment.svg index db094f70eb..fcda9d2c3c 100644 --- a/src/img/arrow/chatFormAttachment.svg +++ b/src/img/arrow/chatFormAttachment.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/arrow/gallery.svg b/src/img/arrow/gallery.svg index a36e9310e1..c029a2f026 100644 --- a/src/img/arrow/gallery.svg +++ b/src/img/arrow/gallery.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/audio/mute.svg b/src/img/icon/audio/mute.svg index 352a22e30e..1211342af7 100644 --- a/src/img/icon/audio/mute.svg +++ b/src/img/icon/audio/mute.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/src/img/icon/audio/pause.svg b/src/img/icon/audio/pause.svg index c725e84cb4..021d1929ea 100644 --- a/src/img/icon/audio/pause.svg +++ b/src/img/icon/audio/pause.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/src/img/icon/audio/play.svg b/src/img/icon/audio/play.svg index 230bfad9b1..85d8a7f095 100644 --- a/src/img/icon/audio/play.svg +++ b/src/img/icon/audio/play.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/img/icon/audio/volume.svg b/src/img/icon/audio/volume.svg index 6dc8f52c45..74159b7434 100644 --- a/src/img/icon/audio/volume.svg +++ b/src/img/icon/audio/volume.svg @@ -1,6 +1,4 @@ - - - - - + + + diff --git a/src/img/icon/chat/attachment/media.svg b/src/img/icon/chat/attachment/media.svg index ab01122010..999300a4c8 100644 --- a/src/img/icon/chat/attachment/media.svg +++ b/src/img/icon/chat/attachment/media.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/chat/attachment/multiple.svg b/src/img/icon/chat/attachment/multiple.svg index ffecdbc9c7..9203e5fb3d 100644 --- a/src/img/icon/chat/attachment/multiple.svg +++ b/src/img/icon/chat/attachment/multiple.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/chat/attachment/object.svg b/src/img/icon/chat/attachment/object.svg index c497293b09..bd871450d4 100644 --- a/src/img/icon/chat/attachment/object.svg +++ b/src/img/icon/chat/attachment/object.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/img/icon/chat/buttons/reply0.svg b/src/img/icon/chat/buttons/reply0.svg index 1168de1cc4..e6687f20e1 100644 --- a/src/img/icon/chat/buttons/reply0.svg +++ b/src/img/icon/chat/buttons/reply0.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/chat/buttons/reply1.svg b/src/img/icon/chat/buttons/reply1.svg index 5be4714dee..c2765eff4c 100644 --- a/src/img/icon/chat/buttons/reply1.svg +++ b/src/img/icon/chat/buttons/reply1.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/chat/buttons/send.svg b/src/img/icon/chat/buttons/send.svg index 560ad0b4f5..4215567b02 100644 --- a/src/img/icon/chat/buttons/send.svg +++ b/src/img/icon/chat/buttons/send.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/chat/emptyState.svg b/src/img/icon/chat/emptyState.svg index 5712ec53c9..55e209e960 100644 --- a/src/img/icon/chat/emptyState.svg +++ b/src/img/icon/chat/emptyState.svg @@ -1,45 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/icon/menu/help/chat.svg b/src/img/icon/menu/help/chat.svg index 9937acc965..e8960624fb 100644 --- a/src/img/icon/menu/help/chat.svg +++ b/src/img/icon/menu/help/chat.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/menu/help/community.svg b/src/img/icon/menu/help/community.svg index 793b6b9bd9..25f5f4a029 100644 --- a/src/img/icon/menu/help/community.svg +++ b/src/img/icon/menu/help/community.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/img/icon/menu/help/feature.svg b/src/img/icon/menu/help/feature.svg index 3ecd8ed2a2..4ffcd09001 100644 --- a/src/img/icon/menu/help/feature.svg +++ b/src/img/icon/menu/help/feature.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/menu/help/help.svg b/src/img/icon/menu/help/help.svg index fc4236b92b..3ea09019f0 100644 --- a/src/img/icon/menu/help/help.svg +++ b/src/img/icon/menu/help/help.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/img/icon/menu/important.svg b/src/img/icon/menu/important.svg index e008ac46ab..0b76ecfaa9 100644 --- a/src/img/icon/menu/important.svg +++ b/src/img/icon/menu/important.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/img/icon/menu/syncStatus/network/yellow.svg b/src/img/icon/menu/syncStatus/network/yellow.svg index 49da183ad2..0c3df10648 100644 --- a/src/img/icon/menu/syncStatus/network/yellow.svg +++ b/src/img/icon/menu/syncStatus/network/yellow.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/img/icon/popup/confirm/warning.svg b/src/img/icon/popup/confirm/warning.svg index 81b7f8cac8..472fadc3ec 100644 --- a/src/img/icon/popup/confirm/warning.svg +++ b/src/img/icon/popup/confirm/warning.svg @@ -1,225 +1,225 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/icon/popup/preview/play.svg b/src/img/icon/popup/preview/play.svg index 3b0ed2d0b7..dbf2bc991f 100644 --- a/src/img/icon/popup/preview/play.svg +++ b/src/img/icon/popup/preview/play.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/icon/popup/share/header.svg b/src/img/icon/popup/share/header.svg index 9934811160..434adbec22 100644 --- a/src/img/icon/popup/share/header.svg +++ b/src/img/icon/popup/share/header.svg @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/icon/progress/close.svg b/src/img/icon/progress/close.svg index 9cd240df95..1bcde89ec1 100644 --- a/src/img/icon/progress/close.svg +++ b/src/img/icon/progress/close.svg @@ -1,4 +1,3 @@ - - + \ No newline at end of file diff --git a/src/img/icon/share/banner.svg b/src/img/icon/share/banner.svg index 8b6e07aa58..3d8ce27c77 100644 --- a/src/img/icon/share/banner.svg +++ b/src/img/icon/share/banner.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/img/icon/share/smile.svg b/src/img/icon/share/smile.svg index 6f0edb54cd..8b3098a3d3 100644 --- a/src/img/icon/share/smile.svg +++ b/src/img/icon/share/smile.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/img/icon/widget/remove.svg b/src/img/icon/widget/remove.svg index 74f2596d45..bbc73d98df 100644 --- a/src/img/icon/widget/remove.svg +++ b/src/img/icon/widget/remove.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/logo/white.svg b/src/img/logo/white.svg index a3af8e732c..acf2a6ac8e 100644 --- a/src/img/logo/white.svg +++ b/src/img/logo/white.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/img/theme/dark/arrow/chatFormAttachment.svg b/src/img/theme/dark/arrow/chatFormAttachment.svg index 0a8914856b..006dd118a7 100644 --- a/src/img/theme/dark/arrow/chatFormAttachment.svg +++ b/src/img/theme/dark/arrow/chatFormAttachment.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/theme/dark/arrow/menuDirection.svg b/src/img/theme/dark/arrow/menuDirection.svg index 87d71dffb1..69445c4336 100644 --- a/src/img/theme/dark/arrow/menuDirection.svg +++ b/src/img/theme/dark/arrow/menuDirection.svg @@ -1,6 +1,6 @@ - - + + diff --git a/src/img/theme/dark/icon/audio/mute.svg b/src/img/theme/dark/icon/audio/mute.svg index 4ca4a20062..94f478ff5e 100644 --- a/src/img/theme/dark/icon/audio/mute.svg +++ b/src/img/theme/dark/icon/audio/mute.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/src/img/theme/dark/icon/audio/pause.svg b/src/img/theme/dark/icon/audio/pause.svg index 1efac6698e..63999bfbc7 100644 --- a/src/img/theme/dark/icon/audio/pause.svg +++ b/src/img/theme/dark/icon/audio/pause.svg @@ -1,4 +1,3 @@ - - - + + diff --git a/src/img/theme/dark/icon/audio/play.svg b/src/img/theme/dark/icon/audio/play.svg index 5e3321846f..e5cb0a8dbc 100644 --- a/src/img/theme/dark/icon/audio/play.svg +++ b/src/img/theme/dark/icon/audio/play.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/img/theme/dark/icon/audio/volume.svg b/src/img/theme/dark/icon/audio/volume.svg index d5e9d7bf9d..36293d2f36 100644 --- a/src/img/theme/dark/icon/audio/volume.svg +++ b/src/img/theme/dark/icon/audio/volume.svg @@ -1,6 +1,4 @@ - - - - - + + + diff --git a/src/img/theme/dark/icon/chat/buttons/reply1.svg b/src/img/theme/dark/icon/chat/buttons/reply1.svg index bca5a7d243..7640524635 100644 --- a/src/img/theme/dark/icon/chat/buttons/reply1.svg +++ b/src/img/theme/dark/icon/chat/buttons/reply1.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/theme/dark/icon/chat/buttons/send.svg b/src/img/theme/dark/icon/chat/buttons/send.svg index 219b0ae393..a0f55738fd 100644 --- a/src/img/theme/dark/icon/chat/buttons/send.svg +++ b/src/img/theme/dark/icon/chat/buttons/send.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/theme/dark/icon/menu/action/block/text/quote0.svg b/src/img/theme/dark/icon/menu/action/block/text/quote0.svg index 918e70a340..d3965d81ab 100644 --- a/src/img/theme/dark/icon/menu/action/block/text/quote0.svg +++ b/src/img/theme/dark/icon/menu/action/block/text/quote0.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/img/theme/dark/icon/menu/action/block/text/quote1.svg b/src/img/theme/dark/icon/menu/action/block/text/quote1.svg index 75272bbe46..16fe75cfe6 100644 --- a/src/img/theme/dark/icon/menu/action/block/text/quote1.svg +++ b/src/img/theme/dark/icon/menu/action/block/text/quote1.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/img/theme/dark/icon/menu/syncStatus/loading.svg b/src/img/theme/dark/icon/menu/syncStatus/loading.svg index cdcee32d87..999689bb66 100644 --- a/src/img/theme/dark/icon/menu/syncStatus/loading.svg +++ b/src/img/theme/dark/icon/menu/syncStatus/loading.svg @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + diff --git a/src/img/theme/dark/icon/object/preview/hl.svg b/src/img/theme/dark/icon/object/preview/hl.svg index 4bfd24a752..ba689eef50 100644 --- a/src/img/theme/dark/icon/object/preview/hl.svg +++ b/src/img/theme/dark/icon/object/preview/hl.svg @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/src/img/theme/dark/icon/popup/share/header.svg b/src/img/theme/dark/icon/popup/share/header.svg index 206a93a912..a3eab5e7a0 100644 --- a/src/img/theme/dark/icon/popup/share/header.svg +++ b/src/img/theme/dark/icon/popup/share/header.svg @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/img/theme/dark/icon/share/banner.svg b/src/img/theme/dark/icon/share/banner.svg index bd04274db0..17fb93a37c 100644 --- a/src/img/theme/dark/icon/share/banner.svg +++ b/src/img/theme/dark/icon/share/banner.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/img/theme/dark/icon/share/smile.svg b/src/img/theme/dark/icon/share/smile.svg index 25eed194bb..c801162d65 100644 --- a/src/img/theme/dark/icon/share/smile.svg +++ b/src/img/theme/dark/icon/share/smile.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/img/theme/dark/icon/widget/button/all.svg b/src/img/theme/dark/icon/widget/button/all.svg index 903feda36c..329c4accd2 100644 --- a/src/img/theme/dark/icon/widget/button/all.svg +++ b/src/img/theme/dark/icon/widget/button/all.svg @@ -1,4 +1,4 @@ - - + + diff --git a/src/img/theme/dark/icon/widget/button/bin.svg b/src/img/theme/dark/icon/widget/button/bin.svg index a21a9946e0..8209394ed8 100644 --- a/src/img/theme/dark/icon/widget/button/bin.svg +++ b/src/img/theme/dark/icon/widget/button/bin.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/img/theme/dark/icon/widget/button/chat.svg b/src/img/theme/dark/icon/widget/button/chat.svg index edec41900f..58567d1a78 100644 --- a/src/img/theme/dark/icon/widget/button/chat.svg +++ b/src/img/theme/dark/icon/widget/button/chat.svg @@ -1,3 +1,3 @@ - + diff --git a/src/img/theme/dark/icon/widget/button/member.svg b/src/img/theme/dark/icon/widget/button/member.svg index 65065548e9..adb1f56280 100644 --- a/src/img/theme/dark/icon/widget/button/member.svg +++ b/src/img/theme/dark/icon/widget/button/member.svg @@ -1,6 +1,6 @@ - - - - + + + + diff --git a/src/img/theme/dark/icon/widget/button/store.svg b/src/img/theme/dark/icon/widget/button/store.svg index 428659f6be..ce16392793 100644 --- a/src/img/theme/dark/icon/widget/button/store.svg +++ b/src/img/theme/dark/icon/widget/button/store.svg @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/src/img/theme/dark/icon/widget/remove.svg b/src/img/theme/dark/icon/widget/remove.svg index 7e8ad873a2..7c6537c03b 100644 --- a/src/img/theme/dark/icon/widget/remove.svg +++ b/src/img/theme/dark/icon/widget/remove.svg @@ -1,3 +1,3 @@ - + diff --git a/src/json/constant.ts b/src/json/constant.ts index 157428572b..84e4728e06 100644 --- a/src/json/constant.ts +++ b/src/json/constant.ts @@ -6,6 +6,7 @@ export default { appName: 'Anytype', blankRouteId: '_blank_', storeSpaceId: '_anytype_marketplace', + localLoversSpaceId: 'bafyreigyfkt6rbv24sbv5aq2hko3bhmv5xxlf22b4bypdu6j7hnphm3psq.23me69r569oi1', anytypeProfileId: '_anytype_profile', fontCode: 'plex', popupPinIds: [ 'search' ], @@ -34,12 +35,12 @@ export default { limit: { menuRecords: 100, widgets: 20, - space: 10, notification: 20, + space: 50, graphDepth: 5, chat: { - messages: 100, + messages: 30, attachments: 10, files: 10, mentions: 10, @@ -127,7 +128,6 @@ export default { date: 'ot-date', profile: 'ot-profile', chat: 'ot-chat', - chatDerived: 'ot-chatDerived', }, templateId: { diff --git a/src/json/error.ts b/src/json/error.ts index 80036ec8a8..3fb9825922 100644 --- a/src/json/error.ts +++ b/src/json/error.ts @@ -13,6 +13,21 @@ export default { LIMIT_OF_ROWS_OR_RELATIONS_EXCEEDED: 7, FILE_LOAD_ERROR: 8, INSUFFICIENT_PERMISSIONS: 9, + + Import: { + INTERNAL_ERROR: 3, + NOTION_NO_OBJECTS_IN_INTEGRATION: 5, + IMPORT_IS_CANCELED: 6, + CSV_LIMIT_OF_ROWS_OR_RELATIONS_EXCEEDED: 7, + FILE_LOAD_ERROR: 8, + INSUFFICIENT_PERMISSIONS: 9, + HTML_WRONG_HTML_STRUCTURE: 10, + PB_NOT_ANYBLOCK_FORMAT: 11, + NOTION_SERVER_IS_UNAVAILABLE: 12, + NOTION_RATE_LIMIT_EXCEEDED: 13, + FILE_IMPORT_NO_OBJECTS_IN_ZIP_ARCHIVE: 14, + FILE_IMPORT_NO_OBJECTS_IN_DIRECTORY: 17, + } }, 'Error: net::ERR_TIMED_OUT': 'Network time-out', diff --git a/src/json/extension.ts b/src/json/extension.ts index 8173cc8a8b..6b19e30efa 100644 --- a/src/json/extension.ts +++ b/src/json/extension.ts @@ -1,8 +1,8 @@ export default { clipper: { - ids: [ 'jbnammhjiplhpjfncnlejjjejghimdkf', 'jkmhmgghdjjbafmkgjmplhemjjnkligf' ], + ids: [ 'jbnammhjiplhpjfncnlejjjejghimdkf', 'jkmhmgghdjjbafmkgjmplhemjjnkligf', 'lcamkcmpcofgmbmloefimnelnjpcdpfn' ], name: 'Anytype Webclipper', prefix: 'anytypeWebclipper', emojiUrl: 'https://anytype-static.fra1.cdn.digitaloceanspaces.com/emojies/' } -}; \ No newline at end of file +}; diff --git a/src/json/latex.json b/src/json/latex.json index 19c2c9d063..e129987985 100644 --- a/src/json/latex.json +++ b/src/json/latex.json @@ -1,1667 +1,1667 @@ [ - { - "id": "templates", - "name": "Templates", - "children": [ - { - "comment": "`\\begin{align*} a&=b+c \\\\ d+e&=f \\end{align*}`" - }, - { - "comment": "`\\int_{-\\infty}^\\infty f(\\hat\\xi\\,)e^{2 \\pi i \\xi x}\\,d\\xi`" - }, - { - "comment": "`\\cfrac{a}{1 + b}`" - }, - { - "comment": "`\\dbinom{n}{k}`" - }, - { - "comment": "`\\begin{matrix} a & b \\\\ c & d \\end{matrix}`" - }, - { - "comment": "`\\begin{Bmatrix} 0 & -1 \\\\ -1 & 0 \\end{Bmatrix}`" - }, - { - "comment": "`\\sum_{\\mathclap{1\\le i\\le j\\le n}} x_{ij} + \\sum_{\\begin{subarray}{l}i\\in\\Lambda\\\\0", - "comment": "`a\\>\\>{b}`" - }, - { - "symbol": "\\{", - "comment": "" - }, - { - "symbol": "\\}", - "comment": "" - }, - { - "symbol": "\\|", - "comment": "" - }, - { - "symbol": "\\~", - "comment": "`\\text{\\~{a}}`" - }, - { - "symbol": "\\^", - "comment": "`\\text{\\^{a}}`" - } - ] - }, - { - "name": "A", - "children": [ - { - "symbol": "\\AA", - "comment": "`\\text{\\AA}`" - }, - { - "symbol": "\\aa", - "comment": "`\\text{\\aa}`" - }, - { - "symbol": "\\above", - "comment": "`{a \\above{2pt} b+1}`" - }, - { - "symbol": "\\acute", - "comment": "`\\acute e`" - }, - { - "symbol": "\\AE", - "comment": "`\\text{\\AE}`" - }, - { - "symbol": "\\ae", - "comment": "`\\text{\\ae}`" - }, - { - "symbol": "\\alef", - "comment": "" - }, - { - "symbol": "\\alefsym", - "comment": "" - }, - { - "symbol": "\\aleph", - "comment": "" - }, - { - "symbol": "\\allowbreak", - "comment": "" - }, - { - "symbol": "\\Alpha", - "comment": "" - }, - { - "symbol": "\\alpha", - "comment": "" - }, - { - "symbol": "\\amalg", - "comment": "" - }, - { - "symbol": "\\And", - "comment": "" - }, - { - "symbol": "\\angln", - "comment": "" - }, - { - "symbol": "\\angle", - "comment": "" - }, - { - "symbol": "\\approx", - "comment": "" - }, - { - "symbol": "\\approxeq", - "comment": "" - }, - { - "symbol": "\\approxcolon", - "comment": "" - }, - { - "symbol": "\\approxcoloncolon", - "comment": "" - }, - { - "symbol": "\\arccos", - "comment": "" - }, - { - "symbol": "\\arcctg", - "comment": "" - }, - { - "symbol": "\\arcsin", - "comment": "" - }, - { - "symbol": "\\arctan", - "comment": "" - }, - { - "symbol": "\\arctg", - "comment": "" - }, - { - "symbol": "\\arg", - "comment": "" - }, - { - "symbol": "\\argmax", - "comment": "" - }, - { - "symbol": "\\argmin", - "comment": "" - }, - { - "symbol": "\\arraystretch", - "comment": "`\\def\\arraystretch{1.5} \\begin{array}{cc} a & b \\\\ c & d \\end{array}`" - }, - { - "symbol": "\\ast", - "comment": "" - }, - { - "symbol": "\\asymp", - "comment": "" - }, - { - "symbol": "\\atop", - "comment": "`{a \\atop b}`" - } - ] - }, - { - "name": "B", - "children": [ - { - "symbol": "\\backepsilon", - "comment": "" - }, - { - "symbol": "\\backprime", - "comment": "" - }, - { - "symbol": "\\backsim", - "comment": "" - }, - { - "symbol": "\\backsimeq", - "comment": "" - }, - { - "symbol": "\\backslash", - "comment": "" - }, - { - "symbol": "\\bar", - "comment": "`\\bar{y}`" - }, - { - "symbol": "\\barwedge", - "comment": "" - }, - { - "symbol": "\\Bbb", - "comment": "`\\Bbb{ABC}`" - }, - { - "symbol": "\\Bbbk", - "comment": "" - }, - { - "symbol": "\\bcancel", - "comment": "`\\bcancel{5}`" - }, - { - "symbol": "\\because", - "comment": "" - }, - { - "symbol": "\\begin", - "comment": "`\\begin{matrix}``a & b \\\\``c & d`'`\\end{matrix}`" - }, - { - "symbol": "\\begingroup", - "comment": "`\\begingroup...\\endgroup`" - }, - { - "symbol": "\\Beta", - "comment": "" - }, - { - "symbol": "\\beta", - "comment": "" - }, - { - "symbol": "\\beth", - "comment": "" - }, - { - "symbol": "\\between", - "comment": "" - }, - { - "symbol": "\\bf", - "comment": "`\\bf AaBb12`" - }, - { - "symbol": "\\big", - "comment": "`\\big(\\big)`" - }, - { - "symbol": "\\Big", - "comment": "`\\Big(\\Big)`" - }, - { - "symbol": "\\bigcap", - "comment": "" - }, - { - "symbol": "\\bigcirc", - "comment": "" - }, - { - "symbol": "\\bigcup", - "comment": "" - }, - { - "symbol": "\\bigg", - "comment": "`\\bigg(\\bigg)`" - }, - { - "symbol": "\\Bigg", - "comment": "`\\Bigg(\\Bigg)`" - }, - { - "symbol": "\\biggl", - "comment": "`\\biggl(`" - }, - { - "symbol": "\\Biggl", - "comment": "`\\Biggl(`" - }, - { - "symbol": "\\biggm", - "comment": "`\\biggm\\vert`" - }, - { - "symbol": "\\Biggm", - "comment": "`\\Biggm\\vert`" - }, - { - "symbol": "\\biggr", - "comment": "`\\biggr)`" - }, - { - "symbol": "\\Biggr", - "comment": "`\\Biggr)`" - }, - { - "symbol": "\\bigl", - "comment": "`\\bigl(`" - }, - { - "symbol": "\\Bigl", - "comment": "`\\Bigl(`" - }, - { - "symbol": "\\bigm", - "comment": "`\\bigm\\vert`" - }, - { - "symbol": "\\Bigm", - "comment": "`\\Bigm\\vert`" - }, - { - "symbol": "\\bigodot", - "comment": "" - }, - { - "symbol": "\\bigoplus", - "comment": "" - }, - { - "symbol": "\\bigotimes", - "comment": "" - }, - { - "symbol": "\\bigr", - "comment": "`\\bigr)`" - }, - { - "symbol": "\\Bigr", - "comment": "`\\Bigr)`" - }, - { - "symbol": "\\bigsqcup", - "comment": "" - }, - { - "symbol": "\\bigstar", - "comment": "" - }, - { - "symbol": "\\bigtriangledown", - "comment": "" - }, - { - "symbol": "\\bigtriangleup", - "comment": "" - }, - { - "symbol": "\\biguplus", - "comment": "" - }, - { - "symbol": "\\bigvee", - "comment": "" - }, - { - "symbol": "\\bigwedge", - "comment": "" - }, - { - "symbol": "\\binom", - "comment": "`\\binom n k`" - }, - { - "symbol": "\\blacklozenge", - "comment": "" - }, - { - "symbol": "\\blacksquare", - "comment": "" - }, - { - "symbol": "\\blacktriangle", - "comment": "" - }, - { - "symbol": "\\blacktriangledown", - "comment": "" - }, - { - "symbol": "\\blacktriangleleft", - "comment": "" - }, - { - "symbol": "\\blacktriangleright", - "comment": "" - }, - { - "symbol": "\\bm", - "comment": "`\\bm{AaBb}`" - }, - { - "symbol": "\\bmod", - "comment": "`a \\bmod b`" - }, - { - "symbol": "\\bold", - "comment": "`\\bold{AaBb123}`" - }, - { - "symbol": "\\boldsymbol", - "comment": "`\\boldsymbol{AaBb}`" - }, - { - "symbol": "\\bot", - "comment": "" - }, - { - "symbol": "\\bowtie", - "comment": "" - }, - { - "symbol": "\\Box", - "comment": "" - }, - { - "symbol": "\\boxdot", - "comment": "" - }, - { - "symbol": "\\boxed", - "comment": "`\\boxed{ab}`" - }, - { - "symbol": "\\boxminus", - "comment": "" - }, - { - "symbol": "\\boxplus", - "comment": "" - }, - { - "symbol": "\\boxtimes", - "comment": "" - }, - { - "symbol": "\\Bra", - "comment": "`\\Bra{\\psi}`" - }, - { - "symbol": "\\bra", - "comment": "`\\bra{\\psi}`" - }, - { - "symbol": "\\braket", - "comment": "`\\braket{\\phi\\vert\\psi}`" - }, - { - "symbol": "\\brace", - "comment": "`{n\\brace k}`" - }, - { - "symbol": "\\brack", - "comment": "`{n\\brack k}`" - }, - { - "symbol": "\\breve", - "comment": "`\\breve{eu}`" - }, - { - "symbol": "\\bull", - "comment": "" - }, - { - "symbol": "\\bullet", - "comment": "" - }, - { - "symbol": "\\Bumpeq", - "comment": "" - }, - { - "symbol": "\\bumpeq", - "comment": "" - } - ] - }, - { - "name": "C", - "children": [ - { - "symbol": "\\cal", - "comment": "`\\cal AaBb123`" - }, - { - "symbol": "\\cancel", - "comment": "`\\cancel{5}`" - }, - { - "symbol": "\\Cap", - "comment": "" - }, - { - "symbol": "\\cap", - "comment": "" - }, - { - "symbol": "\\cdot", - "comment": "" - }, - { - "symbol": "\\cdotp", - "comment": "" - }, - { - "symbol": "\\cdots", - "comment": "" - }, - { - "symbol": "\\ce", - "comment": "`\\ce{C6H5-CHO}`" - }, - { - "symbol": "\\centerdot", - "comment": "`a\\centerdot b`" - }, - { - "symbol": "\\cfrac", - "comment": "`\\cfrac{2}{1+\\cfrac{2}{1+\\cfrac{2}{1}}}`" - }, - { - "symbol": "\\char", - "comment": "`\\char\"263a`" - }, - { - "symbol": "\\check", - "comment": "`\\check{oe}`" - }, - { - "symbol": "\\ch", - "comment": "" - }, - { - "symbol": "\\checkmark", - "comment": "" - }, - { - "symbol": "\\Chi", - "comment": "" - }, - { - "symbol": "\\chi", - "comment": "" - }, - { - "symbol": "\\choose", - "comment": "`{n+1 \\choose k+2}`" - }, - { - "symbol": "\\circ", - "comment": "" - }, - { - "symbol": "\\circeq", - "comment": "" - }, - { - "symbol": "\\circlearrowleft", - "comment": "" - }, - { - "symbol": "\\circlearrowright", - "comment": "" - }, - { - "symbol": "\\circledast", - "comment": "" - }, - { - "symbol": "\\circledcirc", - "comment": "" - }, - { - "symbol": "\\circleddash", - "comment": "" - }, - { - "symbol": "\\circledR", - "comment": "" - }, - { - "symbol": "\\circledS", - "comment": "" - }, - { - "symbol": "\\clubs", - "comment": "" - }, - { - "symbol": "\\clubsuit", - "comment": "" - }, - { - "symbol": "\\cnums", - "comment": "" - }, - { - "symbol": "\\colon", - "comment": "" - }, - { - "symbol": "\\Colonapprox", - "comment": "" - }, - { - "symbol": "\\colonapprox", - "comment": "" - }, - { - "symbol": "\\coloncolon", - "comment": "" - }, - { - "symbol": "\\coloncolonapprox", - "comment": "" - }, - { - "symbol": "\\coloncolonequals", - "comment": "" - }, - { - "symbol": "\\coloncolonminus", - "comment": "" - }, - { - "symbol": "\\coloncolonsim", - "comment": "" - }, - { - "symbol": "\\Coloneq", - "comment": "" - }, - { - "symbol": "\\coloneq", - "comment": "" - }, - { - "symbol": "\\colonequals", - "comment": "" - }, - { - "symbol": "\\Coloneqq", - "comment": "" - }, - { - "symbol": "\\coloneqq", - "comment": "" - }, - { - "symbol": "\\colonminus", - "comment": "" - }, - { - "symbol": "\\Colonsim", - "comment": "" - }, - { - "symbol": "\\colonsim", - "comment": "" - }, - { - "symbol": "\\color", - "comment": "`\\color{#0000FF} AaBb123`" - }, - { - "symbol": "\\colorbox", - "comment": "`\\colorbox{red}{Black on red}`" - }, - { - "symbol": "\\complement", - "comment": "" - }, - { - "symbol": "\\Complex", - "comment": "" - }, - { - "symbol": "\\cong", - "comment": "" - }, - { - "symbol": "\\coprod", - "comment": "" - }, - { - "symbol": "\\copyright", - "comment": "" - }, - { - "symbol": "\\cos", - "comment": "" - }, - { - "symbol": "\\cosec", - "comment": "" - }, - { - "symbol": "\\cosh", - "comment": "" - }, - { - "symbol": "\\cot", - "comment": "" - }, - { - "symbol": "\\cotg", - "comment": "" - }, - { - "symbol": "\\coth", - "comment": "" - }, - { - "symbol": "\\cr", - "comment": "`\\begin{matrix}``a & b \\cr ``c & d`'`\\end{matrix}`" - }, - { - "symbol": "\\csc", - "comment": "" - }, - { - "symbol": "\\ctg", - "comment": "" - }, - { - "symbol": "\\cth", - "comment": "" - }, - { - "symbol": "\\Cup", - "comment": "" - }, - { - "symbol": "\\cup", - "comment": "" - }, - { - "symbol": "\\curlyeqprec", - "comment": "" - }, - { - "symbol": "\\curlyeqsucc", - "comment": "" - }, - { - "symbol": "\\curlyvee", - "comment": "" - }, - { - "symbol": "\\curlywedge", - "comment": "" - }, - { - "symbol": "\\curvearrowleft", - "comment": "" - }, - { - "symbol": "\\curvearrowright", - "comment": "" - } - ] - }, - { - "name": "D", - "children": [ - { - "symbol": "\\dag", - "comment": "" - }, - { - "symbol": "\\Dagger", - "comment": "" - }, - { - "symbol": "\\dagger", - "comment": "" - }, - { - "symbol": "\\daleth", - "comment": "" - }, - { - "symbol": "\\Darr", - "comment": "" - }, - { - "symbol": "\\dArr", - "comment": "" - }, - { - "symbol": "\\darr", - "comment": "" - }, - { - "symbol": "\\dashleftarrow", - "comment": "" - }, - { - "symbol": "\\dashrightarrow", - "comment": "" - }, - { - "symbol": "\\dashv", - "comment": "" - }, - { - "symbol": "\\dbinom", - "comment": "`\\dbinom n k`" - }, - { - "symbol": "\\dblcolon", - "comment": "" - }, - { - "symbol": "\\ddag", - "comment": "" - }, - { - "symbol": "\\ddagger", - "comment": "" - }, - { - "symbol": "\\ddot", - "comment": "`\\ddot x`" - }, - { - "symbol": "\\ddots", - "comment": "" - }, - { - "symbol": "\\def", - "comment": "`\\def\\foo{x^2} \\foo + \\foo`" - }, - { - "symbol": "\\deg", - "comment": "" - }, - { - "symbol": "\\degree", - "comment": "" - }, - { - "symbol": "\\delta", - "comment": "" - }, - { - "symbol": "\\Delta", - "comment": "" - }, - { - "symbol": "\\det", - "comment": "" - }, - { - "symbol": "\\digamma", - "comment": "" - }, - { - "symbol": "\\dfrac", - "comment": "`\\dfrac{a-1}{b-1}`" - }, - { - "symbol": "\\diagdown", - "comment": "" - }, - { - "symbol": "\\diagup", - "comment": "" - }, - { - "symbol": "\\Diamond", - "comment": "" - }, - { - "symbol": "\\diamond", - "comment": "" - }, - { - "symbol": "\\diamonds", - "comment": "" - }, - { - "symbol": "\\diamondsuit", - "comment": "" - }, - { - "symbol": "\\dim", - "comment": "" - }, - { - "symbol": "\\displaystyle", - "comment": "`\\displaystyle\\sum_0^n`" - }, - { - "symbol": "\\div", - "comment": "" - }, - { - "symbol": "\\divideontimes", - "comment": "" - }, - { - "symbol": "\\dot", - "comment": "`\\dot x`" - }, - { - "symbol": "\\Doteq", - "comment": "" - }, - { - "symbol": "\\doteq", - "comment": "" - }, - { - "symbol": "\\doteqdot", - "comment": "" - }, - { - "symbol": "\\dotplus", - "comment": "" - }, - { - "symbol": "\\dots", - "comment": "`x_1 + \\dots + x_n`" - }, - { - "symbol": "\\dotsb", - "comment": "`x_1 +\\dotsb + x_n`" - }, - { - "symbol": "\\dotsc", - "comment": "`x,\\dotsc,y`" - }, - { - "symbol": "\\dotsi", - "comment": "`\\int_{A_1}\\int_{A_2}\\dotsi`" - }, - { - "symbol": "\\dotsm", - "comment": "`x_1 x_2 \\dotsm x_n`" - }, - { - "symbol": "\\dotso", - "comment": "" - }, - { - "symbol": "\\doublebarwedge", - "comment": "" - }, - { - "symbol": "\\doublecap", - "comment": "" - }, - { - "symbol": "\\doublecup", - "comment": "" - }, - { - "symbol": "\\Downarrow", - "comment": "" - }, - { - "symbol": "\\downarrow", - "comment": "" - }, - { - "symbol": "\\downdownarrows", - "comment": "" - }, - { - "symbol": "\\downharpoonleft", - "comment": "" - }, - { - "symbol": "\\downharpoonright", - "comment": "" - } - ] - }, - { - "name": "E", - "children": [ - { - "symbol": "\\edef", - "comment": "`\\def\\foo{a}\\edef\\bar{\\foo}\\def\\foo{}\\bar`" - }, - { - "symbol": "\\ell", - "comment": "" - }, - { - "symbol": "\\empty", - "comment": "" - }, - { - "symbol": "\\emptyset", - "comment": "" - }, - { - "symbol": "\\end", - "comment": "`\\begin{matrix}``a & b \\\\``c & d`'`\\end{matrix}`" - }, - { - "symbol": "\\endgroup", - "comment": "\\begingroup...\\endgroup" - }, - { - "symbol": "\\enspace", - "comment": "`a\\enspace b`" - }, - { - "symbol": "\\Epsilon", - "comment": "" - }, - { - "symbol": "\\epsilon", - "comment": "" - }, - { - "symbol": "\\eqcirc", - "comment": "" - }, - { - "symbol": "\\Eqcolon", - "comment": "" - }, - { - "symbol": "\\eqcolon", - "comment": "" - }, - { - "symbol": "\\Eqqcolon", - "comment": "" - }, - { - "symbol": "\\eqqcolon", - "comment": "" - }, - { - "symbol": "\\eqsim", - "comment": "" - }, - { - "symbol": "\\eqslantgtr", - "comment": "" - }, - { - "symbol": "\\eqslantless", - "comment": "" - }, - { - "symbol": "\\equalscolon", - "comment": "" - }, - { - "symbol": "\\equalscoloncolon", - "comment": "" - }, - { - "symbol": "\\equiv", - "comment": "" - }, - { - "symbol": "\\Eta", - "comment": "" - }, - { - "symbol": "\\eta", - "comment": "" - }, - { - "symbol": "\\eth", - "comment": "" - }, - { - "symbol": "\\exist", - "comment": "" - }, - { - "symbol": "\\exists", - "comment": "" - }, - { - "symbol": "\\exp", - "comment": "" - }, - { - "symbol": "\\expandafter", - "comment": "" - } - ] - }, - { - "name": "F", - "children": [ - { - "symbol": "\\fallingdotseq", - "comment": "" - }, - { - "symbol": "\\fbox", - "comment": "`\\fbox{Hi there!}`" - }, - { - "symbol": "\\fcolorbox", - "comment": "`\\fcolorbox{red}{aqua}{A}`" - }, - { - "symbol": "\\Finv", - "comment": "" - }, - { - "symbol": "\\flat", - "comment": "" - }, - { - "symbol": "\\footnotesize", - "comment": "`\\footnotesize footnotesize`" - }, - { - "symbol": "\\forall", - "comment": "" - }, - { - "symbol": "\\frac", - "comment": "`\\frac a b`" - }, - { - "symbol": "\\frak", - "comment": "`\\frak{AaBb}`" - }, - { - "symbol": "\\frown", - "comment": "" - }, - { - "symbol": "\\futurelet", - "comment": "\\futurelet\\cs" - } - ] - }, - { - "name": "G", - "children": [ - { - "symbol": "\\Game", - "comment": "" - }, - { - "symbol": "\\Gamma", - "comment": "" - }, - { - "symbol": "\\gamma", - "comment": "" - }, - { - "symbol": "\\gcd", - "comment": "" - }, - { - "symbol": "\\gdef", - "comment": "`\\gdef\\bar#1{#1^2} \\bar{y} + \\bar{y}`" - }, - { - "symbol": "\\ge", - "comment": "" - }, - { - "symbol": "\\genfrac", - "comment": "`\\genfrac ( ] {2pt}{0}a{a+1}`" - }, - { - "symbol": "\\geq", - "comment": "" - }, - { - "symbol": "\\geqq", - "comment": "" - }, - { - "symbol": "\\geqslant", - "comment": "" - }, - { - "symbol": "\\gets", - "comment": "" - }, - { - "symbol": "\\gg", - "comment": "" - }, - { - "symbol": "\\ggg", - "comment": "" - }, - { - "symbol": "\\gggtr", - "comment": "" - }, - { - "symbol": "\\gimel", - "comment": "" - }, - { - "symbol": "\\global", - "comment": "`\\global\\def\\add#1#2{#1+#2} \\add 2 3`" - }, - { - "symbol": "\\gnapprox", - "comment": "" - }, - { - "symbol": "\\gneq", - "comment": "" - }, - { - "symbol": "\\gneqq", - "comment": "" - }, - { - "symbol": "\\gnsim", - "comment": "" - }, - { - "symbol": "\\grave", - "comment": "`\\grave{eu}`" - }, - { - "symbol": "\\gt", - "comment": "`a \\gt b`" - }, - { - "symbol": "\\gtrdot", - "comment": "" - }, - { - "symbol": "\\gtrapprox", - "comment": "" - }, - { - "symbol": "\\gtreqless", - "comment": "" - }, - { - "symbol": "\\gtreqqless", - "comment": "" - }, - { - "symbol": "\\gtrless", - "comment": "" - }, - { - "symbol": "\\gtrsim", - "comment": "" - }, - { - "symbol": "\\gvertneqq", - "comment": "" - } - ] - }, - { - "name": "H", - "children": [ - { - "symbol": "\\H", - "comment": "`\\text{\\H{a}}`" - }, - { - "symbol": "\\Harr", - "comment": "" - }, - { - "symbol": "\\hArr", - "comment": "" - }, - { - "symbol": "\\harr", - "comment": "" - }, - { - "symbol": "\\hat", - "comment": "`\\hat{\\theta}`" - }, - { - "symbol": "\\hbar", - "comment": "" - }, - { - "symbol": "\\hbox", - "comment": "`\\hbox{$x^2$}`" - }, - { - "symbol": "\\hdashline", - "comment": "`\\begin{matrix} a & b \\\\ \\hdashline c & d \\end{matrix}`" - }, - { - "symbol": "\\hearts", - "comment": "" - }, - { - "symbol": "\\heartsuit", - "comment": "" - }, - { - "symbol": "\\hline", - "comment": "`\\begin{matrix}``a & b \\\\ \\hline`` c & d`'`\\end{matrix}`" - }, - { - "symbol": "\\hom", - "comment": "" - }, - { - "symbol": "\\hookleftarrow", - "comment": "" - }, - { - "symbol": "\\hookrightarrow", - "comment": "" - }, - { - "symbol": "\\hphantom", - "comment": "`a\\hphantom{bc}d`" - }, - { - "symbol": "\\href", - "comment": "`\\href{https://www.anytype.io}{Anytype.io}`" - }, - { - "symbol": "\\hskip", - "comment": "`w\\hskip1em i\\hskip2em d`" - }, - { - "symbol": "\\hslash", - "comment": "" - }, - { - "symbol": "\\hspace", - "comment": "`s\\hspace7ex k`" - }, - { - "symbol": "\\huge", - "comment": "`\\huge huge`" - }, - { - "symbol": "\\Huge", - "comment": "`\\Huge Huge`" - } - ] - }, - { - "name": "I", - "children": [ - { - "symbol": "\\i", - "comment": "`\\text{\\i}`" - }, - { - "symbol": "\\iff", - "comment": "`A\\iff B`" - }, - { - "symbol": "\\iiint", - "comment": "" - }, - { - "symbol": "\\iint", - "comment": "" - }, - { - "symbol": "\\Im", - "comment": "" - }, - { - "symbol": "\\image", - "comment": "" - }, - { - "symbol": "\\imageof", - "comment": "" - }, - { - "symbol": "\\imath", - "comment": "" - }, - { - "symbol": "\\impliedby", - "comment": "`P\\impliedby Q`" - }, - { - "symbol": "\\implies", - "comment": "`P\\implies Q`" - }, - { - "symbol": "\\in", - "comment": "" - }, - { - "symbol": "\\includegraphics", - "comment": "`\\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://anytype.io/images/graph/avatar-10.png}" - }, - { - "symbol": "\\inf", - "comment": "" - }, - { - "symbol": "\\infin", - "comment": "" - }, - { - "symbol": "\\infty", - "comment": "" - }, - { - "symbol": "\\injlim", - "comment": "`\\injlim`" - }, - { - "symbol": "\\int", - "comment": "" - }, - { - "symbol": "\\intercal", - "comment": "" - }, - { - "symbol": "\\intop", - "comment": "" - }, - { - "symbol": "\\Iota", - "comment": "" - }, - { - "symbol": "\\iota", - "comment": "" - }, - { - "symbol": "\\isin", - "comment": "" - }, - { - "symbol": "\\it", - "comment": "`{\\it AaBb}`" - } - ] - }, - { - "name": "JK", - "children": [ - { - "symbol": "\\j", - "comment": "`\\text{\\j}`" - }, - { - "symbol": "\\jmath", - "comment": "" - }, - { - "symbol": "\\Join", - "comment": "" - }, - { - "symbol": "\\Kappa", - "comment": "" - }, - { - "symbol": "\\kappa", - "comment": "" - }, - { - "symbol": "\\KaTeX", - "comment": "" - }, - { - "symbol": "\\ker", - "comment": "" - }, - { - "symbol": "\\kern", - "comment": "`I\\kern-2.5pt R`" - }, - { - "symbol": "\\Ket", - "comment": "`\\Ket{\\psi}`" - }, - { - "symbol": "\\ket", - "comment": "`\\ket{\\psi}`" - } - ] - }, - { - "name": "L", - "children": [ - { - "symbol": "\\Lambda", - "comment": "" - }, - { - "symbol": "\\lambda", - "comment": "" - }, - { - "symbol": "\\land", - "comment": "" - }, - { - "symbol": "\\lang", - "comment": "`\\lang A\\rangle`" - }, - { - "symbol": "\\langle", - "comment": "`\\langle A\\rangle`" - }, - { - "symbol": "\\Larr", - "comment": "" - }, - { - "symbol": "\\lArr", - "comment": "" - }, - { - "symbol": "\\larr", - "comment": "" - }, - { - "symbol": "\\large", - "comment": "`\\large large`" - }, - { - "symbol": "\\Large", - "comment": "`\\Large Large`" - }, - { - "symbol": "\\LARGE", - "comment": "`\\LARGE LARGE`" - }, - { - "symbol": "\\LaTeX", - "comment": "" - }, - { - "symbol": "\\lBrace", - "comment": "" - }, - { - "symbol": "\\lbrace", - "comment": "" - }, - { - "symbol": "\\lbrack", - "comment": "" - }, - { - "symbol": "\\lceil", - "comment": "" - }, - { - "symbol": "\\ldotp", - "comment": "" - }, - { - "symbol": "\\ldots", - "comment": "" - }, - { - "symbol": "\\le", - "comment": "" + { + "id": "templates", + "name": "Templates", + "children": [ + { + "comment": "`\\begin{align*} a&=b+c \\\\ d+e&=f \\end{align*}`" + }, + { + "comment": "`\\int_{-\\infty}^\\infty f(\\hat\\xi\\,)e^{2 \\pi i \\xi x}\\,d\\xi`" + }, + { + "comment": "`\\cfrac{a}{1 + b}`" + }, + { + "comment": "`\\dbinom{n}{k}`" + }, + { + "comment": "`\\begin{matrix} a & b \\\\ c & d \\end{matrix}`" + }, + { + "comment": "`\\begin{Bmatrix} 0 & -1 \\\\ -1 & 0 \\end{Bmatrix}`" + }, + { + "comment": "`\\sum_{\\mathclap{1\\le i\\le j\\le n}} x_{ij} + \\sum_{\\begin{subarray}{l}i\\in\\Lambda\\\\0", + "comment": "`a\\>\\>{b}`" + }, + { + "symbol": "\\{", + "comment": "" + }, + { + "symbol": "\\}", + "comment": "" + }, + { + "symbol": "\\|", + "comment": "" + }, + { + "symbol": "\\~", + "comment": "`\\text{\\~{a}}`" + }, + { + "symbol": "\\^", + "comment": "`\\text{\\^{a}}`" + } + ] + }, + { + "name": "A", + "children": [ + { + "symbol": "\\AA", + "comment": "`\\text{\\AA}`" + }, + { + "symbol": "\\aa", + "comment": "`\\text{\\aa}`" + }, + { + "symbol": "\\above", + "comment": "`{a \\above{2pt} b+1}`" + }, + { + "symbol": "\\acute", + "comment": "`\\acute e`" + }, + { + "symbol": "\\AE", + "comment": "`\\text{\\AE}`" + }, + { + "symbol": "\\ae", + "comment": "`\\text{\\ae}`" + }, + { + "symbol": "\\alef", + "comment": "" + }, + { + "symbol": "\\alefsym", + "comment": "" + }, + { + "symbol": "\\aleph", + "comment": "" + }, + { + "symbol": "\\allowbreak", + "comment": "" + }, + { + "symbol": "\\Alpha", + "comment": "" + }, + { + "symbol": "\\alpha", + "comment": "" + }, + { + "symbol": "\\amalg", + "comment": "" + }, + { + "symbol": "\\And", + "comment": "" + }, + { + "symbol": "\\angln", + "comment": "" + }, + { + "symbol": "\\angle", + "comment": "" + }, + { + "symbol": "\\approx", + "comment": "" + }, + { + "symbol": "\\approxeq", + "comment": "" + }, + { + "symbol": "\\approxcolon", + "comment": "" + }, + { + "symbol": "\\approxcoloncolon", + "comment": "" + }, + { + "symbol": "\\arccos", + "comment": "" + }, + { + "symbol": "\\arcctg", + "comment": "" + }, + { + "symbol": "\\arcsin", + "comment": "" + }, + { + "symbol": "\\arctan", + "comment": "" + }, + { + "symbol": "\\arctg", + "comment": "" + }, + { + "symbol": "\\arg", + "comment": "" + }, + { + "symbol": "\\argmax", + "comment": "" + }, + { + "symbol": "\\argmin", + "comment": "" + }, + { + "symbol": "\\arraystretch", + "comment": "`\\def\\arraystretch{1.5} \\begin{array}{cc} a & b \\\\ c & d \\end{array}`" + }, + { + "symbol": "\\ast", + "comment": "" + }, + { + "symbol": "\\asymp", + "comment": "" + }, + { + "symbol": "\\atop", + "comment": "`{a \\atop b}`" + } + ] + }, + { + "name": "B", + "children": [ + { + "symbol": "\\backepsilon", + "comment": "" + }, + { + "symbol": "\\backprime", + "comment": "" + }, + { + "symbol": "\\backsim", + "comment": "" + }, + { + "symbol": "\\backsimeq", + "comment": "" + }, + { + "symbol": "\\backslash", + "comment": "" + }, + { + "symbol": "\\bar", + "comment": "`\\bar{y}`" + }, + { + "symbol": "\\barwedge", + "comment": "" + }, + { + "symbol": "\\Bbb", + "comment": "`\\Bbb{ABC}`" + }, + { + "symbol": "\\Bbbk", + "comment": "" + }, + { + "symbol": "\\bcancel", + "comment": "`\\bcancel{5}`" + }, + { + "symbol": "\\because", + "comment": "" + }, + { + "symbol": "\\begin", + "comment": "`\\begin{matrix}``a & b \\\\``c & d`'`\\end{matrix}`" + }, + { + "symbol": "\\begingroup", + "comment": "`\\begingroup...\\endgroup`" + }, + { + "symbol": "\\Beta", + "comment": "" + }, + { + "symbol": "\\beta", + "comment": "" + }, + { + "symbol": "\\beth", + "comment": "" + }, + { + "symbol": "\\between", + "comment": "" + }, + { + "symbol": "\\bf", + "comment": "`\\bf AaBb12`" + }, + { + "symbol": "\\big", + "comment": "`\\big(\\big)`" + }, + { + "symbol": "\\Big", + "comment": "`\\Big(\\Big)`" + }, + { + "symbol": "\\bigcap", + "comment": "" + }, + { + "symbol": "\\bigcirc", + "comment": "" + }, + { + "symbol": "\\bigcup", + "comment": "" + }, + { + "symbol": "\\bigg", + "comment": "`\\bigg(\\bigg)`" + }, + { + "symbol": "\\Bigg", + "comment": "`\\Bigg(\\Bigg)`" + }, + { + "symbol": "\\biggl", + "comment": "`\\biggl(`" + }, + { + "symbol": "\\Biggl", + "comment": "`\\Biggl(`" + }, + { + "symbol": "\\biggm", + "comment": "`\\biggm\\vert`" + }, + { + "symbol": "\\Biggm", + "comment": "`\\Biggm\\vert`" + }, + { + "symbol": "\\biggr", + "comment": "`\\biggr)`" + }, + { + "symbol": "\\Biggr", + "comment": "`\\Biggr)`" + }, + { + "symbol": "\\bigl", + "comment": "`\\bigl(`" + }, + { + "symbol": "\\Bigl", + "comment": "`\\Bigl(`" + }, + { + "symbol": "\\bigm", + "comment": "`\\bigm\\vert`" + }, + { + "symbol": "\\Bigm", + "comment": "`\\Bigm\\vert`" + }, + { + "symbol": "\\bigodot", + "comment": "" + }, + { + "symbol": "\\bigoplus", + "comment": "" + }, + { + "symbol": "\\bigotimes", + "comment": "" + }, + { + "symbol": "\\bigr", + "comment": "`\\bigr)`" + }, + { + "symbol": "\\Bigr", + "comment": "`\\Bigr)`" + }, + { + "symbol": "\\bigsqcup", + "comment": "" + }, + { + "symbol": "\\bigstar", + "comment": "" + }, + { + "symbol": "\\bigtriangledown", + "comment": "" + }, + { + "symbol": "\\bigtriangleup", + "comment": "" + }, + { + "symbol": "\\biguplus", + "comment": "" + }, + { + "symbol": "\\bigvee", + "comment": "" + }, + { + "symbol": "\\bigwedge", + "comment": "" + }, + { + "symbol": "\\binom", + "comment": "`\\binom n k`" + }, + { + "symbol": "\\blacklozenge", + "comment": "" + }, + { + "symbol": "\\blacksquare", + "comment": "" + }, + { + "symbol": "\\blacktriangle", + "comment": "" + }, + { + "symbol": "\\blacktriangledown", + "comment": "" + }, + { + "symbol": "\\blacktriangleleft", + "comment": "" + }, + { + "symbol": "\\blacktriangleright", + "comment": "" + }, + { + "symbol": "\\bm", + "comment": "`\\bm{AaBb}`" + }, + { + "symbol": "\\bmod", + "comment": "`a \\bmod b`" + }, + { + "symbol": "\\bold", + "comment": "`\\bold{AaBb123}`" + }, + { + "symbol": "\\boldsymbol", + "comment": "`\\boldsymbol{AaBb}`" + }, + { + "symbol": "\\bot", + "comment": "" + }, + { + "symbol": "\\bowtie", + "comment": "" + }, + { + "symbol": "\\Box", + "comment": "" + }, + { + "symbol": "\\boxdot", + "comment": "" + }, + { + "symbol": "\\boxed", + "comment": "`\\boxed{ab}`" + }, + { + "symbol": "\\boxminus", + "comment": "" + }, + { + "symbol": "\\boxplus", + "comment": "" + }, + { + "symbol": "\\boxtimes", + "comment": "" + }, + { + "symbol": "\\Bra", + "comment": "`\\Bra{\\psi}`" + }, + { + "symbol": "\\bra", + "comment": "`\\bra{\\psi}`" + }, + { + "symbol": "\\braket", + "comment": "`\\braket{\\phi\\vert\\psi}`" + }, + { + "symbol": "\\brace", + "comment": "`{n\\brace k}`" + }, + { + "symbol": "\\brack", + "comment": "`{n\\brack k}`" + }, + { + "symbol": "\\breve", + "comment": "`\\breve{eu}`" + }, + { + "symbol": "\\bull", + "comment": "" + }, + { + "symbol": "\\bullet", + "comment": "" + }, + { + "symbol": "\\Bumpeq", + "comment": "" + }, + { + "symbol": "\\bumpeq", + "comment": "" + } + ] + }, + { + "name": "C", + "children": [ + { + "symbol": "\\cal", + "comment": "`\\cal AaBb123`" + }, + { + "symbol": "\\cancel", + "comment": "`\\cancel{5}`" + }, + { + "symbol": "\\Cap", + "comment": "" + }, + { + "symbol": "\\cap", + "comment": "" + }, + { + "symbol": "\\cdot", + "comment": "" + }, + { + "symbol": "\\cdotp", + "comment": "" + }, + { + "symbol": "\\cdots", + "comment": "" + }, + { + "symbol": "\\ce", + "comment": "`\\ce{C6H5-CHO}`" + }, + { + "symbol": "\\centerdot", + "comment": "`a\\centerdot b`" + }, + { + "symbol": "\\cfrac", + "comment": "`\\cfrac{2}{1+\\cfrac{2}{1+\\cfrac{2}{1}}}`" + }, + { + "symbol": "\\char", + "comment": "`\\char\"263a`" + }, + { + "symbol": "\\check", + "comment": "`\\check{oe}`" + }, + { + "symbol": "\\ch", + "comment": "" + }, + { + "symbol": "\\checkmark", + "comment": "" + }, + { + "symbol": "\\Chi", + "comment": "" + }, + { + "symbol": "\\chi", + "comment": "" + }, + { + "symbol": "\\choose", + "comment": "`{n+1 \\choose k+2}`" + }, + { + "symbol": "\\circ", + "comment": "" + }, + { + "symbol": "\\circeq", + "comment": "" + }, + { + "symbol": "\\circlearrowleft", + "comment": "" + }, + { + "symbol": "\\circlearrowright", + "comment": "" + }, + { + "symbol": "\\circledast", + "comment": "" + }, + { + "symbol": "\\circledcirc", + "comment": "" + }, + { + "symbol": "\\circleddash", + "comment": "" + }, + { + "symbol": "\\circledR", + "comment": "" + }, + { + "symbol": "\\circledS", + "comment": "" + }, + { + "symbol": "\\clubs", + "comment": "" + }, + { + "symbol": "\\clubsuit", + "comment": "" + }, + { + "symbol": "\\cnums", + "comment": "" + }, + { + "symbol": "\\colon", + "comment": "" + }, + { + "symbol": "\\Colonapprox", + "comment": "" + }, + { + "symbol": "\\colonapprox", + "comment": "" + }, + { + "symbol": "\\coloncolon", + "comment": "" + }, + { + "symbol": "\\coloncolonapprox", + "comment": "" + }, + { + "symbol": "\\coloncolonequals", + "comment": "" + }, + { + "symbol": "\\coloncolonminus", + "comment": "" + }, + { + "symbol": "\\coloncolonsim", + "comment": "" + }, + { + "symbol": "\\Coloneq", + "comment": "" + }, + { + "symbol": "\\coloneq", + "comment": "" + }, + { + "symbol": "\\colonequals", + "comment": "" + }, + { + "symbol": "\\Coloneqq", + "comment": "" + }, + { + "symbol": "\\coloneqq", + "comment": "" + }, + { + "symbol": "\\colonminus", + "comment": "" + }, + { + "symbol": "\\Colonsim", + "comment": "" + }, + { + "symbol": "\\colonsim", + "comment": "" + }, + { + "symbol": "\\color", + "comment": "`\\color{#0000FF} AaBb123`" + }, + { + "symbol": "\\colorbox", + "comment": "`\\colorbox{red}{Black on red}`" + }, + { + "symbol": "\\complement", + "comment": "" + }, + { + "symbol": "\\Complex", + "comment": "" + }, + { + "symbol": "\\cong", + "comment": "" + }, + { + "symbol": "\\coprod", + "comment": "" + }, + { + "symbol": "\\copyright", + "comment": "" + }, + { + "symbol": "\\cos", + "comment": "" + }, + { + "symbol": "\\cosec", + "comment": "" + }, + { + "symbol": "\\cosh", + "comment": "" + }, + { + "symbol": "\\cot", + "comment": "" + }, + { + "symbol": "\\cotg", + "comment": "" + }, + { + "symbol": "\\coth", + "comment": "" + }, + { + "symbol": "\\cr", + "comment": "`\\begin{matrix}``a & b \\cr ``c & d`'`\\end{matrix}`" + }, + { + "symbol": "\\csc", + "comment": "" + }, + { + "symbol": "\\ctg", + "comment": "" + }, + { + "symbol": "\\cth", + "comment": "" + }, + { + "symbol": "\\Cup", + "comment": "" + }, + { + "symbol": "\\cup", + "comment": "" + }, + { + "symbol": "\\curlyeqprec", + "comment": "" + }, + { + "symbol": "\\curlyeqsucc", + "comment": "" + }, + { + "symbol": "\\curlyvee", + "comment": "" + }, + { + "symbol": "\\curlywedge", + "comment": "" + }, + { + "symbol": "\\curvearrowleft", + "comment": "" + }, + { + "symbol": "\\curvearrowright", + "comment": "" + } + ] + }, + { + "name": "D", + "children": [ + { + "symbol": "\\dag", + "comment": "" + }, + { + "symbol": "\\Dagger", + "comment": "" + }, + { + "symbol": "\\dagger", + "comment": "" + }, + { + "symbol": "\\daleth", + "comment": "" + }, + { + "symbol": "\\Darr", + "comment": "" + }, + { + "symbol": "\\dArr", + "comment": "" + }, + { + "symbol": "\\darr", + "comment": "" + }, + { + "symbol": "\\dashleftarrow", + "comment": "" + }, + { + "symbol": "\\dashrightarrow", + "comment": "" + }, + { + "symbol": "\\dashv", + "comment": "" + }, + { + "symbol": "\\dbinom", + "comment": "`\\dbinom n k`" + }, + { + "symbol": "\\dblcolon", + "comment": "" + }, + { + "symbol": "\\ddag", + "comment": "" + }, + { + "symbol": "\\ddagger", + "comment": "" + }, + { + "symbol": "\\ddot", + "comment": "`\\ddot x`" + }, + { + "symbol": "\\ddots", + "comment": "" + }, + { + "symbol": "\\def", + "comment": "`\\def\\foo{x^2} \\foo + \\foo`" + }, + { + "symbol": "\\deg", + "comment": "" + }, + { + "symbol": "\\degree", + "comment": "" + }, + { + "symbol": "\\delta", + "comment": "" + }, + { + "symbol": "\\Delta", + "comment": "" + }, + { + "symbol": "\\det", + "comment": "" + }, + { + "symbol": "\\digamma", + "comment": "" + }, + { + "symbol": "\\dfrac", + "comment": "`\\dfrac{a-1}{b-1}`" + }, + { + "symbol": "\\diagdown", + "comment": "" + }, + { + "symbol": "\\diagup", + "comment": "" + }, + { + "symbol": "\\Diamond", + "comment": "" + }, + { + "symbol": "\\diamond", + "comment": "" + }, + { + "symbol": "\\diamonds", + "comment": "" + }, + { + "symbol": "\\diamondsuit", + "comment": "" + }, + { + "symbol": "\\dim", + "comment": "" + }, + { + "symbol": "\\displaystyle", + "comment": "`\\displaystyle\\sum_0^n`" + }, + { + "symbol": "\\div", + "comment": "" + }, + { + "symbol": "\\divideontimes", + "comment": "" + }, + { + "symbol": "\\dot", + "comment": "`\\dot x`" + }, + { + "symbol": "\\Doteq", + "comment": "" + }, + { + "symbol": "\\doteq", + "comment": "" + }, + { + "symbol": "\\doteqdot", + "comment": "" + }, + { + "symbol": "\\dotplus", + "comment": "" + }, + { + "symbol": "\\dots", + "comment": "`x_1 + \\dots + x_n`" + }, + { + "symbol": "\\dotsb", + "comment": "`x_1 +\\dotsb + x_n`" + }, + { + "symbol": "\\dotsc", + "comment": "`x,\\dotsc,y`" + }, + { + "symbol": "\\dotsi", + "comment": "`\\int_{A_1}\\int_{A_2}\\dotsi`" + }, + { + "symbol": "\\dotsm", + "comment": "`x_1 x_2 \\dotsm x_n`" + }, + { + "symbol": "\\dotso", + "comment": "" + }, + { + "symbol": "\\doublebarwedge", + "comment": "" + }, + { + "symbol": "\\doublecap", + "comment": "" + }, + { + "symbol": "\\doublecup", + "comment": "" + }, + { + "symbol": "\\Downarrow", + "comment": "" + }, + { + "symbol": "\\downarrow", + "comment": "" + }, + { + "symbol": "\\downdownarrows", + "comment": "" + }, + { + "symbol": "\\downharpoonleft", + "comment": "" + }, + { + "symbol": "\\downharpoonright", + "comment": "" + } + ] + }, + { + "name": "E", + "children": [ + { + "symbol": "\\edef", + "comment": "`\\def\\foo{a}\\edef\\bar{\\foo}\\def\\foo{}\\bar`" + }, + { + "symbol": "\\ell", + "comment": "" + }, + { + "symbol": "\\empty", + "comment": "" + }, + { + "symbol": "\\emptyset", + "comment": "" + }, + { + "symbol": "\\end", + "comment": "`\\begin{matrix}``a & b \\\\``c & d`'`\\end{matrix}`" + }, + { + "symbol": "\\endgroup", + "comment": "\\begingroup...\\endgroup" + }, + { + "symbol": "\\enspace", + "comment": "`a\\enspace b`" + }, + { + "symbol": "\\Epsilon", + "comment": "" + }, + { + "symbol": "\\epsilon", + "comment": "" + }, + { + "symbol": "\\eqcirc", + "comment": "" + }, + { + "symbol": "\\Eqcolon", + "comment": "" + }, + { + "symbol": "\\eqcolon", + "comment": "" + }, + { + "symbol": "\\Eqqcolon", + "comment": "" + }, + { + "symbol": "\\eqqcolon", + "comment": "" + }, + { + "symbol": "\\eqsim", + "comment": "" + }, + { + "symbol": "\\eqslantgtr", + "comment": "" + }, + { + "symbol": "\\eqslantless", + "comment": "" + }, + { + "symbol": "\\equalscolon", + "comment": "" + }, + { + "symbol": "\\equalscoloncolon", + "comment": "" + }, + { + "symbol": "\\equiv", + "comment": "" + }, + { + "symbol": "\\Eta", + "comment": "" + }, + { + "symbol": "\\eta", + "comment": "" + }, + { + "symbol": "\\eth", + "comment": "" + }, + { + "symbol": "\\exist", + "comment": "" + }, + { + "symbol": "\\exists", + "comment": "" + }, + { + "symbol": "\\exp", + "comment": "" + }, + { + "symbol": "\\expandafter", + "comment": "" + } + ] + }, + { + "name": "F", + "children": [ + { + "symbol": "\\fallingdotseq", + "comment": "" + }, + { + "symbol": "\\fbox", + "comment": "`\\fbox{Hi there!}`" + }, + { + "symbol": "\\fcolorbox", + "comment": "`\\fcolorbox{red}{aqua}{A}`" + }, + { + "symbol": "\\Finv", + "comment": "" + }, + { + "symbol": "\\flat", + "comment": "" + }, + { + "symbol": "\\footnotesize", + "comment": "`\\footnotesize footnotesize`" + }, + { + "symbol": "\\forall", + "comment": "" + }, + { + "symbol": "\\frac", + "comment": "`\\frac a b`" + }, + { + "symbol": "\\frak", + "comment": "`\\frak{AaBb}`" + }, + { + "symbol": "\\frown", + "comment": "" + }, + { + "symbol": "\\futurelet", + "comment": "\\futurelet\\cs" + } + ] + }, + { + "name": "G", + "children": [ + { + "symbol": "\\Game", + "comment": "" + }, + { + "symbol": "\\Gamma", + "comment": "" + }, + { + "symbol": "\\gamma", + "comment": "" + }, + { + "symbol": "\\gcd", + "comment": "" + }, + { + "symbol": "\\gdef", + "comment": "`\\gdef\\bar#1{#1^2} \\bar{y} + \\bar{y}`" + }, + { + "symbol": "\\ge", + "comment": "" + }, + { + "symbol": "\\genfrac", + "comment": "`\\genfrac ( ] {2pt}{0}a{a+1}`" + }, + { + "symbol": "\\geq", + "comment": "" + }, + { + "symbol": "\\geqq", + "comment": "" + }, + { + "symbol": "\\geqslant", + "comment": "" + }, + { + "symbol": "\\gets", + "comment": "" + }, + { + "symbol": "\\gg", + "comment": "" + }, + { + "symbol": "\\ggg", + "comment": "" + }, + { + "symbol": "\\gggtr", + "comment": "" + }, + { + "symbol": "\\gimel", + "comment": "" + }, + { + "symbol": "\\global", + "comment": "`\\global\\def\\add#1#2{#1+#2} \\add 2 3`" + }, + { + "symbol": "\\gnapprox", + "comment": "" + }, + { + "symbol": "\\gneq", + "comment": "" + }, + { + "symbol": "\\gneqq", + "comment": "" + }, + { + "symbol": "\\gnsim", + "comment": "" + }, + { + "symbol": "\\grave", + "comment": "`\\grave{eu}`" + }, + { + "symbol": "\\gt", + "comment": "`a \\gt b`" + }, + { + "symbol": "\\gtrdot", + "comment": "" + }, + { + "symbol": "\\gtrapprox", + "comment": "" + }, + { + "symbol": "\\gtreqless", + "comment": "" + }, + { + "symbol": "\\gtreqqless", + "comment": "" + }, + { + "symbol": "\\gtrless", + "comment": "" + }, + { + "symbol": "\\gtrsim", + "comment": "" + }, + { + "symbol": "\\gvertneqq", + "comment": "" + } + ] + }, + { + "name": "H", + "children": [ + { + "symbol": "\\H", + "comment": "`\\text{\\H{a}}`" + }, + { + "symbol": "\\Harr", + "comment": "" + }, + { + "symbol": "\\hArr", + "comment": "" + }, + { + "symbol": "\\harr", + "comment": "" + }, + { + "symbol": "\\hat", + "comment": "`\\hat{\\theta}`" + }, + { + "symbol": "\\hbar", + "comment": "" + }, + { + "symbol": "\\hbox", + "comment": "`\\hbox{$x^2$}`" + }, + { + "symbol": "\\hdashline", + "comment": "`\\begin{matrix} a & b \\\\ \\hdashline c & d \\end{matrix}`" + }, + { + "symbol": "\\hearts", + "comment": "" + }, + { + "symbol": "\\heartsuit", + "comment": "" + }, + { + "symbol": "\\hline", + "comment": "`\\begin{matrix}``a & b \\\\ \\hline`` c & d`'`\\end{matrix}`" + }, + { + "symbol": "\\hom", + "comment": "" + }, + { + "symbol": "\\hookleftarrow", + "comment": "" + }, + { + "symbol": "\\hookrightarrow", + "comment": "" + }, + { + "symbol": "\\hphantom", + "comment": "`a\\hphantom{bc}d`" + }, + { + "symbol": "\\href", + "comment": "`\\href{https://www.anytype.io}{Anytype.io}`" + }, + { + "symbol": "\\hskip", + "comment": "`w\\hskip1em i\\hskip2em d`" + }, + { + "symbol": "\\hslash", + "comment": "" + }, + { + "symbol": "\\hspace", + "comment": "`s\\hspace7ex k`" + }, + { + "symbol": "\\huge", + "comment": "`\\huge huge`" + }, + { + "symbol": "\\Huge", + "comment": "`\\Huge Huge`" + } + ] + }, + { + "name": "I", + "children": [ + { + "symbol": "\\i", + "comment": "`\\text{\\i}`" + }, + { + "symbol": "\\iff", + "comment": "`A\\iff B`" + }, + { + "symbol": "\\iiint", + "comment": "" + }, + { + "symbol": "\\iint", + "comment": "" + }, + { + "symbol": "\\Im", + "comment": "" + }, + { + "symbol": "\\image", + "comment": "" + }, + { + "symbol": "\\imageof", + "comment": "" + }, + { + "symbol": "\\imath", + "comment": "" + }, + { + "symbol": "\\impliedby", + "comment": "`P\\impliedby Q`" + }, + { + "symbol": "\\implies", + "comment": "`P\\implies Q`" + }, + { + "symbol": "\\in", + "comment": "" + }, + { + "symbol": "\\includegraphics", + "comment": "`\\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://anytype.io/images/graph/avatar-10.png}" + }, + { + "symbol": "\\inf", + "comment": "" + }, + { + "symbol": "\\infin", + "comment": "" + }, + { + "symbol": "\\infty", + "comment": "" + }, + { + "symbol": "\\injlim", + "comment": "`\\injlim`" + }, + { + "symbol": "\\int", + "comment": "" + }, + { + "symbol": "\\intercal", + "comment": "" + }, + { + "symbol": "\\intop", + "comment": "" + }, + { + "symbol": "\\Iota", + "comment": "" + }, + { + "symbol": "\\iota", + "comment": "" + }, + { + "symbol": "\\isin", + "comment": "" + }, + { + "symbol": "\\it", + "comment": "`{\\it AaBb}`" + } + ] + }, + { + "name": "JK", + "children": [ + { + "symbol": "\\j", + "comment": "`\\text{\\j}`" + }, + { + "symbol": "\\jmath", + "comment": "" + }, + { + "symbol": "\\Join", + "comment": "" + }, + { + "symbol": "\\Kappa", + "comment": "" + }, + { + "symbol": "\\kappa", + "comment": "" + }, + { + "symbol": "\\KaTeX", + "comment": "" + }, + { + "symbol": "\\ker", + "comment": "" + }, + { + "symbol": "\\kern", + "comment": "`I\\kern-2.5pt R`" + }, + { + "symbol": "\\Ket", + "comment": "`\\Ket{\\psi}`" + }, + { + "symbol": "\\ket", + "comment": "`\\ket{\\psi}`" + } + ] + }, + { + "name": "L", + "children": [ + { + "symbol": "\\Lambda", + "comment": "" + }, + { + "symbol": "\\lambda", + "comment": "" + }, + { + "symbol": "\\land", + "comment": "" + }, + { + "symbol": "\\lang", + "comment": "`\\lang A\\rangle`" + }, + { + "symbol": "\\langle", + "comment": "`\\langle A\\rangle`" + }, + { + "symbol": "\\Larr", + "comment": "" + }, + { + "symbol": "\\lArr", + "comment": "" + }, + { + "symbol": "\\larr", + "comment": "" + }, + { + "symbol": "\\large", + "comment": "`\\large large`" + }, + { + "symbol": "\\Large", + "comment": "`\\Large Large`" + }, + { + "symbol": "\\LARGE", + "comment": "`\\LARGE LARGE`" + }, + { + "symbol": "\\LaTeX", + "comment": "" + }, + { + "symbol": "\\lBrace", + "comment": "" + }, + { + "symbol": "\\lbrace", + "comment": "" + }, + { + "symbol": "\\lbrack", + "comment": "" + }, + { + "symbol": "\\lceil", + "comment": "" + }, + { + "symbol": "\\ldotp", + "comment": "" + }, + { + "symbol": "\\ldots", + "comment": "" + }, + { + "symbol": "\\le", + "comment": "" }, { "symbol": "\\leadsto", diff --git a/src/json/relation.ts b/src/json/relation.ts index 47b7c0a5b3..4e93a9350c 100644 --- a/src/json/relation.ts +++ b/src/json/relation.ts @@ -137,7 +137,7 @@ export default { 'targetSpaceId', 'creator', 'createdDate', - 'spaceMainChatId' + 'chatId', ], participant: [ diff --git a/src/json/text.json b/src/json/text.json index 843dd5b30d..0f3d3c1b20 100644 --- a/src/json/text.json +++ b/src/json/text.json @@ -23,7 +23,6 @@ "commonHome": "Home", "commonSubmit": "Submit", "commonValue": "Value", - "commonProgress": "Processing...", "commonArchived": "Object is in the bin", "commonEmpty": "Empty", "commonBack": "Back", @@ -63,7 +62,7 @@ "commonUnlinkFromType": "Unlink from Type", "commonUnlinkFromObject": "Unlink from Object", "commonUnlinkFromSet": "Unlink from Set", - "commonFromCollection": "Unlink from Collection", + "commonUnlinkFromCollection": "Unlink from Collection", "commonDeletedObject": "Non-existent object", "commonDeletedType": "Deleted type", "commonDeletedRelation": "Deleted Relation", @@ -168,8 +167,11 @@ "commonNothingFound": "Nothing found", "commonEntrySpace": "My First Space", "commonSystem": "System", - "commonMainChat": "Main сhat", + "commonProgress": "Progress", + "commonMainChat": "Chat", "commonMenu": "Menu", + "commonSignUp": "Sign Up", + "commonNotFound": "Not found", "pluralDay": "day|days", "pluralObject": "Object|Objects", @@ -229,6 +231,7 @@ "electronMenuDebugTree": "Tree diagnostics", "electronMenuDebugStat": "Statistics", "electronMenuDebugReconcile": "Reconcile", + "electronMenuDebugNet": "Network", "electronMenuClose": "Close Window", "electronMenuEdit": "Edit", "electronMenuUndo": "Undo", @@ -322,12 +325,14 @@ "viewName4": "Calendar", "viewName5": "Graph", - "progress0": "Copying files %s\/%s", - "progress1": "Import in progress", - "progress2": "Export in progress", - "progress3": "Download in progress", - "progress4": "Recovering vault", - "progress5": "Migration in progress", + + "progressDropFiles": "Copying files...", + "progressImport": "Import in progress...", + "progressExport": "Export in progress...", + "progressSaveFile": "Download in progress...", + "progressMigration": "Recovering vault...", + "progressRecoverAccount": "Migration in progress...", + "progressUpdateCheck": "Update...", "progressUpdateCheck": "Checking for update...", "spellcheckAdd": "Add to dictionary", @@ -923,7 +928,7 @@ "popupSettingsImportNotionHelpTitle": "How to import from Notion", "popupSettingsImportNotionHelpStep": "Step %s", - "popupSettingsImportNotionHelpStep11": "Open Settings & members.", + "popupSettingsImportNotionHelpStep11": "Open Settings.", "popupSettingsImportNotionHelpStep12": "Open My Connections and then click Develop or manage integrations.", "popupSettingsImportNotionHelpStep13": "Click New integration or Create new integration.", "popupSettingsImportNotionHelpStep14": "Select your workspace and set Name for integration.", @@ -931,7 +936,7 @@ "popupSettingsImportNotionHelpStep16": "Copy Internal Integration Secret for connecting and importing your data.", "popupSettingsImportNotionHelpStep2Descr": "Add integration to the pages you want to import into Anytype. Page will be imported with all children documents. Select your root object to import all objects.", "popupSettingsImportNotionHelpStep21": "Click on three dots on the upper right corner, then click Connect to (you need to scroll the menu). Select your Anytype integration.", - "popupSettingsImportNotionHelpStep22": "Press Confirm. Now you just need to paste your Internal Integration Token to Anytype.", + "popupSettingsImportNotionHelpStep22": "Press Confirm. Now you just need to paste your Internal Integration Token to Anytype. Hint: Newly created integrations may produce a 'page not found' error on the first import. If this happens, wait a few minutes and try running the import again.", "popupSettingsImportNotionWarningTitle": "Some data formats will be imported as text", "popupSettingsImportNotionWarningLi1": "All @mentions will be converted to text", @@ -1072,8 +1077,8 @@ "popupConfirmOpenExternalLinkTitle": "Are you sure?", "popupConfirmOpenExternalLinkText": "You are trying to open url that is potentially harmful. Are you sure you want to proceed?", - "popupConfirmChatDeleteMessageTitle": "Delete message", - "popupConfirmChatDeleteMessageText": "Are you sure you want to delete this message?", + "popupConfirmChatDeleteMessageTitle": "Delete this message?", + "popupConfirmChatDeleteMessageText": "It cannot be restored after confirmation", "popupInviteRequestTitle": "Join a space", "popupInviteRequestText": "You've been invited to join %s space, created by %s. Send a request so space owner can let you in.", @@ -1385,7 +1390,7 @@ "menuBlockRelationEditSelectRelationType": "Select Relation Type", "menuBlockRelationEditAddObjectType": "Add Object Type", "menuBlockRelationEditFilterObjectTypes": "Filter Object types...", - "menuBlockRelationEditToastOnCreate": "Relation %s has been created and added to your Library", + "menuBlockRelationEditToastOnCreate": "Relation %s has been created", "menuBlockRelationViewFeaturedRelations": "Featured Relations", "menuBlockRelationViewInThisObject": "In this Object", @@ -1458,7 +1463,7 @@ "menuDataviewRelationEditHideRelation": "Hide Relation", "menuDataviewRelationEditAddObjectType": "Add Object type", "menuDataviewRelationEditFilterObjectTypes": "Filter Object types...", - "menuDataviewRelationEditToastOnCreate": "Relation %s has been created and added to your Library", + "menuDataviewRelationEditToastOnCreate": "Relation %s has been created", "menuDataviewSortNoSortsApplied": "No sorts applied to this View", "menuDataviewSortNewSort": "New sort", @@ -1514,6 +1519,7 @@ "menuHelpTutorial": "Help and Tutorials", "menuHelpContact": "Contact Us", "menuHelpTech": "Technical Information", + "menuHelpNet": "Network Information", "menuHelpTerms": "Terms of Use", "menuHelpPrivacy": "Privacy Policy", "menuHelpGallery": "ANY Experience Gallery", @@ -1759,7 +1765,6 @@ "widgetRecentOpen": "Recently opened", "widgetSet": "Sets", "widgetCollection": "Collections", - "widgetChat": "Chats", "widgetEdit": "Edit widgets", "widgetAdd": "Add widget", "widgetLibrary": "Library", @@ -1844,10 +1849,25 @@ "onboardingStoreRelation2Button": "Great!", "onboardingObjectCreationStart": "Creating Objects", - "onboardingObjectCreationStart11": "Let’s create an object from scratch. The default object type is now ‘Page’, meaning that each new object is referred to as a Note unless you choose a different type. You can change the default object type anytime in the settings menu.", "onboardingObjectCreationStart21": "Choose here from the most popular object types, such as Page, Task, or Collection. You can also select an object from the Type menu.", "onboardingObjectCreationStart2Button": "I got it!", + "emailCollectionStep0Title": "Want to stay in touch?", + "emailCollectionStep0Description": "Enter your email to receive tips and updates. We do not link your account with your email, ever. Cancel anytime.", + "emailCollectionStep1Title": "Just a moment", + "emailCollectionStep1Description": "Enter the code we’ve sent you to your email", + "emailCollectionStep2Title": "You’re Subscribed!", + + "emailCollectionStep2News": "You are now set to receive the latest updates. Enjoy exploring!", + "emailCollectionStep2Tips": "You are now set to receive new insights. Enjoy exploring!", + "emailCollectionStep2NewsAndTips": "You are now set to receive the latest updates and perks. Enjoy exploring!", + + "emailCollectionCheckboxTipsLabel": "Insider tips & tutorials on using Anytype", + "emailCollectionCheckboxNewsLabel": "Product updates & company news", + "emailCollectionEnterEmail": "Enter email...", + "emailCollectionCodeSent": "Code sent!", + "emailCollectionGreat": "Great!", + "onboardingObjectCreationFinish": "Creating Objects", "onboardingObjectCreationFinish11": "For the Object you created, you can adjust it using the top menu. Change the cover, layout, or set up a relations to build the graph.", "onboardingObjectCreationFinish1Button": "Ok! I like it", @@ -1918,6 +1938,7 @@ "libKeyboardAnalyticsId": "Analytics ID", "libKeyboardDeviceId": "Device ID", "libKeyboardTechInformation": "Tech information", + "libKeyboardNetInformation": "Network information", "libRelationSmall": "Small", "libRelationMedium": "Medium", @@ -2135,16 +2156,18 @@ "notificationGalleryErrorTitle": "Something went wrong", "notificationGalleryErrorText": "Oops! '%s' wasn't installed. Please check your Internet connection and try again or post a report in our community.", - "notificationImportErrorTitle5": "No Items to Import", - "notificationImportErrorText5": "There are no items to import. Please check your file type or Import selection and try again.", - "notificationImportErrorTitle6": "Import Canceled", - "notificationImportErrorText6": "The import has been canceled.", - "notificationImportErrorTitle7": "Import Limit Exceeded", - "notificationImportErrorText7": "The file exceeds the import limit of 1,000 rows or 10 columns. Please adjust your file and try again.", - "notificationImportErrorTitle8": "File Load Error", - "notificationImportErrorText8": "We couldn’t load your files. Please check your files and try again, or manually transfer the files.", - "notificationImportErrorTitle9": "Permission Denied", + "notificationImportErrorText3": "Internal error during import. Please report it to Anytype devs using Help -> Report a Bug. We will check.", + "notificationImportErrorText5": "No objects found in the provided Notion integration. Open Notion and check that you have added the integration to the pages you want to export. Check our FAQ for more details.", + "notificationImportErrorText6": "The import was canceled by the user.", + "notificationImportErrorText7": "The number of lines of the CSV file exceeds 1000. Try splitting the file into smaller parts.", + "notificationImportErrorText8": "Error when uploading a file. Check if you have enough space and try again.", "notificationImportErrorText9": "We don’t have permission to import into this Anytype space.", + "notificationImportErrorText10": "An error occurred during HTML rendering. Check the format of your HTML file.", + "notificationImportErrorText11": "The imported AnyBlock file has an unsupported format. It may have been exported from an old or unsupported version of Anytype. Update it and try exporting again.", + "notificationImportErrorText12": "Notion API returned an internal error. Most likely something is broken on the Notion side. Try running the import again later.", + "notificationImportErrorText13": "Notion API returned an exceeded limits error. Wait a few minutes and try running the import again.", + "notificationImportErrorText14": "No objects of the required format were found in the imported archive. Make sure you have selected the correct import format, such as HTML or Markdown", + "notificationImportErrorText17": "No objects of the required format were found in the imported folder. Make sure you have selected the correct file format, such as HTML or Markdown", "notificationJoinSuccessText": "%s has requested to join '%s' space", @@ -2200,6 +2223,36 @@ "networkMode1Title": "Local-only", "networkMode1Text": "Don't back up; sync within local network", "networkMode2Title": "Self-hosted", - "networkMode2Text": "Back up to your self-hosted network" - + "networkMode2Text": "Back up to your self-hosted network", + + "formulaNone": "Calculate", + "formulaCount": "Count", + "formulaPercentage": "Percentage", + "formulaMath": "Math", + "formulaDate": "Date", + "formulaDistinct": "Count unique values", + "formulaDistinctShort": "Unique", + "formulaEmpty": "Count empty", + "formulaEmptyShort": "Empty", + "formulaNotEmpty": "Count not empty", + "formulaNotEmptyShort": "Not empty", + "formulaPercentEmpty": "Percentage empty", + "formulaPercentNotEmpty": "Percentage not empty", + "formulaSum": "Sum", + "formulaAverage": "Average", + "formulaMedian": "Median", + "formulaMin": "Minimum", + "formulaMax": "Maximum", + "formulaRange": "Range", + "formulaDateMin": "Earliest date", + "formulaDateMinShort": "Earliest", + "formulaDateMax": "Latest date", + "formulaDateMaxShort": "Latest", + "formulaDateRange": "Date range", + "formulaDateRangeShort": "Range", + "formulaCheckboxCount": "Count all", + "formulaCheckboxEmpty": "Count unchecked", + "formulaCheckboxNotEmpty": "Count checked", + "formulaCheckboxPercentEmpty": "Percentage unchecked", + "formulaCheckboxPercentNotEmpty": "Percentage checked" } diff --git a/src/json/theme.ts b/src/json/theme.ts index 8ba2b6ae9b..220bb858a0 100644 --- a/src/json/theme.ts +++ b/src/json/theme.ts @@ -2,6 +2,7 @@ export default { iconSpace: { text: '#fff', bg: { + grey: '#949494', yellow: '#ecd91b', orange: '#ffb522', red: '#f55522', @@ -10,11 +11,10 @@ export default { blue: '#3e58eb', ice: '#2aa7ee', teal: '#0fc8ba', - green: '#57c600', - grey: '#949494', + lime: '#5dd400', }, - list: [ 'grey', 'yellow', 'orange', 'red', 'pink', 'purple', 'blue', 'ice', 'teal', 'lime', 'green' ], + list: [ 'grey', 'yellow', 'orange', 'red', 'pink', 'purple', 'blue', 'ice', 'teal', 'lime' ], }, /* ----------------------------------------------------------- */ @@ -23,6 +23,7 @@ export default { color: { default: '#252525', + grey: '#b6b6b6', yellow: '#ecd91b', orange: '#ffb522', red: '#f55522', @@ -32,7 +33,6 @@ export default { ice: '#2aa7ee', teal: '#0fc8ba', lime: '#5dd400', - green: '#57c600', }, graph: { @@ -65,7 +65,8 @@ export default { dark: { color: { - default: '#ebebeb', + default: '#f8f8f8', + grey: '#737373', yellow: '#ecd91b', orange: '#ffb522', red: '#f55522', @@ -75,7 +76,6 @@ export default { ice: '#2aa7ee', teal: '#0fc8ba', lime: '#5dd400', - green: '#57c600', }, graph: { diff --git a/src/scss/_mixins.scss b/src/scss/_mixins.scss index b5c6dc936d..c75b692978 100644 --- a/src/scss/_mixins.scss +++ b/src/scss/_mixins.scss @@ -44,7 +44,7 @@ $vaultWidthCollapsed: 72px; @mixin pos-abs-mid { position: absolute; left: 50%; top: 50%; } @mixin clamp { -webkit-box-orient: vertical; display: -webkit-box; overflow: hidden; } -@mixin clamp1 { @include clamp; -webkit-line-clamp: 1; } -@mixin clamp2 { @include clamp; -webkit-line-clamp: 2; } -@mixin clamp3 { @include clamp; -webkit-line-clamp: 3; } -@mixin clamp4 { @include clamp; -webkit-line-clamp: 4; } \ No newline at end of file +@mixin clamp1 { @include clamp; -webkit-line-clamp: 1; } +@mixin clamp2 { @include clamp; -webkit-line-clamp: 2; } +@mixin clamp3 { @include clamp; -webkit-line-clamp: 3; } +@mixin clamp4 { @include clamp; -webkit-line-clamp: 4; } \ No newline at end of file diff --git a/src/scss/_vars.scss b/src/scss/_vars.scss index 3a0de35f4a..8fd9018e44 100644 --- a/src/scss/_vars.scss +++ b/src/scss/_vars.scss @@ -16,9 +16,9 @@ --color-shape-secondary-inversion: #292929; --color-shape-tertiary: #f2f2f2; - --color-shape-highlight-dark: rgba(79, 79, 79, 0.16); - --color-shape-highlight-medium: rgba(79, 79, 79, 0.08); - --color-shape-highlight-light: rgba(79, 79, 79, 0.04); + --color-shape-highlight-dark: rgba(0, 0, 0, 0.11); + --color-shape-highlight-medium: rgba(0, 0, 0, 0.05); + --color-shape-highlight-light: rgba(0, 0, 0, 0.03); --color-shape-highlight-add: rgba(93,212,0,0.2); --color-shape-highlight-change: rgba(42,167,238,0.2); @@ -29,7 +29,7 @@ --color-control-accent: #252525; --color-control-active: #b6b6b6; --color-control-active-inversion: #737373; - --color-control-inactive: #ebebeb; + --color-control-inactive: #dcdcdc; --color-control-bg: #fff; /* Background */ @@ -44,8 +44,8 @@ --color-system-accent-100: #ffb522; --color-system-accent-50: #ffd15b; --color-system-accent-25: #ffee94; - --color-system-selection: rgba(24, 163, 241, 0.15); - --color-system-drop-zone: rgba(255, 187, 44, 0.25); + --color-system-selection: rgba(42, 167, 238, 0.10); + --color-system-drop-zone: rgba(255, 181, 34, 0.25); /* Color */ @@ -58,7 +58,6 @@ --color-ice: #2aa7ee; --color-teal: #0fc8ba; --color-lime: #5dd400; - --color-green: #57c600; /* Font */ diff --git a/src/scss/block/chat/attachment.scss b/src/scss/block/chat/attachment.scss index f9dbb56f05..8f453d7b70 100644 --- a/src/scss/block/chat/attachment.scss +++ b/src/scss/block/chat/attachment.scss @@ -56,21 +56,11 @@ video { width: 100%; display: block; object-fit: cover; } } - .attachment.isAudio { min-width: calc(532px / 2); } + .attachment.isAudio { min-width: unset; } .attachment.isAudio { - .mediaAudio { padding: 12px 16px; } + .mediaAudio { padding: 12px 16px; border: unset; } .mediaAudio { - .controls { display: flex; align-items: center; gap: 0px 8px; } - .controls { - .icon { flex-shrink: 0; } - .icon.play { margin: 0px; } - .icon.volume { margin: 0px; } - - .name { display: none; } - .time { position: static; flex-shrink: 0; } - #time { margin: 0px; } - #volume { opacity: 1; flex-shrink: 0; } - } + #volume { bottom: 40px; right: 16px; } } } diff --git a/src/scss/block/chat/form.scss b/src/scss/block/chat/form.scss index 1d6d357561..0bba05e831 100644 --- a/src/scss/block/chat/form.scss +++ b/src/scss/block/chat/form.scss @@ -15,7 +15,7 @@ background: var(--color-shape-tertiary); } .head { - .side.left { flex-grow: 1; display: flex; align-items: center; gap: 0px 8px; } + .side.left { flex-grow: 1; display: flex; align-items: center; gap: 0px 8px; overflow: hidden; } .side.left { .icon, .iconObject { flex-shrink: 0; width: 32px; height: 32px; } diff --git a/src/scss/block/cover.scss b/src/scss/block/cover.scss index 4e59526bab..3e4d1e8a88 100644 --- a/src/scss/block/cover.scss +++ b/src/scss/block/cover.scss @@ -48,7 +48,7 @@ .dragWrap { width: 160px; position: absolute; left: 50%; top: 8px; margin-left: -80px; display: flex; z-index: 1; } .dragWrap { - .input-drag { width: 96px; } + .input-drag-horizontal { width: 96px; } .number { width: calc(100% - 106px); white-space: nowrap; } } diff --git a/src/scss/block/dataview/view/board.scss b/src/scss/block/dataview/view/board.scss index bdb75dc2ac..fd11bffa35 100644 --- a/src/scss/block/dataview/view/board.scss +++ b/src/scss/block/dataview/view/board.scss @@ -3,19 +3,19 @@ .blocks { .block.blockDataview { .viewContent.viewBoard { padding: 0px 0px 80px 0px; } - .viewContent.viewBoard { + .viewContent.viewBoard { - .columns { display: flex; flex-direction: row; gap: 0px 8px; position: relative; } - .column { width: 262px; flex-shrink: 0; display: flex; flex-direction: column; position: relative; } + .columns { display: flex; flex-direction: row; gap: 0px 8px; position: relative; } + .column { width: 262px; flex-shrink: 0; display: flex; flex-direction: column; position: relative; } .column.isOver::before { content: ""; position: absolute; background: var(--color-system-accent-100); width: 2px; height: 100%; border-radius: 2px; top: 0px; } .column.isOver.left::before { left: -5px; } .column.isOver.right::before { right: -5px; } - .column { + .column { .bgColor { position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; opacity: 0.5; } - .head { cursor: grab; color: var(--color-text-secondary); width: 100%; position: relative; padding: 8px 16px 0px 16px; } + .head { cursor: grab; color: var(--color-text-secondary); width: 100%; position: relative; padding: 8px 16px 0px 16px; } .head * { cursor: grab; } .head { .sides { display: flex; width: 100%; gap: 0px 6px; line-height: 24px; position: relative; z-index: 1; } @@ -55,7 +55,7 @@ } .loadMore { margin-bottom: 8px; position: relative; z-index: 1; } - } + } .column:hover, .column.active { .head .side.right .icon { opacity: 1; } } @@ -71,7 +71,7 @@ .card { display: none; } } - .card { width: 246px; display: flex; flex-direction: column; margin: 0px auto 8px auto; position: relative; z-index: 1; cursor: default; } + .card { width: 246px; display: flex; flex-direction: column; margin: 0px auto 8px auto; position: relative; z-index: 1; cursor: default; } .card { .cardContent { border: 1px solid var(--color-shape-highlight-medium); border-radius: 8px; background: var(--color-bg-primary); transition: border-color $transitionCommon; @@ -107,24 +107,24 @@ .cardContent { opacity: 0.3; } } - .card.add { + .card.add { min-height: unset; text-align: center; padding: 10px 0px; margin: 0px auto; line-height: 1; transition: $transitionAllCommon; border: 1px solid var(--color-shape-tertiary); border-radius: 8px; flex-direction: row; justify-content: center; background: var(--color-bg-primary); } .card.add.first { margin: 0px; } - .card.add { - .icon { background-image: url('~img/icon/plus/column0.svg'); vertical-align: top; } - } - .card.add:hover { - .icon { background-image: url('~img/icon/plus/column1.svg'); } - } + .card.add { + .icon { background-image: url('~img/icon/plus/column0.svg'); vertical-align: top; } + } + .card.add:hover { + .icon { background-image: url('~img/icon/plus/column1.svg'); } + } .card.add.isOver.bottom::before { top: -6px; } .card.isEditing { .cardContent { border: 2px solid var(--color-system-accent-100); } } - } - } + } + } } html.platformLinux { diff --git a/src/scss/block/dataview/view/common.scss b/src/scss/block/dataview/view/common.scss index 9563a14cb4..1154ad874c 100644 --- a/src/scss/block/dataview/view/common.scss +++ b/src/scss/block/dataview/view/common.scss @@ -37,7 +37,16 @@ video { width: 100%; height: 100%; object-fit: cover; } } - .mediaAudio { padding: 8px 16px; } + .mediaAudio { padding: 8px 16px; border: unset; } + .mediaAudio { + .controlsWrapper { + .name { display: none; } + + .controls { + #volume { right: 16px; } + } + } + } } .cover.canEdit { .inner { background: none; } diff --git a/src/scss/block/dataview/view/graph.scss b/src/scss/block/dataview/view/graph.scss index c72ed2f1bd..72a21161fd 100644 --- a/src/scss/block/dataview/view/graph.scss +++ b/src/scss/block/dataview/view/graph.scss @@ -10,7 +10,7 @@ canvas { width: 100%; height: 100%; background: var(--color-bg-primary); display: block; } canvas.move { cursor: move; } } - } + } .block.blockDataview.isInline { .viewContent.viewGraph { height: 500px; } diff --git a/src/scss/block/dataview/view/grid.scss b/src/scss/block/dataview/view/grid.scss index 16d2190af1..99ff5807b5 100644 --- a/src/scss/block/dataview/view/grid.scss +++ b/src/scss/block/dataview/view/grid.scss @@ -2,7 +2,20 @@ .blocks { .block.blockDataview { - .cellHead { + .rowHead, .rowFoot, #rowHeadClone { display: grid; white-space: nowrap; height: 36px; } + + .rowHead, .rowFoot { width: calc(100% - 4px); margin-left: 2px; } + .rowHead.fixed { opacity: 0; visibility: hidden; pointer-events: none; } + + .rowFoot { box-shadow: 0px 1px var(--color-shape-secondary) inset; margin-top: -2px; height: 48px; } + + #rowHeadClone { position: fixed !important; background: var(--color-bg-primary); z-index: 1; } + #rowHeadClone::after { content: ''; height: 1px; width: 100%; background: var(--color-shape-secondary); position: absolute; bottom: -1px; } + #rowHeadClone { + .rowHead { margin: 0px; width: 100%; } + } + + .cellHead, .cellFoot { @include text-small; text-align: left; color: var(--color-text-secondary); font-weight: 400; line-height: 20px; position: relative; height: 38px; display: inline-block; vertical-align: top; transition: background-color $transitionCommon; } @@ -11,9 +24,9 @@ .cellContent { cursor: grab; } } - .cellHead { + .cellHead, .cellFoot { .cellContent { height: 36px !important; overflow: visible !important; } - .flex { padding: 9px 14px; gap: 0px 6px; align-items: center; } + .flex { padding: 9px 14px; gap: 0px 6px; align-items: center; height: 100%; } .iconObject { width: 20px; height: 20px; margin: 0px; vertical-align: top; flex-shrink: 0; display: none; } .icon.lock { flex-shrink: 0; } @@ -24,6 +37,7 @@ .resize { width: 20px; height: calc(100% - 2px); position: absolute; right: 0px; top: 1px; cursor: col-resize; z-index: 10; } } + .cellHead.small { text-align: center; } .cellHead.small { .flex { display: inline-block; } @@ -31,11 +45,23 @@ .name { display: none; } .icon.lock { display: none; } } - .cellHead.last { overflow: visible; padding: 9px 14px; cursor: default; } + + .cellHead.last, .cellFoot.last { overflow: visible; padding: 9px 14px; cursor: default; } .cellHead.last { .icon.plus { margin: 0px; } } + .cellFoot { height: 48px; @include text-common; color: var(--color-text-primary); } + .cellFoot { + .flex { justify-content: flex-end; } + .result { display: flex; flex-direction: row; align-items: center; gap: 0px 2px; max-width: 100%; } + .name { width: auto !important; color: var(--color-text-secondary); } + .cellContent { height: 48px !important; } + + .select { border: 0px; padding-left: 0px; padding-top: 0px; padding-bottom: 0px; opacity: 0; pointer-events: none; } + .select:hover { background: none; } + } + .cellHead.isDragging { border: 0px; height: 38px; } .cellHead.isDragging::after { content: ""; display: block; width: 100%; height: 100%; position: absolute; left: 0px; top: 0px; z-index: 0; pointer-events: none; @@ -45,29 +71,37 @@ .resize { display: none; } } - .cellHead.cellKeyHover::after, .cellHead.active::after { + .cellHead.cellKeyHover::after, + .cellHead.hover::after, + .cellFoot.cellKeyHover::after, + .cellFoot.hover::after + { content: ""; display: block; width: 100%; height: 100%; position: absolute; left: 0px; top: 0px; z-index: 0; pointer-events: none; background-color: var(--color-shape-highlight-light); } - .cellHead.last::after, .cellHead.active::after { background: none; } - .cellHead.last:hover, .cellHead.last.active { + .cellFoot.cellKeyHover, .cellFoot.hover { + .select { opacity: 1; pointer-events: all; } + } + + .cellFoot.cellKeyHover::after, .cellFoot.hover::after { height: calc(100% - 1px); } + + .cellHead.last::after, .cellHead.hover::after { background: none; } + .cellHead.last:hover, .cellHead.last.hover { .icon.plus { background-image: url('~img/icon/plus/menu1.svg'); } } - .viewContent.viewGrid { width: 100%; position: relative; padding: 0px 0px 80px 0px; } + .viewContent.viewGrid { width: 100%; position: relative; padding: 0px 0px 80px 0px; } .viewContent.viewGrid { - .rowHead { display: grid; white-space: nowrap; width: calc(100% - 4px); margin-left: 2px; height: 36px; } - .loadMore { padding: 10px 2px; box-shadow: 0px 1px var(--color-shape-secondary) inset; } .icon.checkbox { vertical-align: top; } .icon.edit { width: 36px; height: 48px; position: absolute; right: 0px; top: 0px; } .row { white-space: nowrap; box-shadow: 0px 1px var(--color-shape-secondary) inset; margin-left: 2px !important; width: calc(100% - 4px); height: 48px; } - .row.add { margin-top: -2px; } .row.isArchived *, .row.isDeleted * { text-decoration: line-through; color: var(--color-control-active); } .row:hover { background-color: var(--color-shape-highlight-light); } + .row.add { margin-top: -2px; } .row > .selectionTarget, .row > .dropTarget > .selectionTarget { display: grid; } @@ -143,7 +177,7 @@ .dropTarget.isOver.top::before { top: -1px; } .dropTarget.isOver.bottom::before { bottom: -1px; } } - } + } .block.blockDataview.isInline { .viewContent.viewGrid { padding: 0px; } diff --git a/src/scss/block/featured.scss b/src/scss/block/featured.scss index 128c53b355..5e58a3f49c 100644 --- a/src/scss/block/featured.scss +++ b/src/scss/block/featured.scss @@ -8,11 +8,10 @@ .icon.checkbox { width: 20px; height: 20px; vertical-align: middle; margin-top: -4px; background-image: url('~img/icon/dataview/checkbox0.svg'); } .icon.checkbox.active { background-image: url('~img/icon/dataview/checkbox1.svg'); } - .wrap { white-space: normal; } + .wrap { display: flex; flex-direction: row; align-items: center; gap: 0px 2px; flex-wrap: wrap; } + .bullet { width: 4px; height: 4px; border-radius: 50%; background: var(--color-text-secondary); } - .bullet { width: 4px; height: 4px; border-radius: 100%; background: var(--color-text-secondary); display: inline-block; vertical-align: middle; margin: 0px 2px; } - - .cell { white-space: nowrap; display: inline-block } + .cell { white-space: nowrap; display: inline-flex; flex-direction: row; align-items: center; gap: 0px 2px; } .cell.canEdit { .cellContent { .empty { display: inline; } @@ -20,58 +19,40 @@ } .cell:last-child .bullet { display: none; } - .cellContent { display: inline-block; border-radius: 4px; vertical-align: top; padding: 0px 6px; transition: background $transitionCommon; cursor: default; } + .cellContent { display: inline-block; border-radius: 4px; vertical-align: top; padding: 0px 6px; transition: background $transitionCommon; cursor: default !important; } .cellContent.disabled { opacity: 1; } .cellContent:not(.disabled):hover, .cellContent:not(.disabled).hover { background: var(--color-shape-highlight-medium); } - .cellContent > .wrap { display: inline; } - .cellContent.isName .name { display: inline; } .cellContent { - .over { display: inline; } - - .element { margin: -1px 6px 0px 0px; vertical-align: top; line-height: inherit; background: none !important; display: inline; } - .element:last-child { margin-right: 0px; } - - .iconObject { display: none; } + .element { line-height: inherit; background: none !important; cursor: default !important; } + .iconObject { display: none; margin: 0px; } .name { vertical-align: baseline; line-height: inherit; display: inline; word-break: break-word; white-space: normal; } .empty { vertical-align: top; } - .flex { display: inline; } + .flex { display: inline-flex; flex-direction: row; align-items: center; } - .more { vertical-align: middle; margin-top: -2px; @include text-common; line-height: 18px; } + .more { @include text-common; line-height: 18px; } .label { display: inline; vertical-align: middle; } } .cellContent.c-select { - .over { display: inline; } - .tagItem { margin: -1px 6px 0px 0px; vertical-align: middle; max-width: 400px; } - .tagItem:last-child { margin-right: 0px; } - .tagItem.isStatus { line-height: 16px; } + .over { display: flex; flex-direction: row; align-items: center; flex-wrap: wrap; gap: 0px 6px; } + .tagItem { margin: 0px; max-width: 400px; } } .cellContent.c-file { - .wrap { white-space: nowrap; } - - .element { margin-right: 2px; } - .element:last-child { margin-right: 0px; } - .iconObject { display: inline; margin: 0px; } - .iconObject * { position: static; vertical-align: middle; margin: 0px; } + .over { display: flex; flex-direction: row; align-items: center; gap: 0px 2px; height: 28px; } + .element { flex-shrink: 0; display: flex; } + .iconObject { display: block; } .name { display: none; } .empty { padding: 0px 4px; } - .more { margin-left: 2px; } - } - - .cellContent.c-object, .cellContent.c-file { - .element { cursor: default; } } .cellContent.c-object { - .iconObject { display: inline-block; vertical-align: middle; margin: -1px 6px 0px 0px !important; } + .iconObject { flex-shrink: 0; margin: 0px 6px 0px 0px !important; } } - .cellContent.c-checkbox { - .icon { margin: 0px 4px 0px 0px; } - } + .cellContent.c-checkbox { display: flex; flex-direction: row; align-items: center; height: 28px; gap: 0px 4px; } .cellContent.c-longText { .name { display: inline-block; vertical-align: top; max-width: 220px; @include text-overflow-nw; } @@ -83,6 +64,14 @@ > .wrapContent > .selectionTarget > .dropTarget { margin-left: -6px; } } + .block.blockFeatured.align1 { + .wrap { justify-content: center; } + } + + .block.blockFeatured.align2 { + .wrap { justify-content: flex-end; } + } + .block.blockFeatured.small { @include text-common; padding: 0px; margin: 0px; line-height: 22px; } .block.blockFeatured.small { .cellContent { padding: 2.5px 6px; } @@ -92,4 +81,4 @@ .editorWrapper.noSystemBlocks { .blocks .block.blockFeatured { display: none; } -} +} \ No newline at end of file diff --git a/src/scss/block/link.scss b/src/scss/block/link.scss index f17f11f844..61da021232 100644 --- a/src/scss/block/link.scss +++ b/src/scss/block/link.scss @@ -6,24 +6,24 @@ .isArchived { .cardName { color: var(--color-control-active); } - .cardName span::before { display: none; } + .cardName span::before { display: none; } } - .loading, .deleted { color: var(--color-control-active); display: flex; gap: 0px 6px; align-items: center; } - .loading, .deleted { - .name { display: inline-block; vertical-align: top; max-width: calc(100% - 26px); position: relative; @include text-overflow-nw; } - } + .loading, .deleted { color: var(--color-control-active); display: flex; gap: 0px 6px; align-items: center; } + .loading, .deleted { + .name { display: inline-block; vertical-align: top; max-width: calc(100% - 26px); position: relative; @include text-overflow-nw; } + } .loading { .loaderWrapper { width: 20px; height: 20px; display: inline-block; vertical-align: top; position: relative; margin: 0px; } .loader { width: 20px; height: 20px; margin: -10px 0px 0px -10px; } } - .deleted { - .icon.ghost { width: 24px; height: 24px; } - } + .deleted { + .icon.ghost { width: 24px; height: 24px; } + } - .linkCard { - .sides { display: flex; flex-direction: row; } + .linkCard { + .sides { display: flex; flex-direction: row; } .side { transition: border-color $transitionCommon; } .side.left { width: 100%; position: relative; display: flex; } .side.right { display: none; overflow: hidden; } @@ -53,7 +53,7 @@ .item:last-child { margin: 0px; } .item:last-child::after { display: none; } } - } + } .linkCard.c18.withIcon { .cardName { position: relative; } diff --git a/src/scss/block/media.scss b/src/scss/block/media.scss index f97b2a9528..3570fb1577 100644 --- a/src/scss/block/media.scss +++ b/src/scss/block/media.scss @@ -13,8 +13,8 @@ .deleted { @include text-paragraph; color: var(--color-control-active); display: flex; gap: 0px 6px; align-items: center; } .deleted { - .icon.ghost { width: 24px; height: 24px; } - } + .icon.ghost { width: 24px; height: 24px; } + } .icon.resize, .icon.download { position: absolute; z-index: 1; opacity: 0; cursor: default; transition: $transitionAllCommon; } .icon.resize { width: 20px; height: 20px; right: 0px; bottom: 0px; cursor: nwse-resize; background-image: url('~img/icon/resize.svg'); } @@ -68,13 +68,13 @@ } } - .block.blockMedia > .wrapContent { border-radius: 8px; } + .block.blockMedia > .wrapContent { border-radius: 8px; box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.05); } .block.blockMedia > .wrapContent > .selectionTarget > .dropTarget { line-height: 0px; } .block.blockMedia.isReadonly { .icon.resize { display: none; } } - + .block.blockMedia:hover { .icon.resize { opacity: 1; } .icon.download { opacity: 1; } @@ -94,8 +94,8 @@ .icon.play { display: none; } } - .block.blockMedia.isAudio.withContent > .wrapContent { background-color: var(--color-shape-tertiary); } - .block.blockMedia.isAudio > .wrapContent > .selectionTarget > .dropTarget > .focusable > .wrap { width: 100%; padding: 16px; border-radius: 8px; overflow: hidden; } + .block.blockMedia.isAudio.withContent > .wrapContent {box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.05); background-color: var(--color-bg-primary); } + .block.blockMedia.isAudio > .wrapContent > .selectionTarget > .dropTarget > .focusable > .wrap { width: 100%; padding: 12px 12px 7px 14px; border-radius: 8px; overflow: unset; } .block.blockMedia > .wrapContent > .selectionTarget.isSelectionSelected::after { left: 0px; width: 100%; border-radius: 8px; } .block.blockMedia.isPdf.withContent > .wrapContent > .selectionTarget.isSelectionSelected::after { border-radius: 0px; } diff --git a/src/scss/common.scss b/src/scss/common.scss index 9a9dd75815..cd4f1a3424 100644 --- a/src/scss/common.scss +++ b/src/scss/common.scss @@ -33,6 +33,7 @@ select:-webkit-autofill:hover, select:-webkit-autofill:focus { transition: background-color 5000s ease-in-out 0s; } input, textarea, select { font-family: 'Inter'; } + #drag { -webkit-app-region: drag; position: fixed; top: 0px; left: 0px; width: 100%; height: 52px; z-index: -1; user-select: none; pointer-events: all; } #root-loader { position: fixed; width: 100%; height: 100%; left: 0px; top: 0px; background: #060606; z-index: 1000; transition: opacity 0.3s ease-in-out; } #root-loader { @@ -106,6 +107,7 @@ html.platformWindows, html.platformLinux { ::-webkit-input-placeholder { color: var(--color-text-tertiary) !important; } .isBlurred { filter: blur(7px); } .animationWord { display: inline-block; } +.isRtl { direction: rtl; text-align: right; } .fileWrap { position: relative; overflow: hidden; } .fileWrap { diff --git a/src/scss/component/common.scss b/src/scss/component/common.scss index 0f179ea555..4503327dac 100644 --- a/src/scss/component/common.scss +++ b/src/scss/component/common.scss @@ -6,6 +6,7 @@ @import "./editor"; @import "./emptySearch"; @import "./error"; +@import "./floater"; @import "./footer"; @import "./frame"; @import "./header"; @@ -29,4 +30,6 @@ @import "./share"; @import "./preview/common"; -@import "./media/common"; \ No newline at end of file +@import "./media/common"; + +@import "./emailCollectionForm"; diff --git a/src/scss/component/editor.scss b/src/scss/component/editor.scss index 08b5d3afd6..bafeb09294 100644 --- a/src/scss/component/editor.scss +++ b/src/scss/component/editor.scss @@ -29,6 +29,14 @@ #editorSize { position: absolute; width: 400px; top: 48px; left: 50%; margin-left: -200px; z-index: 10; visibility: hidden; } .dragEmpty { height: 40px; transition: $transitionAllCommon; } + .dragWrap { + .number { color: var(--color-bg-primary); } + .input-drag-horizontal { + .back { background: rgba(255,255,255,0.5); } + .fill { background: var(--color-bg-primary); } + .icon { border-color: var(--color-bg-primary); } + } + } } .editorControls { width: 100%; height: 72px; margin: 0px auto; z-index: 1; position: relative; line-height: 16px; opacity: 0; } @@ -144,29 +152,22 @@ /* Human */ -.editorWrapper.isHuman.withIcon, -.editorWrapper.isParticipant.withIcon -{ - .blocks { margin-top: -94px; } - .editorControls { height: 164px; } -} - -.editorWrapper.isHuman.withIcon, -.editorWrapper.isHuman.withIconAndCover, -.editorWrapper.isParticipant.withIcon, -.editorWrapper.isParticipant.withIconAndCover -{ - .controlButtons { left: 144px !important; } -} +.editorWrapper.isHuman, +.editorWrapper.isParticipant { + &.withIcon { + .blocks { margin-top: -94px; } + .editorControls { height: 164px; } + } -.editorWrapper.isHuman.withIconAndCover, -.editorWrapper.isParticipant.withIconAndCover -{ padding-top: 214px; } + &.withIcon, + &.withIconAndCover { + .controlButtons { left: 144px !important; } + } -.editorWrapper.isHuman.withIconAndCover, -.editorWrapper.isParticipant.withIconAndCover -{ - .controlButtons { bottom: 26px; } + &.withIconAndCover { padding-top: 214px; } + &.withIconAndCover { + .controlButtons { bottom: 26px; } + } } .editorWrapper.align1, @@ -208,8 +209,10 @@ } } -.editorWrapper.isChat.withIcon { - .controlButtons { left: 0px; } +.editorWrapper.isChat { + &.withIcon { + .controlButtons { left: 0px; } + } } /* Set, Collection, Date */ @@ -237,35 +240,32 @@ } } -.editorWrapper.isSet.withIcon, -.editorWrapper.isCollection.withIcon { - .controlButtons { left: 14px; } -} - -.editorWrapper.isSet.withIconAndCover, -.editorWrapper.isCollection.withIconAndCover, -.editorWrapper.isChat.withIconAndCover { padding-top: 356px; } +.editorWrapper.isSet, +.editorWrapper.isCollection { + &.withIcon { + .controlButtons { left: 14px; } + } -.editorWrapper.isSet.withIconAndCover, -.editorWrapper.isCollection.withIconAndCover, -.editorWrapper.isChat.withIconAndCover { - .controlButtons { left: 0px !important; } -} + &.withIcon, + &.withIconAndCover { + .headSimple { + .side.left { width: 96px; } + .side.center { width: calc(100% - 128px); } + } + #button-icon { display: none; } + } -.editorWrapper.isSet.withIcon, -.editorWrapper.isSet.withIconAndCover, -.editorWrapper.isCollection.withIcon, -.editorWrapper.isCollection.withIconAndCover { - .headSimple { - .side.left { width: 96px; } - .side.center { width: calc(100% - 128px); } + &.withCover, + &.withIconAndCover { + .editorControls { display: none; } } - #button-icon { display: none; } } -.editorWrapper.isSet.withCover, -.editorWrapper.isSet.withIconAndCover, -.editorWrapper.isCollection.withCover, -.editorWrapper.isCollection.withIconAndCover { - .editorControls { display: none; } +.editorWrapper.isSet, +.editorWrapper.isCollection, +.editorWrapper.isChat { + &.withIconAndCover { padding-top: 356px; } + &.withIconAndCover { + .controlButtons { left: 0px !important; } + } } \ No newline at end of file diff --git a/src/scss/component/emailCollectionForm.scss b/src/scss/component/emailCollectionForm.scss new file mode 100644 index 0000000000..80bfdbbd69 --- /dev/null +++ b/src/scss/component/emailCollectionForm.scss @@ -0,0 +1,43 @@ +@import "~scss/_mixins"; + +.emailCollectionForm { display: flex; flex-direction: column; } +.emailCollectionForm { + .statusBar { @include text-small; min-height: 18px; margin: 0px 0px 2px; padding-top: 4px; color: var(--color-text-secondary); } + .statusBar.error { color: var(--color-red); } + + .buttonWrapper { padding-top: 8px; } + .buttonWrapper { + .button { width: 100%; overflow: hidden; } + .loaderWrapper { border-radius: 0px !important; } + } + + .inputWrapper { + .input { border-color: var(--color-shape-primary) !important; } + } + + .step0 { padding-top: 16px; } + .step0 { + .check { @include text-small; } + .inputWrapper { padding-top: 16px; } + .inputWrapper { + .input { border-radius: 3px; height: 36px; } + } + } + + .step1 { padding-top: 16px; text-align: center; } + .step1 { + .pin { margin-bottom: 12px; } + .pin { + .input { @include text-header1; width: 35px; height: 47px; border-radius: 6px; border-color: var(--color-shape-primary); } + } + + .resend { font-weight: 500; color: var(--color-text-secondary); @include text-small; } + .resend.countdown { color: var(--color-text-primary); } + .resend:not(.countdown):hover { color: var(--color-control-active); } + } + + .step2 { padding-top: 8px; } + .step2 { + .icon { width: 100%; height: 138px; background: url('~img/icon/payment/green.svg') 50% 50% no-repeat; background-size: 80px; } + } +} diff --git a/src/scss/component/floater.scss b/src/scss/component/floater.scss new file mode 100644 index 0000000000..b6993ae5bf --- /dev/null +++ b/src/scss/component/floater.scss @@ -0,0 +1,2 @@ +.floater { position: absolute; pointer-events: none; z-index: 200; transition: opacity 0.2s ease-in-out; opacity: 0; } +.floater.show { opacity: 1; pointer-events: auto; } \ No newline at end of file diff --git a/src/scss/component/footer.scss b/src/scss/component/footer.scss index 3253525e71..31ee6f1775 100644 --- a/src/scss/component/footer.scss +++ b/src/scss/component/footer.scss @@ -13,7 +13,9 @@ a { text-decoration: none; color: unset; } } - .iconWrap { width: 36px; height: 36px; position: relative; z-index: 10; position: absolute; bottom: 14px; } + .buttons { z-index: 10; position: absolute; bottom: 14px; right: 14px; display: flex; flex-direction: row; gap: 0px 8px; align-items: center; } + + .iconWrap { width: 36px; height: 36px; position: relative; } .iconWrap { .bg { background-color: var(--color-bg-primary); border: 1px solid var(--color-shape-secondary); border-radius: 50%; width: 100%; height: 100%; @@ -23,10 +25,17 @@ } .iconWrap:hover .bg { transform: scale(0.95); } - #button-help { right: 14px; } #button-help { .icon { background-image: url('~img/icon/footer/help.svg'); } } + + #button-progress { + .inner { + position: absolute; left: 3px; top: 3px; width: calc(100% - 6px); height: calc(100% - 6px); background-color: var(--color-bg-primary); + z-index: 1; border-radius: 50%; @include text-small; font-weight: 500; color: var(--color-text-secondary); display: flex; text-align: center; + align-items: center; justify-content: center; + } + } } .footer.mainGraph { display: block !important; position: absolute; } \ No newline at end of file diff --git a/src/scss/component/iconObject.scss b/src/scss/component/iconObject.scss index 4f46f3a8e3..5e7f852293 100644 --- a/src/scss/component/iconObject.scss +++ b/src/scss/component/iconObject.scss @@ -127,13 +127,4 @@ .iconObject.withImage { background-color: unset !important; } -.iconObject.isHuman, .iconObject.isParticipant { border-radius: 100% !important; background-color: unset; } - -.iconObject.isSpaceView { border-radius: 2px !important; } -.iconObject.isSpaceView.c64, -.iconObject.isSpaceView.c80, -.iconObject.isSpaceView.c96, -.iconObject.isSpaceView.c108, -.iconObject.isSpaceView.c112, -.iconObject.isSpaceView.c128, -.iconObject.isSpaceView.c160 { border-radius: 4px !important; } \ No newline at end of file +.iconObject.isHuman, .iconObject.isParticipant { border-radius: 100% !important; background-color: unset; } \ No newline at end of file diff --git a/src/scss/component/media/audio.scss b/src/scss/component/media/audio.scss index 9285972694..66851e69ea 100644 --- a/src/scss/component/media/audio.scss +++ b/src/scss/component/media/audio.scss @@ -1,41 +1,45 @@ @import "~scss/_mixins"; -.mediaAudio { width: 100%; } +.mediaAudio { width: 100%; border: 1px solid var(--color-shape-secondary); container-type: inline-size; container-name: media-audio; } .mediaAudio { - .controls { width: 100%; min-width: 160px; position: relative; text-align: left; color: var(--color-text-primary); } - .controls { - .input-drag { - .icon { cursor: default; } - } - - .name { - @include text-common; display: inline-block; vertical-align: top; - line-height: 20px; width: calc(100% - 26px); - } + .controlsWrapper { width: 100%; position: relative; text-align: left; color: var(--color-text-primary); } + .controlsWrapper { + .name { @include text-common; display: inline-block; vertical-align: top; line-height: 20px; padding-bottom: 3px; } .name span { display: inline-block; min-width: 100%; height: 100%; @include clamp1; } - .icon { vertical-align: top; transition: none; } - .icon.play { - width: 20px; height: 20px; margin-right: 6px; background-image: url('~img/icon/audio/play.svg'); margin-left: -4px; - } - .icon.play.active { background-image: url('~img/icon/audio/pause.svg'); } - .icon.volume { width: 20px; height: 20px; margin-right: 6px; background-image: url('~img/icon/audio/volume.svg'); margin-left: -2px; } - .icon.volume.active { background-image: url('~img/icon/audio/mute.svg'); } + .controls { display: flex; align-items: center; column-gap: 10px; } - .time { @include text-small; text-align: right; line-height: 20px; position: absolute; right: 0px; bottom: 0px; } + @container media-audio (max-width: 208px) { .controls { column-gap: 5px; }} - .input-drag { display: inline-block; vertical-align: top; height: 20px; } - .input-drag { - .icon { width: 6px; height: 6px; border: 0px; background: none; } - .bullet { width: 6px; height: 6px; border-radius: 100%; background: var(--color-system-accent-100); } - .fill { background: var(--color-system-accent-100); } - .back { background: var(--color-shape-highlight-medium); } - } + .controls { + div { flex: 0 1 auto; } + + .timeDragWrapper { flex: 1 0 auto; } + + .icon { vertical-align: top; transition: none; } + .icon.play { width: 20px; height: 20px; min-width: 20px; min-height: 20px; background-image: url('~img/icon/audio/play.svg'); } + .icon.play.active { background-image: url('~img/icon/audio/pause.svg'); } + + .input-drag-horizontal .icon { cursor: default; } + + .icon.volume { width: 20px; height: 20px; min-width: 20px; min-height: 20px; background-image: url('~img/icon/audio/volume.svg'); } + .icon.volume.muted { background-image: url('~img/icon/audio/mute.svg'); } + .time { @include text-small; text-wrap: nowrap; width: 36px; text-align: center; } + @container media-audio (max-width: 208px) { .time { display: none; }} + + .input-drag-horizontal { display: inline-block; vertical-align: top; height: 20px; } + .input-drag-horizontal { + .icon { width: 6px; height: 6px; border: 0px; background: none; } + .bullet { width: 12px; height: 12px; border-radius: 6px; background: var(--color-control-accent); } + .fill { height: 4px; background: var(--color-control-accent); transform: translateY(-50%); margin-top: 0px; } + .back { width: 100%; height: 4px; background: var(--color-shape-secondary); transform: translateY(-50%); margin-top: 0px; } + } + + } + #time { margin: 6px 0px; width: 100%; display: block; } - #volume { width: 40px; opacity: 0; transition: opacity $transitionCommon; } + } - .controls:hover { - #volume { opacity: 1; } - } -} \ No newline at end of file +} + diff --git a/src/scss/component/progress.scss b/src/scss/component/progress.scss index 354ba6a526..548ffe9ede 100644 --- a/src/scss/component/progress.scss +++ b/src/scss/component/progress.scss @@ -1,32 +1,52 @@ @import "~scss/_mixins"; -.progress { - position: fixed; left: 0px; top: 0px; z-index: 110; width: 100%; height: 100%; background: rgba(0,0,0,0.4); - transition: background 0.05s ease-in-out; user-select: none; -} - -.progress.isUnlocked { background: none; pointer-events: none; } -.progress.isUnlocked { - .inner { top: auto; left: 10px; top: 40px; margin: 0px; } -} +.progress { position: fixed; left: 0px; top: 0px; z-index: 110; width: 100%; height: 100%; pointer-events: none; user-select: none; } .progress { .inner { - position: absolute; left: 50%; top: 50%; box-shadow: 0px 6px 24px rgba(0, 0, 0, 0.2); height: 72px; width: 384px; cursor: grab; - border-radius: 12px; text-align: center; background: var(--color-bg-primary); overflow: hidden; margin: -36px 0px 0px -192px; padding: 12px 16px; - transition-property: opacity, transform; transition-duration: 0.05s; transition-timing-function: ease-in-out; pointer-events: all; + position: absolute; box-shadow: 0px 6px 24px rgba(0, 0, 0, 0.2); cursor: grab; width: 288px; border-radius: 12px; text-align: center; + background: var(--color-bg-primary); overflow: hidden; transition-property: opacity, transform; transition-duration: 0.05s; + transition-timing-function: ease-in-out; pointer-events: all; display: flex; flex-direction: column; bottom: 56px; right: 56px; + } + + .titleWrap { font-weight: 600; display: flex; gap: 0px 6px; padding: 11px 16px 3px 16px; } + .titleWrap { + .label.percent { font-weight: 400; color: var(--color-text-secondary); } } - .inner { - .label { position: absolute; left: 16px; top: 12px; z-index: 1; color: var(--color-text-primary); white-space: nowrap; @include text-paragraph; } - .bar { width: calc(100% - 32px); height: 8px; background: var(--color-shape-tertiary); overflow: hidden; border-radius: 8px; position: absolute; bottom: 16px; left: 16px; } - .fill { position: absolute; left: 0px; top: 0px; height: 100%; background: var(--color-control-accent); transition: width 0.2s linear; } + + .item { + padding: 8px 16px; position: relative; border-bottom: 1px solid var(--color-shape-secondary); gap: 4px 0px; display: flex; + flex-direction: column; + } + .item { + .nameWrap { display: flex; flex-direction: row; gap: 0px 6px; justify-content: space-between; align-items: center; } + .nameWrap { + .label { color: var(--color-text-primary); @include text-overflow-nw; @include text-common; line-height: 28px; } + .icon.close { width: 20px; height: 20px; background-image: url('~img/icon/progress/close.svg'); cursor: default; flex-shrink: 0; opacity: 0; } + } + + .bar { width: 100%; height: 4px; background: var(--color-shape-secondary); overflow: hidden; border-radius: 8px; position: relative; } + + .fill { position: absolute; left: 0px; top: 0px; height: 100%; background: var(--color-system-accent-25); transition: width 0.2s linear; } + .fill::after { + content: ''; width: 100%; height: 100%; position: absolute; left: 0px; top: 0px; + background-image: linear-gradient(90deg, rgba(0,0,0,0) 0%, var(--color-system-accent-50) 50%, rgba(0,0,0,0) 100%); + animation: animateGradient 2s linear infinite; + } + + @keyframes animateGradient { + 0% { opacity: 1; transform: translateX(-100%); } + 50% { transform: translateX(100%); } + 50.01% { opacity: 0; } + 100% { opacity: 0; } + } } - - .icon.close { - width: 24px; height: 24px; position: absolute; top: 14px; right: 14px; background-image: url('~img/icon/progress/close.svg'); - cursor: default; background-size: 20px; border-radius: 4px; + .item:hover { + .nameWrap { + .icon.close { opacity: 1; } + } } - .icon.close:hover { background-color: var(--color-shape-highlight-medium); } + .item:last-child { border-bottom: 0px; } } .progress.hide { background: rgba(0,0,0,0); } diff --git a/src/scss/component/share.scss b/src/scss/component/share.scss index 7878dce3a4..bb5965a95d 100644 --- a/src/scss/component/share.scss +++ b/src/scss/component/share.scss @@ -8,7 +8,7 @@ .shareTooltip { .icon.smile { width: 85px; height: 40px; background: url('~img/icon/share/smile.svg') } .label { @include text-common; } - .icon.close { background-color: var(--color-bg-primary); box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.20); background-image: url('~img/icon/notification/delete.svg'); } + .icon.close { background-color: var(--color-bg-primary); box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.20); background-image: url('~img/icon/notification/delete.svg'); background-size: 8px; } } .shareBanner { position: relative; border-radius: 12px; background: var(--color-bg-primary) linear-gradient(-90deg, #C5F3E5 0%, #F1FFC9 27.23%, rgba(255, 255, 255, 0.15) 54%); margin-top: 10px; } diff --git a/src/scss/component/sidebar/widget.scss b/src/scss/component/sidebar/widget.scss index f299edfff5..45f2d3ada3 100644 --- a/src/scss/component/sidebar/widget.scss +++ b/src/scss/component/sidebar/widget.scss @@ -8,13 +8,16 @@ gap: 0px 8px; overflow: hidden; } > .head { - .name { @include text-overflow-nw; opacity: 0; transform: translate3d(0px,30px,0px); transition: all 0.2s $easeInQuint; } + .name { + @include text-overflow-nw; opacity: 0; transform: translate3d(0px,30px,0px); transition: all 0.2s $easeInQuint; + max-width: calc(100% - 88px); + } } > .head.show { .name { opacity: 1; transform: translate3d(0px,0px,0px); } } - > .body { height: calc(100% - 52px); padding: 0px 6px 12px 12px; position: relative; flex-grow: 1; overflow: auto; overscroll-behavior: none; } + > .body { height: calc(100% - 52px); padding: 0px 6px 12px 12px; position: relative; flex-grow: 1; overflow: scroll; overscroll-behavior: none; } > .body { @keyframes shake1 { 0% { transform: rotate(-0.5deg); } diff --git a/src/scss/form/button.scss b/src/scss/form/button.scss index 38ee14ecd9..6f10fde155 100644 --- a/src/scss/form/button.scss +++ b/src/scss/form/button.scss @@ -4,7 +4,7 @@ display: inline-flex; border: 0px; font-weight: 500; text-decoration: none; text-align: center; height: 40px; padding: 0px 16px; border-radius: 8px; transition: $transitionAllCommon; vertical-align: middle; position: relative; overflow: hidden; align-items: center; justify-content: center; - @include text-paragraph; cursor: default; -webkit-app-region: no-drag; + @include text-common; cursor: default; -webkit-app-region: no-drag; } .button > .loaderWrapper { position: absolute; z-index: 1; width: 100%; height: 100%; } diff --git a/src/scss/form/common.scss b/src/scss/form/common.scss index b3b70f39b8..1d717c1b20 100644 --- a/src/scss/form/common.scss +++ b/src/scss/form/common.scss @@ -1,5 +1,6 @@ @import "./button"; -@import "./drag"; +@import "./drag/horizontal"; +@import "./drag/vertical"; @import "./filter"; @import "./input"; @import "./inputWithFile"; diff --git a/src/scss/form/drag.scss b/src/scss/form/drag.scss deleted file mode 100644 index 89f60567db..0000000000 --- a/src/scss/form/drag.scss +++ /dev/null @@ -1,18 +0,0 @@ -@import "~scss/_mixins"; - -.input-drag { height: 100%; position: relative; } -.input-drag { - .back { width: 100%; height: 2px; background: rgba(255,255,255,0.5); position: absolute; top: 50%; left: 0px; margin-top: -1px; } - .fill { height: 2px; background: var(--color-bg-primary); width: 0px; position: absolute; left: 0px; top: 50%; margin-top: -1px; } - .icon { - width: 12px; height: 12px; border: 2px solid var(--color-bg-primary); border-radius: 50%; position: absolute; left: 0px; top: 50%; - transform: translateY(-50%); transition: none; cursor: grab; - } - .bullet { position: absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0px); } -} - -.dragWrap { height: 24px; background: rgba(0,0,0,0.5); border-radius: 4px; padding: 0px 8px; display: flex; } -.dragWrap { - .input-drag { width: calc(100% - 38px); margin-right: 8px; } - .number { width: 38px; @include text-common; flex-shrink: 0; line-height: 24px; color: var(--color-bg-primary); font-weight: 500; text-align: right; } -} \ No newline at end of file diff --git a/src/scss/form/drag/horizontal.scss b/src/scss/form/drag/horizontal.scss new file mode 100644 index 0000000000..fee0106604 --- /dev/null +++ b/src/scss/form/drag/horizontal.scss @@ -0,0 +1,18 @@ +@import "~scss/_mixins"; + +.input-drag-horizontal { height: 100%; position: relative; } +.input-drag-horizontal { + .back { width: 100%; height: 4px; border-radius: 2px; background: var(--color-shape-secondary); position: absolute; top: 50%; left: 0px; margin-top: -2px; } + .fill { height: 4px; border-radius: 2px; background: var(--color-control-accent); width: 0px; position: absolute; left: 0px; top: 50%; margin-top: -2px; } + .icon { + width: 12px; height: 12px; border: 2px solid var(--color-control-accent); border-radius: 50%; position: absolute; left: 0px; top: 50%; + transform: translateY(-50%); transition: none; cursor: grab; + } + .bullet { position: absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0px); } +} + +.dragWrap { height: 24px; background: rgba(0,0,0,0.5); border-radius: 4px; padding: 0px 8px; display: flex; } +.dragWrap { + .input-drag-horizontal { width: calc(100% - 38px); margin-right: 8px; } + .number { width: 38px; @include text-common; flex-shrink: 0; line-height: 24px; color: var(--color-control-accent); font-weight: 500; text-align: right; } +} \ No newline at end of file diff --git a/src/scss/form/drag/vertical.scss b/src/scss/form/drag/vertical.scss new file mode 100644 index 0000000000..16a3ddf8e9 --- /dev/null +++ b/src/scss/form/drag/vertical.scss @@ -0,0 +1,14 @@ +@import "~scss/_mixins"; + +.input-drag-vertical { padding: 8px 2px; width: 20px; height: 88px; border-radius: 8px; background-color: var(--color-bg-primary); box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2); border: 1px solid var(--color-shape-secondary); } +.input-drag-vertical { + .vertical-range, + .vertical-range::-webkit-slider-runnable-track, + .vertical-range::-webkit-slider-thumb { -webkit-appearance: none; } + + .vertical-range { position: absolute; width: 14px; height: 72px; cursor: pointer; writing-mode: vertical-rl; padding: unset; cursor: auto; } + .vertical-range::-webkit-slider-runnable-track { height: 100%; width: 10px; } + .vertical-range::-webkit-slider-thumb { width: 0px; height: 0px; background: transparent; border: none; } + .slider-track { pointer-events: none; position: absolute; left: 8px; bottom: 8px; background-color: var(--color-control-accent); width: 4px; border-radius: 2px; } + .slider-bg { pointer-events: none; position: absolute; left: 8px; bottom: 8px; background-color: var(--color-shape-secondary); width: 4px; border-radius: 2px; height: 72px; } +} diff --git a/src/scss/form/phrase.scss b/src/scss/form/phrase.scss index b721c4eb39..ec48e961b0 100644 --- a/src/scss/form/phrase.scss +++ b/src/scss/form/phrase.scss @@ -21,7 +21,6 @@ .bg-blue { background: var(--color-blue) !important; } .bg-ice { background: var(--color-ice) !important; } .bg-lime { background: var(--color-lime) !important; } - .bg-green { background: var(--color-green) !important; } .placeholder { color: var(--color-text-tertiary); top: 0; display: flex; flex-direction: row; align-items: center; justify-content: center; } #entry { diff --git a/src/scss/form/select.scss b/src/scss/form/select.scss index 488626b319..9516b86dcf 100644 --- a/src/scss/form/select.scss +++ b/src/scss/form/select.scss @@ -5,7 +5,7 @@ transition: $transitionAllCommon; position: relative; font-family: 'Inter'; white-space: nowrap; padding: 3px 20px 3px 6px; line-height: 20px !important; } -.select:hover, .select.isFocused { background: var(--color-shape-tertiary); } +.select:hover, .select.hover, .select.isFocused { background: var(--color-shape-tertiary); } .select { .icon { transition: none; } diff --git a/src/scss/menu/common.scss b/src/scss/menu/common.scss index 4d8762f9f0..47d0b13fef 100644 --- a/src/scss/menu/common.scss +++ b/src/scss/menu/common.scss @@ -222,7 +222,7 @@ .section > .inputWrap { padding-bottom: 0px; } .section.noLine::after { display: none; } - .input-drag { + .input-drag-horizontal { .back { background-color: var(--color-shape-secondary); } .icon { width: 12px; height: 12px; border-color: var(--color-shape-secondary); background-color: var(--color-bg-primary); @@ -272,6 +272,7 @@ html.platformWindows { @import "./quickCapture"; @import "./syncStatus"; @import "./graph"; +@import "./participant"; @import "./search/object"; @import "./search/text"; @@ -301,4 +302,4 @@ html.platformWindows { @import "./dataview/source"; @import "./dataview/text"; @import "./dataview/view"; -@import "./dataview/template"; +@import "./dataview/template"; \ No newline at end of file diff --git a/src/scss/menu/onboarding.scss b/src/scss/menu/onboarding.scss index a65d3c8dbc..ae0ea5ccbc 100644 --- a/src/scss/menu/onboarding.scss +++ b/src/scss/menu/onboarding.scss @@ -74,6 +74,8 @@ } } + .menu.menuOnboarding.invertedColor { box-shadow: inset 0px 0px 0px 1px var(--color-control-inactive), 0px 4px 12px 0px rgba(37, 37, 37, 0.20); background-color: var(--color-bg-primary); color: var(--color-text-primary); } + .menu.menuOnboarding.isWizard { min-height: 458px; } .menu.menuOnboarding.isWizard { .bottom { position: absolute; bottom: 16px; width: calc(100% - 32px); margin: 0px; } diff --git a/src/scss/menu/participant.scss b/src/scss/menu/participant.scss new file mode 100644 index 0000000000..8237688caa --- /dev/null +++ b/src/scss/menu/participant.scss @@ -0,0 +1,16 @@ +@import "~scss/_mixins"; + +.menus { + .menu.menuParticipant { width: 312px; border-radius: 20px; } + .menu.menuParticipant { + .content { display: flex; flex-direction: column; align-items: center; padding: 24px; } + .iconObject { margin: 0px 0px 12px 0px; } + .name { @include text-header2; } + + .label { color: var(--color-text-secondary); @include text-overflow-nw; @include text-small; max-width: 100%; margin: 4px 0px 0px 0px; } + .label:empty { display: none; } + + .descr { @include clamp4; margin: 4px 0px 0px 0px; } + .descr:empty { display: none; } + } +} \ No newline at end of file diff --git a/src/scss/menu/syncStatus.scss b/src/scss/menu/syncStatus.scss index 01c6d7239f..9a54fe4a10 100644 --- a/src/scss/menu/syncStatus.scss +++ b/src/scss/menu/syncStatus.scss @@ -1,103 +1,103 @@ @import "~scss/_mixins"; @keyframes objectSyncing { - //100% {transform: rotate(1turn)} + //100% {transform: rotate(1turn)} } .menus { - .menu.menuSyncStatus { width: var(--menu-width-large); height: var(--menu-width-large); } - .menu.menuSyncStatus { - .content { padding: 0px; height: 100%; max-height: unset; } - .syncMenuWrapper { padding: 16px 0px 0px 0px; height: 100%; display: flex; flex-direction: column; } - .syncPanel { height: 28px; padding: 0px 16px; margin-bottom: 4px; display: flex; justify-content: space-between; align-items: center; } + .menu.menuSyncStatus { width: var(--menu-width-large); height: var(--menu-width-large); } + .menu.menuSyncStatus { + .content { padding: 0px; height: 100%; max-height: unset; } + .syncMenuWrapper { padding: 16px 0px 0px 0px; height: 100%; display: flex; flex-direction: column; } + .syncPanel { height: 28px; padding: 0px 16px; margin-bottom: 4px; display: flex; justify-content: space-between; align-items: center; } - .title { @include text-paragraph; font-weight: 600; padding: 0; color: var(--color-text-primary); } + .title { @include text-paragraph; font-weight: 600; padding: 0; color: var(--color-text-primary); } - .icons { display: flex; flex-direction: row; align-items: center; gap: 0px 8px; } - .icons { - .iconWrapper { display: flex; position: relative; align-items: center; justify-content: center; width: 28px; height: 28px; } + .icons { display: flex; flex-direction: row; align-items: center; gap: 0px 8px; } + .icons { + .iconWrapper { display: flex; position: relative; align-items: center; justify-content: center; width: 28px; height: 28px; } - .iconWrapper { - .iconBg { width: 100%; height: 100%; position: absolute; z-index: 0; border-radius: 50%; background: var(--color-shape-tertiary); } - .icon { width: 20px; height: 20px; } - .icon.network { background: url('~img/icon/menu/syncStatus/network/grey.svg'); } - .icon.self { background: url('~img/icon/menu/syncStatus/self/grey.svg'); } - .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/grey.svg'); } - .icon.localOnly { background: url('~img/icon/menu/syncStatus/localOnly.svg'); } - } - .iconWrapper.connected { - .iconBg { background: #c5efa3; } - .icon.network { background: url('~img/icon/menu/syncStatus/network/green.svg'); } - .icon.self { background: url('~img/icon/menu/syncStatus/self/green.svg'); } - .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/green.svg'); } - } - .iconWrapper.connectedSlow { - .iconBg { background: #f4eb91; } - .icon.network { background: url('~img/icon/menu/syncStatus/network/yellow.svg'); } - } - .iconWrapper.error { - .iconBg { background: #fcd1c3; } - .icon.network { background: url('~img/icon/menu/syncStatus/network/red.svg'); } - .icon.self { background: url('~img/icon/menu/syncStatus/self/red.svg'); } - .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/red.svg'); } - } + .iconWrapper { + .iconBg { width: 100%; height: 100%; position: absolute; z-index: 0; border-radius: 50%; background: var(--color-shape-tertiary); } + .icon { width: 20px; height: 20px; } + .icon.network { background: url('~img/icon/menu/syncStatus/network/grey.svg'); } + .icon.self { background: url('~img/icon/menu/syncStatus/self/grey.svg'); } + .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/grey.svg'); } + .icon.localOnly { background: url('~img/icon/menu/syncStatus/localOnly.svg'); } + } + .iconWrapper.connected { + .iconBg { background: #c5efa3; } + .icon.network { background: url('~img/icon/menu/syncStatus/network/green.svg'); } + .icon.self { background: url('~img/icon/menu/syncStatus/self/green.svg'); } + .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/green.svg'); } + } + .iconWrapper.connectedSlow { + .iconBg { background: #f4eb91; } + .icon.network { background: url('~img/icon/menu/syncStatus/network/yellow.svg'); } + } + .iconWrapper.error { + .iconBg { background: #fcd1c3; } + .icon.network { background: url('~img/icon/menu/syncStatus/network/red.svg'); } + .icon.self { background: url('~img/icon/menu/syncStatus/self/red.svg'); } + .icon.p2p { background: url('~img/icon/menu/syncStatus/p2p/red.svg'); } + } - .iconWrapper:hover { - .iconBg { opacity: 0.5; } - } - } + .iconWrapper:hover { + .iconBg { opacity: 0.5; } + } + } - .items { height: 100%; padding: 0px; } - .items { - .sides { display: flex; align-items: center; gap: 0px 4px; } - .sides { - .side.left { display: flex; align-items: center; flex-grow: 1; width: calc(100% - 24px); } - .side.right { width: 20px; flex-shrink: 0; display: flex; align-items: center; } - .side.right { - .icon { width: 20px; height: 20px; } - .icon.queued { background-image: url('~img/icon/menu/syncStatus/queued.svg'); } - .icon.syncing { background-image: url('~img/icon/menu/syncStatus/loading.svg'); transform: translateZ(0); animation: rotate 0.8s infinite steps(8); } - .icon.synced { background-image: url('~img/icon/menu/syncStatus/ok.svg'); } - .icon.error { background-image: url('~img/icon/menu/syncStatus/failed.svg'); display: block; margin: 0px; } - .icon.more { background-image: url('~img/icon/menu/action/more0.svg'); opacity: 0; position: static; margin: 0px; } + .items { height: 100%; padding: 0px; } + .items { + .sides { display: flex; align-items: center; gap: 0px 4px; } + .sides { + .side.left { display: flex; align-items: center; flex-grow: 1; width: calc(100% - 24px); } + .side.right { width: 20px; flex-shrink: 0; display: flex; align-items: center; } + .side.right { + .icon { width: 20px; height: 20px; } + .icon.queued { background-image: url('~img/icon/menu/syncStatus/queued.svg'); } + .icon.syncing { background-image: url('~img/icon/menu/syncStatus/loading.svg'); transform: translateZ(0); animation: rotate 0.8s infinite steps(8); } + .icon.synced { background-image: url('~img/icon/menu/syncStatus/ok.svg'); } + .icon.error { background-image: url('~img/icon/menu/syncStatus/failed.svg'); display: block; margin: 0px; } + .icon.more { background-image: url('~img/icon/menu/action/more0.svg'); opacity: 0; position: static; margin: 0px; } .icon.more:hover { background-color: unset !important; background-image: url('~img/icon/menu/action/more1.svg'); } - } - } + } + } - .sectionName { padding: 4px 16px; } + .sectionName { padding: 4px 16px; } - .item { padding: 3px 8px; margin: 0px 8px; width: unset; line-height: 22px; border-radius: 6px; } - .item { - .info { display: flex; align-items: baseline; width: calc(100% - 24px); } - .info { - .iconObject { margin-right: 8px; } - .name { margin: 0px 6px 0px 0px; @include text-overflow-nw; } - .size { color: var(--color-text-secondary); } - } - } + .item { padding: 3px 8px; margin: 0px 8px; width: unset; line-height: 22px; border-radius: 6px; } + .item { + .info { display: flex; align-items: baseline; width: calc(100% - 24px); } + .info { + .iconObject { margin-right: 8px; } + .name { margin: 0px 6px 0px 0px; @include text-overflow-nw; } + .size { color: var(--color-text-secondary); } + } + } - .item:hover, .item.hover { background: var(--color-shape-highlight-medium); } - .item:hover, .item.hover { - .side.right { - .icon:not(.more) { display: none; } - .icon.more { opacity: 1; } - } - } - } - } + .item:hover, .item.hover { background: var(--color-shape-highlight-medium); } + .item:hover, .item.hover { + .side.right { + .icon:not(.more) { display: none; } + .icon.more { opacity: 1; } + } + } + } + } - .menu.menuSyncStatusInfo { - .content { padding: 8px 0px; } + .menu.menuSyncStatusInfo { + .content { padding: 8px 0px; } - .title, - .label { padding: 0px 16px; } - .title { color: var(--color-text-primary); font-weight: 500; } - .label { @include text-small; color: var(--color-text-secondary); } + .title, + .label { padding: 0px 16px; } + .title { color: var(--color-text-primary); font-weight: 500; } + .label { @include text-small; color: var(--color-text-secondary); } - .items { - .item { padding: 4px 16px; } - } - .items:before { content: ''; display: block; height: 1px; margin: 8px 16px 6px; background-color: var(--color-shape-secondary); } - } + .items { + .item { padding: 4px 16px; } + } + .items:before { content: ''; display: block; height: 1px; margin: 8px 16px 6px; background-color: var(--color-shape-secondary); } + } } diff --git a/src/scss/page/main/media.scss b/src/scss/page/main/media.scss index 121412ff59..8f02f32493 100644 --- a/src/scss/page/main/media.scss +++ b/src/scss/page/main/media.scss @@ -55,7 +55,6 @@ .mediaAudio { padding: 12px 16px; } .mediaAudio { - .controls { display: flex; align-items: center; gap: 0px 8px; } .controls { .icon { flex-shrink: 0; } .icon.play { margin: 0px; } diff --git a/src/scss/popup/confirm.scss b/src/scss/popup/confirm.scss index 2377f92b20..d9fac0f887 100644 --- a/src/scss/popup/confirm.scss +++ b/src/scss/popup/confirm.scss @@ -44,7 +44,7 @@ } .popup.popupConfirm.isWide { - .innerWrap { width: 640px; } + .innerWrap { width: 640px; max-height: 640px; } } .popup.popupConfirm.shareMoreInfo { diff --git a/src/scss/popup/membership.scss b/src/scss/popup/membership.scss index 2ee0b5c227..4800608127 100644 --- a/src/scss/popup/membership.scss +++ b/src/scss/popup/membership.scss @@ -48,7 +48,7 @@ .statusBar { @include text-small; min-height: 18px; margin: 0px 0px 2px; color: var(--color-text-secondary); } .statusBar.error { color: var(--color-red); } - .statusBar.ok { color: var(--color-green); } + .statusBar.ok { color: var(--color-lime); } .priceWrapper { margin-bottom: 14px; } .priceWrapper { @@ -157,7 +157,7 @@ .statusBar { @include text-small; min-height: 18px; margin: 0px 0px 4px; color: var(--color-text-secondary); } .statusBar.error { color: var(--color-red); } - .statusBar.ok { color: var(--color-green); } + .statusBar.ok { color: var(--color-lime); } .button { width: 100%; } } diff --git a/src/scss/popup/settings.scss b/src/scss/popup/settings.scss index 4e6f965aec..f6d3b1b46d 100644 --- a/src/scss/popup/settings.scss +++ b/src/scss/popup/settings.scss @@ -734,7 +734,7 @@ span { font-weight: 600; text-decoration: underline; } } - .swiper { margin: 0px -31px 8px -31px; } + .swiper { margin: 0px -31px 8px -31px; flex-shrink: 0; } .swiper { .swiper-wrapper { margin-bottom: 10px; } .swiper-slide { width: calc(100% - 64px); min-width: 396px; } diff --git a/src/scss/popup/spaceCreate.scss b/src/scss/popup/spaceCreate.scss index 6ca0a3969f..5d2a2f5a95 100644 --- a/src/scss/popup/spaceCreate.scss +++ b/src/scss/popup/spaceCreate.scss @@ -4,12 +4,12 @@ .popup.popupSpaceCreate { .innerWrap { width: 480px; padding: 20px 56px 24px 56px; text-align: center; } - .label { @include text-small; color: var(--color-text-secondary); text-transform: uppercase; margin: 0px 0px 36px 0px; } + .label { @include text-very-small; color: var(--color-text-secondary); text-transform: uppercase; margin: 0px 0px 36px 0px; } .iconWrapper { display: flex; justify-content: center; margin: 0px 0px 16px 0px; } .nameWrapper { margin: 0px 0px 28px 0px; } - .input { @include text-header1; text-align: center; } + .input { @include text-header1; height: auto; text-align: center; } .buttons { display: flex; flex-direction: column; gap: 8px 0px; } } } \ No newline at end of file diff --git a/src/scss/theme/dark/block.scss b/src/scss/theme/dark/block.scss index 86c4ce368a..5db423fe16 100644 --- a/src/scss/theme/dark/block.scss +++ b/src/scss/theme/dark/block.scss @@ -203,6 +203,8 @@ .icon.messageReply:hover, .icon.messageReply.hover { background-image: url('#{$themePath}/icon/chat/buttons/reply1.svg'); } .icon.more:hover, .icon.more.hover { background-image: url('#{$themePath}/icon/menu/action/more1.svg'); } } + + .reply { color: var(--color-text-inversion); } } .message.isSelf { .side.right { background: #162908; } diff --git a/src/scss/theme/dark/common.scss b/src/scss/theme/dark/common.scss index ed0e6f008b..9081614959 100644 --- a/src/scss/theme/dark/common.scss +++ b/src/scss/theme/dark/common.scss @@ -5,7 +5,7 @@ $themePath: '~img/theme/dark'; html.themeDark { /* Text */ - --color-text-primary: #ebebeb; + --color-text-primary: #f8f8f8; --color-text-secondary: #9a9a9a; --color-text-tertiary: #656565; --color-text-inversion: #171717; @@ -31,14 +31,13 @@ html.themeDark { --color-bg-primary: #171717; --color-bg-secondary: #191919; - --color-bg-tertiary: #464646; --color-bg-loader: rgba(0,0,0,0.7); /* System */ --color-system-accent-125: #ffc83c; --color-system-accent-50: #9f6b00; - --color-system-accent-25: #f09c0e; + --color-system-accent-25: #694500; --color-system-selection: rgba(24, 163, 241, 0.15); /* Common */ @@ -68,7 +67,7 @@ html.themeDark { .isMultiSelect.tagColor-red { color: var(--color-red) !important; background: #74321e !important; } .isMultiSelect.tagColor-pink { color: var(--color-pink) !important; background: #712055 !important; } .isMultiSelect.tagColor-purple { color: var(--color-purple) !important; background: #542663 !important; } - .isMultiSelect.tagColor-blue { color: var(--color-blue) !important; background: #2b3368 !important; } + .isMultiSelect.tagColor-blue { color: var(--color-blue) !important; background: #20295c !important; } .isMultiSelect.tagColor-ice { color: var(--color-ice) !important; background: #19465f !important; } .isMultiSelect.tagColor-teal { color: var(--color-teal) !important; background: #16534e !important; } .isMultiSelect.tagColor-lime { color: var(--color-lime) !important; background: #36551d !important; } @@ -123,6 +122,8 @@ html.themeDark { .icon.volume { background-image: url('#{$themePath}/icon/audio/volume.svg'); } .icon.volume.active { background-image: url('#{$themePath}/icon/audio/mute.svg'); } + + .icon.volume.muted { background-image: url('#{$themePath}/icon/audio/mute.svg'); } } } @@ -169,7 +170,9 @@ html.themeDark { } .inputWithFile { border-color: transparent; background-color: var(--color-shape-highlight-medium); } - .input-drag { + .input-drag-vertical { background-color: var(--color-bg-secondary); } + + .input-drag-horizontal { .fill { background: var(--color-text-primary); } .icon { border-color: var(--color-text-secondary); } } @@ -241,6 +244,15 @@ html.themeDark { .icon.buttonAdd { background-image: url('#{$themePath}/icon/block/add0.svg'); } .icon.buttonAdd:hover { background-image: url('#{$themePath}/icon/block/add1.svg'); } } + + .dragWrap { + .number { color: var(--color-text-primary); } + .input-drag-horizontal { + .back { background: rgba(255,255,255,0.5); } + .fill { background: var(--color-text-primary); } + .icon { border-color: var(--color-text-primary); } + } + } } /* EditorControls */ diff --git a/src/scss/theme/dark/menu.scss b/src/scss/theme/dark/menu.scss index 456c884b58..9860ef6404 100644 --- a/src/scss/theme/dark/menu.scss +++ b/src/scss/theme/dark/menu.scss @@ -306,7 +306,7 @@ /* GraphSettings */ .menu.menuGraphSettings { - .input-drag { + .input-drag-horizontal { .icon { background-color: var(--color-bg-secondary); } } } diff --git a/src/scss/theme/dark/popup.scss b/src/scss/theme/dark/popup.scss index c3f30ce78c..877279e5ae 100644 --- a/src/scss/theme/dark/popup.scss +++ b/src/scss/theme/dark/popup.scss @@ -13,7 +13,6 @@ .popup.popupSettings, .popup.popupSettingsOnboarding { .mainSides { - > .side.left { background: var(--color-bg-secondary); } > .side.left { .item { .icon.logout { background-image: url('#{$themePath}/icon/popup/settings/logout.svg'); } diff --git a/src/scss/theme/dark/widget.scss b/src/scss/theme/dark/widget.scss index 262a368a79..2d30b59395 100644 --- a/src/scss/theme/dark/widget.scss +++ b/src/scss/theme/dark/widget.scss @@ -75,3 +75,7 @@ } } } + +.button.widget { + .icon.bin { background-image: url('#{$themePath}/icon/widget/button/bin.svg'); } +} \ No newline at end of file diff --git a/src/scss/widget/buttons.scss b/src/scss/widget/buttons.scss index e16299777f..2a022f48c7 100644 --- a/src/scss/widget/buttons.scss +++ b/src/scss/widget/buttons.scss @@ -17,9 +17,6 @@ .side.left { gap: 0px 6px; } .side.right { justify-content: flex-end; padding-left: 6px; overflow: hidden; } .side.right { - .icon.more { background-image: url('~img/icon/menu/action/more0.svg'); opacity: 0; transition: $transitionAllCommon; } - .icon.more:hover, .icon.more.hover { background-image: url('~img/icon/menu/action/more1.svg'); opacity: 1; } - .btn { background-image: linear-gradient(90deg, #2aa7ee, #27c941); background-clip: text; -webkit-text-fill-color: transparent; font-weight: 500; } } diff --git a/src/scss/widget/common.scss b/src/scss/widget/common.scss index 811835747b..be7dfe5d5a 100644 --- a/src/scss/widget/common.scss +++ b/src/scss/widget/common.scss @@ -106,7 +106,16 @@ .head > .flex > .clickable { width: calc(100% - 36px); } } +.button.widget { + height: unset; text-align: left; @include text-paragraph; @include text-overflow-nw; font-weight: 600; padding: 14px 16px; + display: flex; position: relative; gap: 0px 12px; justify-content: flex-start; text-align: left; +} +.button.widget { + .icon { height: 20px; width: 20px; margin: 0px; flex-shrink: 0; } + .icon.bin { background-image: url('~img/icon/widget/button/bin.svg'); } +} + @import "./space"; @import "./buttons"; @import "./tree"; -@import "./view/common"; +@import "./view/common"; \ No newline at end of file diff --git a/src/ts/app.tsx b/src/ts/app.tsx index 7bbfa7a2f5..ea0709d831 100644 --- a/src/ts/app.tsx +++ b/src/ts/app.tsx @@ -193,7 +193,9 @@ class App extends React.Component { ) : ''} {drag} +
+
@@ -255,7 +257,7 @@ class App extends React.Component { Renderer.on('update-available', this.onUpdateAvailable); Renderer.on('update-confirm', this.onUpdateConfirm); Renderer.on('update-not-available', this.onUpdateUnavailable); - Renderer.on('update-downloaded', () => S.Common.progressClear()); + Renderer.on('update-downloaded', () => S.Progress.delete('update')); Renderer.on('update-error', this.onUpdateError); Renderer.on('download-progress', this.onUpdateProgress); Renderer.on('spellcheck', this.onSpellcheck); @@ -420,12 +422,12 @@ class App extends React.Component { onUpdateCheck (e: any, auto: boolean) { if (!auto) { - S.Common.progressSet({ status: translate('progressUpdateCheck'), current: 0, total: 1, isUnlocked: true }); + S.Progress.add({ id: I.ProgressType.UpdateCheck, type: I.ProgressType.UpdateCheck, current: 0, total: 1 }); }; }; onUpdateConfirm (e: any, auto: boolean) { - S.Common.progressClear(); + S.Progress.delete(I.ProgressType.UpdateCheck); Storage.setHighlight('whatsNew', true); if (auto) { @@ -451,7 +453,7 @@ class App extends React.Component { }; onUpdateAvailable (e: any, auto: boolean) { - S.Common.progressClear(); + S.Progress.delete(I.ProgressType.UpdateCheck); if (auto) { return; @@ -476,7 +478,7 @@ class App extends React.Component { }; onUpdateUnavailable (e: any, auto: boolean) { - S.Common.progressClear(); + S.Progress.delete(I.ProgressType.UpdateCheck); if (auto) { return; @@ -497,7 +499,7 @@ class App extends React.Component { onUpdateError (e: any, err: string, auto: boolean) { console.error(err); - S.Common.progressClear(); + S.Progress.delete(I.ProgressType.UpdateCheck); if (auto) { return; @@ -522,11 +524,11 @@ class App extends React.Component { }; onUpdateProgress (e: any, progress: any) { - S.Common.progressSet({ - status: U.Common.sprintf(translate('commonUpdateProgress'), U.File.size(progress.transferred), U.File.size(progress.total)), + S.Progress.update({ + id: I.ProgressType.Update, + type: I.ProgressType.Update, current: progress.transferred, total: progress.total, - isUnlocked: true, }); }; diff --git a/src/ts/component/block/bookmark.tsx b/src/ts/component/block/bookmark.tsx index 765e687d28..d0223a20fb 100644 --- a/src/ts/component/block/bookmark.tsx +++ b/src/ts/component/block/bookmark.tsx @@ -268,7 +268,7 @@ const BlockBookmark = observer(class BlockBookmark extends React.Component this.onContextMenu(e, item)} onMore={e => this.onContextMenu(e, item, true)} - onReply={e => this.onReply(e, item)} + onReplyEdit={e => this.onReplyEdit(e, item)} + onReplyClick={e => this.onReplyClick(e, item)} getReplyContent={this.getReplyContent} /> ))} @@ -209,6 +210,10 @@ const BlockChat = observer(class BlockChat extends React.Component { if (!message.error.code) { @@ -328,7 +333,7 @@ const BlockChat = observer(class BlockChat extends React.Component { + if (!message.error.code && message.messages.length) { + messages = messages.concat(message.messages); + }; + + S.Chat.set(rootId, messages); + }); + }; + getReplyContent (message: any): any { const { creator, content } = message; const { space } = S.Common; diff --git a/src/ts/component/block/chat/buttons.tsx b/src/ts/component/block/chat/buttons.tsx index 275eac7949..5e43e2a24b 100644 --- a/src/ts/component/block/chat/buttons.tsx +++ b/src/ts/component/block/chat/buttons.tsx @@ -216,8 +216,8 @@ const ChatButtons = observer(class ChatButtons extends React.Component { it.isActive = false; if (it.type == I.MarkType.Link) { @@ -248,8 +248,8 @@ const ChatButtons = observer(class ChatButtons extends React.Component it.id), filters: [ @@ -268,6 +268,9 @@ const ChatButtons = observer(class ChatButtons extends React.Component { this.onAttachment(option.id); } @@ -295,9 +300,9 @@ const ChatButtons = observer(class ChatButtons extends React.Component { - S.Menu.open(menuItem, { + S.Menu.open(menuId, { element: `#block-${blockId} #button-${blockId}-${I.ChatButton.Object}`, - className: 'chatAttachment', + className: 'chatAttachment fixed', offsetY: -8, vertical: I.MenuDirection.Top, noFlipX: true, diff --git a/src/ts/component/block/chat/form.tsx b/src/ts/component/block/chat/form.tsx index c65ffc5c4b..006c635522 100644 --- a/src/ts/component/block/chat/form.tsx +++ b/src/ts/component/block/chat/form.tsx @@ -50,6 +50,7 @@ const ChatForm = observer(class ChatForm extends React.Component { this.onBlurInput = this.onBlurInput.bind(this); this.onKeyUpInput = this.onKeyUpInput.bind(this); this.onKeyDownInput = this.onKeyDownInput.bind(this); + this.onInput = this.onInput.bind(this); this.onPaste = this.onPaste.bind(this); this.onMention = this.onMention.bind(this); this.onChatButtonSelect = this.onChatButtonSelect.bind(this); @@ -155,6 +156,7 @@ const ChatForm = observer(class ChatForm extends React.Component { onBlur={this.onBlurInput} onKeyUp={this.onKeyUpInput} onKeyDown={this.onKeyDownInput} + onInput={this.onInput} onPaste={this.onPaste} onMouseDown={this.onMouseDown} onMouseUp={this.onMouseUp} @@ -243,6 +245,8 @@ const ChatForm = observer(class ChatForm extends React.Component { const { rootId } = this.props; const { attachments } = this.state; + keyboard.disableSelection(false); + Storage.setChat(rootId, { text: this.getTextValue(), marks: this.marks, @@ -436,6 +440,13 @@ const ChatForm = observer(class ChatForm extends React.Component { this.removeBookmarks(); }; + onInput () { + const value = this.getTextValue(); + const checkRtl = U.Common.checkRtl(value); + + $(this.refEditable?.node).toggleClass('isRtl', checkRtl); + }; + onPaste (e: any) { e.preventDefault(); @@ -482,6 +493,8 @@ const ChatForm = observer(class ChatForm extends React.Component { if (list.length) { this.addAttachments(list); }; + + this.onInput(); }; canDrop (e: any): boolean { @@ -712,6 +725,7 @@ const ChatForm = observer(class ChatForm extends React.Component { this.marks = []; this.updateMarkup('', 0, 0); this.setState({ attachments: [] }, () => this.refEditable.setRange(this.range)); + this.refButtons.setButtons(); }; onReply (message: I.ChatMessage) { @@ -741,7 +755,7 @@ const ChatForm = observer(class ChatForm extends React.Component { bgColor: 'red', title: translate('popupConfirmChatDeleteMessageTitle'), text: translate('popupConfirmChatDeleteMessageText'), - textConfirm: translate('commonYes'), + textConfirm: translate('commonDelete'), onConfirm: () => { C.ChatDeleteMessage(rootId, id, () => { if (this.editingId == id) { @@ -764,11 +778,15 @@ const ChatForm = observer(class ChatForm extends React.Component { }; getTextValue (): string { - return String(this.refEditable?.getTextValue() || ''); + return this.trim(String(this.refEditable?.getTextValue() || '').replace(/^\r?\n/gm, '')); }; getHtmlValue (): string { - return String(this.refEditable?.getHtmlValue() || ''); + return this.trim(String(this.refEditable?.getHtmlValue() || '')); + }; + + trim (value: string): string { + return String(value || '').replace(/^(\r?\n)/gm, '').replace(/(\r?\n)$/gm, ''); }; getMarksFromHtml (): { marks: I.Mark[], text: string } { @@ -815,7 +833,7 @@ const ChatForm = observer(class ChatForm extends React.Component { this.updateMarkup(value, to, to); break; }; - } + }; }; onTextButtonToggle (type: I.MarkType, param: string) { @@ -835,7 +853,7 @@ const ChatForm = observer(class ChatForm extends React.Component { }; case I.MarkType.Object: { - U.Object.getById(param, (object: any) => { + U.Object.getById(param, {}, (object: any) => { object.isTmp = true; object.timestamp = U.Date.now(); @@ -958,7 +976,7 @@ const ChatForm = observer(class ChatForm extends React.Component { }; canSend () { - return this.editingId || this.getTextValue() || this.state.attachments.length; + return this.editingId || this.getTextValue() || this.state.attachments.length || this.marks.length; }; hasSelection (): boolean { @@ -983,6 +1001,7 @@ const ChatForm = observer(class ChatForm extends React.Component { this.refEditable.setRange({ from, to }); this.refEditable.placeholderCheck(); this.renderMarkup(); + this.checkSendButton(); }; renderMarkup () { @@ -990,9 +1009,9 @@ const ChatForm = observer(class ChatForm extends React.Component { const node = this.refEditable.node; const value = this.refEditable.getTextValue(); - renderMentions(rootId, node, this.marks, value); - renderObjects(rootId, node, this.marks, value, this.props); - renderLinks(node, this.marks, value, this.props); + renderMentions(rootId, node, this.marks, () => value); + renderObjects(rootId, node, this.marks, () => value, this.props); + renderLinks(node, this.marks, () => value, this.props); renderEmoji(node); }; diff --git a/src/ts/component/block/chat/message/index.tsx b/src/ts/component/block/chat/message/index.tsx index 11b7da2f72..53af4bb044 100644 --- a/src/ts/component/block/chat/message/index.tsx +++ b/src/ts/component/block/chat/message/index.tsx @@ -5,29 +5,18 @@ import { IconObject, Icon, ObjectName, Label } from 'Component'; import { I, S, U, C, J, Mark, translate, Preview } from 'Lib'; import Attachment from '../attachment'; - -interface Props extends I.BlockComponent { - blockId: string; - id: string; - isThread: boolean; - isNew: boolean; - onThread: (id: string) => void; - onContextMenu: (e: any) => void; - onMore: (e: any) => void; - onReply: (e: any) => void; - getReplyContent: (message: any) => any; -}; +import Reply from './reply'; const LINES_LIMIT = 10; -const ChatMessage = observer(class ChatMessage extends React.Component { +const ChatMessage = observer(class ChatMessage extends React.Component { node = null; refText = null; attachmentRefs: any = {}; isExpanded = false; - constructor (props: Props) { + constructor (props: I.ChatMessageComponent) { super(props); this.onExpand = this.onExpand.bind(this); @@ -38,7 +27,7 @@ const ChatMessage = observer(class ChatMessage extends React.Component { }; render () { - const { rootId, id, isThread, isNew, readonly, onThread, onContextMenu, onMore, onReply, getReplyContent } = this.props; + const { rootId, id, isThread, isNew, readonly, onThread, onContextMenu, onMore, onReplyEdit } = this.props; const { space } = S.Common; const { account } = S.Auth; const message = S.Chat.getMessage(rootId, id); @@ -52,40 +41,10 @@ const ChatMessage = observer(class ChatMessage extends React.Component { const canAddReaction = this.canAddReaction(); const cn = [ 'message' ]; const ca = [ 'attachments', attachmentsLayout ]; + const ct = [ 'textWrapper' ]; - let reply = null; - if (replyToMessageId) { - const replyToMessage = S.Chat.getReply(rootId, replyToMessageId); - if (replyToMessage) { - const { text, attachment, isMultiple } = getReplyContent(replyToMessage); - const author = U.Space.getParticipant(U.Space.getParticipantId(space, replyToMessage.creator)); - - let icon: any = null; - if (attachment) { - let iconSize = null; - if (U.Object.getFileLayouts().concat([ I.ObjectLayout.Human, I.ObjectLayout.Participant ]).includes(attachment.layout)) { - iconSize = 32; - }; - - icon = ; - }; - if (isMultiple) { - icon = ; - }; - - reply = ( -
- {icon} -
- -
-
-
- ); - }; - }; - - let text = U.Common.sanitize(U.Common.lbBr(Mark.toHtml(content.text, content.marks))); + let text = content.text.replace(/\r?\n$/, ''); + text = U.Common.sanitize(U.Common.lbBr(Mark.toHtml(text, content.marks))); if (modifiedAt) { const cnl = [ 'label', 'small' ]; @@ -118,6 +77,9 @@ const ChatMessage = observer(class ChatMessage extends React.Component { if (this.isExpanded) { cn.push('isExpanded'); }; + if (U.Common.checkRtl(text)) { + ct.push('isRtl'); + }; // Subscriptions for (const mark of content.marks) { @@ -168,9 +130,9 @@ const ChatMessage = observer(class ChatMessage extends React.Component {
{U.Date.date('H:i', createdAt)}
- {reply} + -
+
this.refText = ref} className="text" @@ -216,7 +178,7 @@ const ChatMessage = observer(class ChatMessage extends React.Component { {!readonly ? (
{!hasReactions && canAddReaction ? : ''} - +
) : ''} @@ -248,9 +210,9 @@ const ChatMessage = observer(class ChatMessage extends React.Component { const isSelf = creator == account.id; const readonly = this.props.readonly || !isSelf; - renderMentions(rootId, this.node, marks, text); - renderObjects(rootId, this.node, marks, text, { readonly }); - renderLinks(this.node, marks, text, { readonly }); + renderMentions(rootId, this.node, marks, () => text); + renderObjects(rootId, this.node, marks, () => text, { readonly }); + renderLinks(this.node, marks, () => text, { readonly }); renderEmoji(this.node); this.checkLinesLimit(); @@ -349,7 +311,7 @@ const ChatMessage = observer(class ChatMessage extends React.Component { const subId = S.Record.getSubId(rootId, blockId); const message = S.Chat.getMessage(rootId, id); - return (message.attachments || []).map(it => S.Detail.get(subId, it.target)).filter(it => !it._empty_ && !it.isDeleted); + return (message.attachments || []).map(it => S.Detail.get(subId, it.target)).filter(it => !it._empty_); }; getAttachmentsClass (): string { diff --git a/src/ts/component/block/chat/message/reply.tsx b/src/ts/component/block/chat/message/reply.tsx new file mode 100644 index 0000000000..5ae6f318e9 --- /dev/null +++ b/src/ts/component/block/chat/message/reply.tsx @@ -0,0 +1,48 @@ +import * as React from 'react'; +import { observer } from 'mobx-react'; +import { IconObject, Icon, ObjectName } from 'Component'; +import { I, S, U } from 'Lib'; + +const ChatMessageReply = observer(class ChatMessageReply extends React.Component { + + render () { + const { space } = S.Common; + const { rootId, id, getReplyContent, onReplyClick } = this.props; + const message = S.Chat.getReply(rootId, id); + const cn = [ 'reply' ]; + + if (!message) { + return null; + }; + + const { text, attachment, isMultiple } = getReplyContent(message); + const author = U.Space.getParticipant(U.Space.getParticipantId(space, message.creator)); + const iconLayouts = U.Object.getFileLayouts().concat(U.Object.getHumanLayouts()); + + let icon: any = null; + + if (attachment) { + const iconSize = iconLayouts.includes(attachment.layout) ? 32 : null; + icon = ; + } else + if (isMultiple) { + icon = ; + }; + + if (U.Common.checkRtl(text)) { + cn.push('isRtl'); + }; + + return ( +
+ {icon} +
+ +
+
+
+ ); + }; +}); + +export default ChatMessageReply; \ No newline at end of file diff --git a/src/ts/component/block/cover.tsx b/src/ts/component/block/cover.tsx index aaf867a39e..94501430a6 100644 --- a/src/ts/component/block/cover.tsx +++ b/src/ts/component/block/cover.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import $ from 'jquery'; import { observer } from 'mobx-react'; -import { Icon, Drag, Cover, Loader, Label } from 'Component'; +import { Icon, DragHorizontal, Cover, Loader, Label } from 'Component'; import { I, C, S, U, J, focus, translate, keyboard } from 'Lib'; import ControlButtons from 'Component/page/elements/head/controlButtons'; @@ -97,7 +97,7 @@ const BlockCover = observer(class BlockCover extends React.Component
- this.refDrag = ref} onStart={this.onScaleStart} onMove={this.onScaleMove} diff --git a/src/ts/component/block/dataview.tsx b/src/ts/component/block/dataview.tsx index 35b941639d..993b6a25c3 100644 --- a/src/ts/component/block/dataview.tsx +++ b/src/ts/component/block/dataview.tsx @@ -4,7 +4,7 @@ import raf from 'raf'; import arrayMove from 'array-move'; import { observer } from 'mobx-react'; import { set } from 'mobx'; -import { I, C, S, U, J, analytics, Dataview, keyboard, Onboarding, Relation, Renderer, focus, translate, Action } from 'Lib'; +import { I, C, S, U, J, analytics, Dataview, keyboard, Onboarding, Relation, focus, translate, Action } from 'Lib'; import Controls from './dataview/controls'; import Selection from './dataview/selection'; @@ -313,7 +313,7 @@ const BlockDataview = observer(class BlockDataview extends React.Component { if (!canEdit) { if (Relation.isUrl(relation.format) && value) { - Action.openUrl(Relation.getUrlScheme(relation.format, value) + value); + Action.openUrl(Relation.checkUrlScheme(relation.format, value)); return; }; @@ -380,8 +380,7 @@ const Cell = observer(class Cell extends React.Component { }); if (e.shiftKey && value) { - const scheme = Relation.getUrlScheme(relation.format, value); - Action.openUrl(scheme + value); + Action.openUrl(Relation.checkUrlScheme(relation.format, value)); ret = true; break; @@ -409,11 +408,9 @@ const Cell = observer(class Cell extends React.Component { return; }; - const scheme = Relation.getUrlScheme(relation.format, value); - switch (item.id) { case 'go': { - Action.openUrl(scheme + value); + Action.openUrl(Relation.checkUrlScheme(relation.format, value)); analytics.event('RelationUrlOpen'); break; }; diff --git a/src/ts/component/block/dataview/cell/text.tsx b/src/ts/component/block/dataview/cell/text.tsx index 0a33a4ada2..4e1c9037f0 100644 --- a/src/ts/component/block/dataview/cell/text.tsx +++ b/src/ts/component/block/dataview/cell/text.tsx @@ -383,7 +383,7 @@ const CellText = observer(class CellText extends React.Component this.range = null; this.setEditing(false); - if (pressed == 'enter+shift') { + if (onRecordAdd && (pressed == 'enter+shift')) { onRecordAdd(e, 0, groupId, {}, recordIdx + 1); }; }); diff --git a/src/ts/component/block/dataview/controls.tsx b/src/ts/component/block/dataview/controls.tsx index 81ad125cc4..88330feaab 100644 --- a/src/ts/component/block/dataview/controls.tsx +++ b/src/ts/component/block/dataview/controls.tsx @@ -5,7 +5,7 @@ import { observer } from 'mobx-react'; import { observable } from 'mobx'; import { SortableContainer, SortableElement } from 'react-sortable-hoc'; import { Icon, Button, Filter } from 'Component'; -import { C, I, S, U, analytics, Relation, keyboard, translate, Dataview, sidebar, J } from 'Lib'; +import { C, I, S, U, M, analytics, Relation, keyboard, translate, Dataview, sidebar, J } from 'Lib'; import Head from './head'; interface Props extends I.ViewComponent { @@ -208,7 +208,10 @@ const Controls = observer(class Controls extends React.Component { onViewSwitch (view: any) { this.onViewSet(view); - window.setTimeout(() => { $(`#button-${this.props.block.id}-settings`).trigger('click'); }, 50); + + window.setTimeout(() => { + $(`#button-${this.props.block.id}-settings`).trigger('click'); + }, 50); }; onViewCopy (view) { @@ -284,9 +287,16 @@ const Controls = observer(class Controls extends React.Component { horizontal: I.MenuDirection.Center, offsetY: 10, noFlipY: true, - onBack: (id) => { + onBack: (id: string) => { + const menu = S.Menu.get(id); + + if (menu) { + const view = U.Common.objectCopy(menu.param.data.view.get()); + param.data.view = observable.box(new M.View(view)); + }; + S.Menu.replace(id, component, { ...param, noAnimation: true }); - window.setTimeout(() => S.Menu.update(component, { noAnimation: false }), 50); + window.setTimeout(() => S.Menu.update(component, { noAnimation: false }), J.Constant.delay.menu); }, data: { readonly, @@ -526,11 +536,7 @@ const Controls = observer(class Controls extends React.Component { }; toggleHoverArea (v: boolean) { - const { block } = this.props; - const obj = $(`#block-${block.id}`); - const hoverArea = obj.find('.hoverArea'); - - v ? hoverArea.addClass('active') : hoverArea.removeClass('active'); + $(`#block-${this.props.block.id} .hoverArea`).toggleClass('active', v); }; resize () { @@ -549,11 +555,9 @@ const Controls = observer(class Controls extends React.Component { const nw = node.outerWidth(); let add = false; - let close = false; if (sideLeft.hasClass('small')) { sideLeft.removeClass('small'); - close = true; }; const width = sideLeft.outerWidth() + sideRight.outerWidth(); @@ -568,10 +572,7 @@ const Controls = observer(class Controls extends React.Component { if (add) { sideLeft.addClass('small'); - close = true; - }; - - if (close) { + } else { S.Menu.closeAll([ 'dataviewViewList' ]); }; }; diff --git a/src/ts/component/block/dataview/head.tsx b/src/ts/component/block/dataview/head.tsx index 6d1b7e3623..063efcf21a 100644 --- a/src/ts/component/block/dataview/head.tsx +++ b/src/ts/component/block/dataview/head.tsx @@ -138,6 +138,10 @@ const Head = observer(class Head extends React.Component }; onTitleOver (e: any, item: any) { + if (!this.menuContext) { + return; + }; + const { rootId, block, loadData, isCollection } = this.props; const { targetObjectId } = block.content; @@ -155,6 +159,7 @@ const Head = observer(class Head extends React.Component isSub: true, data: {}, }; + const onCreate = (message: any, isNew: boolean) => { if (message.views && message.views.length) { window.setTimeout(() => loadData(message.views[0].id, 0, true), 50); @@ -309,12 +314,9 @@ const Head = observer(class Head extends React.Component }; checkInput (isEmpty: boolean) { - if (!this.ref) { - return; + if (this.ref) { + $(this.ref.node).toggleClass('isEmpty', isEmpty) }; - - const node = $(this.ref.node); - isEmpty ? node.addClass('isEmpty') : node.removeClass('isEmpty'); }; save () { diff --git a/src/ts/component/block/dataview/view/board/column.tsx b/src/ts/component/block/dataview/view/board/column.tsx index f7ac9c7110..3a1a1e329b 100644 --- a/src/ts/component/block/dataview/view/board/column.tsx +++ b/src/ts/component/block/dataview/view/board/column.tsx @@ -116,7 +116,9 @@ const Column = observer(class Column extends React.Component { /> ))} - {limit + this.offset < total ? : ''} + {limit + this.offset < total ? ( + + ): ''} {isAllowedObject ? (
this.onAdd(e, 1)}> diff --git a/src/ts/component/block/dataview/view/calendar/item.tsx b/src/ts/component/block/dataview/view/calendar/item.tsx index 92b1a09e11..aa55ce09f9 100644 --- a/src/ts/component/block/dataview/view/calendar/item.tsx +++ b/src/ts/component/block/dataview/view/calendar/item.tsx @@ -159,10 +159,9 @@ const Item = observer(class Item extends React.Component { }; onDoubleClick () { - if (!this.canCreate()) { - return; + if (this.canCreate()) { + this.onCreate(); }; - this.onCreate(); }; onCreate () { @@ -174,12 +173,17 @@ const Item = observer(class Item extends React.Component { onCreate(details); }; - canCreate () { + canCreate (): boolean { const { getView, isAllowedObject } = this.props; const view = getView(); + + if (!view) { + return false; + }; + const groupRelation = S.Record.getRelationByKey(view.groupRelationKey); - return !groupRelation.isReadonlyValue && isAllowedObject(); + return groupRelation && !groupRelation.isReadonlyValue && isAllowedObject(); }; }); diff --git a/src/ts/component/block/dataview/view/graph.tsx b/src/ts/component/block/dataview/view/graph.tsx index 8c2d2d17fa..bb454a6836 100644 --- a/src/ts/component/block/dataview/view/graph.tsx +++ b/src/ts/component/block/dataview/view/graph.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import $ from 'jquery'; import { observer } from 'mobx-react'; import { I, C, S, U, J, Dataview } from 'Lib'; -import { Graph } from 'Component'; +import { GraphProvider } from 'Component'; const PADDING = 46; @@ -28,7 +28,7 @@ const ViewGraph = observer(class ViewGraph extends React.Component
- this.refGraph = ref} diff --git a/src/ts/component/block/dataview/view/grid.tsx b/src/ts/component/block/dataview/view/grid.tsx index 4d88c1a1f5..68b1a43607 100644 --- a/src/ts/component/block/dataview/view/grid.tsx +++ b/src/ts/component/block/dataview/view/grid.tsx @@ -1,12 +1,14 @@ import * as React from 'react'; +import * as ReactDOM from 'react-dom'; import $ from 'jquery'; import arrayMove from 'array-move'; import { observer } from 'mobx-react'; import { AutoSizer, WindowScroller, List, InfiniteLoader } from 'react-virtualized'; import { Icon, LoadMore } from 'Component'; -import { I, C, S, U, J, translate, keyboard, Relation, sidebar } from 'Lib'; +import { I, C, S, U, J, translate, keyboard, Relation } from 'Lib'; import HeadRow from './grid/head/row'; import BodyRow from './grid/body/row'; +import FootRow from './grid/foot/row'; const PADDING = 46; @@ -23,12 +25,12 @@ const ViewGrid = observer(class ViewGrid extends React.Component ) : null} + + {isInline && (limit + offset < total) ? ( ) : ''} @@ -152,7 +159,8 @@ const ViewGrid = observer(class ViewGrid extends React.Component this.onScroll()); + + scroll.on('scroll', () => this.onScrollHorizontal()); + container.off(`scroll.${block.id}`).on(`scroll.${block.id}`, () => this.onScrollVertical()); }; unbind () { + const { isPopup, block } = this.props; const node = $(this.node); + const scroll = node.find('#scroll'); + const container = U.Common.getScrollContainer(isPopup); - node.find('#scroll').off('scroll'); + scroll.off('scroll'); + container.off(`scroll.${block.id}`); }; - onScroll () { + onScrollHorizontal () { S.Menu.resizeAll(); this.resizeColumns('', 0); + + const { isInline } = this.props; + + if (isInline) { + return; + }; + + const node = $(this.node); + const clone = node.find('#rowHeadClone'); + + if (clone.length) { + const scroll = node.find('#scroll'); + + clone.css({ transform: `translate3d(${-scroll.scrollLeft()}px,0px,0px)` }); + }; + }; + + onScrollVertical () { + const { isPopup, isInline } = this.props; + + if (isInline) { + return; + }; + + const container = U.Common.getScrollContainer(isPopup); + const node = $(this.node); + const rowHead = node.find('#rowHead'); + if (!rowHead.length) { + return; + }; + + const scroll = node.find('#scroll'); + const hh = J.Size.header; + const st = container.scrollTop(); + const { left, top } = rowHead.offset(); + const sl = scroll.scrollLeft(); + + rowHead.removeClass('fixed'); + node.find('#rowHeadClone').remove(); + + if (top - st <= hh) { + const clone = $('
'); + + node.append(clone); + + ReactDOM.render(( + + ), clone.get(0)); + + clone.find('.rowHead').attr({ id: '' }); + clone.css({ + left: left + sl, + top: hh, + width: rowHead.width(), + transform: `translate3d(${-sl}px,0px,0px)` + }); + + rowHead.addClass('fixed'); + }; }; resizeColumns (relationKey: string, width: number) { @@ -191,7 +274,7 @@ const ViewGrid = observer(class ViewGrid extends React.Component cellLast.addClass('hover'), + onClose: () => cellLast.removeClass('hover'), data: { readonly, loadData, @@ -345,7 +432,7 @@ const ViewGrid = observer(class ViewGrid extends React.Component { + return new Promise((resolve, reject) => { offset += getLimit(); loadData(view.id, offset, false, resolve); S.Record.metaSet(subId, '', { offset }); diff --git a/src/ts/component/block/dataview/view/grid/foot/cell.tsx b/src/ts/component/block/dataview/view/grid/foot/cell.tsx new file mode 100644 index 0000000000..545f2fad97 --- /dev/null +++ b/src/ts/component/block/dataview/view/grid/foot/cell.tsx @@ -0,0 +1,238 @@ +import * as React from 'react'; +import { observer } from 'mobx-react'; +import { Select } from 'Component'; +import { I, S, C, J, keyboard, Relation, Dataview, analytics, translate } from 'Lib'; + +interface Props extends I.ViewComponent, I.ViewRelation { + rootId?: string; + block?: I.Block; +}; + +interface State { + isEditing: boolean; + result: any; +}; + +const FootCell = observer(class FootCell extends React.Component { + + node = null; + menuContext = null; + refSelect = null; + + state = { + isEditing: false, + result: null, + }; + + constructor (props: Props) { + super(props); + + this.onClick = this.onClick.bind(this); + this.onOpen = this.onOpen.bind(this); + this.onClose = this.onClose.bind(this); + this.onOver = this.onOver.bind(this); + this.onChange = this.onChange.bind(this); + this.onMouseEnter = this.onMouseEnter.bind(this); + this.onMouseLeave = this.onMouseLeave.bind(this); + }; + + render () { + const { relationKey, rootId, block, getView } = this.props; + const { isEditing, result } = this.state; + const relation = S.Record.getRelationByKey(relationKey); + const view = getView(); + + if (!relation || !view) { + return null; + }; + + // Subscriptions + const viewRelation = view.getRelation(relationKey); + if (!viewRelation) { + return null; + }; + + const cn = [ 'cellFoot', `cell-key-${relationKey}` ]; + const sections = this.getSections(); + const option = Relation.formulaByType(relation.format).find(it => it.id == String(viewRelation.formulaType)); + + if (viewRelation.formulaType != I.FormulaType.None) { + const subId = S.Record.getSubId(rootId, block.id); + const records = S.Record.getRecords(subId, [ relationKey ], true); + + records.forEach(record => { + const value = record[relationKey]; + }); + }; + + return ( +
this.node = ref} + id={Relation.cellId('foot', relationKey, '')} + className={cn.join(' ')} + onClick={this.onClick} + onMouseEnter={this.onMouseEnter} + onMouseLeave={this.onMouseLeave} + > +
+
+ {isEditing || (result === null) ? ( + this.node = node} - id={id} - type={subType} - value={text} - className={cn.join(' ')} - onMouseDown={onClick} - onMouseEnter={this.onMouseEnter} - onMouseLeave={this.onMouseLeave} - {...U.Common.dataProps(dataset)} - /> - ); - break; - }; - - return content; +const Button = forwardRef(({ + id, + type = 'button', + subType = 'submit', + icon, + arrow, + text = '', + color = 'black', + className = '', + tooltip, + tooltipX, + tooltipY = I.MenuDirection.Bottom, + onClick, + onMouseEnter, + onMouseLeave, + onMouseDown, + dataset +}, ref) => { + const [ isLoading, setIsLoading ] = useState(false); + const nodeRef = useRef(null); + const cn = [ 'button', color, className ]; + + let content = null; + + if (isLoading) { + cn.push('isLoading'); }; - onMouseEnter (e: any) { - const { tooltip, tooltipX, tooltipY, onMouseEnter } = this.props; - const node = $(this.node); - + const handleMouseEnter = (e: MouseEvent) => { if (tooltip) { - Preview.tooltipShow({ text: tooltip, element: node, typeX: tooltipX, typeY: tooltipY }); + Preview.tooltipShow({ text: tooltip, element: $(nodeRef.current), typeX: tooltipX, typeY: tooltipY }); }; - if (onMouseEnter) { + if (onMouseEnter) { onMouseEnter(e); }; }; - - onMouseLeave (e: any) { - Preview.tooltipHide(false); - }; - onClick (e: any) { - const { onClick } = this.props; - const node = $(this.node); + const handleMouseLeave = (e: MouseEvent) => { + Preview.tooltipHide(false); - if (node.hasClass('disabled')) { - return; + if (onMouseLeave) { + onMouseLeave(e); }; + }; - if (onClick) { + const handleClick = (e: MouseEvent) => { + if (!$(nodeRef.current).hasClass('disabled') && onClick) { onClick(e); }; }; - onMouseDown (e: any) { - const { onMouseDown } = this.props; - const node = $(this.node); - - if (node.hasClass('disabled')) { - return; - }; - - if (onMouseDown) { + const handleMouseDown = (e: MouseEvent) => { + if (!$(nodeRef.current).hasClass('disabled') && onMouseDown) { onMouseDown(e); }; }; - setLoading (v: boolean) { - this.setState({ isLoading: v }); - }; - - setDisabled (v: boolean) { - const node = $(this.node); - v ? node.addClass('disabled') : node.removeClass('disabled'); - }; + useImperativeHandle(ref, () => ({ + setLoading: (v: boolean) => setIsLoading(v), + setDisabled: (v: boolean) => $(nodeRef.current).toggleClass('disabled', v), + isDisabled: () => $(nodeRef.current).hasClass('disabled'), + isLoading: () => isLoading, + })); + + switch (type) { + case 'input': { + content = ( + + ); + break; + }; - isDisabled () { - return $(this.node).hasClass('disabled'); + default: { + content = ( +
+ {isLoading && } + {icon && } +
+ {arrow &&
} +
+ ); + }; }; -}; + return content; +}); -export default Button; +export default Button; \ No newline at end of file diff --git a/src/ts/component/form/checkbox.tsx b/src/ts/component/form/checkbox.tsx index 3f32d3e596..f5eccd701f 100644 --- a/src/ts/component/form/checkbox.tsx +++ b/src/ts/component/form/checkbox.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef, useState, useEffect, useImperativeHandle } from 'react'; interface Props { id?: string; @@ -8,86 +8,57 @@ interface Props { onChange?(e: any, value: boolean): void; }; -interface State { - value: boolean; +interface CheckboxRefProps { + getValue: () => boolean; + setValue: (v: boolean) => void; + toggle: () => void; }; -class Checkbox extends React.Component { - - _isMounted = false; - public static defaultProps = { - value: false - }; - - state = { - value: false, - }; - - constructor (props: Props) { - super(props); - - this.onChange = this.onChange.bind(this); - }; +const Checkbox = forwardRef(({ + id = '', + value: initialValue = false, + className = '', + readonly = false, + onChange, +}, ref: any) => { - render () { - const { value } = this.state; - const { id, className, readonly } = this.props; - const cn = [ 'icon', 'checkbox' ]; + const [ value, setValue ] = useState(false); + const cn = [ 'icon', 'checkbox', className ]; - if (className) { - cn.push(className); - }; - if (readonly) { - cn.push('isReadonly'); - }; - if (value) { - cn.push('active'); - }; - - return ( -
- ); + if (readonly) { + cn.push('isReadonly'); }; - - componentDidMount () { - this._isMounted = true; - - this.setValue(this.props.value); + if (value) { + cn.push('active'); }; - - componentWillUnmount () { - this._isMounted = false; - }; - - onChange (e: any) { - const { readonly } = this.props; - const { value } = this.state; + const onChangeHandler = (e: any) => { if (readonly) { return; }; - this.setValue(!value); - if (this.props.onChange) { - this.props.onChange(e, !value); + setValue(!value); + if (onChange) { + onChange(e, !value); }; }; + + useImperativeHandle(ref, () => ({ + getValue: () => value, + setValue, + toggle: () => setValue(!value), + })); - setValue (v: boolean) { - this.setState({ value: Boolean(v) }); - }; + useEffect(() => setValue(initialValue)); - getValue () { - return this.state.value; - }; + return ( +
+ ); - toggle () { - this.setValue(!this.getValue()); - }; -}; +}); -export default Checkbox; +export default Checkbox; \ No newline at end of file diff --git a/src/ts/component/form/drag.tsx b/src/ts/component/form/drag/horizontal.tsx similarity index 96% rename from src/ts/component/form/drag.tsx rename to src/ts/component/form/drag/horizontal.tsx index 8bafec4e79..0c555cb04b 100644 --- a/src/ts/component/form/drag.tsx +++ b/src/ts/component/form/drag/horizontal.tsx @@ -14,7 +14,7 @@ interface Props { const SNAP = 0.025; -class Drag extends React.Component { +class DragHorizontal extends React.Component { public static defaultProps = { value: 0, @@ -40,7 +40,7 @@ class Drag extends React.Component { render () { const { id, className } = this.props; - const cn = [ 'input-drag' ]; + const cn = [ 'input-drag-horizontal' ]; if (className) { cn.push(className); @@ -180,4 +180,4 @@ class Drag extends React.Component { }; -export default Drag; \ No newline at end of file +export default DragHorizontal; \ No newline at end of file diff --git a/src/ts/component/form/drag/vertical.tsx b/src/ts/component/form/drag/vertical.tsx new file mode 100644 index 0000000000..c27220ab73 --- /dev/null +++ b/src/ts/component/form/drag/vertical.tsx @@ -0,0 +1,69 @@ +import React, { useRef, useImperativeHandle, forwardRef, ChangeEvent, MouseEvent } from 'react'; +import { Input } from 'Component'; + +interface Props { + id?: string; + className?: string; + value: number; + min?: number; + max?: number; + step?: number; + onChange? (e: ChangeEvent, v: number): void; + onMouseLeave? (e: MouseEvent): void; + onMouseEnter? (e: MouseEvent): void; +}; + +const DragVertical = forwardRef(({ + id, + className = '', + value, + min = 0, + max = 1, + step = 0.01, + onChange, + onMouseLeave, + onMouseEnter, +}, forwardedRef) => { + const inputRef = useRef(null); + const divRef = useRef(null); + + useImperativeHandle(forwardedRef, () => divRef.current); + + const handleChange = (e: ChangeEvent, value: string) => { + e.preventDefault(); + e.stopPropagation(); + + if (onChange) { + onChange(e, 1 - Number(value) || 0); + }; + }; + + return ( +
+ { + e.preventDefault(); + e.stopPropagation(); + }} + /> +
+
+
+ ); +}); + +export default DragVertical; \ No newline at end of file diff --git a/src/ts/component/form/editable.tsx b/src/ts/component/form/editable.tsx index 299faa7458..c8c029cf70 100644 --- a/src/ts/component/form/editable.tsx +++ b/src/ts/component/form/editable.tsx @@ -41,15 +41,13 @@ class Editable extends React.Component { this.onKeyUp = this.onKeyUp.bind(this); this.onFocus = this.onFocus.bind(this); this.onBlur = this.onBlur.bind(this); + this.onPaste = this.onPaste.bind(this); this.onCompositionStart = this.onCompositionStart.bind(this); this.onCompositionEnd = this.onCompositionEnd.bind(this); }; render () { - const { - id, classNameWrap, classNameEditor, classNamePlaceholder, readonly, placeholder, spellcheck, onSelect, onPaste, - onMouseDown, onMouseUp, onDragStart - } = this.props; + const { id, classNameWrap, classNameEditor, classNamePlaceholder, readonly, placeholder, spellcheck, onSelect, onMouseDown, onMouseUp, onDragStart } = this.props; const cnw = [ 'editableWrap' ]; const cne = [ 'editable' ]; const cnp = [ 'placeholder' ]; @@ -95,7 +93,7 @@ class Editable extends React.Component { onFocus={this.onFocus} onBlur={this.onBlur} onSelect={onSelect} - onPaste={onPaste} + onPaste={this.onPaste} onMouseUp={onMouseUp} onInput={this.onInput} onDragStart={onDragStart} @@ -176,9 +174,17 @@ class Editable extends React.Component { setRange(el, { start: range.from, end: range.to }); }; + onPaste (e: any) { + const { onPaste } = this.props; + + if (onPaste) { + onPaste(e); + }; + }; + onInput (e: any) { const { onInput } = this.props; - + this.placeholderCheck(); if (onInput) { @@ -196,7 +202,8 @@ class Editable extends React.Component { if (maxLength) { const text = this.getTextValue(); - if ((text.length >= maxLength) && !keyboard.isSpecial(e)) { + + if ((text.length >= maxLength) && !keyboard.isSpecial(e) && !keyboard.withCommand(e)) { e.preventDefault(); }; }; diff --git a/src/ts/component/form/filter.tsx b/src/ts/component/form/filter.tsx index c02722742e..122ff11016 100644 --- a/src/ts/component/form/filter.tsx +++ b/src/ts/component/form/filter.tsx @@ -147,10 +147,6 @@ class Filter extends React.Component { this.ref.blur(); }; - setRange (range: I.TextRange) { - this.ref.setRange(range); - }; - onFocus (e: any) { const { placeholderFocus, onFocus } = this.props; @@ -256,9 +252,7 @@ class Filter extends React.Component { }; checkButton () { - const node = $(this.node); - - this.getValue() ? node.addClass('active') : node.removeClass('active'); + $(this.node).toggleClass('active', !!this.getValue()); this.placeholderCheck(); }; @@ -271,6 +265,14 @@ class Filter extends React.Component { return this.ref.getValue(); }; + getRange () { + return this.ref.getRange(); + }; + + setRange (range: I.TextRange) { + this.ref.setRange(range); + }; + placeholderCheck () { this.getValue() ? this.placeholderHide() : this.placeholderShow(); }; diff --git a/src/ts/component/form/input.tsx b/src/ts/component/form/input.tsx index 8b3763a988..8cadd9f427 100644 --- a/src/ts/component/form/input.tsx +++ b/src/ts/component/form/input.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { FC, useEffect, useRef, useState, forwardRef, useImperativeHandle } from 'react'; import $ from 'jquery'; import Inputmask from 'inputmask'; import { I, keyboard } from 'Lib'; @@ -8,7 +8,7 @@ interface Props { name?: string; type?: string; placeholder?: string; - value: string; + value?: string; autoComplete?: string; maxLength?: number; className?: string; @@ -20,6 +20,9 @@ interface Props { pattern?: string; inputMode?: any; noValidate?: boolean; + min?: number; + max?: number; + step?: number; onCompositionStart?(): void; onCompositionEnd?(): void; onInput?(e: any, value: string): void; @@ -36,336 +39,218 @@ interface Props { onClick?(e: any): void; }; -interface State { - value: string; - type: string; +export interface InputRef { + setValue: (v: string) => void; + getValue: () => string; + setType: (v: string) => void; + setError: (v: boolean) => void; + focus: () => void; + blur: () => void; + select: () => void; + setRange: (range: I.TextRange) => void; + getRange: () => I.TextRange; + getSelectionRect: () => DOMRect | null; }; -class Input extends React.Component { +const Input = forwardRef(({ + id = '', + name = '', + type = 'text', + value: initialValue = '', + placeholder = '', + autoComplete = '', + className = '', + readonly = false, + maxLength = null, + multiple = false, + accept = null, + pattern = null, + inputMode = null, + noValidate = true, + min = 0, + max = 0, + step = 0, + focusOnMount = false, + maskOptions = null, + onClick, + onMouseEnter, + onMouseLeave, + onCompositionStart, + onCompositionEnd, + onInput, + onChange, + onPaste, + onCut, + onKeyUp, + onKeyDown, + onFocus, + onBlur, + onSelect, +}, ref) => { + + const [ value, setValue ] = useState(initialValue); + const [ inputType, setInputType ] = useState(type); + const inputRef = useRef(null); + const isFocused = useRef(false); + const rangeRef = useRef(null); + const cn = [ 'input', `input-${inputType}`, className ]; - _isMounted = false; - node: any = null; - mask: any = null; - isFocused = false; - range: I.TextRange = null; - composition = false; - - public static defaultProps = { - type: 'text', - value: '' - }; - - state = { - value: '', - type: '' + if (readonly) { + cn.push('isReadonly'); }; - - constructor (props: Props) { - super(props); - - this.onChange = this.onChange.bind(this); - this.onKeyUp = this.onKeyUp.bind(this); - this.onKeyDown = this.onKeyDown.bind(this); - this.onInput = this.onInput.bind(this); - this.onFocus = this.onFocus.bind(this); - this.onBlur = this.onBlur.bind(this); - this.onPaste = this.onPaste.bind(this); - this.onCut = this.onCut.bind(this); - this.onSelect = this.onSelect.bind(this); - this.onCompositionStart = this.onCompositionStart.bind(this); - this.onCompositionEnd = this.onCompositionEnd.bind(this); - }; - - render () { - const { - id, name, placeholder, className, autoComplete, readonly, maxLength, multiple, accept, pattern, inputMode, noValidate, - onClick, onMouseEnter, onMouseLeave - } = this.props; - const type = String(this.state.type || this.props.type || ''); - const cn = [ 'input', 'input-' + type ]; - if (className) { - cn.push(className); - }; - if (readonly) { - cn.push('isReadonly'); - }; - - return ( - this.node = node} - type={type} - name={name} - id={id} - placeholder={placeholder} - value={this.state.value} - className={cn.join(' ')} - pattern={pattern} - inputMode={inputMode} - formNoValidate={noValidate} - autoComplete={autoComplete ? autoComplete : name} - readOnly={readonly} - onChange={this.onChange} - onKeyUp={this.onKeyUp} - onKeyDown={this.onKeyDown} - onMouseEnter={onMouseEnter} - onMouseLeave={onMouseLeave} - onFocus={this.onFocus} - onBlur={this.onBlur} - onPaste={this.onPaste} - onCut={this.onCut} - onSelect={this.onSelect} - onInput={this.onInput} - onClick={onClick} - onCompositionStart={this.onCompositionStart} - onCompositionEnd={this.onCompositionEnd} - maxLength={maxLength ? maxLength : undefined} - accept={accept ? accept : undefined} - multiple={multiple} - spellCheck={false} - /> - ); + const focus = () => { + inputRef.current?.focus({ preventScroll: true }) }; - - componentDidMount () { - this._isMounted = true; - const { value, type, focusOnMount } = this.props; - - this.setValue(value); - this.setState({ type }); - this.initMask(); + useEffect(() => { + if (maskOptions && inputRef.current) { + new Inputmask(maskOptions.mask, maskOptions).mask($(inputRef.current).get(0)); + }; - if (focusOnMount) { - this.focus(); + if (focusOnMount && inputRef.current) { + focus(); }; - }; - - componentWillUnmount () { - this._isMounted = false; - if (this.isFocused) { - this.isFocused = false; - keyboard.setFocus(false); - keyboard.disableSelection(false); + return () => { + if (isFocused.current) { + keyboard.setFocus(false); + keyboard.disableSelection(false); + }; + }; + }, [ maskOptions, focusOnMount ]); + + useImperativeHandle(ref, () => ({ + focus, + blur: () => inputRef.current?.blur(), + select: () => inputRef.current?.select(), + setValue: (v: string) => setValue(String(v || '')), + getValue: () => String(value || ''), + setType: (v: string) => setInputType(v), + setError: (hasError: boolean) => $(inputRef.current).toggleClass('withError', hasError), + getSelectionRect, + setPlaceholder: (placeholder: string) => $(inputRef.current).attr({ placeholder }), + setRange: (range: I.TextRange) => { + callWithTimeout(() => { + focus(); + inputRef.current?.setSelectionRange(range.from, range.to); + }); + }, + getRange: (): I.TextRange | null => rangeRef.current, + })); + + const handleEvent = ( + handler: ((e: any, value: string) => void) | undefined, + e: React.SyntheticEvent + ) => { + let val = null; + if (e.currentTarget) { + val = e.currentTarget.value; + } else + if (e.target) { + val = String($(e.target).val()); }; - }; - initMask () { - let { maskOptions } = this.props; - if (!maskOptions || !this._isMounted) { + if (val === null) { + console.log('[Input Event] No value to handle!'); return; }; - - maskOptions = maskOptions || {}; - new Inputmask(maskOptions.mask, maskOptions).mask($(this.node).get(0)); + handler?.(e, val); }; - onChange (e: any) { - this.setValue(e.target.value); - - if (this.props.onChange) { - this.props.onChange(e, e.target.value); - }; + const handleChange = (e: React.ChangeEvent) => { + setValue(e.target.value); + handleEvent(onChange, e); }; - - onKeyUp (e: any) { - if ($(this.node).hasClass('disabled')) { - return; - }; - this.setValue(e.target.value); - - if (this.props.onKeyUp) { - this.props.onKeyUp(e, this.state.value); - }; + const handleKeyUp = (e: React.KeyboardEvent) => { + if ($(inputRef.current).hasClass('disabled')) return; + handleEvent(onKeyUp, e); }; - - onKeyDown (e: any) { - if ($(this.node).hasClass('disabled')) { - return; - }; - if (this.props.onKeyDown) { - this.props.onKeyDown(e, this.state.value); - }; + const handleKeyDown = (e: React.KeyboardEvent) => { + if ($(inputRef.current).hasClass('disabled')) return; + handleEvent(onKeyDown, e); }; - onInput (e: any) { - if (this.props.onInput) { - this.props.onInput(e, this.state.value); - }; + const handleInput = (e: React.FormEvent) => { + handleEvent(onInput, e); }; - - onFocus (e: any) { - if (this.props.onFocus) { - this.props.onFocus(e, this.state.value); - }; - - this.isFocused = true; - this.addClass('isFocused'); + const handleFocus = (e: React.FocusEvent) => { + isFocused.current = true; + addClass('isFocused'); keyboard.setFocus(true); keyboard.disableSelection(true); + handleEvent(onFocus, e); }; - - onBlur (e: any) { - if (this.props.onBlur) { - this.props.onBlur(e, this.state.value); - }; - - this.isFocused = false; - this.removeClass('isFocused'); + const handleBlur = (e: React.FocusEvent) => { + isFocused.current = false; + removeClass('isFocused'); keyboard.setFocus(false); keyboard.disableSelection(false); + handleEvent(onBlur, e); }; - - onPaste (e: any) { - e.persist(); - this.callWithTimeout(() => { - this.updateRange(e); - - if (this.props.onPaste) { - this.props.onPaste(e, this.state.value); - }; + const handlePaste = (e: React.ClipboardEvent) => { + e.persist(); + callWithTimeout(() => { + updateRange(e); + handleEvent(onPaste, e); }); }; - onCut (e: any) { + const handleCut = (e: React.ClipboardEvent) => { e.persist(); - - this.callWithTimeout(() => { - this.updateRange(e); - - if (this.props.onCut) { - this.props.onCut(e, this.state.value); - }; + callWithTimeout(() => { + updateRange(e); + handleEvent(onCut, e); }); }; - - onSelect (e: any) { - if (this.props.onSelect) { - this.props.onSelect(e, this.state.value); - }; - this.updateRange(e); + const handleSelect = (e: React.SyntheticEvent) => { + updateRange(e); + handleEvent(onSelect, e); }; - onCompositionStart () { + const handleCompositionStart = () => { keyboard.setComposition(true); - - if (this.props.onCompositionStart) { - this.props.onCompositionStart(); - }; + onCompositionStart?.(); }; - onCompositionEnd () { + const handleCompositionEnd = () => { keyboard.setComposition(false); - - if (this.props.onCompositionEnd) { - this.props.onCompositionEnd(); - }; + onCompositionEnd?.(); }; - getInputElement() { - return $(this.node).get(0) as HTMLInputElement; + const addClass = (className: string) => { + $(inputRef.current).addClass(className); }; - - focus () { - this.callWithTimeout(() => this.getInputElement().focus({ preventScroll: true })); - }; - - blur () { - this.callWithTimeout(() => $(this.node).trigger('blur')); - }; - - select () { - this.callWithTimeout(() => this.getInputElement().select()); - }; - - setValue (v: string) { - if (!this._isMounted) { - return; - }; - - this.state.value = String(v ?? ''); - this.setState({ value: this.state.value }); - }; - - getValue () { - return this.state.value; - }; - - setType (v: string) { - if (this._isMounted) { - this.setState({ type: v }); - }; - }; - - setError (v: boolean) { - if (!this._isMounted) { - return; - }; - const node = $(this.node); - v ? node.addClass('withError') : node.removeClass('withError'); + const removeClass = (className: string) => { + $(inputRef.current).removeClass(className); }; - updateRange (e: any) { + const updateRange = (e: any) => { const { selectionStart, selectionEnd } = e.target; - this.range = { from: selectionStart, to: selectionEnd }; - }; - - setRange (range: I.TextRange) { - this.callWithTimeout(() => { - const el = this.getInputElement(); - - el.focus({ preventScroll: true }); - el.setSelectionRange(range.from, range.to); - }); - }; - - getRange (): I.TextRange { - return this.range; - }; - - addClass (v: string) { - if (this._isMounted) { - $(this.node).addClass(v); - }; - }; - - removeClass (v: string) { - if (this._isMounted) { - $(this.node).removeClass(v); - }; + rangeRef.current = { from: selectionStart, to: selectionEnd }; }; - setPlaceholder (v: string) { - $(this.node).attr({ placeholder: v }); + const callWithTimeout = (callback: () => void) => { + setTimeout(() => callback(), 0); }; - callWithTimeout (callBack: () => void) { - window.setTimeout(() => { - if (this._isMounted) { - callBack(); - }; - }); - }; + const getSelectionRect = (): DOMRect | null => { + const node = $(inputRef.current); + const parent = node.parent(); + const { left, top } = node.position(); + const selectionRange = rangeRef.current; - getSelectionRect (): DOMRect { - if (!this._isMounted) { + if (!selectionRange) { return null; }; - const { id } = this.props; - const node = $(this.node); - const parent = node.parent(); - const { left, top } = node.position(); - const value = this.getValue(); - const range = this.getRange(); const elementId = `${id || 'input'}-clone`; let clone = parent.find(`#${elementId}`); @@ -380,16 +265,55 @@ class Input extends React.Component { width: 'auto', left, top, + visibility: 'hidden', + whiteSpace: 'pre', zIndex: 100, }); - clone.text(value.substring(0, range.to)); + clone.text(value.substring(0, selectionRange.to)); const rect = clone.get(0).getBoundingClientRect() as DOMRect; clone.remove(); return rect; }; - -}; -export default Input; \ No newline at end of file + return ( + + ); +}); + +export default Input; diff --git a/src/ts/component/form/pin.tsx b/src/ts/component/form/pin.tsx index c6671465fc..9860e3dcdc 100644 --- a/src/ts/component/form/pin.tsx +++ b/src/ts/component/form/pin.tsx @@ -11,6 +11,7 @@ interface Props { onSuccess?: (value: string) => void; onError?: () => void; isVisible?: boolean; + readonly?: boolean; }; type State = { @@ -43,10 +44,11 @@ class Pin extends React.Component { timeout = 0; render () { - const { pinLength, isNumeric } = this.props; + const { pinLength, isNumeric, readonly } = this.props; const props: any = { maxLength: 1, onKeyUp: this.onInputKeyUp, + readonly, }; if (isNumeric) { @@ -62,7 +64,7 @@ class Pin extends React.Component { onPaste={e => this.onPaste(e, i)} onFocus={() => this.onInputFocus(i)} onKeyDown={e => this.onInputKeyDown(e, i)} - onChange={(_, value) => this.onInputChange(i, value)} + onChange={(_, value) => this.onInputChange(i, value)} {...props} /> ))} @@ -219,4 +221,4 @@ class Pin extends React.Component { }; -export default Pin; \ No newline at end of file +export default Pin; diff --git a/src/ts/component/form/select.tsx b/src/ts/component/form/select.tsx index 111fc48b11..f61f1a4a76 100644 --- a/src/ts/component/form/select.tsx +++ b/src/ts/component/form/select.tsx @@ -188,11 +188,11 @@ class Select extends React.Component { const menuParam = Object.assign({ element, noFlipX: true, - onOpen: () => { + onOpen: (context: any) => { window.setTimeout(() => $(element).addClass('isFocused')); if (onOpen) { - onOpen(); + onOpen(context); }; }, onClose: () => { diff --git a/src/ts/component/form/switch.tsx b/src/ts/component/form/switch.tsx index 172727d549..4b085a4580 100644 --- a/src/ts/component/form/switch.tsx +++ b/src/ts/component/form/switch.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef, useRef, useState, useEffect, useImperativeHandle } from 'react'; interface Props { id?: string; @@ -9,79 +9,61 @@ interface Props { onChange?(e: any, value: boolean): void; }; -class Switch extends React.Component { - - public static defaultProps = { - value: false, - color: 'orange', - }; - - node: any = null; - value = false; +interface SwitchRefProps { + getValue (): boolean; + setValue (value: boolean): void; +}; - constructor (props: Props) { - super(props); - - this.onChange = this.onChange.bind(this); - }; +const Switch = forwardRef(({ + id = '', + value: initialValue = false, + color = 'orange', + className = '', + readonly = false, + onChange, +}, ref: any) => { - render () { - const { id, color, className, readonly } = this.props; - const cn = [ 'switch', color ]; + const nodeRef = useRef(null); + const [ value, setValue ] = useState(initialValue); + const cn = [ 'switch', color, className ]; - if (className) { - cn.push(className); - }; - if (readonly) { - cn.push('isReadonly'); - }; - - return ( -
this.node = node} - id={id} - className={cn.join(' ')} - onClick={this.onChange} - > -
-
- ); + if (value) { + cn.push('active'); }; - - componentDidMount () { - this.setValue(this.props.value); + if (readonly) { + cn.push('isReadonly'); }; - componentDidUpdate () { - this.setValue(this.props.value); - }; - - onChange (e: any) { - const { onChange, readonly } = this.props; - + const onChangeHandler = (e: any) => { if (readonly) { return; }; - const value = !this.value; + setValue(!value); - this.setValue(value); if (onChange) { - onChange(e, value); + onChange(e, !value); }; }; - - setValue (value: boolean) { - const node = $(this.node); - this.value = value; - value ? node.addClass('active') : node.removeClass('active'); - }; - - getValue () { - return this.value; - }; + useEffect(() => setValue(initialValue)); + + useImperativeHandle(ref, () => ({ + getValue: () => value, + setValue: (value: boolean) => setValue(value), + })); -}; + return ( +
+
+
+ ); + +}); export default Switch; \ No newline at end of file diff --git a/src/ts/component/form/textarea.tsx b/src/ts/component/form/textarea.tsx index fe1b18bf95..bd41fe9fec 100644 --- a/src/ts/component/form/textarea.tsx +++ b/src/ts/component/form/textarea.tsx @@ -183,7 +183,7 @@ class Textarea extends React.Component { }; setError (v: boolean) { - v ? this.addClass('withError') : this.removeClass('withError'); + $(this.node).toggleClass('withError', v); }; addClass (v: string) { diff --git a/src/ts/component/util/graph.tsx b/src/ts/component/graph/provider.tsx similarity index 99% rename from src/ts/component/util/graph.tsx rename to src/ts/component/graph/provider.tsx index f519746094..11ec34949f 100644 --- a/src/ts/component/util/graph.tsx +++ b/src/ts/component/graph/provider.tsx @@ -175,6 +175,7 @@ const Graph = observer(class Graph extends React.Component { }; nodeMapper (d: any) { + d = d || {}; d.layout = Number(d.layout) || 0; d.radius = 4; d.src = U.Graph.imageSrc(d); @@ -393,7 +394,7 @@ const Graph = observer(class Graph extends React.Component { }); keyboard.shortcut('backspace, delete', e, () => { - Action.archive(this.ids, () => { + Action.archive(this.ids, analytics.route.graph, () => { this.nodes = this.nodes.filter(d => !this.ids.includes(d.id)); this.send('onRemoveNode', { ids: this.ids }); }); @@ -520,7 +521,7 @@ const Graph = observer(class Graph extends React.Component { }; addNewNode (id: string, sourceId?: string, param?: any, callBack?: (object: any) => void) { - U.Object.getById(id, (object: any) => { + U.Object.getById(id, {}, (object: any) => { object = this.nodeMapper(object); if (param) { diff --git a/src/ts/component/header/index.tsx b/src/ts/component/header/index.tsx index 0a380b7410..d60d6e358a 100644 --- a/src/ts/component/header/index.tsx +++ b/src/ts/component/header/index.tsx @@ -4,6 +4,7 @@ import { Icon } from 'Component'; import HeaderAuthIndex from './auth'; import HeaderMainObject from './main/object'; +import HeaderMainChat from './main/chat'; import HeaderMainHistory from './main/history'; import HeaderMainGraph from './main/graph'; import HeaderMainNavigation from './main/navigation'; @@ -17,6 +18,7 @@ interface Props extends I.HeaderComponent { const Components = { authIndex: HeaderAuthIndex, mainObject: HeaderMainObject, + mainChat: HeaderMainChat, mainHistory: HeaderMainHistory, mainGraph: HeaderMainGraph, mainNavigation: HeaderMainNavigation, @@ -56,17 +58,19 @@ class Header extends React.Component { return ( ); }; @@ -134,7 +138,9 @@ class Header extends React.Component { }; onDoubleClick () { - Renderer.send('winCommand', 'maximize'); + if (U.Common.isPlatformMac()) { + Renderer.send('winCommand', 'maximize'); + }; }; menuOpen (id: string, elementId: string, param: Partial) { diff --git a/src/ts/component/header/main/chat.tsx b/src/ts/component/header/main/chat.tsx new file mode 100644 index 0000000000..87a68cca4a --- /dev/null +++ b/src/ts/component/header/main/chat.tsx @@ -0,0 +1,60 @@ +import * as React from 'react'; +import { observer } from 'mobx-react'; +import { Sync } from 'Component'; +import { I, S, U, J, keyboard } from 'Lib'; + +interface State { + templatesCnt: number; +}; + +const HeaderMainChat = observer(class HeaderMainChat extends React.Component { + + state = { + templatesCnt: 0 + }; + + constructor (props: I.HeaderComponent) { + super(props); + + this.onSync = this.onSync.bind(this); + this.onOpen = this.onOpen.bind(this); + }; + + render () { + const { rootId, renderLeftIcons } = this.props; + + return ( + +
+ {renderLeftIcons(this.onOpen)} + +
+ +
+
+ + ); + }; + + onOpen () { + const { rootId } = this.props; + const object = S.Detail.get(rootId, rootId, []); + + keyboard.disableClose(true); + S.Popup.closeAll(null, () => U.Object.openRoute(object)); + }; + + onSync () { + const { rootId, menuOpen } = this.props; + + menuOpen('syncStatus', '#button-header-sync', { + subIds: [ 'syncStatusInfo' ], + data: { + rootId, + } + }); + }; + +}); + +export default HeaderMainChat; \ No newline at end of file diff --git a/src/ts/component/header/main/object.tsx b/src/ts/component/header/main/object.tsx index ef0a0fc493..730d4363a5 100644 --- a/src/ts/component/header/main/object.tsx +++ b/src/ts/component/header/main/object.tsx @@ -87,7 +87,7 @@ const HeaderMainObject = observer(class HeaderMainObject extends React.Component
{renderLeftIcons(this.onOpen)} - {canSync ? : ''} + {canSync ? : ''}
@@ -142,7 +142,6 @@ const HeaderMainObject = observer(class HeaderMainObject extends React.Component const { rootId, menuOpen } = this.props; menuOpen('syncStatus', '#button-header-sync', { - horizontal: I.MenuDirection.Left, subIds: [ 'syncStatusInfo' ], data: { rootId, diff --git a/src/ts/component/index.tsx b/src/ts/component/index.tsx index 20bbc6ded5..f91b9b802e 100644 --- a/src/ts/component/index.tsx +++ b/src/ts/component/index.tsx @@ -11,6 +11,8 @@ import DropTarget from './drag/target'; import SelectionProvider from './selection/provider'; import SelectionTarget from './selection/target'; +import GraphProvider from './graph/provider'; + import ListPopup from './list/popup'; import ListMenu from './list/menu'; import ListNotification from './list/notification'; @@ -51,7 +53,8 @@ import Checkbox from './form/checkbox'; import Textarea from './form/textarea'; import Button from './form/button'; import Select from './form/select'; -import Drag from './form/drag'; +import DragHorizontal from './form/drag/horizontal'; +import DragVertical from './form/drag/vertical'; import Pin from './form/pin'; import Filter from './form/filter'; import Phrase from './form/phrase'; @@ -74,8 +77,6 @@ import PreviewLink from './preview/link'; import PreviewObject from './preview/object'; import PreviewDefault from './preview/default'; -import Graph from './util/graph'; - import Cell from './block/dataview/cell'; import ObjectName from './util/object/name'; @@ -93,6 +94,8 @@ import ShareTooltip from './util/share/tooltip'; import ShareBanner from './util/share/banner'; import FooterAuthDisclaimer from './footer/auth/disclaimer'; +import EmailCollectionForm from './util/emailCollectionForm'; + export { Page, EditorPage, @@ -106,6 +109,8 @@ export { SelectionProvider, SelectionTarget, + GraphProvider, + ListPopup, ListMenu, ListChildren, @@ -132,7 +137,8 @@ export { Button, Select, Toast, - Drag, + DragHorizontal, + DragVertical, Marker, Tag, Loader, @@ -159,7 +165,6 @@ export { PreviewObject, PreviewDefault, - Graph, Cell, Sidebar, @@ -182,5 +187,7 @@ export { ProgressBar, ShareTooltip, ShareBanner, - FooterAuthDisclaimer + FooterAuthDisclaimer, + + EmailCollectionForm, }; diff --git a/src/ts/component/list/objectManager.tsx b/src/ts/component/list/objectManager.tsx index 8a221adccf..6c8c4ac9c1 100644 --- a/src/ts/component/list/objectManager.tsx +++ b/src/ts/component/list/objectManager.tsx @@ -6,62 +6,69 @@ import { Checkbox, Filter, Icon, IconObject, Loader, ObjectName, EmptySearch, Ob import { I, S, U, J, translate } from 'Lib'; interface Props { - subId: string; - rowLength: number; - withArchived: boolean; - buttons: I.ButtonComponent[]; + subId: string; + rowLength: number; + buttons: I.ButtonComponent[]; info?: I.ObjectManagerItemInfo, - iconSize: number; - textEmpty: string; - filters?: I.Filter[]; + iconSize: number; + textEmpty: string; + filters?: I.Filter[]; sorts?: I.Sort[]; - rowHeight?: number; - sources?: string[]; + rowHeight?: number; + sources?: string[]; collectionId?: string; + isReadonly?: boolean; + ignoreArchived: boolean; + ignoreHidden: boolean; resize?: () => void; onAfterLoad?: (message: any) => void; - isReadonly?: boolean; }; interface State { - isLoading: boolean; + isLoading: boolean; }; const ListObjectManager = observer(class ListObjectManager extends React.Component { - _isMounted = false; - state = { - isLoading: false, - }; - - top = 0; - offset = 0; - cache: any = null; - refList: List = null; - refFilter: Filter = null; - refCheckbox: Map = new Map(); - selected: string[] = []; - timeout = 0; - - constructor (props: Props) { - super(props); - - this.onScroll = this.onScroll.bind(this); - this.onFilterShow = this.onFilterShow.bind(this); - this.onFilterChange = this.onFilterChange.bind(this); - this.onFilterClear = this.onFilterClear.bind(this); - this.onSelectAll = this.onSelectAll.bind(this); - }; - - render () { - if (!this.cache) { - return null; - }; - - const { isLoading } = this.state; - const { buttons, rowHeight, iconSize, info, isReadonly } = this.props; - const items = this.getItems(); - const cnControls = [ 'controls' ]; + _isMounted = false; + state = { + isLoading: false, + }; + + public static defaultProps = { + ignoreArchived: true, + ignoreHidden: true, + isReadonly: false, + }; + + top = 0; + offset = 0; + cache: any = null; + refList: List = null; + refFilter: Filter = null; + refCheckbox: Map = new Map(); + selected: string[] = []; + timeout = 0; + + constructor (props: Props) { + super(props); + + this.onScroll = this.onScroll.bind(this); + this.onFilterShow = this.onFilterShow.bind(this); + this.onFilterChange = this.onFilterChange.bind(this); + this.onFilterClear = this.onFilterClear.bind(this); + this.onSelectAll = this.onSelectAll.bind(this); + }; + + render () { + if (!this.cache) { + return null; + }; + + const { isLoading } = this.state; + const { buttons, rowHeight, iconSize, info, isReadonly } = this.props; + const items = this.getItems(); + const cnControls = [ 'controls' ]; const filter = this.getFilterValue(); if (filter) { @@ -69,16 +76,16 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone }; let textEmpty = String(this.props.textEmpty || ''); - let buttonsList: I.ButtonComponent[] = []; + let buttonsList: I.ButtonComponent[] = []; - if (this.selected.length) { + if (this.selected.length) { cnControls.push('withSelected'); - buttonsList.push({ icon: 'checkbox active', text: translate('commonDeselectAll'), onClick: this.onSelectAll }); - buttonsList = buttonsList.concat(buttons); - } else { - buttonsList.push({ icon: 'checkbox', text: translate('commonSelectAll'), onClick: this.onSelectAll }); - }; + buttonsList.push({ icon: 'checkbox active', text: translate('commonDeselectAll'), onClick: this.onSelectAll }); + buttonsList = buttonsList.concat(buttons); + } else { + buttonsList.push({ icon: 'checkbox', text: translate('commonSelectAll'), onClick: this.onSelectAll }); + }; if (isReadonly) { buttonsList = []; @@ -103,15 +110,15 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone return itemInfo; }; - const Button = (item: any) => ( -
- -
{item.text}
-
- ); + const Button = (item: any) => ( +
+ +
{item.text}
+
+ ); - const Item = (item: any) => ( -
+ const Item = (item: any) => ( +
{isReadonly ? '' : ( this.refCheckbox.set(item.id, ref)} @@ -119,7 +126,7 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone onChange={e => this.onClick(e, item)} /> )} -
U.Object.openConfig(item)}> +
U.Object.openConfig(item)}>
@@ -128,31 +135,31 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone
-
- ); - - const rowRenderer = (param: any) => { - const item = items[param.index]; - - return ( - {}} - > -
- {item.children.map((item: any, i: number) => ( - - ))} -
-
- ); - }; - - let controls = ( +
+ ); + + const rowRenderer = (param: any) => { + const item = items[param.index]; + + return ( + {}} + > +
+ {item.children.map((item: any, i: number) => ( + + ))} +
+
+ ); + }; + + let controls = (
@@ -174,172 +181,172 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone
- ); + ); - let content = null; - if (!items.length) { - if (!filter) { - controls = null; - } else { + let content = null; + if (!items.length) { + if (!filter) { + controls = null; + } else { textEmpty = U.Common.sprintf(translate('popupSearchNoObjects'), filter); }; - content = ; - } else { - content = ( -
- {isLoading ? : ( - {}} - isRowLoaded={({ index }) => true} - > - {({ onRowsRendered }) => ( - - {({ height, isScrolling, registerChild, scrollTop }) => ( - - {({ width, height }) => ( - this.refList = ref} - width={width} - height={height} - deferredMeasurmentCache={this.cache} - rowCount={items.length} - rowHeight={rowHeight || 64} - rowRenderer={rowRenderer} - onRowsRendered={onRowsRendered} - overscanRowCount={10} - onScroll={this.onScroll} - scrollToAlignment="start" - /> - )} - - )} - - )} - - )} -
- ); - }; - - return ( -
- {controls} - {content} -
- ); - }; - - componentDidMount () { - const { resize } = this.props; - - this._isMounted = true; - this.load(); - - if (resize) { - resize(); - }; - }; - - componentDidUpdate () { - const { subId, resize, rowHeight } = this.props; - const records = S.Record.getRecordIds(subId, ''); - const items = this.getItems(); - - if (!this.cache) { - this.cache = new CellMeasurerCache({ - fixedWidth: true, - defaultHeight: rowHeight || 64, - keyMapper: i => (items[i] || {}).id, - }); - this.forceUpdate(); - }; - - records.forEach(id => { - const check = this.refCheckbox.get(id); - if (check) { - check.setValue(this.selected.includes(id)); - }; - }); - - if (resize) { - resize(); - }; - - if (this.refList) { - this.refList.recomputeRowHeights(); - }; - }; - - componentWillUnmount () { - this._isMounted = false; - window.clearTimeout(this.timeout); - }; - - onFilterShow () { - const node = $(ReactDOM.findDOMNode(this)); - const wrapper = node.find('#filterWrapper'); - - wrapper.addClass('active'); - this.refFilter.focus(); - }; - - onFilterChange () { - window.clearTimeout(this.timeout); - this.timeout = window.setTimeout(() => this.load(), J.Constant.delay.keyboard); - }; - - onFilterClear () { - const node = $(ReactDOM.findDOMNode(this)); - const wrapper = node.find('#filterWrapper'); - - S.Menu.closeAll(J.Menu.store); - wrapper.removeClass('active'); - }; - - onClick (e: React.MouseEvent, item: any) { - e.stopPropagation(); - - const { subId } = this.props; - const records = S.Record.getRecordIds(subId, ''); - - if (e.shiftKey) { - const idx = records.findIndex(id => id == item.id); - - if ((idx >= 0) && (this.selected.length > 0)) { - const indexes = this.getSelectedIndexes().filter(i => i != idx); - const closest = U.Common.findClosestElement(indexes, idx); - - if (isFinite(closest)) { - const [ start, end ] = this.getSelectionRange(closest, idx); - this.selected = this.selected.concat(records.slice(start, end)); - }; - }; - } else { - if (this.selected.includes(item.id)) { - this.selected = this.selected.filter(it => it != item.id); - } else { - this.selected.push(item.id); - }; - }; - - this.selected = U.Common.arrayUnique(this.selected); - this.forceUpdate(); - }; - - getSelectedIndexes () { - const { subId } = this.props; - const records = S.Record.getRecordIds(subId, ''); - const indexes = this.selected.map(id => records.findIndex(it => it == id)); - - return indexes.filter(idx => idx >= 0); - }; - - getSelectionRange (index1: number, index2: number) { - const [ start, end ] = (index1 >= index2) ? [ index2, index1 ] : [ index1 + 1, index2 + 1 ]; - return [ start, end ]; - }; + content = ; + } else { + content = ( +
+ {isLoading ? : ( + {}} + isRowLoaded={({ index }) => true} + > + {({ onRowsRendered }) => ( + + {({ height, isScrolling, registerChild, scrollTop }) => ( + + {({ width, height }) => ( + this.refList = ref} + width={width} + height={height} + deferredMeasurmentCache={this.cache} + rowCount={items.length} + rowHeight={rowHeight || 64} + rowRenderer={rowRenderer} + onRowsRendered={onRowsRendered} + overscanRowCount={10} + onScroll={this.onScroll} + scrollToAlignment="start" + /> + )} + + )} + + )} + + )} +
+ ); + }; + + return ( +
+ {controls} + {content} +
+ ); + }; + + componentDidMount () { + const { resize } = this.props; + + this._isMounted = true; + this.load(); + + if (resize) { + resize(); + }; + }; + + componentDidUpdate () { + const { subId, resize, rowHeight } = this.props; + const records = S.Record.getRecordIds(subId, ''); + const items = this.getItems(); + + if (!this.cache) { + this.cache = new CellMeasurerCache({ + fixedWidth: true, + defaultHeight: rowHeight || 64, + keyMapper: i => (items[i] || {}).id, + }); + this.forceUpdate(); + }; + + records.forEach(id => { + const check = this.refCheckbox.get(id); + if (check) { + check.setValue(this.selected.includes(id)); + }; + }); + + if (resize) { + resize(); + }; + + if (this.refList) { + this.refList.recomputeRowHeights(); + }; + }; + + componentWillUnmount () { + this._isMounted = false; + window.clearTimeout(this.timeout); + }; + + onFilterShow () { + const node = $(ReactDOM.findDOMNode(this)); + const wrapper = node.find('#filterWrapper'); + + wrapper.addClass('active'); + this.refFilter.focus(); + }; + + onFilterChange () { + window.clearTimeout(this.timeout); + this.timeout = window.setTimeout(() => this.load(), J.Constant.delay.keyboard); + }; + + onFilterClear () { + const node = $(ReactDOM.findDOMNode(this)); + const wrapper = node.find('#filterWrapper'); + + S.Menu.closeAll(J.Menu.store); + wrapper.removeClass('active'); + }; + + onClick (e: React.MouseEvent, item: any) { + e.stopPropagation(); + + const { subId } = this.props; + const records = S.Record.getRecordIds(subId, ''); + + if (e.shiftKey) { + const idx = records.findIndex(id => id == item.id); + + if ((idx >= 0) && (this.selected.length > 0)) { + const indexes = this.getSelectedIndexes().filter(i => i != idx); + const closest = U.Common.findClosestElement(indexes, idx); + + if (isFinite(closest)) { + const [ start, end ] = this.getSelectionRange(closest, idx); + this.selected = this.selected.concat(records.slice(start, end)); + }; + }; + } else { + if (this.selected.includes(item.id)) { + this.selected = this.selected.filter(it => it != item.id); + } else { + this.selected.push(item.id); + }; + }; + + this.selected = U.Common.arrayUnique(this.selected); + this.forceUpdate(); + }; + + getSelectedIndexes () { + const { subId } = this.props; + const records = S.Record.getRecordIds(subId, ''); + const indexes = this.selected.map(id => records.findIndex(it => it == id)); + + return indexes.filter(idx => idx >= 0); + }; + + getSelectionRange (index1: number, index2: number) { + const [ start, end ] = (index1 >= index2) ? [ index2, index1 ] : [ index1 + 1, index2 + 1 ]; + return [ start, end ]; + }; setSelectedRange (start: number, end: number) { const { subId } = this.props; @@ -358,82 +365,83 @@ const ListObjectManager = observer(class ListObjectManager extends React.Compone this.forceUpdate(); }; - onSelectAll () { - this.selected.length ? this.selectionClear() : this.selectionAll(); - }; - - selectionAll () { - const { subId } = this.props; - this.selected = S.Record.getRecordIds(subId, ''); - this.forceUpdate(); - }; - - selectionClear () { - this.selected = []; - this.forceUpdate(); - }; - - onScroll ({ scrollTop }) { - this.top = scrollTop; - }; - - load () { - const { subId, sources, withArchived, collectionId, onAfterLoad } = this.props; - const filter = this.getFilterValue(); - const filters = [].concat(this.props.filters || []); + onSelectAll () { + this.selected.length ? this.selectionClear() : this.selectionAll(); + }; + + selectionAll () { + const { subId } = this.props; + this.selected = S.Record.getRecordIds(subId, ''); + this.forceUpdate(); + }; + + selectionClear () { + this.selected = []; + this.forceUpdate(); + }; + + onScroll ({ scrollTop }) { + this.top = scrollTop; + }; + + load () { + const { subId, sources, ignoreArchived, ignoreHidden, collectionId, onAfterLoad } = this.props; + const filter = this.getFilterValue(); + const filters = [].concat(this.props.filters || []); const sorts = [].concat(this.props.sorts || []); - if (filter) { - filters.push({ relationKey: 'name', condition: I.FilterCondition.Like, value: filter }); - }; + if (filter) { + filters.push({ relationKey: 'name', condition: I.FilterCondition.Like, value: filter }); + }; - this.setState({ isLoading: true }); + this.setState({ isLoading: true }); - U.Data.searchSubscribe({ - subId, - sorts, - filters, - withArchived, - sources: sources || [], + U.Data.searchSubscribe({ + subId, + sorts, + filters, + ignoreArchived, + ignoreHidden, + sources: sources || [], collectionId: collectionId || '' - }, (message) => { + }, (message) => { this.setState({ isLoading: false }); if (onAfterLoad) { onAfterLoad(message); }; - }); - }; - - getItems () { - const { subId, rowLength } = this.props; - const ret: any[] = []; - const records = S.Record.getRecords(subId); - - let row = { children: [] }; - let n = 0; - - for (const item of records) { - row.children.push(item); - - n++; - if (n == rowLength) { - ret.push(row); - row = { children: [] }; - n = 0; - }; - }; - - if (row.children.length < rowLength) { - ret.push(row); - }; - - return ret.filter(it => it.children.length > 0); - }; - - getFilterValue () { - return this.refFilter ? this.refFilter.getValue() : ''; - }; + }); + }; + + getItems () { + const { subId, rowLength } = this.props; + const ret: any[] = []; + const records = S.Record.getRecords(subId); + + let row = { children: [] }; + let n = 0; + + for (const item of records) { + row.children.push(item); + + n++; + if (n == rowLength) { + ret.push(row); + row = { children: [] }; + n = 0; + }; + }; + + if (row.children.length < rowLength) { + ret.push(row); + }; + + return ret.filter(it => it.children.length > 0); + }; + + getFilterValue () { + return this.refFilter ? this.refFilter.getValue() : ''; + }; }); diff --git a/src/ts/component/list/popup.tsx b/src/ts/component/list/popup.tsx index 5ce20af4c5..9a6d380cf9 100644 --- a/src/ts/component/list/popup.tsx +++ b/src/ts/component/list/popup.tsx @@ -19,10 +19,7 @@ const ListPopup = observer(class ListPopup extends React.Component 0 ? body.addClass('overPopup') : body.removeClass('overPopup'); + $('body').toggleClass('overPopup', S.Popup.list.length > 0); }; }); diff --git a/src/ts/component/list/previewObject.tsx b/src/ts/component/list/previewObject.tsx index ad93b7fbcd..7faae71ed1 100644 --- a/src/ts/component/list/previewObject.tsx +++ b/src/ts/component/list/previewObject.tsx @@ -256,8 +256,8 @@ class ListObjectPreview extends React.Component { const isFirst = this.page == 0; const isLast = this.page == this.getMaxPage(); - isFirst ? arrowLeft.addClass('dn') : arrowRight.removeClass('dn'); - isLast ? arrowRight.addClass('dn') : arrowRight.removeClass('dn'); + arrowLeft.toggleClass('dn', isFirst); + arrowRight.toggleClass('dn', isLast); }; }; diff --git a/src/ts/component/menu/block/add.tsx b/src/ts/component/menu/block/add.tsx index 3d849a3e22..da86b5eb22 100644 --- a/src/ts/component/menu/block/add.tsx +++ b/src/ts/component/menu/block/add.tsx @@ -246,10 +246,10 @@ const MenuBlockAdd = observer(class MenuBlockAdd extends React.Component }; checkFilter () { + const { getId } = this.props; const { filter } = S.Common; - const obj = $('#menuBlockAdd'); - - filter ? obj.addClass('withFilter') : obj.removeClass('withFilter'); + + $(`#${getId()}`).toggleClass('withFilter', !!filter); }; rebind () { diff --git a/src/ts/component/menu/block/link.tsx b/src/ts/component/menu/block/link.tsx index 05c3b06801..53aba1bd8d 100644 --- a/src/ts/component/menu/block/link.tsx +++ b/src/ts/component/menu/block/link.tsx @@ -286,7 +286,7 @@ const MenuBlockLink = observer(class MenuBlockLink extends React.Component { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/block/link/settings.tsx b/src/ts/component/menu/block/link/settings.tsx index 0070c369da..5aa1bdb7bc 100644 --- a/src/ts/component/menu/block/link/settings.tsx +++ b/src/ts/component/menu/block/link/settings.tsx @@ -34,13 +34,13 @@ const MenuBlockLinkSettings = observer(class MenuBlockLinkSettings extends React
); - return ( -
+ return ( +
{sections.map((section: any, i: number) => (
))} -
- ); +
+ ); }; componentDidMount () { @@ -136,19 +136,19 @@ const MenuBlockLinkSettings = observer(class MenuBlockLinkSettings extends React getContent () { const { param } = this.props; - const { data } = param; - const { rootId, blockId } = data; - const block = S.Block.getLeaf(rootId, blockId); - const object = S.Detail.get(rootId, block.getTargetObjectId()); + const { data } = param; + const { rootId, blockId } = data; + const block = S.Block.getLeaf(rootId, blockId); + const object = S.Detail.get(rootId, block.getTargetObjectId()); - return U.Data.checkLinkSettings(block.content, object.layout); + return U.Data.checkLinkSettings(block.content, object.layout); }; getStyles () { return [ { id: I.LinkCardStyle.Text, name: translate('menuBlockLinkSettingsStyleText'), icon: 'style-text' }, { id: I.LinkCardStyle.Card, name: translate('menuBlockLinkSettingsStyleCard'), icon: 'style-card' }, - ].map((it: any) => { + ].map((it: any) => { it.icon = 'linkStyle' + it.id; return it; }); @@ -176,40 +176,40 @@ const MenuBlockLinkSettings = observer(class MenuBlockLinkSettings extends React getSections () { const { param } = this.props; - const { data } = param; - const { rootId, blockId } = data; - const block = S.Block.getLeaf(rootId, blockId); + const { data } = param; + const { rootId, blockId } = data; + const block = S.Block.getLeaf(rootId, blockId); if (!block) { return []; }; - const object = S.Detail.get(rootId, block.getTargetObjectId()); - const content = this.getContent(); + const object = S.Detail.get(rootId, block.getTargetObjectId()); + const content = this.getContent(); const isCard = content.cardStyle == I.LinkCardStyle.Card; const isText = content.cardStyle == I.LinkCardStyle.Text; const isTask = U.Object.isTaskLayout(object.layout); const isNote = U.Object.isNoteLayout(object.layout); - const canIcon = !isTask && !isNote; + const canIcon = !isTask && !isNote; const canIconSize = canIcon && isCard; const canIconSwitch = canIcon && isText; - const canCover = !isNote && isCard; - const canDescription = !isNote; + const canCover = !isNote && isCard; + const canDescription = !isNote; - const styles = this.getStyles(); + const styles = this.getStyles(); const style = styles.find(it => it.id == content.cardStyle) || styles[0]; let icon: any = {}; - let icons: any[] = []; + let icons: any[] = []; let description: any = {}; let descriptions: any[] = []; - if (canIcon) { + if (canIcon) { icons = this.getIcons(); icon = icons.find(it => it.id == content.iconSize) || icons[0]; - }; + }; if (canDescription) { descriptions = this.getDescriptions(); @@ -275,20 +275,20 @@ const MenuBlockLinkSettings = observer(class MenuBlockLinkSettings extends React }; save (id: string, v: any) { - const { param } = this.props; - const { data } = param; - const { rootId, blockId, blockIds } = data; - const block = S.Block.getLeaf(rootId, blockId); + const { param } = this.props; + const { data } = param; + const { rootId, blockId, blockIds } = data; + const block = S.Block.getLeaf(rootId, blockId); if (!block) { return; }; - const content = U.Common.objectCopy(block.content || {}); + const content = U.Common.objectCopy(block.content || {}); - content[id] = v; + content[id] = v; C.BlockLinkListSetAppearance(rootId, blockIds, content.iconSize, content.cardStyle, content.description, content.relations); - }; + }; hasRelationKey (key: string) { const content = this.getContent(); diff --git a/src/ts/component/menu/block/mention.tsx b/src/ts/component/menu/block/mention.tsx index c2ceb65dac..ed4eaaa091 100644 --- a/src/ts/component/menu/block/mention.tsx +++ b/src/ts/component/menu/block/mention.tsx @@ -280,7 +280,7 @@ const MenuBlockMention = observer(class MenuBlockMention extends React.Component }; loadMoreRows ({ startIndex, stopIndex }) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/button.tsx b/src/ts/component/menu/button.tsx index a54b8e3e6a..b85cc8c6c4 100644 --- a/src/ts/component/menu/button.tsx +++ b/src/ts/component/menu/button.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; +import { observer } from 'mobx-react'; import { MenuItemVertical } from 'Component'; import { I } from 'Lib'; -import { observer } from 'mobx-react'; const MenuButton = observer(class MenuButton extends React.Component { diff --git a/src/ts/component/menu/dataview/calendar/day.tsx b/src/ts/component/menu/dataview/calendar/day.tsx index fbaef7c8c4..4ff741b74b 100644 --- a/src/ts/component/menu/dataview/calendar/day.tsx +++ b/src/ts/component/menu/dataview/calendar/day.tsx @@ -129,7 +129,7 @@ const MenuCalendarDay = observer(class MenuCalendarDay extends React.Component U.Date.date('j-n-Y', it[relationKey]) == current); const relation = S.Record.getRelationByKey(relationKey); - if (!readonly && !relation.isReadonlyValue && onCreate) { + if (!readonly && relation && !relation.isReadonlyValue && onCreate) { ret.push({ id: 'add', icon: 'plus', name: translate('commonCreateNewObject') }); }; diff --git a/src/ts/component/menu/dataview/context.tsx b/src/ts/component/menu/dataview/context.tsx index 9e27154e34..0689025c6c 100644 --- a/src/ts/component/menu/dataview/context.tsx +++ b/src/ts/component/menu/dataview/context.tsx @@ -172,7 +172,7 @@ class MenuContext extends React.Component { allowedCollection = false; }; - if (archiveCnt == length) { + if (archiveCnt && (archiveCnt == length)) { allowedOpen = false; allowedLinkTo = false; allowedUnlink = false; @@ -416,13 +416,13 @@ class MenuContext extends React.Component { }; case 'archive': { - Action.archive(objectIds, cb); + Action.archive(objectIds, route, cb); win.trigger('removeGraphNode', { ids: objectIds }); break; }; case 'unarchive': { - Action.restore(objectIds, cb); + Action.restore(objectIds, route, cb); break; }; diff --git a/src/ts/component/menu/dataview/file/list.tsx b/src/ts/component/menu/dataview/file/list.tsx index 8a5a7d38a6..71b966a267 100644 --- a/src/ts/component/menu/dataview/file/list.tsx +++ b/src/ts/component/menu/dataview/file/list.tsx @@ -274,7 +274,7 @@ const MenuDataviewFileList = observer(class MenuDataviewFileList extends React.C }; loadMoreRows ({ startIndex, stopIndex }) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/dataview/file/values.tsx b/src/ts/component/menu/dataview/file/values.tsx index 5283f5fc77..33c73565be 100644 --- a/src/ts/component/menu/dataview/file/values.tsx +++ b/src/ts/component/menu/dataview/file/values.tsx @@ -27,7 +27,7 @@ const MenuDataviewFileValues = observer(class MenuDataviewFileValues extends Rea const { canEdit } = data; const items = this.getItems(); - const Handle = SortableHandle(() => ( + const Handle = SortableHandle(() => ( )); @@ -42,7 +42,7 @@ const MenuDataviewFileValues = observer(class MenuDataviewFileValues extends Rea position()} /> ); - const Item = SortableElement((item: any) => { + const Item = SortableElement((item: any) => { const cn = [ 'item' ]; let content = null; @@ -78,7 +78,7 @@ const MenuDataviewFileValues = observer(class MenuDataviewFileValues extends Rea ); }); - const List = SortableContainer(() => ( + const List = SortableContainer(() => (
{items.map((item: any, i: number) => )}
@@ -129,13 +129,13 @@ const MenuDataviewFileValues = observer(class MenuDataviewFileValues extends Rea this._isMounted = false; S.Menu.closeAll([ 'dataviewFileList' ]); - }; + }; onSortStart () { keyboard.disableSelection(true); }; - - onSortEnd (result: any) { + + onSortEnd (result: any) { const { oldIndex, newIndex } = result; const { param, id } = this.props; const { data } = param; @@ -145,7 +145,7 @@ const MenuDataviewFileValues = observer(class MenuDataviewFileValues extends Rea this.save(value); keyboard.disableSelection(false); - }; + }; onAdd (e: any) { const { getId, getSize, param } = this.props; diff --git a/src/ts/component/menu/dataview/filter/list.tsx b/src/ts/component/menu/dataview/filter/list.tsx index aa47c7adde..3deda00fe1 100644 --- a/src/ts/component/menu/dataview/filter/list.tsx +++ b/src/ts/component/menu/dataview/filter/list.tsx @@ -225,13 +225,16 @@ const MenuFilterList = observer(class MenuFilterList extends React.Component { - loadData(view.id, 0); - }); + C.BlockDataviewFilterRemove(rootId, blockId, view.id, [ item.id ], () => loadData(view.id, 0)); S.Menu.close('select'); analytics.event('RemoveFilter', { diff --git a/src/ts/component/menu/dataview/filter/values.tsx b/src/ts/component/menu/dataview/filter/values.tsx index 03b97fb3f0..7a6eecc783 100644 --- a/src/ts/component/menu/dataview/filter/values.tsx +++ b/src/ts/component/menu/dataview/filter/values.tsx @@ -345,7 +345,7 @@ const MenuDataviewFilterValues = observer(class MenuDataviewFilterValues extends this.unbind(); S.Menu.closeAll(J.Menu.cell); - }; + }; rebind () { this.unbind(); @@ -383,6 +383,10 @@ const MenuDataviewFilterValues = observer(class MenuDataviewFilterValues extends }; const item = view.getFilter(itemId); + if (!item) { + return []; + }; + const relation: any = S.Record.getRelationByKey(item.relationKey) || {}; const relationOptions = this.getRelationOptions(); const relationOption: any = relationOptions.find(it => it.id == item.relationKey) || {}; @@ -513,7 +517,7 @@ const MenuDataviewFilterValues = observer(class MenuDataviewFilterValues extends // Remove value when we change relation, filter non unique entries if (k == 'relationKey') { const relation = S.Record.getRelationByKey(v); - const conditions = Relation.filterConditionsByType(relation.format); + const conditions = Relation.filterConditionsByType(relation?.format); item.condition = conditions.length ? conditions[0].id : I.FilterCondition.None; item.quickOption = I.FilterQuickOption.ExactDate; @@ -728,14 +732,9 @@ const MenuDataviewFilterValues = observer(class MenuDataviewFilterValues extends }; checkClear (v: any) { - if (!this._isMounted) { - return; + if (this._isMounted) { + $(this.node).find('.icon.clear').toggleClass('active', v); }; - - const node = $(this.node); - const clear = node.find('.icon.clear'); - - v ? clear.addClass('active') : clear.removeClass('active'); }; onClear (e: any) { diff --git a/src/ts/component/menu/dataview/object/list.tsx b/src/ts/component/menu/dataview/object/list.tsx index a52e0ffd52..993b273655 100644 --- a/src/ts/component/menu/dataview/object/list.tsx +++ b/src/ts/component/menu/dataview/object/list.tsx @@ -358,7 +358,7 @@ const MenuDataviewObjectList = observer(class MenuDataviewObjectList extends Rea }; loadMoreRows ({ startIndex, stopIndex }) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/dataview/template/context.tsx b/src/ts/component/menu/dataview/template/context.tsx index 6d31233728..a2151a5fd4 100644 --- a/src/ts/component/menu/dataview/template/context.tsx +++ b/src/ts/component/menu/dataview/template/context.tsx @@ -125,7 +125,7 @@ class MenuTemplateContext extends React.Component { }; case 'remove': { - Action.archive([ template.id ], onArchive); + Action.archive([ template.id ], route, onArchive); break; }; }; diff --git a/src/ts/component/menu/dataview/template/list.tsx b/src/ts/component/menu/dataview/template/list.tsx index e201d4cc54..5b3bc45bd3 100644 --- a/src/ts/component/menu/dataview/template/list.tsx +++ b/src/ts/component/menu/dataview/template/list.tsx @@ -324,7 +324,7 @@ const MenuTemplateList = observer(class MenuTemplateList extends React.Component const { getId, param } = this.props; const { data } = param; const { onTypeChange } = data; - const allowedLayouts = U.Object.getPageLayouts().concat(U.Object.getSetLayouts()).concat(I.ObjectLayout.Chat); + const allowedLayouts = U.Object.getPageLayouts().concat(U.Object.getSetLayouts()); S.Menu.open('typeSuggest', { element: `#${getId()} #defaultType`, diff --git a/src/ts/component/menu/dataview/view/settings.tsx b/src/ts/component/menu/dataview/view/settings.tsx index 0872221e7d..657029c55a 100644 --- a/src/ts/component/menu/dataview/view/settings.tsx +++ b/src/ts/component/menu/dataview/view/settings.tsx @@ -83,6 +83,10 @@ const MenuViewSettings = observer(class MenuViewSettings extends React.Component }; componentDidUpdate () { + const { param } = this.props; + const { data } = param; + + this.param = U.Common.objectCopy(data.view.get()); this.setName(); this.resize(); this.focus(); @@ -199,7 +203,7 @@ const MenuViewSettings = observer(class MenuViewSettings extends React.Component const { data } = param; const { rootId, blockId, onSave, readonly } = data; const block = S.Block.getLeaf(rootId, blockId); - const view = data.view.get(); + const view = data.view ? data.view.get() : null; if (readonly || !block || !view) { return; @@ -312,9 +316,7 @@ const MenuViewSettings = observer(class MenuViewSettings extends React.Component width: getSize().width, data, noAnimation: true, - onOpen: (context) => { - this.menuContext = context; - } + onOpen: context => this.menuContext = context, }; if (item.data) { diff --git a/src/ts/component/menu/graph/settings.tsx b/src/ts/component/menu/graph/settings.tsx index 92f7e450d9..92021b6322 100644 --- a/src/ts/component/menu/graph/settings.tsx +++ b/src/ts/component/menu/graph/settings.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import $ from 'jquery'; import { observer } from 'mobx-react'; import { I, S, J, keyboard, translate, analytics } from 'Lib'; -import { MenuItemVertical, Drag } from 'Component'; +import { MenuItemVertical, DragHorizontal } from 'Component'; const MenuGraphSettings = observer(class MenuGraphSettings extends React.Component { @@ -38,7 +38,7 @@ const MenuGraphSettings = observer(class MenuGraphSettings extends React.Compone
{values[item.id]}
- { return [ { id: 'whatsNew', document: 'whatsNew', caption: btn }, { id: 'shortcut', caption: 'Ctrl+Space' }, - // { id: 'hints' }, { isDiv: true }, { id: 'gallery' }, { id: 'community' }, @@ -131,37 +130,6 @@ class MenuHelp extends React.Component { break; }; - case 'hints': { - const isPopup = keyboard.isPopup(); - const rootId = keyboard.getRootId(); - const isEditor = keyboard.isMainEditor(); - const isSet = keyboard.isMainSet(); - - let key = ''; - - if (isEditor && home && (rootId == home.id)) { - key = 'basics'; - } else - if (isSet) { - key = 'mainSet'; - } else - if (isEditor) { - key = S.Block.checkBlockTypeExists(rootId) ? 'objectCreationStart' : 'basics'; - } else - if (isGraph) { - key = 'mainGraph'; - } else { - const { page, action } = keyboard.getMatch().params; - - key = U.Common.toCamelCase([ page, action ].join('-')); - }; - - if (key) { - Onboarding.start(key, isPopup, true); - }; - break; - }; - }; }; diff --git a/src/ts/component/menu/index.tsx b/src/ts/component/menu/index.tsx index d6604fcad1..5a70a5d023 100644 --- a/src/ts/component/menu/index.tsx +++ b/src/ts/component/menu/index.tsx @@ -7,6 +7,7 @@ import { I, S, U, J, keyboard, analytics, Storage, sidebar } from 'Lib'; import MenuHelp from './help'; import MenuOnboarding from './onboarding'; +import MenuParticipant from './participant'; import MenuSelect from './select'; import MenuButton from './button'; @@ -86,6 +87,7 @@ const Components: any = { help: MenuHelp, onboarding: MenuOnboarding, + participant: MenuParticipant, select: MenuSelect, button: MenuButton, @@ -538,7 +540,7 @@ const Menu = observer(class Menu extends React.Component { let y = oy; let flipX = false; - if (stickToElementEdge) { + if (stickToElementEdge != I.MenuDirection.None) { switch (stickToElementEdge) { case I.MenuDirection.Top: offsetY = -eh; break; case I.MenuDirection.Bottom: offsetY = eh; break; diff --git a/src/ts/component/menu/item/filter.tsx b/src/ts/component/menu/item/filter.tsx index 39dee6c108..dc23fc8f42 100644 --- a/src/ts/component/menu/item/filter.tsx +++ b/src/ts/component/menu/item/filter.tsx @@ -177,7 +177,7 @@ const MenuItemFilter = observer(class MenuItemFilter extends React.Component; - }; + }; componentDidMount () { this._isMounted = true; diff --git a/src/ts/component/menu/item/relationView.tsx b/src/ts/component/menu/item/relationView.tsx index 466dea7596..be4fed5d79 100644 --- a/src/ts/component/menu/item/relationView.tsx +++ b/src/ts/component/menu/item/relationView.tsx @@ -111,7 +111,7 @@ const MenuItemRelationView = observer(class MenuItemRelationView extends React.C ) : ''}
); - }; + }; componentDidMount () { this._isMounted = true; diff --git a/src/ts/component/menu/item/vertical.tsx b/src/ts/component/menu/item/vertical.tsx index edb1a926f0..45574151eb 100644 --- a/src/ts/component/menu/item/vertical.tsx +++ b/src/ts/component/menu/item/vertical.tsx @@ -10,7 +10,7 @@ class MenuItemVertical extends React.Component { render () { const { id, icon, object, inner, name, description, caption, color, arrow, checkbox, isActive, withDescription, withSwitch, withSelect, withMore, - className, style, iconSize, switchValue, selectValue, options, readonly, withDefault, onClick, onSwitch, onSelect, onMouseEnter, onMouseLeave, onMore, + className, style, iconSize, switchValue, selectValue, options, readonly, onClick, onSwitch, onSelect, onMouseEnter, onMouseLeave, onMore, selectMenuParam, subComponent, note, sortArrow } = this.props; const cn = [ 'item' ]; @@ -168,7 +168,7 @@ class MenuItemVertical extends React.Component { {content}
); - }; + }; componentDidMount () { this.resize(); @@ -181,12 +181,9 @@ class MenuItemVertical extends React.Component { resize () { const node = $(this.node); - if (node.hasClass('withIcon')) { - return; + if (!node.hasClass('withIcon')) { + node.toggleClass('withIconObject', !!node.find('.iconObject').length); }; - - const icon = node.find('.iconObject'); - icon.length ? node.addClass('withIconObject') : node.removeClass('withIconObject'); }; }; diff --git a/src/ts/component/menu/object.tsx b/src/ts/component/menu/object.tsx index db00e4f89a..3edfdd2d03 100644 --- a/src/ts/component/menu/object.tsx +++ b/src/ts/component/menu/object.tsx @@ -117,6 +117,7 @@ class MenuObject extends React.Component { let createWidget = { id: 'createWidget', icon: 'createWidget', name: translate('menuObjectCreateWidget') }; let downloadFile = { id: 'downloadFile', icon: 'download', name: translate('commonDownload') }; let openFile = { id: 'openFile', icon: 'expand', name: translate('menuObjectDownloadOpen') }; + let openObject = { id: 'openAsObject', icon: 'expand', name: translate('commonOpenObject') }; if (isTemplate) { template = { id: 'pageCreate', icon: 'template', name: translate('commonCreateObject') }; @@ -181,25 +182,27 @@ class MenuObject extends React.Component { const allowedPrint = !isFilePreview; const allowedDownloadFile = U.Object.isInFileLayouts(object.layout); const allowedOpenFile = U.Object.isInFileLayouts(object.layout); - - if (!allowedArchive) archive = null; - if (!allowedLock) pageLock = null; - if (!allowedCopy) pageCopy = null; - if (!allowedReload) pageReload = null; - if (!allowedSearch) search = null; - if (!allowedHistory) history = null; - if (!allowedFav) fav = null; + const allowedOpenObject = isFilePreview; + + if (!allowedArchive) archive = null; + if (!allowedLock) pageLock = null; + if (!allowedCopy) pageCopy = null; + if (!allowedReload) pageReload = null; + if (!allowedSearch) search = null; + if (!allowedHistory) history = null; + if (!allowedFav) fav = null; if (!allowedInstall && !allowedUninstall) pageInstall = null; if (!isTemplate && !allowedTemplate) template = null; - if (allowedUninstall) archive = null; - if (!allowedWidget) createWidget = null; - if (!allowedLinkTo) linkTo = null; - if (!allowedPageLink) pageLink = null; + if (allowedUninstall) archive = null; + if (!allowedWidget) createWidget = null; + if (!allowedLinkTo) linkTo = null; + if (!allowedPageLink) pageLink = null; if (!allowedAddCollection) addCollection = null; - if (!allowedExport) pageExport = null; - if (!allowedPrint) print = null; + if (!allowedExport) pageExport = null; + if (!allowedPrint) print = null; if (!allowedDownloadFile) downloadFile = null; if (!allowedOpenFile) openFile = null; + if (!allowedOpenObject) openObject = null; if (!canWrite) { template = null; @@ -213,33 +216,37 @@ class MenuObject extends React.Component { pageCopy = null; }; - sections = [ + sections = sections.concat([ + { children: [ openObject ] }, { children: [ createWidget, fav, pageLock, history ] }, { children: [ linkTo, addCollection ] }, { children: [ search, pageLink, pageInstall, pageCopy, archive, remove ] }, { children: [ print ] }, { children: [ openFile, downloadFile ] }, - ]; + ]); } else { if (isTemplate) { - sections = [ + sections = sections.concat([ + { children: [ openObject ] }, { children: [ search, template, pageCopy, setDefaultTemplate, pageExport, archive, history ] }, { children: [ print ] }, - ]; + ]); } else if (object.isArchived) { - sections = [ + sections = sections.concat([ + { children: [ openObject ] }, { children: [ search, pageExport, remove, archive ] }, { children: [ print ] }, - ]; + ]); } else { - sections = [ + sections = sections.concat([ + { children: [ openObject ] }, { children: [ createWidget, fav, pageLock ] }, { children: [ linkTo, addCollection, template ] }, { children: [ search, history, pageCopy, archive ] }, { children: [ pageLink, pageReload ] }, { children: [ print, pageExport ] }, - ]; + ]); }; sections = sections.map((it: any, i: number) => ({ ...it, id: 'page' + i })); @@ -429,7 +436,7 @@ class MenuObject extends React.Component { }; case 'pageArchive': { - Action.archive([ object.id ], () => { + Action.archive([ object.id ], route, () => { if (onArchive) { onArchive(); } else { @@ -440,7 +447,7 @@ class MenuObject extends React.Component { }; case 'pageUnarchive': { - Action.restore([ object.id ]); + Action.restore([ object.id ], route); break; }; @@ -538,6 +545,11 @@ class MenuObject extends React.Component { Action.downloadFile(object.id, route, U.Object.isImageLayout(object.layout)); break; }; + + case 'openAsObject': { + U.Object.openAuto(object); + break; + }; }; if (close) { diff --git a/src/ts/component/menu/onboarding.tsx b/src/ts/component/menu/onboarding.tsx index ee03c5e1c0..3d2bd538e5 100644 --- a/src/ts/component/menu/onboarding.tsx +++ b/src/ts/component/menu/onboarding.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import $ from 'jquery'; import raf from 'raf'; import { observer } from 'mobx-react'; -import { Button, Icon, Label } from 'Component'; +import { Button, Icon, Label, EmailCollectionForm } from 'Component'; import { I, C, S, U, J, Onboarding, analytics, keyboard, translate } from 'Lib'; import ReactCanvasConfetti from 'react-canvas-confetti'; @@ -29,7 +29,7 @@ const MenuOnboarding = observer(class MenuSelect extends React.Component 1; + const withEmailForm = key == 'emailCollection'; let buttons = []; let category = ''; @@ -88,6 +89,9 @@ const MenuOnboarding = observer(class MenuSelect extends React.Component ) : ''} + {withEmailForm ? ( + close()} /> + ) : ''}
{withSteps ? ( @@ -246,10 +250,19 @@ const MenuOnboarding = observer(class MenuSelect extends React.Component { + + render () { + const object = this.getObject(); + + if (!object) { + return ; + }; + + const relationKey = object.globalName ? 'globalName': 'identity'; + + return ( + + + + + ); + }; + + componentDidMount () { + this.load(); + }; + + getObject () { + return this.props.param.data.object; + }; + + load () { + const object = this.getObject(); + if (!object) { + return; + }; + + U.Object.getById(object.id, { keys: U.Data.participantRelationKeys() }, (object: any) => { + if (object) { + this.props.param.data.object = object; + }; + }); + }; + +}); + +export default MenuParticipant; \ No newline at end of file diff --git a/src/ts/component/menu/quickCapture.tsx b/src/ts/component/menu/quickCapture.tsx index ca2e447273..f3409c9507 100644 --- a/src/ts/component/menu/quickCapture.tsx +++ b/src/ts/component/menu/quickCapture.tsx @@ -218,7 +218,7 @@ class MenuQuickCapture extends React.Component { load (clear: boolean, callBack?: (message: any) => void) { const filter = String(this.filter || ''); - const layouts = U.Object.getPageLayouts().concat(U.Object.getSetLayouts()).concat(I.ObjectLayout.Chat); + const layouts = U.Object.getPageLayouts().concat(U.Object.getSetLayouts()); const filters: any[] = [ { relationKey: 'layout', condition: I.FilterCondition.In, value: I.ObjectLayout.Type }, @@ -316,7 +316,7 @@ class MenuQuickCapture extends React.Component { } else { const pinned = pinnedIds.map(id => S.Record.getTypeById(id)).filter(it => it).slice(0, LIMIT_PINNED); - items = U.Data.getObjectTypesForNewObject({ withChat: true }).filter(it => !pinnedIds.includes(it.id)); + items = U.Data.getObjectTypesForNewObject().filter(it => !pinnedIds.includes(it.id)); items = items.slice(0, LIMIT_PINNED - pinned.length); items.push(S.Record.getSetType()); items.push(S.Record.getCollectionType()); @@ -673,7 +673,7 @@ class MenuQuickCapture extends React.Component { obj.find('.item').each((i: number, item: any) => { item = $(item); - item.find('.iconObject').length ? item.addClass('withIcon') : item.removeClass('withIcon'); + item.toggleClass('withIcon', !!item.find('.iconObject').length); }); obj.css({ width: Math.min(ww - J.Size.menuBorder * 2 - sw, Math.ceil(obj.outerWidth())) }); diff --git a/src/ts/component/menu/relation/suggest.tsx b/src/ts/component/menu/relation/suggest.tsx index 204872c002..90a64f7add 100644 --- a/src/ts/component/menu/relation/suggest.tsx +++ b/src/ts/component/menu/relation/suggest.tsx @@ -207,7 +207,7 @@ const MenuRelationSuggest = observer(class MenuRelationSuggest extends React.Com }; loadMoreRows ({ startIndex, stopIndex }) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/search/text.tsx b/src/ts/component/menu/search/text.tsx index 7cd0d5ce38..92d0d62e4b 100644 --- a/src/ts/component/menu/search/text.tsx +++ b/src/ts/component/menu/search/text.tsx @@ -143,7 +143,7 @@ class MenuSearchText extends React.Component { return; }; - const value = this.ref.getValue(); + const value = this.ref?.getValue(); if (value && (this.last == value)) { return; }; @@ -195,7 +195,8 @@ class MenuSearchText extends React.Component { }); this.items = this.container.get(0).querySelectorAll(tag) || []; - this.items.length ? switcher.addClass('active') : switcher.removeClass('active'); + + switcher.toggleClass('active', !!this.items.length); this.setCnt(); this.focus(); diff --git a/src/ts/component/menu/select.tsx b/src/ts/component/menu/select.tsx index a4b8d27cea..ab84f1e27b 100644 --- a/src/ts/component/menu/select.tsx +++ b/src/ts/component/menu/select.tsx @@ -34,7 +34,7 @@ const MenuSelect = observer(class MenuSelect extends React.Component { render () { const { param } = this.props; const { data } = param; - const { filter, value, disabled, placeholder, noVirtualisation, withDefault, menuLabel } = data; + const { filter, value, disabled, placeholder, noVirtualisation, menuLabel } = data; const items = this.getItems(true); const withFilter = this.isWithFilter(); @@ -416,7 +416,11 @@ const MenuSelect = observer(class MenuSelect extends React.Component { const { data } = param; const value = Relation.getArrayValue(data.value); - return item.checkbox || value.includes(String(item.id)); + if (undefined !== item.checkbox) { + return item.checkbox; + }; + + return value.includes(String(item.id)); }; resize () { @@ -449,10 +453,10 @@ const MenuSelect = observer(class MenuSelect extends React.Component { content.css({ height }); }; - withFilter ? obj.addClass('withFilter') : obj.removeClass('withFilter'); - withAdd ? obj.addClass('withAdd') : obj.removeClass('withAdd'); - noScroll ? obj.addClass('noScroll') : obj.removeClass('noScroll'); - noVirtualisation ? obj.addClass('noVirtualisation') : obj.removeClass('noVirtualisation'); + obj.toggleClass('withFilter', !!withFilter); + obj.toggleClass('withAdd', !!withAdd); + obj.toggleClass('noScroll', !!noScroll); + obj.toggleClass('noVirtualisation', !!noVirtualisation); position(); }; diff --git a/src/ts/component/menu/type/suggest.tsx b/src/ts/component/menu/type/suggest.tsx index ae6824168c..8bf8685ce5 100644 --- a/src/ts/component/menu/type/suggest.tsx +++ b/src/ts/component/menu/type/suggest.tsx @@ -207,7 +207,7 @@ const MenuTypeSuggest = observer(class MenuTypeSuggest extends React.Component { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, resolve); }); diff --git a/src/ts/component/menu/widget.tsx b/src/ts/component/menu/widget.tsx index 6bbe1e4a53..ef0a63a777 100644 --- a/src/ts/component/menu/widget.tsx +++ b/src/ts/component/menu/widget.tsx @@ -6,14 +6,14 @@ import { I, C, S, U, J, keyboard, translate, Action, analytics } from 'Lib'; const MenuWidget = observer(class MenuWidget extends React.Component { - _isMounted = false; + _isMounted = false; node: any = null; - n = -1; + n = -1; target = null; layout: I.WidgetLayout = null; limit = 0; - constructor (props: I.Menu) { + constructor (props: I.Menu) { super(props); const { param } = this.props; @@ -31,11 +31,11 @@ const MenuWidget = observer(class MenuWidget extends React.Component { }; }; - render(): React.ReactNode { + render(): React.ReactNode { const { param } = this.props; const { data } = param; const { isEditing } = data; - const sections = this.getSections(); + const sections = this.getSections(); const Section = item => (
@@ -76,7 +76,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { ) : ''}
); - } + } componentDidMount () { this._isMounted = true; @@ -103,7 +103,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { $(window).trigger(`updateWidgetData.${blockId}`); }; - rebind (): void { + rebind (): void { this.unbind(); $(window).on('keydown.menu', e => this.props.onKeyDown(e)); window.setTimeout(() => this.props.setActive(), 15); @@ -121,7 +121,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { button.addClass((this.target !== null) && (this.layout !== null) ? 'black' : 'blank disabled'); }; - getSections () { + getSections () { this.checkState(); const { param } = this.props; @@ -191,7 +191,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { this.limit = limitOptions.includes(this.limit) ? this.limit : (limitOptions.length ? limitOptions[0] : null); }; - getItems () { + getItems () { const sections = this.getSections(); let items = []; @@ -201,7 +201,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { return items; }; - onMouseEnter (e: React.MouseEvent, item): void { + onMouseEnter (e: React.MouseEvent, item): void { if (!keyboard.isMouseDisabled) { this.props.setActive(item, false); this.onOver(e, item); @@ -358,13 +358,13 @@ const MenuWidget = observer(class MenuWidget extends React.Component { close(); }; - save (): void { + save (): void { const { close, param } = this.props; const { data } = param; const { isEditing, onSave } = data; const { widgets } = S.Block; - if (!this.target || (this.layout === null)) { + if (!this.target || (this.layout === null)) { return; }; @@ -388,7 +388,7 @@ const MenuWidget = observer(class MenuWidget extends React.Component { }); close(); - }; + }; getTargetId (): string { const { param } = this.props; diff --git a/src/ts/component/page/auth/animation/constants.ts b/src/ts/component/page/auth/animation/constants.ts index 76482fb0c6..c7b04d53d5 100644 --- a/src/ts/component/page/auth/animation/constants.ts +++ b/src/ts/component/page/auth/animation/constants.ts @@ -27,16 +27,16 @@ export enum OnboardStage { export const StatePropertyMap = { Void: { - zoom: 6.7, + zoom: 6.7, }, Offline: { - zoom: 1, + zoom: 1, }, SoulCreating: { - zoom: 6.7, + zoom: 6.7, }, SpaceCreating: { - zoom: 35, + zoom: 35, }, } as const; diff --git a/src/ts/component/page/auth/deleted.tsx b/src/ts/component/page/auth/deleted.tsx index 4794b91bdc..e6e6f794ea 100644 --- a/src/ts/component/page/auth/deleted.tsx +++ b/src/ts/component/page/auth/deleted.tsx @@ -19,7 +19,7 @@ const PageAuthDeleted = observer(class PageAuthDeleted extends React.Component @@ -97,7 +97,7 @@ const PageAuthDeleted = observer(class PageAuthDeleted extends React.Component
- Log out + {translate('popupSettingsLogout')}
); diff --git a/src/ts/component/page/auth/login.tsx b/src/ts/component/page/auth/login.tsx index 164270f08f..adf6f7aa39 100644 --- a/src/ts/component/page/auth/login.tsx +++ b/src/ts/component/page/auth/login.tsx @@ -32,7 +32,7 @@ const PageAuthLogin = observer(class PageAuthLogin extends React.Component this.node = ref}>
@@ -196,14 +196,14 @@ const PageAuthLogin = observer(class PageAuthLogin extends React.Component { node: HTMLDivElement = null; - refFrame: Frame = null; - refPhrase: Phrase = null; - refNext: Button = null; - refName: Input = null; + refFrame: any = null; + refPhrase: any = null; + refNext: any = null; + refName: any = null; state: State = { stage: Stage.Vault, @@ -30,9 +30,6 @@ const PageAuthOnboard = observer(class PageAuthOnboard extends React.Component (this.node = ref)} + ref={ref => this.node = ref} className={`stage${Stage[stage]}`} > {this.canMoveBack() ? : ''} - (this.refFrame = ref)}> + this.refFrame = ref}> <Label id="label" className="animation" text={translate(`authOnboard${Stage[stage]}Label`)} /> @@ -163,7 +160,7 @@ const PageAuthOnboard = observer(class PageAuthOnboard extends React.Component<I }; if (account && (stage == Stage.Phrase)) { - Renderer.send('keytarGet', account.id).then(value => this.refPhrase.setValue(value)); + Renderer.send('keytarGet', account.id).then(value => this.refPhrase?.setValue(value)); }; this.refFrame?.resize(); @@ -194,7 +191,7 @@ const PageAuthOnboard = observer(class PageAuthOnboard extends React.Component<I /** Guard to prevent illegal state change */ canMoveForward (): boolean { - return !this.isDelayed && !!Stage[this.state.stage]; + return !!Stage[this.state.stage] && !this.refNext?.isLoading(); }; /** Guard to prevent illegal state change */ @@ -248,6 +245,7 @@ const PageAuthOnboard = observer(class PageAuthOnboard extends React.Component<I onRouteChange: () => { S.Common.fullscreenObjectSet(true); S.Common.showRelativeDatesSet(true); + S.Common.showObjectSet(false); U.Space.initSpaceState(); Onboarding.start('basics', false); diff --git a/src/ts/component/page/auth/select.tsx b/src/ts/component/page/auth/select.tsx index b385af9dc2..ec9debab21 100644 --- a/src/ts/component/page/auth/select.tsx +++ b/src/ts/component/page/auth/select.tsx @@ -14,7 +14,7 @@ class PageAuthSelect extends React.Component<I.PageComponent, State> { }; constructor (props: I.PageComponent) { - super(props); + super(props); this.onLogin = this.onLogin.bind(this); this.onRegister = this.onRegister.bind(this); @@ -23,7 +23,7 @@ class PageAuthSelect extends React.Component<I.PageComponent, State> { render () { const { error } = this.state; - return ( + return ( <div ref={ref => this.node = ref}> <Header {...this.props} component="authIndex" /> <Frame> diff --git a/src/ts/component/page/auth/setup.tsx b/src/ts/component/page/auth/setup.tsx index 5b6752d309..5b88f9404b 100644 --- a/src/ts/component/page/auth/setup.tsx +++ b/src/ts/component/page/auth/setup.tsx @@ -77,7 +77,7 @@ const PageAuthSetup = observer(class PageAuthSetup extends React.Component<I.Pag </Frame> </div> ); - }; + }; componentDidMount () { const { match } = this.props; @@ -100,8 +100,6 @@ const PageAuthSetup = observer(class PageAuthSetup extends React.Component<I.Pag }; componentDidUpdate (): void { - this.refFrame.resize(); - Animation.to(); }; diff --git a/src/ts/component/page/elements/head/banner.tsx b/src/ts/component/page/elements/head/banner.tsx index ddb15f90e9..1402a6d0c6 100644 --- a/src/ts/component/page/elements/head/banner.tsx +++ b/src/ts/component/page/elements/head/banner.tsx @@ -32,7 +32,14 @@ class HeaderBanner extends React.Component<Props> { switch (type) { case I.BannerType.IsArchived: { label = translate('deletedBanner'); - action = <div className="action" onClick={e => Action.restore([ object.id ])}>{translate('deletedBannerRestore')}</div>; + action = ( + <div + className="action" + onClick={() => Action.restore([ object.id ], analytics.route.banner)} + > + {translate('deletedBannerRestore')} + </div> + ); break; }; diff --git a/src/ts/component/page/elements/head/controlButtons.tsx b/src/ts/component/page/elements/head/controlButtons.tsx index 4282f752d9..7a7b0ad72e 100644 --- a/src/ts/component/page/elements/head/controlButtons.tsx +++ b/src/ts/component/page/elements/head/controlButtons.tsx @@ -49,7 +49,7 @@ const ControlButtons = observer(class ControlButtons extends React.Component<Pro let allowedLayout = !checkType && allowedDetails && !isInSets && !isChat && !isType; let allowedIcon = !checkType && allowedDetails && !isTask && !isNote && !isBookmark; - let allowedCover = !checkType && allowedDetails && !isNote; + let allowedCover = !checkType && allowedDetails && !isNote && !isType; if (root.isLocked() || readonly) { allowedIcon = false; @@ -215,9 +215,7 @@ const ControlButtons = observer(class ControlButtons extends React.Component<Pro resize () { const { ww } = U.Common.getWindowDimensions(); - const node = $(this.node); - - ww <= 900 ? node.addClass('small') : node.removeClass('small'); + $(this.node).toggleClass('small', ww <= 900); }; }); diff --git a/src/ts/component/page/elements/head/editor.tsx b/src/ts/component/page/elements/head/editor.tsx index ab1b7e1a58..e536d34771 100644 --- a/src/ts/component/page/elements/head/editor.tsx +++ b/src/ts/component/page/elements/head/editor.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import $ from 'jquery'; import { observer } from 'mobx-react'; import { I, M, C, S, U, keyboard } from 'Lib'; -import { Block, Drag } from 'Component'; +import { Block, DragHorizontal } from 'Component'; interface Props extends I.BlockComponent { setLayoutWidth?(v: number): void; @@ -45,7 +45,7 @@ const PageHeadEditor = observer(class PageHeadEditor extends React.Component<Pro return ( <div ref={node => this.node = node}> <div id="editorSize" className="dragWrap"> - <Drag + <DragHorizontal ref={ref => this.refDrag = ref} value={root.fields.width} snaps={[ 0.25, 0.5, 0.75 ]} diff --git a/src/ts/component/page/elements/head/simple.tsx b/src/ts/component/page/elements/head/simple.tsx index 9426363966..d35382dc09 100644 --- a/src/ts/component/page/elements/head/simple.tsx +++ b/src/ts/component/page/elements/head/simple.tsx @@ -186,9 +186,7 @@ const HeadSimple = observer(class Controls extends React.Component<Props> { onKeyDown (e: any, item: any) { if (item.id == 'title') { - keyboard.shortcut('enter', e, (pressed: string) => { - e.preventDefault(); - }); + keyboard.shortcut('enter', e, () => e.preventDefault()); }; }; @@ -214,11 +212,12 @@ const HeadSimple = observer(class Controls extends React.Component<Props> { }; getRange (id: string): I.TextRange { - return this.refEditable[id] ? this.refEditable[id].getRange() : null; + return this.refEditable[id]?.getRange(); }; getValue (id: string): string { - return this.refEditable[id] ? this.refEditable[id].getTextValue() : null; + const value = String(this.refEditable[id]?.getTextValue() || ''); + return U.Common.stripTags(value); }; setValue () { diff --git a/src/ts/component/page/main/archive.tsx b/src/ts/component/page/main/archive.tsx index b6d842a3a6..996bd4e70b 100644 --- a/src/ts/component/page/main/archive.tsx +++ b/src/ts/component/page/main/archive.tsx @@ -46,7 +46,7 @@ const PageMainArchive = observer(class PageMainArchive extends React.Component<I filters={filters} sorts={sorts} rowLength={this.getRowLength()} - withArchived={true} + ignoreArchived={false} buttons={buttons} iconSize={48} resize={this.resize} @@ -69,7 +69,7 @@ const PageMainArchive = observer(class PageMainArchive extends React.Component<I return; }; - Action.restore(this.refManager.selected || []); + Action.restore(this.refManager.selected || [], analytics.route.archive); this.selectionClear(); }; diff --git a/src/ts/component/page/main/chat.tsx b/src/ts/component/page/main/chat.tsx index dfa0dec684..e5d8dca597 100644 --- a/src/ts/component/page/main/chat.tsx +++ b/src/ts/component/page/main/chat.tsx @@ -3,9 +3,7 @@ import $ from 'jquery'; import raf from 'raf'; import { observer } from 'mobx-react'; import { Header, Footer, Loader, Block, Deleted } from 'Component'; -import { I, M, C, S, U, J, Action, keyboard, translate, sidebar } from 'Lib'; -import Controls from 'Component/page/elements/head/controls'; -import HeadSimple from 'Component/page/elements/head/simple'; +import { I, M, C, S, U, J, Action, keyboard, analytics } from 'Lib'; interface State { isLoading: boolean; @@ -22,7 +20,6 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC refControls: any = null; loading = false; timeout = 0; - blockRefs: any = {}; state = { isLoading: false, @@ -38,8 +35,8 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC render () { const { isLoading, isDeleted } = this.state; const rootId = this.getRootId(); - const check = U.Data.checkDetails(rootId); const readonly = this.isReadonly(); + const object = S.Detail.get(rootId, rootId, [ 'chatId' ]); if (isDeleted) { return <Deleted {...this.props} />; @@ -50,39 +47,22 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC if (isLoading) { content = <Loader id="loader" />; } else { - const children = S.Block.getChildren(rootId, rootId, it => it.isChat()); - const cover = new M.Block({ id: rootId + '-cover', type: I.BlockType.Cover, childrenIds: [], fields: {}, content: {} }); + const chat = new M.Block({ id: J.Constant.blockId.chat, type: I.BlockType.Chat, childrenIds: [], fields: {}, content: {} }); content = ( - <React.Fragment> - {check.withCover ? <Block {...this.props} key={cover.id} rootId={rootId} block={cover} /> : ''} - - <div className="blocks"> - <Controls ref={ref => this.refControls = ref} key="editorControls" {...this.props} rootId={rootId} resize={this.resize} /> - <HeadSimple - {...this.props} - ref={ref => this.refHead = ref} - placeholder={translate('defaultNamePage')} - rootId={rootId} - readonly={readonly} - /> - - {children.map((block: I.Block, i: number) => ( - <Block - {...this.props} - ref={ref => this.blockRefs[block.id] = ref} - key={block.id} - rootId={rootId} - iconSize={20} - block={block} - className="noPlus" - isSelectionDisabled={true} - isContextMenuDisabled={true} - readonly={readonly} - /> - ))} - </div> - </React.Fragment> + <div className="blocks"> + <Block + {...this.props} + key={chat.id} + rootId={rootId} + iconSize={20} + block={chat} + className="noPlus" + isSelectionDisabled={true} + isContextMenuDisabled={true} + readonly={readonly} + /> + </div> ); }; @@ -90,13 +70,13 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC <div ref={node => this.node = node}> <Header {...this.props} - component="mainObject" + component="mainChat" ref={ref => this.refHeader = ref} - rootId={rootId} + rootId={object.chatId} /> <div id="bodyWrapper" className="wrapper"> - <div className={[ 'editorWrapper', check.className ].join(' ')}> + <div className="editorWrapper isChat"> {content} </div> </div> @@ -256,7 +236,7 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC if (count && !S.Menu.isOpen()) { keyboard.shortcut('backspace, delete', e, () => { e.preventDefault(); - Action.archive(ids); + Action.archive(ids, analytics.route.chat); selection.clear(); }); }; @@ -295,9 +275,7 @@ const PageMainChat = observer(class PageMainChat extends React.Component<I.PageC const head = node.find('.headSimple'); if (cover.length) { - cover.css({ top: headerHeight }); - - cover.width() <= J.Size.editor ? cover.addClass('isFull') : cover.removeClass('isFull'); + cover.css({ top: headerHeight }).toggleClass('isFull', cover.width() <= J.Size.editor); }; const fh = Number(formWrapper.outerHeight(true)) || 0; diff --git a/src/ts/component/page/main/empty.tsx b/src/ts/component/page/main/empty.tsx index 1f8a11ed85..cef68671f1 100644 --- a/src/ts/component/page/main/empty.tsx +++ b/src/ts/component/page/main/empty.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { observer } from 'mobx-react'; -import { Title, Label, IconObject, Header, Footer, Icon } from 'Component'; +import { ObjectName, Label, IconObject, Header, Footer, Icon } from 'Component'; import { I, U, translate } from 'Lib'; const PageMainEmpty = observer(class PageMainEmpty extends React.Component<I.PageComponent> { @@ -31,7 +31,7 @@ const PageMainEmpty = observer(class PageMainEmpty extends React.Component<I.Pag <div className="wrapper"> <IconObject object={space} size={96} /> - <Title text={space.name} /> + <ObjectName className="title" object={space} /> <Label text={translate('pageMainEmptyDescription')} /> <div className="row"> diff --git a/src/ts/component/page/main/graph.tsx b/src/ts/component/page/main/graph.tsx index 801d12ac93..dceb84af2c 100644 --- a/src/ts/component/page/main/graph.tsx +++ b/src/ts/component/page/main/graph.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import $ from 'jquery'; import { observer } from 'mobx-react'; import { I, C, S, U, J, keyboard } from 'Lib'; -import { Header, Footer, Graph, Loader } from 'Component'; +import { Header, Footer, GraphProvider, Loader } from 'Component'; const PageMainGraph = observer(class PageMainGraph extends React.Component<I.PageComponent> { @@ -47,7 +47,7 @@ const PageMainGraph = observer(class PageMainGraph extends React.Component<I.Pag <Loader id="loader" /> <div className="wrapper"> - <Graph + <GraphProvider key="graph" {...this.props} ref={ref => this.refGraph = ref} @@ -148,9 +148,9 @@ const PageMainGraph = observer(class PageMainGraph extends React.Component<I.Pag const oh = obj.height(); const header = node.find('#header'); const hh = header.height(); - const wh = isPopup ? oh - hh : win.height(); + const wh = isPopup ? oh : win.height(); - wrapper.css({ height: wh }); + wrapper.css({ height: wh - hh }); if (isPopup) { const element = $('#popupPage .content'); diff --git a/src/ts/component/page/main/import.tsx b/src/ts/component/page/main/import.tsx index 95faf19cb8..48c9479699 100644 --- a/src/ts/component/page/main/import.tsx +++ b/src/ts/component/page/main/import.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { Loader, Title, Error, Frame, Button } from 'Component'; -import { I, C, S, U, translate } from 'Lib'; +import { I, C, S, U, translate, analytics } from 'Lib'; interface State { error: string; @@ -48,8 +48,15 @@ class PageMainImport extends React.Component<I.PageComponent, State> { this.setState({ error: message.error.description }); } else { U.Space.openDashboard('route'); + window.setTimeout(() => { - S.Popup.open('usecase', { data: { page: 'item', object: message.info } }); + S.Popup.open('usecase', { + data: { + page: 'item', + object: message.info, + route: analytics.route.usecaseSite, + }, + }); }, S.Popup.getTimeout()); }; }); diff --git a/src/ts/component/page/main/set.tsx b/src/ts/component/page/main/set.tsx index 59a7b8acbd..5f4e9e532d 100644 --- a/src/ts/component/page/main/set.tsx +++ b/src/ts/component/page/main/set.tsx @@ -3,7 +3,7 @@ import $ from 'jquery'; import raf from 'raf'; import { observer } from 'mobx-react'; import { Header, Footer, Loader, Block, Deleted } from 'Component'; -import { I, M, C, S, U, J, Action, keyboard, translate } from 'Lib'; +import { I, M, C, S, U, J, Action, keyboard, translate, analytics } from 'Lib'; import Controls from 'Component/page/elements/head/controls'; import HeadSimple from 'Component/page/elements/head/simple'; @@ -254,7 +254,7 @@ const PageMainSet = observer(class PageMainSet extends React.Component<I.PageCom if (count && !S.Menu.isOpen()) { keyboard.shortcut('backspace, delete', e, () => { e.preventDefault(); - Action.archive(ids); + Action.archive(ids, analytics.route.set); selection.clear(); }); }; diff --git a/src/ts/component/page/main/type.tsx b/src/ts/component/page/main/type.tsx index 883782a21d..75ff3b2dc8 100644 --- a/src/ts/component/page/main/type.tsx +++ b/src/ts/component/page/main/type.tsx @@ -68,7 +68,7 @@ const PageMainType = observer(class PageMainType extends React.Component<I.PageC const allowedDetails = object.isInstalled && S.Block.checkFlags(rootId, rootId, [ I.RestrictionObject.Details ]); const allowedRelation = object.isInstalled && S.Block.checkFlags(rootId, rootId, [ I.RestrictionObject.Relation ]) && !U.Object.isParticipantLayout(object.recommendedLayout); const allowedTemplate = object.isInstalled && allowedObject && showTemplates && canWrite && !isTemplate; - const allowedLayout = ![ I.ObjectLayout.Bookmark, I.ObjectLayout.Chat, I.ObjectLayout.Participant ].includes(object.recommendedLayout); + const allowedLayout = ![ I.ObjectLayout.Bookmark, I.ObjectLayout.Participant ].includes(object.recommendedLayout); const subIdObject = this.getSubIdObject(); const totalObject = S.Record.getMeta(subIdObject, '').total; diff --git a/src/ts/component/popup/invite/confirm.tsx b/src/ts/component/popup/invite/confirm.tsx index 347c7c40cf..ee0c1ff808 100644 --- a/src/ts/component/popup/invite/confirm.tsx +++ b/src/ts/component/popup/invite/confirm.tsx @@ -1,18 +1,21 @@ import * as React from 'react'; import { observer } from 'mobx-react'; -import { Title, Button, Error, IconObject } from 'Component'; +import { Title, Button, Error, IconObject, Loader } from 'Component'; import { I, C, S, U, translate, analytics } from 'Lib'; interface State { error: string; + isLoading: boolean; }; const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Component<I.Popup, State> { state = { error: '', + isLoading: false, }; + buttonRefs: Map<string, any> = new Map(); participants = []; constructor (props: I.Popup) { @@ -24,7 +27,7 @@ const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Compo }; render() { - const { error } = this.state; + const { error, isLoading } = this.state; const { param } = this.props; const { data } = param; const { icon } = data; @@ -38,22 +41,24 @@ const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Compo let buttons = []; if (!this.getReaderLimit() && membership.isExplorer) { - buttons.push({ text: translate('popupInviteConfirmButtonReaderLimit'), onClick: () => this.onMembership('members') }); + buttons.push({ id: 'reader', text: translate('popupInviteConfirmButtonReaderLimit'), onClick: () => this.onMembership('members') }); } else if (!this.getWriterLimit()) { buttons = buttons.concat([ - { text: translate('popupInviteConfirmButtonReader'), onClick: () => this.onConfirm(I.ParticipantPermissions.Reader) }, - { text: translate('popupInviteConfirmButtonWriterLimit'), onClick: () => this.onMembership('editors') }, + { id: 'reader', text: translate('popupInviteConfirmButtonReader'), onClick: () => this.onConfirm(I.ParticipantPermissions.Reader) }, + { id: 'writer', text: translate('popupInviteConfirmButtonWriterLimit'), onClick: () => this.onMembership('editors') }, ]); } else { buttons = buttons.concat([ - { text: translate('popupInviteConfirmButtonReader'), onClick: () => this.onConfirm(I.ParticipantPermissions.Reader) }, - { text: translate('popupInviteConfirmButtonWriter'), onClick: () => this.onConfirm(I.ParticipantPermissions.Writer) }, + { id: 'reader', text: translate('popupInviteConfirmButtonReader'), onClick: () => this.onConfirm(I.ParticipantPermissions.Reader) }, + { id: 'writer', text: translate('popupInviteConfirmButtonWriter'), onClick: () => this.onConfirm(I.ParticipantPermissions.Writer) }, ]); }; return ( <React.Fragment> + {isLoading ? <Loader id="loader" /> : ''} + <div className="iconWrapper"> <IconObject object={{ name, iconImage: icon, layout: I.ObjectLayout.Participant }} size={48} /> </div> @@ -62,7 +67,7 @@ const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Compo <div className="buttons"> <div className="sides"> - {buttons.map((item: any, i: number) => <Button key={i} {...item} className="c36" />)} + {buttons.map((item: any, i: number) => <Button ref={ref => this.buttonRefs.set(item.id, ref)} key={i} {...item} className="c36" />)} </div> <Button onClick={this.onReject} text={translate('popupInviteConfirmButtonReject')} className="c36" color="red" /> @@ -91,30 +96,46 @@ const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Compo }; onConfirm (permissions: I.ParticipantPermissions) { + this.setLoading(true); + C.SpaceRequestApprove(this.getSpaceId(), this.getIdentity(), permissions, (message: any) => { if (message.error.code) { - this.setState({ error: message.error.description }); + this.setError(message.error.description); return; }; analytics.event('ApproveInviteRequest', { type: permissions }); + this.setLoading(false); this.props.close(); }); }; onReject () { + this.setLoading(true); + C.SpaceRequestDecline(this.getSpaceId(), this.getIdentity(), (message: any) => { if (message.error.code) { - this.setState({ error: message.error.description }); + this.setError(message.error.description); return; }; analytics.event('RejectInviteRequest'); + this.setLoading(false); this.props.close(); }); }; + setLoading (isLoading: boolean) { + this.setState({ isLoading }); + }; + + setError (error: string) { + this.setState({ error, isLoading: false }); + }; + load () { + this.setLoading(true); + U.Data.search({ spaceId: this.getSpaceId(), keys: U.Data.participantRelationKeys(), @@ -126,7 +147,7 @@ const PopupInviteConfirm = observer(class PopupInviteConfirm extends React.Compo noDeps: true, }, (message: any) => { this.participants = message.records || []; - this.forceUpdate(); + this.setLoading(false); }); }; diff --git a/src/ts/component/popup/invite/request.tsx b/src/ts/component/popup/invite/request.tsx index bdb1a3d7fd..4ef86f21fc 100644 --- a/src/ts/component/popup/invite/request.tsx +++ b/src/ts/component/popup/invite/request.tsx @@ -56,7 +56,7 @@ const PopupInviteRequest = observer(class PopupInviteRequest extends React.Compo const { data } = param; const { invite, cid, key } = data; - if (!account || this.refButton.state.isLoading) { + if (!account || this.refButton.isLoading()) { return; }; diff --git a/src/ts/component/popup/objectManager.tsx b/src/ts/component/popup/objectManager.tsx index fc18608776..f868cd1cb9 100644 --- a/src/ts/component/popup/objectManager.tsx +++ b/src/ts/component/popup/objectManager.tsx @@ -39,7 +39,7 @@ const PopupObjectManager = observer(class PopupObjectManager extends React.Compo ref={ref => this.refManager = ref} subId={subId} rowLength={2} - withArchived={true} + ignoreArchived={false} buttons={[]} iconSize={48} collectionId={collectionId} diff --git a/src/ts/component/popup/page/membership/current.tsx b/src/ts/component/popup/page/membership/current.tsx index c63ac3376b..037bc0fa59 100644 --- a/src/ts/component/popup/page/membership/current.tsx +++ b/src/ts/component/popup/page/membership/current.tsx @@ -188,7 +188,7 @@ const PopupMembershipPageCurrent = observer(class PopupMembershipPageCurrent ext this.refButton.setLoading(true); - C.MembershipGetVerificationEmail(this.refEmail.getValue(), true, (message) => { + C.MembershipGetVerificationEmail(this.refEmail.getValue(), true, false, false, (message) => { this.refButton.setLoading(false); if (message.error.code) { diff --git a/src/ts/component/popup/page/membership/free.tsx b/src/ts/component/popup/page/membership/free.tsx index 70a520dbe2..ac566b67a5 100644 --- a/src/ts/component/popup/page/membership/free.tsx +++ b/src/ts/component/popup/page/membership/free.tsx @@ -138,7 +138,7 @@ const PopupMembershipPageFree = observer(class PopupMembershipPageFree extends R this.refButton.setLoading(true); - C.MembershipGetVerificationEmail(this.refEmail.getValue(), this.refCheckbox?.getValue(), (message) => { + C.MembershipGetVerificationEmail(this.refEmail.getValue(), this.refCheckbox?.getValue(), false, false, (message) => { this.refButton.setLoading(false); if (message.error.code) { diff --git a/src/ts/component/popup/page/settings/account.tsx b/src/ts/component/popup/page/settings/account.tsx index cc8d0e943a..66f79df9e0 100644 --- a/src/ts/component/popup/page/settings/account.tsx +++ b/src/ts/component/popup/page/settings/account.tsx @@ -64,6 +64,7 @@ const PopupSettingsPageAccount = observer(class PopupSettingsPageAccount extends value={name} onKeyUp={this.onName} placeholder={translate('popupSettingsAccountPersonalInformationNamePlaceholder')} + maxLength={160} /> <Input @@ -71,6 +72,7 @@ const PopupSettingsPageAccount = observer(class PopupSettingsPageAccount extends value={profile.description} onKeyUp={this.onDescription} placeholder={translate('popupSettingsAccountPersonalInformationDescriptionPlaceholder')} + maxLength={160} /> </div> @@ -90,9 +92,9 @@ const PopupSettingsPageAccount = observer(class PopupSettingsPageAccount extends ); }; - onName () { - U.Object.setName(S.Block.profile, this.refName.getValue()); - }; + onName () { + U.Object.setName(S.Block.profile, this.refName.getValue()); + }; onDescription (e) { U.Object.setDescription(S.Block.profile, this.refDescription.getValue()); diff --git a/src/ts/component/popup/page/settings/data.tsx b/src/ts/component/popup/page/settings/data.tsx index 444583b5a9..94da6debb5 100644 --- a/src/ts/component/popup/page/settings/data.tsx +++ b/src/ts/component/popup/page/settings/data.tsx @@ -4,43 +4,43 @@ import { I, C, S, U, translate, Renderer, analytics } from 'Lib'; import { observer } from 'mobx-react'; interface Props extends I.PopupSettings { - onPage: (id: string) => void; - setLoading: (v: boolean) => void; + onPage: (id: string) => void; + setLoading: (v: boolean) => void; }; const PopupSettingsPageDataManagement = observer(class PopupSettingsPageStorageIndex extends React.Component<Props, {}> { - constructor (props: Props) { - super(props); + constructor (props: Props) { + super(props); - this.onOffload = this.onOffload.bind(this); - }; + this.onOffload = this.onOffload.bind(this); + }; - render () { - const { onPage } = this.props; + render () { + const { onPage } = this.props; const { dataPath, spaceStorage } = S.Common; - const { localUsage } = spaceStorage; + const { localUsage } = spaceStorage; const suffix = this.getSuffix(); - return ( - <React.Fragment> - <Title text={translate('popupSettingsDataManagementTitle')} /> - <Label className="description" text={translate(`popupSettingsDataManagementLocalStorageText${suffix}`)} /> + return ( + <React.Fragment> + <Title text={translate('popupSettingsDataManagementTitle')} /> + <Label className="description" text={translate(`popupSettingsDataManagementLocalStorageText${suffix}`)} /> - <div className="actionItems"> - <div className="item storageUsage"> - <div className="side left"> + <div className="actionItems"> + <div className="item storageUsage"> + <div className="side left"> <IconObject object={{ iconEmoji: ':desktop_computer:' }} size={44} /> <div className="txt"> <div className="name">{translate('popupSettingsDataLocalFiles')}</div> <div className="type">{U.Common.sprintf(translate(`popupSettingsDataManagementLocalStorageUsage`), U.File.size(localUsage))}</div> </div> - </div> + </div> <div className="side right"> <Button color="blank" className="c28" text={translate(`popupSettingsDataManagementOffloadFiles${suffix}`)} onClick={this.onOffload} /> </div> - </div> + </div> <div className="item"> @@ -56,55 +56,54 @@ const PopupSettingsPageDataManagement = observer(class PopupSettingsPageStorageI <Button color="blank" className="c28" text={translate(`commonOpen`)} onClick={this.onOpenDataLocation} /> </div> </div> - </div> + </div> - <Title className="sub" text={translate('popupSettingsDataManagementDeleteTitle')} /> - <Label className="description" text={translate('popupSettingsDataManagementDeleteText')} /> - <Button className="c36" onClick={() => onPage('delete')} color="red" text={translate('popupSettingsDataManagementDeleteButton')} /> - </React.Fragment> - ); - }; + <Title className="sub" text={translate('popupSettingsDataManagementDeleteTitle')} /> + <Label className="description" text={translate('popupSettingsDataManagementDeleteText')} /> + <Button className="c36" onClick={() => onPage('delete')} color="red" text={translate('popupSettingsDataManagementDeleteButton')} /> + </React.Fragment> + ); + }; - onOffload (e: any) { - const { setLoading } = this.props; + onOffload (e: any) { + const { setLoading } = this.props; const suffix = this.getSuffix(); - const isLocalOnly = U.Data.isLocalOnly(); + const isLocalNetwork = U.Data.isLocalNetwork(); - analytics.event('ScreenFileOffloadWarning'); + analytics.event('ScreenFileOffloadWarning'); - S.Popup.open('confirm',{ - data: { - title: translate('commonAreYouSure'), - text: translate(`popupSettingsDataOffloadWarningText${suffix}`), - textConfirm: isLocalOnly ? translate('popupSettingsDataKeepFiles') : translate('commonYes'), - canCancel: isLocalOnly, + S.Popup.open('confirm',{ + data: { + title: translate('commonAreYouSure'), + text: translate(`popupSettingsDataOffloadWarningText${suffix}`), + textConfirm: isLocalNetwork ? translate('popupSettingsDataKeepFiles') : translate('commonYes'), + canCancel: isLocalNetwork, textCancel: translate('popupSettingsDataRemoveFiles'), - onConfirm: () => { - setLoading(true); - analytics.event('SettingsStorageOffload'); - - C.FileListOffload([], false, (message: any) => { - setLoading(false); - - if (message.error.code) { - return; - }; - - S.Popup.open('confirm',{ - data: { - title: translate('popupSettingsDataFilesOffloaded'), - //text: U.Common.sprintf('Files: %s, Size: %s', message.files, U.File.size(message.bytes)), - textConfirm: translate('commonOk'), - canCancel: false, - } - }); - - analytics.event('FileOffload', { middleTime: message.middleTime }); - }); - }, - } - }); - }; + onConfirm: () => { + setLoading(true); + analytics.event('SettingsStorageOffload'); + + C.FileListOffload([], false, (message: any) => { + setLoading(false); + + if (message.error.code) { + return; + }; + + S.Popup.open('confirm',{ + data: { + title: translate('popupSettingsDataFilesOffloaded'), + textConfirm: translate('commonOk'), + canCancel: false, + } + }); + + analytics.event('FileOffload', { middleTime: message.middleTime }); + }); + }, + } + }); + }; onOpenDataLocation () { Renderer.send('openPath', S.Common.dataPath); @@ -112,7 +111,7 @@ const PopupSettingsPageDataManagement = observer(class PopupSettingsPageStorageI }; getSuffix () { - return U.Data.isLocalOnly() ? 'LocalOnly' : ''; + return U.Data.isLocalNetwork() ? 'LocalOnly' : ''; }; }); diff --git a/src/ts/component/popup/page/settings/import/notion.tsx b/src/ts/component/popup/page/settings/import/notion.tsx index ae77571ec9..51d496ea9c 100644 --- a/src/ts/component/popup/page/settings/import/notion.tsx +++ b/src/ts/component/popup/page/settings/import/notion.tsx @@ -81,7 +81,7 @@ class PopupSettingsPageImportNotion extends React.Component<I.PopupSettings, Sta C.ObjectImportNotionValidateToken(token, (message: any) => { if (message.error.code) { - this.ref.setError(true); + this.ref?.setError(true); this.setState({ error: message.error.description }); return; }; diff --git a/src/ts/component/popup/page/settings/logout.tsx b/src/ts/component/popup/page/settings/logout.tsx index e967053dfe..81ab41212c 100644 --- a/src/ts/component/popup/page/settings/logout.tsx +++ b/src/ts/component/popup/page/settings/logout.tsx @@ -83,14 +83,13 @@ const PopupSettingsPageLogout = observer(class PopupSettingsPageLogout extends R onLogout () { this.props.setPinConfirmed(false); + analytics.event('LogOut'); U.Router.go('/', { replace: true, animate: true, onRouteChange: () => { S.Auth.logout(true, false); - - analytics.event('LogOut'); }, }); }; diff --git a/src/ts/component/popup/page/settings/space/index.tsx b/src/ts/component/popup/page/settings/space/index.tsx index 8cd5c9f744..ee543c7ecd 100644 --- a/src/ts/component/popup/page/settings/space/index.tsx +++ b/src/ts/component/popup/page/settings/space/index.tsx @@ -58,7 +58,7 @@ const PopupSettingsSpaceIndex = observer(class PopupSettingsSpaceIndex extends R const hasLink = cid && key; const isOwner = U.Space.isMyOwner(); const canWrite = U.Space.canMyParticipantWrite(); - const canDelete = !space.isPersonal && isOwner; + const canDelete = !space.isPersonal; const isShareActive = U.Space.isShareActive(); let bytesUsed = 0; @@ -102,7 +102,7 @@ const PopupSettingsSpaceIndex = observer(class PopupSettingsSpaceIndex extends R <IconObject id="spaceIcon" size={96} - object={space} + object={{ ...space, spaceId: S.Common.space }} canEdit={canWrite} menuParam={{ horizontal: I.MenuDirection.Center }} onSelect={this.onSelect} @@ -446,9 +446,9 @@ const PopupSettingsSpaceIndex = observer(class PopupSettingsSpaceIndex extends R const space = U.Space.getSpaceview(); if (space.isShared && !cid && !key) { - C.SpaceInviteGetCurrent(S.Common.space, (message: any) => { - if (!message.error.code) { - this.setInvite(message.inviteCid, message.inviteKey); + U.Space.getInvite(S.Common.space, (cid: string, key: string) => { + if (cid && key) { + this.setInvite(cid, key); }; }); }; @@ -471,7 +471,7 @@ const PopupSettingsSpaceIndex = observer(class PopupSettingsSpaceIndex extends R data: { filter: '', filters: [ - { relationKey: 'recommendedLayout', condition: I.FilterCondition.In, value: U.Object.getPageLayouts().concat(I.ObjectLayout.Chat) }, + { relationKey: 'recommendedLayout', condition: I.FilterCondition.In, value: U.Object.getPageLayouts() }, { relationKey: 'uniqueKey', condition: I.FilterCondition.NotEqual, value: J.Constant.typeKey.template }, ], onClick: (item: any) => { diff --git a/src/ts/component/popup/page/settings/space/list.tsx b/src/ts/component/popup/page/settings/space/list.tsx index 55e8f581f6..66aff30e6d 100644 --- a/src/ts/component/popup/page/settings/space/list.tsx +++ b/src/ts/component/popup/page/settings/space/list.tsx @@ -62,7 +62,7 @@ const PopupSettingsPageSpacesList = observer(class PopupSettingsPageSpacesList e getItems () { const items = S.Record.getRecords(J.Constant.subId.space); - return items.filter(it => !it.isAccountDeleted && it.isLocalOk).map(it => { + return items.filter(it => it.isAccountActive).map(it => { it.participant = U.Space.getMyParticipant(it.targetSpaceId) || {}; return it; }).sort((c1, c2) => { diff --git a/src/ts/component/popup/page/settings/space/share.tsx b/src/ts/component/popup/page/settings/space/share.tsx index 8909d9be52..0dcab34b1e 100644 --- a/src/ts/component/popup/page/settings/space/share.tsx +++ b/src/ts/component/popup/page/settings/space/share.tsx @@ -177,7 +177,7 @@ const PopupSettingsSpaceShare = observer(class PopupSettingsSpaceShare extends R <div className="icons"> <Icon className="question withBackground" onClick={this.onInfo} /> - {space.isShared ? <Icon id="button-more-space" className="more withBackground" onClick={this.onMoreSpace} /> : ''} + {space.isShared && isSpaceOwner ? <Icon id="button-more-space" className="more withBackground" onClick={this.onMoreSpace} /> : ''} </div> </div> @@ -271,9 +271,9 @@ const PopupSettingsSpaceShare = observer(class PopupSettingsSpaceShare extends R const space = U.Space.getSpaceview(); if (space.isShared && !cid && !key) { - C.SpaceInviteGetCurrent(S.Common.space, (message: any) => { - if (!message.error.code) { - this.setInvite(message.inviteCid, message.inviteKey); + U.Space.getInvite(S.Common.space, (cid: string, key: string) => { + if (cid && key) { + this.setInvite(cid, key); }; }); }; @@ -332,11 +332,14 @@ const PopupSettingsSpaceShare = observer(class PopupSettingsSpaceShare extends R onInitLink () { const btn = this.refButton; - if (!btn || btn.state.isLoading) { + const space = U.Space.getSpaceview(); + + if (!btn || btn.isLoading()) { return; }; btn.setLoading(true); + analytics.event('ClickShareSpaceNewLink'); C.SpaceMakeShareable(S.Common.space, (message: any) => { if (this.setError(message.error)) { @@ -348,9 +351,13 @@ const PopupSettingsSpaceShare = observer(class PopupSettingsSpaceShare extends R btn.setLoading(false); if (!this.setError(message.error)) { - this.setInvite(message.inviteCid, message.inviteKey); + return; + }; + + this.setInvite(message.inviteCid, message.inviteKey); + Preview.toastShow({ text: translate('toastInviteGenerate') }); - Preview.toastShow({ text: translate('toastInviteGenerate') }); + if (!space.isShared) { analytics.event('ShareSpace'); }; }); diff --git a/src/ts/component/popup/page/settings/space/storage.tsx b/src/ts/component/popup/page/settings/space/storage.tsx index 73ce91abc3..03740c824e 100644 --- a/src/ts/component/popup/page/settings/space/storage.tsx +++ b/src/ts/component/popup/page/settings/space/storage.tsx @@ -6,56 +6,57 @@ import Head from '../head'; const PopupSettingsPageStorageManager = observer(class PopupSettingsPageStorageManager extends React.Component<I.PopupSettings, {}> { - ref = null; + ref = null; - constructor (props: I.PopupSettings) { - super(props); + constructor (props: I.PopupSettings) { + super(props); - this.onRemove = this.onRemove.bind(this); + this.onRemove = this.onRemove.bind(this); this.onBack = this.onBack.bind(this); - }; - - render () { - const buttons: I.ButtonComponent[] = [ - { icon: 'remove', text: translate('commonDeleteImmediately'), onClick: this.onRemove } - ]; - const filters: I.Filter[] = [ - { relationKey: 'fileSyncStatus', condition: I.FilterCondition.Equal, value: I.FileSyncStatus.Synced }, - ]; + }; + + render () { + const buttons: I.ButtonComponent[] = [ + { icon: 'remove', text: translate('commonDeleteImmediately'), onClick: this.onRemove } + ]; + const filters: I.Filter[] = [ + { relationKey: 'fileSyncStatus', condition: I.FilterCondition.Equal, value: I.FileSyncStatus.Synced }, + ]; const sorts: I.Sort[] = [ { type: I.SortType.Desc, relationKey: 'sizeInBytes' }, ]; - return ( - <div className="wrap"> - <Head onPage={this.onBack} name={translate('commonBack')} /> - <Title text={translate('popupSettingsSpaceStorageManagerTitle')} /> - - <ListObjectManager - ref={ref => this.ref = ref} - subId={J.Constant.subId.fileManager} - rowLength={2} - withArchived={true} - buttons={buttons} + return ( + <div className="wrap"> + <Head onPage={this.onBack} name={translate('commonBack')} /> + <Title text={translate('popupSettingsSpaceStorageManagerTitle')} /> + + <ListObjectManager + ref={ref => this.ref = ref} + subId={J.Constant.subId.fileManager} + rowLength={2} + buttons={buttons} info={I.ObjectManagerItemInfo.FileSize} - iconSize={18} - sorts={sorts} - filters={filters} - textEmpty={translate('popupSettingsSpaceStorageManagerEmptyLabel')} - /> - </div> - ); - }; - - onRemove () { + iconSize={18} + sorts={sorts} + filters={filters} + ignoreHidden={false} + ignoreArchived={false} + textEmpty={translate('popupSettingsSpaceStorageManagerEmptyLabel')} + /> + </div> + ); + }; + + onRemove () { if (this.ref) { Action.delete(this.ref.selected || [], analytics.route.settings, () => this.ref.selectionClear()); }; - }; + }; - onBack () { - this.props.onPage('spaceIndex'); - }; + onBack () { + this.props.onPage('spaceIndex'); + }; }); diff --git a/src/ts/component/popup/page/usecase/item.tsx b/src/ts/component/popup/page/usecase/item.tsx index 0788c9aac8..1b628f00a4 100644 --- a/src/ts/component/popup/page/usecase/item.tsx +++ b/src/ts/component/popup/page/usecase/item.tsx @@ -108,7 +108,7 @@ class PopupUsecasePageItem extends React.Component<I.PopupUsecase, State> { componentDidMount(): void { const object = this.getObject(); - analytics.event('ScreenGalleryInstall', { name: object.name, route: 'App' }); + analytics.event('ScreenGalleryInstall', { name: object.name, route: this.getRoute() }); }; onSwiper (swiper) { @@ -131,18 +131,20 @@ class PopupUsecasePageItem extends React.Component<I.PopupUsecase, State> { const idx = this.swiper.activeIndex; const length = (this.swiper.slides || []).length; - !idx ? arrowLeft.addClass('hide') : arrowLeft.removeClass('hide'); - idx >= length - 1 ? arrowRight.addClass('hide') : arrowRight.removeClass('hide'); + arrowLeft.toggleClass('hide', !idx); + arrowRight.toggleClass('hide', idx >= length - 1); }; onMenu () { + const { config } = S.Common; const { getId, close } = this.props; const object = this.getObject(); + const route = this.getRoute(); const cb = (spaceId: string, isNew: boolean) => { C.ObjectImportExperience(spaceId, object.downloadLink, object.title, isNew, (message: any) => { if (!message.error.code) { - analytics.event('GalleryInstall', { name: object.name }); + analytics.event('GalleryInstall', { name: object.name, route }); }; }); close(); @@ -158,12 +160,13 @@ class PopupUsecasePageItem extends React.Component<I.PopupUsecase, State> { noVirtualisation: true, onSelect: (e: any, item: any) => { const isNew = item.id == 'add'; + const withChat = U.Common.isChatAllowed(); this.setState({ isLoading: true }); - analytics.event('ClickGalleryInstallSpace', { type: isNew ? 'New' : 'Existing' }); + analytics.event('ClickGalleryInstallSpace', { type: isNew ? 'New' : 'Existing', route }); if (isNew) { - C.WorkspaceCreate({ name: object.title, iconOption: U.Common.rand(1, J.Constant.count.icon) }, I.Usecase.None, (message: any) => { + C.WorkspaceCreate({ name: object.title, iconOption: U.Common.rand(1, J.Constant.count.icon) }, I.Usecase.None, withChat, (message: any) => { if (!message.error.code) { cb(message.objectId, true); @@ -179,7 +182,7 @@ class PopupUsecasePageItem extends React.Component<I.PopupUsecase, State> { } }); - analytics.event('ClickGalleryInstall', { name: object.name }); + analytics.event('ClickGalleryInstall', { name: object.name, route }); }; getSpaceOptions (): any[] { @@ -199,10 +202,11 @@ class PopupUsecasePageItem extends React.Component<I.PopupUsecase, State> { }; getObject (): any { - const { param } = this.props; - const { data } = param; + return this.props.param.data.object || {}; + }; - return data.object || {}; + getRoute (): string { + return String(this.props.param.data.route || ''); }; }; diff --git a/src/ts/component/popup/page/usecase/list.tsx b/src/ts/component/popup/page/usecase/list.tsx index 6de025e1a2..c91864d6fa 100644 --- a/src/ts/component/popup/page/usecase/list.tsx +++ b/src/ts/component/popup/page/usecase/list.tsx @@ -43,8 +43,8 @@ class PopupUsecasePageList extends React.Component<I.PopupUsecase, State> { render () { const { getAuthor, onAuthor } = this.props; const { isLoading, category } = this.state; - const items = this.getItems(); const { gallery } = S.Common; + const items = this.getItems(); const filter = this.refFilter ? this.refFilter.getValue() : ''; if (isLoading) { @@ -213,7 +213,7 @@ class PopupUsecasePageList extends React.Component<I.PopupUsecase, State> { onCategory (item: any) { this.setState({ category: (item.id == this.state.category?.id ? null : item) }); - analytics.event('ClickGalleryTab', { type: U.Common.toCamelCase(`-${item.name}`) }); + analytics.event('ClickGalleryTab', { type: item.id }); }; onFilterChange (v: string) { diff --git a/src/ts/component/popup/relation.tsx b/src/ts/component/popup/relation.tsx index b30512f13c..517feca9ce 100644 --- a/src/ts/component/popup/relation.tsx +++ b/src/ts/component/popup/relation.tsx @@ -261,7 +261,7 @@ const PopupRelation = observer(class PopupRelation extends React.Component<I.Pop const { config } = S.Common; let ret = this.getRelationKeys().map(relationKey => S.Record.getRelationByKey(relationKey)); - ret = ret.filter(it => (config.debug.hiddenObject ? true : !it.isHidden) && !it.isReadonlyValue); + ret = ret.filter(it => it && (config.debug.hiddenObject ? true : !it.isHidden) && !it.isReadonlyValue); ret = ret.sort(U.Data.sortByName); return ret; }; diff --git a/src/ts/component/popup/search.tsx b/src/ts/component/popup/search.tsx index 36af27c12b..9fb5c5c440 100644 --- a/src/ts/component/popup/search.tsx +++ b/src/ts/component/popup/search.tsx @@ -310,6 +310,7 @@ const PopupSearch = observer(class PopupSearch extends React.Component<I.Popup, this.filter = filter; this.range = { from: 0, to: filter.length }; this.refFilter.setValue(filter); + this.reload(); }; setFilter(); @@ -321,7 +322,7 @@ const PopupSearch = observer(class PopupSearch extends React.Component<I.Popup, focus.clear(true); if (backlink) { - U.Object.getById(backlink, item => this.setBacklink(item, 'Saved', () => setFilter())); + U.Object.getById(backlink, {}, item => this.setBacklink(item, 'Saved', () => setFilter())); } else { this.reload(); }; @@ -332,19 +333,20 @@ const PopupSearch = observer(class PopupSearch extends React.Component<I.Popup, componentDidUpdate () { const items = this.getItems(); const filter = this.getFilter(); - const length = filter.length; if (filter != this.filter) { this.filter = filter; - this.range = { from: length, to: length }; this.reload(); return; }; this.initCache(); this.setActive(items[this.n]); - this.refFilter.setValue(this.filter); - this.refFilter.setRange(this.range); + + if (this.refFilter) { + this.refFilter.setValue(this.filter); + this.refFilter.setRange(this.range); + }; if (this.refList) { this.refList.recomputeRowHeights(0); @@ -507,8 +509,11 @@ const PopupSearch = observer(class PopupSearch extends React.Component<I.Popup, window.clearTimeout(this.timeout); this.timeout = window.setTimeout(() => { - this.forceUpdate(); storageSet({ filter: v }); + + this.range = this.refFilter?.getRange(); + this.forceUpdate(); + analytics.event('SearchInput', { route }); }, J.Constant.delay.keyboard); }; @@ -557,7 +562,7 @@ const PopupSearch = observer(class PopupSearch extends React.Component<I.Popup, }; loadMoreRows ({ startIndex, stopIndex }) { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this.offset += J.Constant.limit.menuRecords; this.load(false, () => resolve(null)); }); diff --git a/src/ts/component/popup/spaceCreate.tsx b/src/ts/component/popup/spaceCreate.tsx index 2da624f939..961f3a2786 100644 --- a/src/ts/component/popup/spaceCreate.tsx +++ b/src/ts/component/popup/spaceCreate.tsx @@ -28,6 +28,7 @@ const PopupSpaceCreate = observer(class PopupSpaceCreate extends React.Component this.onKeyDown = this.onKeyDown.bind(this); this.onChange = this.onChange.bind(this); + this.onIcon = this.onIcon.bind(this); }; render () { @@ -52,6 +53,7 @@ const PopupSpaceCreate = observer(class PopupSpaceCreate extends React.Component object={space} canEdit={false} menuParam={{ horizontal: I.MenuDirection.Center }} + onClick={this.onIcon} /> </div> @@ -118,13 +120,14 @@ const PopupSpaceCreate = observer(class PopupSpaceCreate extends React.Component this.setLoading(true); + const withChat = U.Common.isChatAllowed(); const details = { name, iconOption, spaceDashboardId: I.HomePredefinedId.Last, }; - C.WorkspaceCreate(details, I.Usecase.GetStarted, (message: any) => { + C.WorkspaceCreate(details, I.Usecase.GetStarted, withChat, (message: any) => { this.setLoading(false); if (message.error.code) { @@ -169,6 +172,17 @@ const PopupSpaceCreate = observer(class PopupSpaceCreate extends React.Component this.setState({ isLoading }); }; + onIcon () { + let { iconOption } = this.state; + + iconOption++; + if (iconOption > J.Constant.count.icon) { + iconOption = 1; + }; + + this.setState({ iconOption }); + }; + }); export default PopupSpaceCreate; \ No newline at end of file diff --git a/src/ts/component/preview/default.tsx b/src/ts/component/preview/default.tsx index ee2d380a0b..6157d90cd3 100644 --- a/src/ts/component/preview/default.tsx +++ b/src/ts/component/preview/default.tsx @@ -90,7 +90,7 @@ const PreviewDefault = observer(class PreviewDefault extends React.Component<Pro this.id = rootId; this.setState({ loading: true }); - U.Object.getById(rootId, (object) => { + U.Object.getById(rootId, {}, (object) => { if (!this._isMounted) { return; }; diff --git a/src/ts/component/preview/link.tsx b/src/ts/component/preview/link.tsx index 57598b9b4a..8e634d7cb0 100644 --- a/src/ts/component/preview/link.tsx +++ b/src/ts/component/preview/link.tsx @@ -59,9 +59,8 @@ const PreviewLink = observer(class PreviewLink extends React.Component<Props, St componentDidUpdate () { const { position } = this.props; const { imageUrl } = this.state; - const node = $(this.node); - imageUrl ? node.addClass('withImage') : node.removeClass('withImage'); + $(this.node).toggleClass('withImage', !!imageUrl); this.load(); diff --git a/src/ts/component/preview/object.tsx b/src/ts/component/preview/object.tsx index a6fb0c8e97..6c268efe91 100644 --- a/src/ts/component/preview/object.tsx +++ b/src/ts/component/preview/object.tsx @@ -480,10 +480,9 @@ const PreviewObject = observer(class PreviewObject extends React.Component<Props }; setActive (v: boolean) { - const node = $(this.node); - - v ? node.addClass('active') : node.removeClass('active'); + $(this.node).toggleClass('active', v); }; + }); -export default PreviewObject; +export default PreviewObject; \ No newline at end of file diff --git a/src/ts/component/selection/provider.tsx b/src/ts/component/selection/provider.tsx index 9bcde336b7..39a0ac7b56 100644 --- a/src/ts/component/selection/provider.tsx +++ b/src/ts/component/selection/provider.tsx @@ -142,8 +142,7 @@ const SelectionProvider = observer(class SelectionProvider extends React.Compone const win = $(window); const container = U.Common.getScrollContainer(isPopup); - isPopup ? this.rect.addClass('fromPopup') : this.rect.removeClass('fromPopup'); - + this.rect.toggleClass('fromPopup', isPopup); this.rootId = keyboard.getRootId(); this.isPopup = isPopup; this.x = e.pageX; @@ -626,9 +625,7 @@ const SelectionProvider = observer(class SelectionProvider extends React.Compone setIsSelecting (v: boolean) { this.isSelecting = v; - - const html = $('html'); - v ? html.addClass('isSelecting') : html.removeClass('isSelecting'); + $('html').toggleClass('isSelecting', v); }; }); diff --git a/src/ts/component/sidebar/index.tsx b/src/ts/component/sidebar/index.tsx index 19990926a6..dfcf171199 100644 --- a/src/ts/component/sidebar/index.tsx +++ b/src/ts/component/sidebar/index.tsx @@ -12,7 +12,7 @@ const Sidebar = observer(class Sidebar extends React.Component { private _isMounted = false; node = null; - ox = 0; + ox = 0; oy = 0; sx = 0; frame = 0; @@ -32,12 +32,12 @@ const Sidebar = observer(class Sidebar extends React.Component { this.onToggleContext = this.onToggleContext.bind(this); }; - render() { + render() { const { showVault, showObject } = S.Common; - const cn = [ 'sidebar' ]; + const cn = [ 'sidebar' ]; const cmd = keyboard.cmdSymbol(); - return ( + return ( <React.Fragment> <Icon id="sidebarToggle" @@ -60,7 +60,7 @@ const Sidebar = observer(class Sidebar extends React.Component { </div> </React.Fragment> ); - }; + }; componentDidMount (): void { this._isMounted = true; diff --git a/src/ts/component/sidebar/object.tsx b/src/ts/component/sidebar/object.tsx index b1b09e8cb2..6a1cd66d0d 100644 --- a/src/ts/component/sidebar/object.tsx +++ b/src/ts/component/sidebar/object.tsx @@ -56,7 +56,7 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S this.loadMoreRows = this.loadMoreRows.bind(this); }; - render() { + render() { const { isLoading } = this.state; const items = this.getItems(); const isAllowedObject = this.isAllowedObject(); @@ -108,7 +108,7 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S ); }; - return ( + return ( <div id="containerObject" ref={ref => this.node = ref} @@ -226,17 +226,11 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S </div> </div> ); - }; + }; componentDidMount () { - const storage = this.storageGet() || {}; - - this.type = storage.type || I.ObjectContainerType.Object; - this.orphan = storage.orphan || false; - this.compact = storage.compact || false; - this.initSort(); - this.refFilter.focus(); + this.initStorage(); this.rebind(); this.load(true); @@ -264,6 +258,20 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S this.unbind(); }; + initStorage () { + const storage = this.storageGet() || {}; + + this.type = storage.type || I.ObjectContainerType.Object; + this.orphan = storage.orphan || false; + + if ([ I.ObjectContainerType.Type, I.ObjectContainerType.Relation ].includes(this.type) && (undefined === storage.compact)) { + storage.compact = true; + }; + + this.compact = storage.compact || false; + this.initSort(); + }; + rebind () { this.unbind(); @@ -393,7 +401,6 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S ignoreDeleted: true, }, (message: any) => { this.setState({ isLoading: false }); - if (callBack) { callBack(message); }; @@ -477,6 +484,15 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S subId: J.Constant.subId.allObject, route: analytics.route.allObjects, allowedLinkTo: true, + onSelect: id => { + switch (id) { + case 'archive': { + this.selected = null; + this.renderSelection(); + break; + }; + }; + } } }); }; @@ -519,6 +535,7 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S }; this.storageSet(storage); + this.initStorage(); this.load(true); const options = U.Menu.getObjectContainerSortOptions(this.type, this.sortId, this.sortType, this.orphan, this.compact); @@ -573,8 +590,8 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S this.type = id as I.ObjectContainerType; storage.type = this.type; - this.initSort(); this.storageSet(storage); + this.initStorage(); this.load(true); analytics.event('ChangeLibraryType', { type: id }); @@ -743,7 +760,7 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S e.preventDefault(); const ids = this.selected ? this.selected : [ next.id ]; - Action.archive(ids); + Action.archive(ids, analytics.route.allObjects); }); }; }; @@ -785,9 +802,9 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S this.selected = this.selected.filter(it => it != item.id); }; this.renderSelection(); - }; + }; - const selectPrevious = () => { + const selectPrevious = () => { if (!this.selected) { return; }; @@ -805,7 +822,7 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S this.selected = this.selected.filter(it => it != item.id); }; this.renderSelection(); - }; + }; const cb = () => { let scrollTo = 0; @@ -1064,8 +1081,8 @@ const SidebarObject = observer(class SidebarObject extends React.Component<{}, S const max = this.getMaxWidth(); const sw = scroll.width(); - this.x <= 0 ? sideLeft.addClass('hide') : sideLeft.removeClass('hide'); - this.x >= max - sw - 1 ? sideRight.addClass('hide') : sideRight.removeClass('hide'); + sideLeft.toggleClass('hide', this.x <= 0); + sideRight.toggleClass('hide', this.x >= max - sw - 1); }; getMaxWidth () { diff --git a/src/ts/component/sidebar/object/item.tsx b/src/ts/component/sidebar/object/item.tsx index 36e828ec0e..8f9a27895a 100644 --- a/src/ts/component/sidebar/object/item.tsx +++ b/src/ts/component/sidebar/object/item.tsx @@ -19,7 +19,7 @@ const ObjectItem = observer(class ObjectItem extends React.Component<Props> { node = null; - render() { + render() { const { item, style, compact, onClick, onContext, onMouseEnter, onMouseLeave } = this.props; const cn = [ 'item', U.Data.layoutClass(item.id, item.layout) ]; const type = S.Record.getTypeById(item.type); @@ -97,7 +97,7 @@ const ObjectItem = observer(class ObjectItem extends React.Component<Props> { {content} </div> ); - }; + }; componentDidMount () { this.resize(); @@ -110,8 +110,8 @@ const ObjectItem = observer(class ObjectItem extends React.Component<Props> { resize () { const node = $(this.node); - node.find('.iconObject').length ? node.addClass('withIcon') : node.removeClass('withIcon'); - node.find('.descr').length ? node.addClass('withDescr') : node.removeClass('withDescr'); + node.toggleClass('withIcon', !!node.find('.iconObject').length); + node.toggleClass('withDescr', !!node.find('.descr').length); }; }); diff --git a/src/ts/component/sidebar/widget.tsx b/src/ts/component/sidebar/widget.tsx index 82a3576c87..6c301c30a8 100644 --- a/src/ts/component/sidebar/widget.tsx +++ b/src/ts/component/sidebar/widget.tsx @@ -1,14 +1,16 @@ import * as React from 'react'; import raf from 'raf'; import { observer } from 'mobx-react'; -import { Button, Widget, DropTarget, Icon, Label, ShareBanner } from 'Component'; -import { I, C, M, S, U, J, keyboard, analytics, translate, Storage } from 'Lib'; +import { Button, Widget, DropTarget, ShareBanner } from 'Component'; +import { I, C, M, S, U, J, keyboard, analytics, translate } from 'Lib'; type State = { isEditing: boolean; previewId: string; }; +const SUB_ID = 'widgetArchive'; + const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, State> { state: State = { @@ -21,6 +23,7 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S position: I.BlockPosition = null; isDragging = false; frame = 0; + isSubcribed = ''; constructor (props) { super(props); @@ -30,6 +33,7 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S this.onDragOver = this.onDragOver.bind(this); this.onDrop = this.onDrop.bind(this); this.onContextMenu = this.onContextMenu.bind(this); + this.onArchive = this.onArchive.bind(this); this.onAdd = this.onAdd.bind(this); this.onScroll = this.onScroll.bind(this); this.setEditing = this.setEditing.bind(this); @@ -43,6 +47,7 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S const bodyCn = [ 'body' ]; const space = U.Space.getSpaceview(); const canWrite = U.Space.canMyParticipantWrite(); + const archived = S.Record.getRecordIds(SUB_ID, ''); let content = null; @@ -168,6 +173,27 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S /> ))} + {archived.length ? ( + <DropTarget + {...this.props} + isTargetBottom={true} + rootId={S.Block.widgets} + id={last?.id} + dropType={I.DropType.Widget} + canDropMiddle={false} + className="lastTarget" + cacheKey="lastTarget" + > + <Button + text={translate('commonBin')} + color="" + className="widget" + icon="bin" + onClick={this.onArchive} + /> + </DropTarget> + ) : ''} + <div className="buttons"> {buttons.map(button => ( <Button key={[ button.id, (isEditing ? 'edit' : '') ].join('-')} color="" {...button} /> @@ -205,6 +231,14 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S ); }; + componentDidMount (): void { + this.subscribeArchive(); + }; + + componentDidUpdate (): void { + this.subscribeArchive(); + }; + onEdit (e: any): void { e.stopPropagation(); @@ -444,6 +478,14 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S }); }; + onArchive (e: any) { + const { isEditing } = this.state; + + if (!isEditing && !e.button) { + U.Object.openEvent(e, { layout: I.ObjectLayout.Archive }); + }; + }; + clear () { const node = $(this.node); @@ -492,6 +534,26 @@ const SidebarWidget = observer(class SidebarWidget extends React.Component<{}, S }, S.Menu.getTimeout()); }; + subscribeArchive () { + const { space } = S.Common + + if (this.isSubcribed == space) { + return; + }; + + U.Data.searchSubscribe({ + subId: SUB_ID, + spaceId: space, + ignoreArchived: false, + filters: [ + { relationKey: 'isArchived', condition: I.FilterCondition.Equal, value: true }, + ], + limit: 1, + }, () => { + this.isSubcribed = space; + }); + }; + }); export default SidebarWidget; diff --git a/src/ts/component/util/deleted.tsx b/src/ts/component/util/deleted.tsx index 89110e0b1f..89ea2dae94 100644 --- a/src/ts/component/util/deleted.tsx +++ b/src/ts/component/util/deleted.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef, useRef, useEffect, useLayoutEffect } from 'react'; import $ from 'jquery'; import { Icon, Label, Button } from 'Component'; import { S, U, translate } from 'Lib'; @@ -8,59 +8,53 @@ interface Props { isPopup?: boolean; }; -class Deleted extends React.Component<Props> { +const Deleted = forwardRef<HTMLDivElement, Props>(({ + className = '', + isPopup = false, +}, ref) => { - public static defaultProps = { - className: '', - }; - node = null; - - render () { - const { className, isPopup } = this.props; - - let onClick = null; - let textButton = ''; - - if (isPopup) { - textButton = translate('commonClose'); - onClick = () => S.Popup.close('page'); - } else { - textButton = translate('utilDeletedBackToDashboard'); - onClick = () => U.Space.openDashboard('route'); - }; - - return ( - <div - ref={ref => this.node = ref} - id="deleteWrapper" - className={[ 'deleteWrapper', className ].join(' ')} - > - <div className="mid"> - <Icon className="ghost" /> - <Label text={translate('utilDeletedObjectNotExist')} /> - <Button color="blank" text={textButton} onClick={onClick} /> - </div> - </div> - ); - }; + const nodeRef = useRef<HTMLDivElement>(null); + const onClick = isPopup ? () => S.Popup.close('page') : () => U.Space.openDashboard('route'); + const textButton = isPopup ? translate('commonClose') : translate('utilDeletedBackToDashboard'); - componentDidMount (): void { - this.resize(); - $(window).on('resize.deleted', () => this.resize()); + const unbind = () => { + $(window).off('resize.deleted'); }; - componentWillUnmount (): void { - $(window).off('resize.deleted'); + const rebind = () => { + $(window).on('resize.deleted', () => resize()); }; - resize () { - const { isPopup } = this.props; - const node = $(this.node); + const resize = () => { + const node = $(nodeRef.current); const container = isPopup ? $('#popupPage-innerWrap') : $(window); node.css({ height: container.height() }); }; - -}; -export default Deleted; + useEffect(() => { + rebind(); + resize(); + + return () => unbind(); + }); + + useLayoutEffect(() => resize()); + + return ( + <div + ref={nodeRef} + id="deleteWrapper" + className={[ 'deleteWrapper', className ].join(' ')} + > + <div className="mid"> + <Icon className="ghost" /> + <Label text={translate('utilDeletedObjectNotExist')} /> + <Button color="blank" text={textButton} onClick={onClick} /> + </div> + </div> + ); + +}); + +export default Deleted; \ No newline at end of file diff --git a/src/ts/component/util/dimmer.tsx b/src/ts/component/util/dimmer.tsx index 819375733f..960cb52b1e 100644 --- a/src/ts/component/util/dimmer.tsx +++ b/src/ts/component/util/dimmer.tsx @@ -1,24 +1,21 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; interface Props { className?: string; onClick?(e: any): void; }; -class Dimmer extends React.Component<Props> { - - - render () { - const { className, onClick } = this.props; - const cn = [ 'dimmer' ]; - - if (className) { - cn.push(className); - }; - - return <div id="dimmer" className={cn.join(' ')} onClick={onClick} />; - }; - -}; +const Dimmer = forwardRef<HTMLDivElement, Props>(({ + className = '', + onClick, +}, ref) => { + return ( + <div + ref={ref} + className={[ 'dimmer', className ].join(' ')} + onClick={onClick} + /> + ); +}); export default Dimmer; \ No newline at end of file diff --git a/src/ts/component/util/dotIndicator.tsx b/src/ts/component/util/dotIndicator.tsx index 2ed790a28a..e3b1de915f 100644 --- a/src/ts/component/util/dotIndicator.tsx +++ b/src/ts/component/util/dotIndicator.tsx @@ -1,31 +1,32 @@ -import React from 'react'; +import React, { forwardRef } from 'react'; -interface DotIndicatorProps { +interface Props { index: number; count: number; className?: string; }; - -class DotIndicator extends React.Component<DotIndicatorProps> { - render () { - const { index, count, className } = this.props; - const dots = []; +const DotIndicator = forwardRef<HTMLDivElement, Props>(({ + index = 0, + count = 0, + className = '', +}, ref) => { - for (let i = 0; i < count; i++) { - const isActive = i === index; - const cn = ['dot']; + const dots = []; + const cn = [ 'dotIndicator', className ]; - if (isActive) { - cn.push('active'); - }; + for (let i = 0; i < count; i++) { + const isActive = i == index; + const cn = [ 'dot' ]; - dots.push(<span key={i} className={cn.join(' ')} />); + if (isActive) { + cn.push('active'); }; - return <div className={['dotIndicator', className].join(' ')}>{dots}</div>; + dots.push(<span key={i} className={cn.join(' ')} />); }; -}; + return <div className={cn.join(' ')}>{dots}</div>; +}); export default DotIndicator; \ No newline at end of file diff --git a/src/ts/component/util/emailCollectionForm.tsx b/src/ts/component/util/emailCollectionForm.tsx new file mode 100644 index 0000000000..b45d2138fa --- /dev/null +++ b/src/ts/component/util/emailCollectionForm.tsx @@ -0,0 +1,292 @@ +import * as React from 'react'; +import { Label, Checkbox, Input, Button, Icon, Pin } from 'Component'; +import { analytics, C, I, J, S, translate, U } from 'Lib'; + +interface Props { + onStepChange: () => void; + onComplete: () => void; +}; + +interface State { + countdown: number; + status: string; + statusText: string; + email: string, + subscribeNews: boolean, + subscribeTips: boolean, + pinDisabled: boolean, + showCodeSent: boolean, +}; + +class EmailCollectionForm extends React.Component<Props, State> { + + state = { + status: '', + statusText: '', + countdown: 60, + email: '', + subscribeNews: false, + subscribeTips: false, + pinDisabled: false, + showCodeSent: false, + }; + + step = 0; + node: any = null; + refCheckboxTips: any = null; + refCheckboxNews: any = null; + refEmail: any = null; + refButton: any = null; + refCode: any = null; + + interval = null; + timeout = null; + + constructor (props: Props) { + super(props); + + this.onCheck = this.onCheck.bind(this); + this.onSubmitEmail = this.onSubmitEmail.bind(this); + this.verifyEmail = this.verifyEmail.bind(this); + this.onConfirmEmailCode = this.onConfirmEmailCode.bind(this); + this.onResend = this.onResend.bind(this); + this.validateEmail = this.validateEmail.bind(this); + }; + + render () { + const { status, statusText, countdown, subscribeNews, subscribeTips, pinDisabled, showCodeSent } = this.state; + + let content = null; + let descriptionSuffix = 'Description'; + + switch (this.step) { + case 0: { + content = ( + <div className="step step0"> + <form onSubmit={this.onSubmitEmail}> + <div className="check" onClick={() => this.onCheck(this.refCheckboxTips, 'Tips')}> + <Checkbox ref={ref => this.refCheckboxTips = ref} value={false} /> {translate('emailCollectionCheckboxTipsLabel')} + </div> + <div className="check" onClick={() => this.onCheck(this.refCheckboxNews, 'Updates')}> + <Checkbox ref={ref => this.refCheckboxNews = ref} value={false} /> {translate('emailCollectionCheckboxNewsLabel')} + </div> + + <div className="inputWrapper"> + <Input ref={ref => this.refEmail = ref} onKeyUp={this.validateEmail} placeholder={translate(`emailCollectionEnterEmail`)} /> + </div> + + {status ? <div className={[ 'statusBar', status ].join(' ')}>{statusText}</div> : ''} + + <div className="buttonWrapper"> + <Button ref={ref => this.refButton = ref} onClick={this.onSubmitEmail} className="c36" text={translate('commonSignUp')} /> + </div> + </form> + </div> + ); + break; + }; + + case 1: { + content = ( + <div className="step step1"> + <Pin + ref={ref => this.refCode = ref} + pinLength={4} + isVisible={true} + onSuccess={this.onConfirmEmailCode} + readonly={pinDisabled} + /> + + {status ? <div className={[ 'statusBar', status ].join(' ')}>{statusText}</div> : ''} + + <div onClick={this.onResend} className={[ 'resend', (countdown ? 'countdown' : '') ].join(' ')}> + {showCodeSent ? translate('emailCollectionCodeSent') : translate('popupMembershipResend')} + {countdown && !showCodeSent ? U.Common.sprintf(translate('popupMembershipCountdown'), countdown) : ''} + </div> + </div> + ); + break; + }; + + case 2: { + descriptionSuffix = 'News'; + if (subscribeTips) { + descriptionSuffix = 'Tips'; + }; + if (subscribeTips && subscribeNews) { + descriptionSuffix = 'NewsAndTips'; + }; + + content = ( + <div className="step step2"> + <Icon /> + + <div className="buttonWrapper"> + <Button onClick={this.props.onComplete} className="c36" text={translate('emailCollectionGreat')} /> + </div> + </div> + ); + break; + }; + }; + + return ( + <div className="emailCollectionForm"> + <Label className="category" text={translate(`emailCollectionStep${this.step}Title`)} /> + <Label className="descr" text={translate(`emailCollectionStep${this.step}${descriptionSuffix}`)} /> + + {content} + </div> + ); + }; + + componentDidMount () { + this.refButton?.setDisabled(true); + + analytics.event('EmailCollection', { route: 'OnboardingTooltip', step: 1 }); + }; + + onCheck (ref, type) { + const val = ref.getValue(); + ref.toggle(); + + if (!val) { + analytics.event('ClickEmailCollection', { route: 'OnboardingTooltip', step: 1, type }); + }; + }; + + setStep (step: number) { + if (this.step == step) { + return; + }; + + this.step = step; + this.props.onStepChange(); + this.forceUpdate(); + + analytics.event('EmailCollection', { route: 'OnboardingTooltip', step: step + 1 }); + }; + + setStatus (status: string, statusText: string) { + this.setState({ status, statusText }); + + window.clearTimeout(this.timeout); + this.timeout = window.setTimeout(() => this.clearStatus(), 4000); + }; + + clearStatus () { + this.setState({ status: '', statusText: '' }); + }; + + validateEmail () { + this.clearStatus(); + + window.clearTimeout(this.timeout); + this.timeout = window.setTimeout(() => { + const value = this.refEmail?.getValue(); + const isValid = U.Common.checkEmail(value); + + if (value && !isValid) { + this.setStatus('error', translate('errorIncorrectEmail')); + }; + + this.refButton?.setDisabled(!isValid); + }, J.Constant.delay.keyboard); + }; + + onSubmitEmail (e: any) { + if (!this.refButton || !this.refEmail) { + return; + }; + + if (this.refButton.isDisabled()) { + return; + }; + + analytics.event('ClickEmailCollection', { route: 'OnboardingTooltip', step: 1, type: 'SignUp' }); + + this.setState({ + email: this.refEmail.getValue(), + subscribeNews: this.refCheckboxNews?.getValue(), + subscribeTips: this.refCheckboxTips?.getValue(), + }, () => { + this.refButton.setLoading(true); + this.verifyEmail(e) + }); + }; + + verifyEmail (e: any) { + e.preventDefault(); + + const { email, subscribeNews, subscribeTips } = this.state; + + C.MembershipGetVerificationEmail(email, subscribeNews, subscribeTips, true, (message) => { + this.refButton?.setLoading(false); + + if (message.error.code) { + this.setStatus('error', message.error.description); + return; + }; + + this.setStep(1); + this.startCountdown(60); + }); + }; + + onConfirmEmailCode () { + const code = this.refCode.getValue(); + + this.setState({ pinDisabled: true }); + + C.MembershipVerifyEmailCode(code, (message) => { + if (message.error.code) { + this.setStatus('error', message.error.description); + this.refCode.reset(); + this.setState({ pinDisabled: false }); + return; + }; + + this.setStep(2); + }); + }; + + onResend (e: any) { + if (this.state.countdown) { + return; + }; + + this.verifyEmail(e); + + analytics.event('ClickEmailCollection', { route: 'OnboardingTooltip', step: 2, type: 'Resend' }); + }; + + startCountdown (seconds) { + const { emailConfirmationTime } = S.Common; + + if (!emailConfirmationTime) { + S.Common.emailConfirmationTimeSet(U.Date.now()); + }; + + this.setState({ countdown: seconds, showCodeSent: true }); + + window.setTimeout(() => { + this.setState({ showCodeSent: false }); + }, 2000); + + this.interval = window.setInterval(() => { + let { countdown } = this.state; + + countdown--; + this.setState({ countdown }); + + if (!countdown) { + S.Common.emailConfirmationTimeSet(0); + window.clearInterval(this.interval); + this.interval = null; + }; + }, 1000); + }; + +}; + +export default EmailCollectionForm; diff --git a/src/ts/component/util/emptySearch.tsx b/src/ts/component/util/emptySearch.tsx index 3e5400447b..91aa54c8b9 100644 --- a/src/ts/component/util/emptySearch.tsx +++ b/src/ts/component/util/emptySearch.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; import { U, translate } from 'Lib'; interface Props { @@ -8,30 +8,25 @@ interface Props { style?: any; }; -class EmptySearch extends React.Component<Props> { - - _isMounted = false; - node: any = null; - - render () { - const { readonly, filter, style } = this.props; - - let text = this.props.text; - if (!text) { - if (filter) { - text = U.Common.sprintf(translate(readonly ? 'popupSearchEmptyFilterReadonly' : 'popupSearchEmptyFilter'), filter); - } else { - text = translate('popupSearchEmpty'); - }; +const EmptySearch = forwardRef<HTMLDivElement, Props>(({ + text = '', + filter = '', + readonly = false, + style = {}, +}, ref) => { + if (!text) { + if (filter) { + text = U.Common.sprintf(translate(readonly ? 'popupSearchEmptyFilterReadonly' : 'popupSearchEmptyFilter'), filter); + } else { + text = translate('popupSearchEmpty'); }; - - return ( - <div ref={node => this.node = node} style={style} className="emptySearch"> - <div className="txt" dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} /> - </div> - ); }; - -}; -export default EmptySearch; + return ( + <div style={style} className="emptySearch"> + <div className="txt" dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} /> + </div> + ); +}); + +export default EmptySearch; \ No newline at end of file diff --git a/src/ts/component/util/error.tsx b/src/ts/component/util/error.tsx index 80b273bcd7..03b2aedaeb 100644 --- a/src/ts/component/util/error.tsx +++ b/src/ts/component/util/error.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; import { I, U } from 'Lib'; interface Props { @@ -8,35 +8,28 @@ interface Props { dataset?: any; }; -class Error extends React.Component<Props> { +const Error = forwardRef<{}, Props>(({ + id = '', + text = '', + className = '', + dataset = {}, +}, ref) => { - public static defaultProps = { - text: '', - className: '', - }; + const cn = [ 'error', className ]; - render () { - const { id, text, className, dataset } = this.props; - const cn = [ 'error' ]; + if (!text && !id) { + return null; + }; - if (!text && !id) { - return null; - }; + return ( + <div + id={id} + className={cn.join(' ')} + dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} + {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} + /> + ); - if (className) { - cn.push(className); - }; - - return ( - <div - id={id} - className={cn.join(' ')} - dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} - {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} - /> - ); - }; - -}; +}); export default Error; \ No newline at end of file diff --git a/src/ts/component/util/floater.tsx b/src/ts/component/util/floater.tsx new file mode 100644 index 0000000000..876b911093 --- /dev/null +++ b/src/ts/component/util/floater.tsx @@ -0,0 +1,66 @@ +import { H } from 'Lib'; +import React, { FC, useState, useEffect, ReactNode, useRef } from 'react'; +import ReactDOM from 'react-dom'; + +interface Props { + children: ReactNode; + anchorEl: HTMLElement | null; + gap?: number; + isShown?: boolean; +}; + +export const Floater: FC<Props> = ({ + children, + anchorEl, + gap: offset = 0, + isShown = true, +}) => { + const ref = useRef<HTMLDivElement>(null); + const [ position, setPosition ] = useState({ top: 0, left: 0 }); + const cn = [ 'floater' ]; + + if (isShown) { + cn.push('show'); + }; + + const onMove = () => { + if (!anchorEl || !ref.current) { + return; + }; + + const anchorElRect = anchorEl.getBoundingClientRect(); + const elRect = ref.current.getBoundingClientRect(); + + const { top: at, left: al, width: aw, height: ah } = anchorElRect; + const sy = window.scrollY; + + const eh = elRect.height; + const ew = elRect.width; + const nl = al + aw / 2 - ew / 2; + + let nt = at - eh - offset + sy; + if (nt < 0) { + nt = at + ah + offset + sy; + } else { + nt = at - eh - offset + sy; + }; + + setPosition({ top: nt, left: nl }); + }; + + H.useElementMovement(anchorEl, onMove); + useEffect(() => onMove(), [ anchorEl, ref.current, isShown ]); + + return ReactDOM.createPortal( + ( + <div + className={cn.join(' ')} + ref={ref} + style={{ transform: `translate3d(${position.left}px, ${position.top}px, 0px)`}} + > + {children} + </div> + ), + document.getElementById('floaterContainer') + ); +}; \ No newline at end of file diff --git a/src/ts/component/util/frame.tsx b/src/ts/component/util/frame.tsx index 548d31de20..75c9e999d3 100644 --- a/src/ts/component/util/frame.tsx +++ b/src/ts/component/util/frame.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef, useRef, useEffect, useLayoutEffect, useImperativeHandle } from 'react'; import $ from 'jquery'; import raf from 'raf'; import { U } from 'Lib'; @@ -9,61 +9,64 @@ interface Props { dataset?: any; }; -class Frame extends React.Component<Props> { - - _isMounted = false; - node: any = null; - - render () { - const { children, className, dataset } = this.props; - const cn = [ 'frame' ]; +interface FrameRefProps { + resize: () => void, +}; - if (className) { - cn.push(className); - }; +const Frame = forwardRef<FrameRefProps, Props>(({ + children, + className = '', + dataset = {}, +}, ref) => { + const nodeRef = useRef<HTMLDivElement | null>(null); + const cn = [ 'frame', className ]; - return ( - <div - ref={node => this.node = node} - className={cn.join(' ')} - {...U.Common.dataProps(dataset)} - > - {children} - </div> - ); - }; - - componentDidMount () { - this._isMounted = true; - this.resize(); - this.unbind(); - - $(window).on('resize.frame', () => this.resize()); - }; - - componentWillUnmount () { - this._isMounted = false; - this.unbind(); - }; - - unbind () { + const unbind = () => { $(window).off('resize.frame'); }; - - resize () { + + const rebind = () => { + unbind(); + $(window).on('resize.frame', () => resize()); + }; + + const resize = () => { raf(() => { - if (!this._isMounted) { + if (!nodeRef.current) { return; }; - const node = $(this.node); + const node = $(nodeRef.current); node.css({ marginTop: -node.outerHeight() / 2, marginLeft: -node.outerWidth() / 2 }); }); }; - -}; + + useEffect(() => { + rebind(); + resize(); + + return () => unbind(); + }); + + useLayoutEffect(() => resize()); + + useImperativeHandle(ref, () => ({ + resize, + })); + + return ( + <div + ref={nodeRef} + className={cn.join(' ')} + {...U.Common.dataProps(dataset)} + > + {children} + </div> + ); + +}); export default Frame; \ No newline at end of file diff --git a/src/ts/component/util/icon.tsx b/src/ts/component/util/icon.tsx index 058d86967f..62e2efddd7 100644 --- a/src/ts/component/util/icon.tsx +++ b/src/ts/component/util/icon.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { MouseEvent, DragEvent, forwardRef, useRef, useEffect } from 'react'; import $ from 'jquery'; import { I, Preview } from 'Lib'; @@ -15,75 +15,50 @@ interface Props { inner?: any; draggable?: boolean; style?: any; - onClick?(e: any): void; - onMouseDown?(e: any): void; - onMouseEnter?(e: any): void; - onMouseLeave?(e: any): void; - onDragStart?(e: any): void; - onContextMenu?(e: any): void; + onClick?(e: MouseEvent): void; + onMouseDown?(e: MouseEvent): void; + onMouseEnter?(e: MouseEvent): void; + onMouseLeave?(e: MouseEvent): void; + onMouseMove?(e: MouseEvent): void; + onDragStart?(e: DragEvent): void; + onContextMenu?(e: MouseEvent): void; }; -class Icon extends React.Component<Props> { - - public static defaultProps = { - tooltipY: I.MenuDirection.Bottom, - }; +const Icon = forwardRef<HTMLDivElement, Props>(({ + id = '', + icon = '', + className = '', + arrow = false, + tooltip = '', + tooltipCaption = '', + tooltipX = I.MenuDirection.Center, + tooltipY = I.MenuDirection.Bottom, + tooltipClassName = '', + inner = null, + draggable = false, + style = {}, + onClick, + onMouseDown, + onMouseEnter, + onMouseLeave, + onMouseMove, + onDragStart, + onContextMenu, +}, ref) => { - node: any = null; - - constructor (props: Props) { - super(props); + const nodeRef = useRef<HTMLDivElement>(null); - this.onMouseDown = this.onMouseDown.bind(this); - this.onMouseEnter = this.onMouseEnter.bind(this); - this.onMouseLeave = this.onMouseLeave.bind(this); - this.onContextMenu = this.onContextMenu.bind(this); - }; - - render () { - const { id, icon, arrow, draggable, className, inner, onClick, onDragStart } = this.props; - const cn = [ 'icon' ]; - const style: any = this.props.style || {}; - - if (className) { - cn.push(className); - }; - - if (icon) { - style.backgroundImage = `url("${icon}")`; - }; - - return ( - <div - ref={node => this.node = node} - id={id} - draggable={draggable} - onMouseDown={this.onMouseDown} - onContextMenu={this.onContextMenu} - onMouseEnter={this.onMouseEnter} - onMouseLeave={this.onMouseLeave} - onClick={onClick} - onDragStart={onDragStart} - className={cn.join(' ')} - style={style} - > - {arrow ? <div className="icon arrow" /> : ''} - {inner ? inner : null} - </div> - ); + if (icon) { + style.backgroundImage = `url("${icon}")`; }; - componentWillUnmount () { - Preview.tooltipHide(false); - }; - - onMouseEnter (e: any) { - const { tooltip, tooltipCaption, tooltipX, tooltipY, tooltipClassName, onMouseEnter } = this.props; - const node = $(this.node); + useEffect(() => Preview.tooltipHide(false)); + + const onMouseEnterHandler = (e: MouseEvent) => { const t = Preview.tooltipCaption(tooltip, tooltipCaption); if (t) { - Preview.tooltipShow({ text: t, element: node, typeX: tooltipX, typeY: tooltipY, className: tooltipClassName }); + Preview.tooltipShow({ text: t, element: $(nodeRef.current), typeX: tooltipX, typeY: tooltipY, className: tooltipClassName }); }; if (onMouseEnter) { @@ -91,9 +66,7 @@ class Icon extends React.Component<Props> { }; }; - onMouseLeave (e: any) { - const { tooltip, onMouseLeave } = this.props; - + const onMouseLeaveHandler = (e: MouseEvent) => { if (tooltip) { Preview.tooltipHide(false); }; @@ -103,9 +76,7 @@ class Icon extends React.Component<Props> { }; }; - onMouseDown (e: any) { - const { onMouseDown } = this.props; - + const onMouseDownHandler = (e: MouseEvent) => { Preview.tooltipHide(true); if (onMouseDown) { @@ -113,16 +84,34 @@ class Icon extends React.Component<Props> { }; }; - onContextMenu (e: any) { - const { onContextMenu } = this.props; - + const onContextMenuHandler = (e: MouseEvent) => { Preview.tooltipHide(true); if (onContextMenu) { onContextMenu(e); }; }; - -}; -export default Icon; + return ( + <div + ref={nodeRef} + id={id} + draggable={draggable} + className={[ 'icon', className ].join(' ')} + style={style} + onMouseDown={onMouseDownHandler} + onMouseEnter={onMouseEnterHandler} + onMouseLeave={onMouseLeaveHandler} + onMouseMove={onMouseMove} + onContextMenu={onContextMenuHandler} + onDragStart={onDragStart} + onClick={onClick} + > + {arrow ? <div className="icon arrow" /> : ''} + {inner} + </div> + ); + +}); + +export default Icon; \ No newline at end of file diff --git a/src/ts/component/util/iconEmoji.tsx b/src/ts/component/util/iconEmoji.tsx index 36a1c27acf..35f031dd62 100644 --- a/src/ts/component/util/iconEmoji.tsx +++ b/src/ts/component/util/iconEmoji.tsx @@ -1,79 +1,66 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; import { S, U, J } from 'Lib'; -import { observer } from 'mobx-react'; interface Props { id?: string; icon?: string; - iconClass?: string; objectId?: string; size?: number; asImage?: boolean; className?: string; canEdit?: boolean; - offsetX?: number; - offsetY?: number; - menuId?: string; - onSelect?(id: string): void; - onUpload?(objectId: string): void; -} +}; -const IconSrc = {}; +const IconEmoji = forwardRef<HTMLDivElement, Props>(({ + id = '', + icon = '', + objectId = '', + size = 18, + asImage = true, + className = '', + canEdit = false, +}, ref) => { -const IconEmoji = observer(class IconEmoji extends React.Component<Props> { - - public static defaultProps = { - offsetX: 0, - offsetY: 0, - size: 18, - className: '', - asImage: true, - }; - - render () { - const { id, size, icon, objectId, asImage, className, canEdit, menuId, iconClass } = this.props; - const cn = [ 'iconEmoji' ]; - const css = { lineHeight: size + 'px' }; + const cn = [ 'iconEmoji', className ]; + const css = { lineHeight: `${size}px` }; - if (className) { - cn.push(className); - }; - if (canEdit) { - cn.push('canEdit'); - }; - if (menuId && S.Menu.isOpen(menuId)) { - cn.push('active'); - }; + if (canEdit) { + cn.push('canEdit'); + }; - let element = null; - if (icon) { - const code = icon.match(':') ? icon : U.Smile.getCode(icon); - if (code) { - if (asImage) { - element = <img src={U.Smile.srcFromColons(code)} className={[ 'smileImage', 'c' + size ].join(' ')} onDragStart={e=> e.preventDefault()} />; - } else { - element = <em-emoji shortcodes={code}></em-emoji>; - }; + let element = null; + if (icon) { + const code = icon.match(':') ? icon : U.Smile.getCode(icon); + if (code) { + if (asImage) { + element = ( + <img + src={U.Smile.srcFromColons(code)} + className={[ 'smileImage', 'c' + size ].join(' ')} + onDragStart={e=> e.preventDefault()} + /> + ); + } else { + element = <em-emoji shortcodes={code}></em-emoji>; }; - } else - if (objectId) { - element = <img src={S.Common.imageUrl(objectId, J.Size.iconPage)} className={[ 'iconImage', 'c' + size ].join(' ')} onDragStart={e => e.preventDefault()} />; - } else - if (iconClass) { - element = <img src={IconSrc[iconClass]} className={[ 'iconCommon', iconClass, 'c' + size ].join(' ')} />; - }; - - if (!element) { - return null; }; - - return ( - <div id={id} style={css} className={cn.join(' ')}> - {element} - </div> + } else + if (objectId) { + element = ( + <img + src={S.Common.imageUrl(objectId, J.Size.iconPage)} + className={[ 'iconImage', 'c' + size ].join(' ')} + onDragStart={e => e.preventDefault()} + /> ); }; + return element ? ( + <div id={id} style={css} className={cn.join(' ')}> + {element} + </div> + ) : null; + }); export default IconEmoji; \ No newline at end of file diff --git a/src/ts/component/util/iconObject.tsx b/src/ts/component/util/iconObject.tsx index 37a0fae3d9..4f3cf02ff1 100644 --- a/src/ts/component/util/iconObject.tsx +++ b/src/ts/component/util/iconObject.tsx @@ -9,7 +9,6 @@ interface Props { layout?: I.ObjectLayout; object?: any; className?: string; - iconClass?: string; canEdit?: boolean; native?: boolean; asImage?: boolean; @@ -93,18 +92,18 @@ const FontSize = { }; const DefaultIcons = [ 'page', 'task', 'set', 'chat', 'bookmark', 'type' ]; -const Ghost = require('img/icon/ghost.svg').default; +const Ghost = require('img/icon/ghost.svg'); const CheckboxTask = { '': { - 0: require('img/icon/object/checkbox0.svg').default, - 1: require('img/icon/object/checkbox1.svg').default, - 2: require('img/icon/object/checkbox2.svg').default, + 0: require('img/icon/object/checkbox0.svg'), + 1: require('img/icon/object/checkbox1.svg'), + 2: require('img/icon/object/checkbox2.svg'), }, dark: { - 0: require('img/icon/object/checkbox0.svg').default, - 1: require('img/theme/dark/icon/object/checkbox1.svg').default, - 2: require('img/icon/object/checkbox2.svg').default, + 0: require('img/icon/object/checkbox0.svg'), + 1: require('img/theme/dark/icon/object/checkbox1.svg'), + 2: require('img/icon/object/checkbox2.svg'), }, }; @@ -135,7 +134,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { const { theme } = S.Common; const object = this.getObject(); const layout = Number(object.layout) || I.ObjectLayout.Page; - const { id, name, iconEmoji, iconImage, iconOption, iconClass, done, relationFormat, isDeleted } = object || {}; + const { id, name, iconEmoji, iconImage, iconOption, done, relationFormat, isDeleted } = object || {}; const cn = [ 'iconObject', 'c' + size, U.Data.layoutClass(object.id, layout) ]; const iconSize = this.iconSize(); const tc = S.Common.getThemeClass(); @@ -162,28 +161,23 @@ const IconObject = observer(class IconObject extends React.Component<Props> { switch (layout) { default: + case I.ObjectLayout.Chat: case I.ObjectLayout.Page: { if (iconImage) { cn.push('withImage'); }; - if (iconEmoji || iconImage || iconClass) { - icon = <IconEmoji {...this.props} className={icn.join(' ')} iconClass={iconClass} size={iconSize} icon={iconEmoji} objectId={iconImage} />; - } else { - defaultIcon('page'); + let di = 'page'; + switch (layout) { + case I.ObjectLayout.Chat: di = 'chat'; break; + case I.ObjectLayout.Collection: + case I.ObjectLayout.Set: di = 'set'; break; }; - break; - }; - case I.ObjectLayout.Chat: { - if (iconImage) { - cn.push('withImage'); - }; - - if (iconEmoji || iconImage || iconClass) { - icon = <IconEmoji {...this.props} className={icn.join(' ')} iconClass={iconClass} size={iconSize} icon={iconEmoji} objectId={iconImage} />; + if (iconEmoji || iconImage) { + icon = <IconEmoji {...this.props} className={icn.join(' ')} size={iconSize} icon={iconEmoji} objectId={iconImage} />; } else { - defaultIcon('chat'); + defaultIcon(di); }; break; }; @@ -195,7 +189,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { }; if (iconEmoji || iconImage) { - icon = <IconEmoji {...this.props} className={icn.join(' ')} iconClass={iconClass} size={iconSize} icon={iconEmoji} objectId={iconImage} />; + icon = <IconEmoji {...this.props} className={icn.join(' ')} size={iconSize} icon={iconEmoji} objectId={iconImage} />; } else { defaultIcon('set'); }; @@ -232,7 +226,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { case I.ObjectLayout.Type: { if (iconEmoji) { - icon = <IconEmoji {...this.props} className={icn.join(' ')} iconClass={iconClass} size={iconSize} icon={iconEmoji} objectId={iconImage} />; + icon = <IconEmoji {...this.props} className={icn.join(' ')} size={iconSize} icon={iconEmoji} objectId={iconImage} />; } else { defaultIcon('type'); }; @@ -244,10 +238,8 @@ const IconObject = observer(class IconObject extends React.Component<Props> { break; }; - const src = require(`img/icon/relation/${Relation.typeName(relationFormat)}.svg`).default; - icn = icn.concat([ 'iconCommon', 'c' + iconSize ]); - icon = <img src={src} className={icn.join(' ')} />; + icon = <img src={`./img/icon/relation/${Relation.typeName(relationFormat)}.svg`} className={icn.join(' ')} />; break; }; @@ -268,7 +260,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { icon = <img src={S.Common.imageUrl(id, iconSize * 2)} className={icn.join(' ')} />; } else { icn = icn.concat([ 'iconFile', 'c' + iconSize ]); - icon = <img src={U.File.iconImage(object)} className={icn.join(' ')} />; + icon = <img src={U.File.iconPath(object)} className={icn.join(' ')} />; }; break; }; @@ -278,7 +270,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { case I.ObjectLayout.Pdf: case I.ObjectLayout.File: { icn = icn.concat([ 'iconFile', 'c' + iconSize ]); - icon = <img src={U.File.iconImage(object)} className={icn.join(' ')} />; + icon = <img src={U.File.iconPath(object)} className={icn.join(' ')} />; break; }; @@ -507,7 +499,7 @@ const IconObject = observer(class IconObject extends React.Component<Props> { }; defaultIcon (type: string) { - return require(`img/icon/default/${type}.svg`).default; + return require(`img/icon/default/${type}.svg`); }; }); diff --git a/src/ts/component/util/label.tsx b/src/ts/component/util/label.tsx index 4808c730b2..cdfd87e929 100644 --- a/src/ts/component/util/label.tsx +++ b/src/ts/component/util/label.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { FC, useEffect, useRef } from 'react'; import $ from 'jquery'; import { I, U } from 'Lib'; @@ -14,41 +14,47 @@ interface Props { onClick?: (e: any) => void; }; -class Label extends React.Component<Props> { - - node: any = null; - - render () { - const { id, text, color, className, dataset, onClick, onMouseDown, onMouseEnter, onMouseLeave } = this.props; - const cn = [ 'label' ]; - - if (className) { - cn.push(className); - }; +const Label: FC<Props> = ({ + id = '', + text = '', + color = '', + className = '', + dataset = {}, + onClick, + onMouseDown, + onMouseEnter, + onMouseLeave, +}) => { + const nodeRef = useRef<HTMLDivElement | null>(null); + const cn = [ 'label' ]; + + if (className) { + cn.push(className); + }; + if (color) { + cn.push(`textColor textColor-${color}`); + }; - if (color) { - cn.push(`textColor textColor-${color}`); + useEffect(() => { + if (nodeRef.current) { + U.Common.renderLinks($(nodeRef.current)); }; + }, []); + + return ( + <div + ref={nodeRef} + id={id} + className={cn.join(' ')} + dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} + onClick={onClick} + onMouseDown={onMouseDown} + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} + {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} + /> + ); - return ( - <div - ref={node => this.node = node} - id={id} - className={cn.join(' ')} - dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} - onClick={onClick} - onMouseDown={onMouseDown} - onMouseEnter={onMouseEnter} - onMouseLeave={onMouseLeave} - {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} - /> - ); - }; - - componentDidMount () { - U.Common.renderLinks($(this.node)); - }; - }; export default Label; \ No newline at end of file diff --git a/src/ts/component/util/loadMore.tsx b/src/ts/component/util/loadMore.tsx index f3a5c3eae1..2e2f298165 100644 --- a/src/ts/component/util/loadMore.tsx +++ b/src/ts/component/util/loadMore.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; import { Icon } from 'Component'; import { translate, U } from 'Lib'; @@ -9,30 +9,26 @@ interface Props { onClick?(e: any): void; }; -class LoadMore extends React.Component<Props> { - - public static defaultProps = { - limit: 10, +const LoadMore = forwardRef<HTMLDivElement, Props>(({ + limit = 10, + loaded = 0, + total = 0, + onClick, +}, ref) => { + + let number = limit; + if (loaded && total) { + const left = total - loaded; + number = limit < left ? limit : left; }; - render () { - const { limit, loaded, total, onClick } = this.props; - - let number = limit; - if (loaded && total) { - const left = total - loaded; - number = limit < left ? limit : left; - }; + return ( + <div className="loadMore" onClick={onClick}> + <Icon /> + <div className="name">{U.Common.sprintf(translate('utilLoadMoreText'), number, U.Common.plural(number, translate('pluralObject')))}</div> + </div> + ); - return ( - <div className="loadMore" onClick={onClick}> - <Icon /> - <div className="name">{U.Common.sprintf(translate('utilLoadMoreText'), number, U.Common.plural(number, translate('pluralObject')))}</div> - </div> - ); - }; - - -}; +}); -export default LoadMore; +export default LoadMore; \ No newline at end of file diff --git a/src/ts/component/util/loader.tsx b/src/ts/component/util/loader.tsx index a47fc0d0f5..4a387f4464 100644 --- a/src/ts/component/util/loader.tsx +++ b/src/ts/component/util/loader.tsx @@ -1,47 +1,44 @@ -import * as React from 'react'; +import React, { forwardRef } from 'react'; +import { I } from 'Lib'; interface Props { id?: string; - type?: string; + type?: I.LoaderType; className?: string; }; -class Loader extends React.Component<Props> { +const Loader = forwardRef<HTMLDivElement, Props>(({ + id = '', + type = I.LoaderType.Dots, + className = '', +}, ref) => { + + let content = null; + switch (type) { + default: + case I.LoaderType.Dots: { + content = ( + <div className="dots"> + <div className="dot" /> + <div className="dot" /> + <div className="dot" /> + </div> + ); + break; + }; - public static defaultProps = { - className: '', - type: 'dots', + case I.LoaderType.Loader: { + content = <div className="loader" />; + break; + }; }; - render () { - const { id, type, className } = this.props; + return ( + <div id={id} className={[ 'loaderWrapper', className ].join(' ')}> + {content} + </div> + ); - let content = null; - switch (type) { - case 'loader': { - content = <div className="loader" />; - break; - }; - - case 'dots': { - content = ( - <div className="dots"> - <div className="dot" /> - <div className="dot" /> - <div className="dot" /> - </div> - ); - break; - }; - }; - - return ( - <div id={id} className={[ 'loaderWrapper', className ].join(' ')}> - {content} - </div> - ); - }; - -}; +}); export default Loader; \ No newline at end of file diff --git a/src/ts/component/util/marker.tsx b/src/ts/component/util/marker.tsx index c41882a673..294cc81176 100644 --- a/src/ts/component/util/marker.tsx +++ b/src/ts/component/util/marker.tsx @@ -1,11 +1,11 @@ -import * as React from 'react'; +import React, { forwardRef, useRef } from 'react'; import $ from 'jquery'; -import { I, S, U, J } from 'Lib'; -import { observer } from 'mobx-react'; +import { I, S, J } from 'Lib'; +import { useLocalObservable } from 'mobx-react'; interface Props { id: string; - type: any; + type: I.MarkerType; color: string; className?: string; readonly?: boolean; @@ -13,172 +13,81 @@ interface Props { onClick?(): void; }; -const Icons = { - checkbox: { - 0: require('img/icon/marker/checkbox0.svg').default, - 1: require('img/icon/marker/checkbox1.svg').default, - 2: require('img/icon/marker/checkbox2.svg').default, - }, - task: { - 0: require('img/icon/object/checkbox0.svg').default, - 1: require('img/icon/object/checkbox1.svg').default, - 2: require('img/icon/object/checkbox2.svg').default, - }, -}; +const Icons: any = {}; +const Theme: any = { dark: {} }; -const Theme = { - dark: { - checkbox: { - 0: require('img/icon/marker/checkbox0.svg').default, - 1: require('img/theme/dark/icon/marker/checkbox1.svg').default, - 2: require('img/icon/marker/checkbox2.svg').default, - }, - task: { - 0: require('img/icon/object/checkbox0.svg').default, - 1: require('img/theme/dark/icon/object/checkbox1.svg').default, - 2: require('img/icon/object/checkbox2.svg').default, - }, - }, +Icons[I.MarkerType.Checkbox] = { + 0: require('img/icon/marker/checkbox0.svg'), + 1: require('img/icon/marker/checkbox1.svg'), + 2: require('img/icon/marker/checkbox2.svg'), }; -const Marker = observer(class Marker extends React.Component<Props> { +Icons[I.MarkerType.Task] = { + 0: require('img/icon/object/checkbox0.svg'), + 1: require('img/icon/object/checkbox1.svg'), + 2: require('img/icon/object/checkbox2.svg'), +}; - public static defaultProps = { - color: 'default', - }; - node = null; +Theme.dark[I.MarkerType.Checkbox] = { + 0: require('img/icon/marker/checkbox0.svg'), + 1: require('img/theme/dark/icon/marker/checkbox1.svg'), + 2: require('img/icon/marker/checkbox2.svg'), +}; - constructor (props: Props) { - super(props); +Theme.dark[I.MarkerType.Task] = { + 0: require('img/icon/object/checkbox0.svg'), + 1: require('img/theme/dark/icon/object/checkbox1.svg'), + 2: require('img/icon/object/checkbox2.svg'), +}; - this.onCheckboxEnter = this.onCheckboxEnter.bind(this); - this.onCheckboxLeave = this.onCheckboxLeave.bind(this); +const Marker = forwardRef<HTMLDivElement, Props>(({ + id = '', + type = I.MarkerType.Bulleted, + color = 'default', + className = '', + active = false, + readonly = false, + onClick, +}, ref) => { + + const colorValue = color || 'default'; + const refNode = useRef<HTMLDivElement>(null); + const cn = [ 'marker', className ]; + const ci = [ 'markerInner', `c${type}`, `textColor textColor-${colorValue}` ]; + const { theme, themeClass } = useLocalObservable(() => ({ + theme: S.Common.theme, + themeClass: S.Common.getThemeClass(), + })); + + if (active) { + cn.push('active'); }; - - render () { - const { id, type, color, className, active, onClick } = this.props; - const { theme } = S.Common; - const cn = [ 'marker' ]; - const ci = [ 'markerInner', 'c' + type ]; - - if (className) { - cn.push(className); - }; - if (active) { - cn.push('active'); - }; - - if (color) { - ci.push('textColor textColor-' + color); - }; - - const props = { - id: `marker-${id}`, - key: `marker-${id}-${type}`, - className: ci.join(' '), - }; - - let inner: any = null; - - switch (type) { - case I.TextStyle.Bulleted: { - inner = <span {...props} />; - break; - }; - - case I.TextStyle.Numbered: { - inner = <span {...props} />; - break; - }; - - case I.TextStyle.Checkbox: { - inner = ( - <img - src={this.getCheckbox(active ? 2 : 0)} - onDragStart={e => e.preventDefault()} - onMouseEnter={this.onCheckboxEnter} - onMouseLeave={this.onCheckboxLeave} - /> - ); - break; - }; - - case 'checkboxTask': { - inner = ( - <img - src={this.getTask(active ? 2 : 0)} - onDragStart={e => e.preventDefault()} - onMouseEnter={this.onCheckboxEnter} - onMouseLeave={this.onCheckboxLeave} - /> - ); - break; - }; - - case I.TextStyle.Toggle: { - inner = <img src={this.getToggle()} onDragStart={e => e.preventDefault()} />; - break; - }; - }; - - return ( - <div - ref={ref => this.node = ref} - className={cn.join(' ')} - onClick={onClick} - > - {inner} - </div> - ); + + const props = { + id: `marker-${id}`, + key: `marker-${id}-${type}`, + className: ci.join(' '), }; - onCheckboxEnter () { - const { active, readonly } = this.props; - const fn = U.Common.toCamelCase(`get-${this.getIconKey()}`); - - if (!active && this[fn] && !readonly) { - $(this.node).find('img').attr({ src: this[fn](1) }); + const onCheckboxEnterHandler = () => { + if (!active && !readonly) { + $(refNode.current).find('img').attr({ src: getIcon(type)[1] }); }; }; - onCheckboxLeave () { - const { active, readonly } = this.props; - const fn = U.Common.toCamelCase(`get-${this.getIconKey()}`); - - if (!active && this[fn] && !readonly) { - $(this.node).find('img').attr({ src: this[fn](0) }); + const onCheckboxLeaveHandler = () => { + if (!active && !readonly) { + $(refNode.current).find('img').attr({ src: getIcon(type)[0] }); }; }; - getIconKey () { - const { type } = this.props; - - let key = ''; - switch (type) { - case I.TextStyle.Checkbox: key = 'checkbox'; break; - case 'checkboxTask': key = 'task'; break; - }; - return key; - }; - - getIcon (type: string) { - const cn = S.Common.getThemeClass(); - const item = Theme[cn]; - + const getIcon = (type: I.MarkerType) => { + const item = Theme[themeClass]; return (item && item[type]) ? item[type] : Icons[type]; }; - getCheckbox (state: number) { - return this.getIcon('checkbox')[state]; - }; - - getTask (state: number) { - return this.getIcon('task')[state]; - }; - - getToggle () { - const color = this.props.color || 'default'; - const c = J.Theme[S.Common.getThemeClass()]?.color[color]; + const getToggle = () => { + const c = J.Theme[themeClass]?.color[colorValue]; const svg = ` <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> @@ -189,6 +98,47 @@ const Marker = observer(class Marker extends React.Component<Props> { return 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg))); }; + let inner: any = null; + + switch (type) { + case I.MarkerType.Bulleted: { + inner = <span {...props} />; + break; + }; + + case I.MarkerType.Numbered: { + inner = <span {...props} />; + break; + }; + + case I.MarkerType.Checkbox: + case I.MarkerType.Task: { + inner = ( + <img + src={getIcon(type)[active ? 2 : 0]} + onDragStart={e => e.preventDefault()} + onMouseEnter={onCheckboxEnterHandler} + onMouseLeave={onCheckboxLeaveHandler} + /> + ); + break; + }; + + case I.MarkerType.Toggle: { + inner = <img src={getToggle()} onDragStart={e => e.preventDefault()} />; + break; + }; + }; + + return ( + <div + ref={refNode} + className={cn.join(' ')} + onClick={onClick} + > + {inner} + </div> + ); }); export default Marker; \ No newline at end of file diff --git a/src/ts/component/util/media/audio.tsx b/src/ts/component/util/media/audio.tsx index a77eedacea..bd53259dc8 100644 --- a/src/ts/component/util/media/audio.tsx +++ b/src/ts/component/util/media/audio.tsx @@ -1,145 +1,212 @@ import * as React from 'react'; import $ from 'jquery'; -import { Icon, Drag } from 'Component'; +import { Icon, DragHorizontal, DragVertical } from 'Component'; import { U } from 'Lib'; +import { Floater } from '../floater'; +import _ from 'lodash'; interface PlaylistItem { - name: string; + name: string; src: string; }; interface Props { - playlist: PlaylistItem[]; - onPlay?(): void; - onPause?(): void; + playlist: PlaylistItem[]; + onPlay?(): void; + onPause?(): void; }; -class MediaAudio extends React.Component<Props> { - - node: any = null; - volume = 0; - playOnSeek = false; - refTime: any = null; - refVolume: any = null; - current: PlaylistItem = { name: '', src: '' }; - audioNode: HTMLAudioElement; - - constructor (props: Props) { - super(props); - - this.onPlayClick = this.onPlayClick.bind(this); - this.onMute = this.onMute.bind(this); - }; - - render () { - return ( - <div - ref={node => this.node = node} - className="wrap resizable audio mediaAudio" - > - <audio id="audio" preload="auto" src={this.current.src} /> - - <div className="controls"> - <Icon className="play" onClick={this.onPlayClick} /> - - <div className="name"> - <span>{this.current.name}</span> - </div> - - <Drag - id="time" - ref={ref => this.refTime = ref} - value={0} - onStart={(e: any, v: number) => this.onTime(v)} - onMove={(e: any, v: number) => this.onTime(v)} - onEnd={(e: any, v: number) => this.onTimeEnd(v)} - /> - - <div className="time"> - <span id="timeCurrent" className="current">0:00</span> /  - <span id="timeTotal" className="total">0:00</span> - </div> - - <Icon className="volume" onClick={this.onMute} /> - <Drag - id="volume" - ref={ref => this.refVolume = ref} - value={1} - onMove={(e: any, v: number) => this.onVolume(v)} - /> - </div> - </div> - ); - }; - - componentDidMount () { - const { playlist } = this.props; - - if (playlist.length) { - this.current = playlist[0]; +interface State { + volume: number; + muted: boolean; + showVolumeSlider: boolean; + timeMetric: string; + current: PlaylistItem; +}; + +class MediaAudio extends React.PureComponent<Props, State> { + + node: HTMLDivElement = null; + timeDragRef: DragHorizontal = null; + audioNode: HTMLAudioElement = null; + volumeIcon = null; + + playOnSeek = false; + current: PlaylistItem = { name: '', src: '' }; + resizeObserver: ResizeObserver; + fadeOutVolumeSlider = _.debounce(() => this.setState({ showVolumeSlider: false }), 250); + + startedPlaying = false; + + constructor (props: Props) { + super(props); + + this.state = { + volume: 1, + muted: false, + showVolumeSlider: false, + timeMetric: '', + current: null, }; - this.forceUpdate(); - }; + this.onPlayClick = this.onPlayClick.bind(this); + this.onMute = this.onMute.bind(this); + this.onResize = this.onResize.bind(this); + this.resizeObserver = new ResizeObserver(this.onResize); + }; + + render () { + const { volume, muted, current } = this.state; + const { src, name } = current || {}; + const iconClasses = [ 'volume']; - componentDidUpdate () { - this.resize(); - this.rebind(); - }; + if (!volume || muted) { + iconClasses.push('muted'); + }; - componentWillUnmount () { - this.unbind(); - }; + return ( + <div + ref={node => this.node = node} + className="wrap resizable audio mediaAudio" + > + <audio id="audio" preload="auto" src={src} /> + + <div className="controlsWrapper"> + <div className="name"> + <span>{name}</span> + </div> + + <div className="controls"> + <Icon className="play" onClick={this.onPlayClick} /> + + <div className="timeDragWrapper"> + <DragHorizontal + id="time" + ref={ref => this.timeDragRef = ref} + value={0} + onStart={(e: any, v: number) => this.onTime(v)} + onMove={(e: any, v: number) => this.onTime(v)} + onEnd={(e: any, v: number) => this.onTimeEnd(v)} + /> + </div> + + <div className="time"> + <span id="timeMetric" className="metric">{this.state.timeMetric}</span> + </div> + <div onMouseLeave={this.fadeOutVolumeSlider}> + <Icon + onMouseEnter={() => { + this.fadeOutVolumeSlider.cancel(); + return this.setState({ showVolumeSlider: true }); + }} + ref={el => this.volumeIcon = el} + className={iconClasses.join(' ')} + onClick={this.onMute} + /> + + <Floater + anchorEl={this.volumeIcon?.node} + isShown={this.state.showVolumeSlider} + gap={8} + > + <DragVertical + id="volume" + className="volume" + value={volume * (muted ? 0 : 1)} + onChange={(e: any, v: number) => this.onVolume(v)} + onMouseEnter={() => { + this.fadeOutVolumeSlider.cancel(); + return this.setState({ showVolumeSlider: true }); + }} + + /> + </Floater> + </div> + </div> + </div> + </div> + ); + }; - rebind () { - this.unbind(); + componentDidMount () { + const playlist = this.getPlaylist(); - const node = $(this.node); - const el = node.find('#audio'); + this.setState({ current: playlist[0] }); + this.resizeObserver.observe(this.node); + }; - this.audioNode = el.get(0) as HTMLAudioElement; + componentDidUpdate () { + this.resize(); + this.rebind(); + }; + + componentWillUnmount () { + this.unbind(); + this.resizeObserver.unobserve(this.node); + }; + + rebind () { + this.unbind(); + + const node = $(this.node); + const el = node.find('#audio'); + + this.audioNode = el.get(0) as HTMLAudioElement; + + if (el.length) { + el.on('canplay timeupdate', () => this.onTimeUpdate()); + el.on('play', () => this.onPlay()); + el.on('ended pause', () => this.onPause()); + }; + }; + + unbind () { + const node = $(this.node); + const el = node.find('#audio'); + + if (el.length) { + el.off('canplay timeupdate play ended pause'); + }; + }; - if (el.length) { - el.on('canplay timeupdate', () => this.onTimeUpdate()); - el.on('play', () => this.onPlay()); - el.on('ended pause', () => this.onPause()); - }; - }; + getPlaylist () { + return this.props.playlist || []; + }; - unbind () { - const node = $(this.node); - const el = node.find('#audio'); + updatePlaylist (playlist: PlaylistItem[]) { + playlist = playlist || []; - if (el.length) { - el.off('canplay timeupdate play ended pause'); - }; - }; + this.setState({ current: playlist[0] }); + }; - resize () { - if (this.refTime) { - this.refTime.resize(); - }; + resize () { + if (this.timeDragRef) { + this.timeDragRef.resize(); + }; + }; - if (this.refVolume) { - this.refVolume.resize(); - }; - }; + onResize () { + this.resize(); + this.rebind(); + }; - onPlayClick (e: React.MouseEvent) { + onPlayClick (e: React.MouseEvent) { e.preventDefault(); e.stopPropagation(); - const el = this.audioNode; - const paused = el.paused; + const el = this.audioNode; + const paused = el.paused; - U.Common.pauseMedia(); - paused ? this.play() : this.pause(); - }; + U.Common.pauseMedia(); + paused ? this.play() : this.pause(); + }; onPlay () { + this.startedPlaying = true; + const { onPlay } = this.props; - const node = $(this.node); - const icon = node.find('.icon.play'); + const node = $(this.node); + const icon = node.find('.icon.play'); icon.addClass('active'); @@ -150,8 +217,8 @@ class MediaAudio extends React.Component<Props> { onPause () { const { onPause } = this.props; - const node = $(this.node); - const icon = node.find('.icon.play'); + const node = $(this.node); + const icon = node.find('.icon.play'); icon.removeClass('active'); @@ -160,83 +227,67 @@ class MediaAudio extends React.Component<Props> { }; }; - play () { - this.audioNode.play(); - }; + play () { + this.audioNode.play(); + }; - pause () { - this.audioNode.pause(); - }; + pause () { + this.audioNode.pause(); + }; - onMute (e: React.MouseEvent) { + onMute (e: React.MouseEvent) { e.preventDefault(); e.stopPropagation(); + + const muted = !this.state.muted; + this.setState({ muted }); + this.audioNode.volume = this.state.volume * (muted ? 0 : 1); + }; - this.audioNode.volume = this.audioNode.volume ? 0 : (this.volume || 1); - this.refVolume.setValue(this.audioNode.volume); - this.setVolumeIcon(); - }; - - onVolume (v: number) { - const el = this.audioNode; - - this.volume = el.volume = v; - this.setVolumeIcon(); - }; - - setVolumeIcon () { - const node = $(this.node); - const icon = node.find('.icon.volume'); - - this.audioNode.volume ? icon.removeClass('active') : icon.addClass('active'); - }; - - onTime (v: number) { - const paused = this.audioNode.paused; - - if (!paused) { - this.pause(); - this.playOnSeek = true; - }; + onVolume (volume: number) { + this.setState({ volume }); + this.audioNode.volume = volume * (this.state.muted ? 0 : 1); + }; - this.audioNode.currentTime = Number(v * this.audioNode.duration) || 0; - }; + onTime (v: number) { + const paused = this.audioNode.paused; - onTimeEnd (v: number) { - if (this.playOnSeek) { - this.play(); - }; - }; + if (!paused) { + this.pause(); + this.playOnSeek = true; + }; - onTimeUpdate () { - const el = this.audioNode; - if (!el) { - return; - }; + this.audioNode.currentTime = Number(v * this.audioNode.duration) || 0; + }; - const node = $(this.node); - const current = node.find('#timeCurrent'); - const total = node.find('#timeTotal'); + onTimeEnd (v: number) { + if (this.playOnSeek) { + this.play(); + }; + }; - let t = this.getTime(el.currentTime); - current.text(`${U.Common.sprintf('%02d', t.m)}:${U.Common.sprintf('%02d', t.s)}`); + onTimeUpdate () { + const el = this.audioNode; + if (!el) { + return; + }; - t = this.getTime(el.duration); - total.text(`${U.Common.sprintf('%02d', t.m)}:${U.Common.sprintf('%02d', t.s)}`); + const t = this.startedPlaying ? this.getTime(el.currentTime) : this.getTime(el.duration); - this.refTime.setValue(el.currentTime / el.duration); - }; + this.setState({ timeMetric: `${U.Common.sprintf('%02d', t.m)}:${U.Common.sprintf('%02d', t.s)}`}); + this.timeDragRef.setValue(el.currentTime / el.duration); + }; - getTime (t: number): { m: number, s: number } { + getTime (t: number): { m: number, s: number } { t = Number(t) || 0; - const m = Math.floor(t / 60); + const m = Math.floor(t / 60); - t -= m * 60; - const s = Math.floor(t); + t -= m * 60; + const s = Math.floor(t); - return { m, s }; - }; + return { m, s }; + }; }; diff --git a/src/ts/component/util/media/mermaid.tsx b/src/ts/component/util/media/mermaid.tsx index f2d3a2cb8c..562d3dd009 100644 --- a/src/ts/component/util/media/mermaid.tsx +++ b/src/ts/component/util/media/mermaid.tsx @@ -1,64 +1,39 @@ -import * as React from 'react'; +import React, { forwardRef, useRef, useEffect } from 'react'; import $ from 'jquery'; import mermaid from 'mermaid'; -import { observer } from 'mobx-react'; +import { useLocalObservable } from 'mobx-react'; import { J, S } from 'Lib'; interface Props { chart: string; }; -const Mermaid = observer(class Mermaid extends React.Component<Props> { +const MediaMermaid = forwardRef<HTMLDivElement, Props>(({ + chart = '', +}, ref) => { - node = null; + const nodeRef = useRef(null); + const { theme } = useLocalObservable(() => S.Common); - render () { - const { theme } = S.Common; - const { chart } = this.props; - - return ( - <div ref={ref => this.node = ref} className="mermaidWrapper"> - <div className="error" /> - <div className="mermaid">{chart}</div> - </div> - ); - }; - - componentDidMount () { - this.init(); - mermaid.contentLoaded(); - }; - - async componentDidUpdate (prevProps: Props) { - const node = $(this.node); - - this.init(); - node.find('.chart').removeAttr('data-processed'); - node.find('.error').text(''); - - await this.drawDiagram(); - }; - - init () { - const theme = (J.Theme[S.Common.getThemeClass()] || {}).mermaid; + const init = () => { + const themeVariables = (J.Theme[S.Common.getThemeClass()] || {}).mermaid; + if (!themeVariables) { + return; + }; - if (theme) { - for (const k in theme) { - if (!theme[k]) { - delete(theme[k]); - }; + for (const k in themeVariables) { + if (!themeVariables[k]) { + delete(themeVariables[k]); }; - - mermaid.initialize({ theme: 'base', themeVariables: theme }); }; + + mermaid.initialize({ theme: 'base', themeVariables }); }; - async drawDiagram () { - const node = $(this.node); - const { chart } = this.props; + async function drawDiagram () { + const node = $(nodeRef.current); let svg: any = ''; - try { const res = await mermaid.render('mermaid-chart', chart); @@ -71,8 +46,30 @@ const Mermaid = observer(class Mermaid extends React.Component<Props> { }; node.find('.mermaid').html(svg); - }; + }; + + useEffect(() => { + init(); + mermaid.contentLoaded(); + }); + + useEffect(() => { + const node = $(nodeRef.current); + + node.find('.chart').removeAttr('data-processed'); + node.find('.error').text(''); + + init(); + drawDiagram(); + }, [ theme, chart ]); + + return ( + <div ref={nodeRef} className="mermaidWrapper"> + <div className="error" /> + <div className="mermaid">{chart}</div> + </div> + ); }); -export default Mermaid; \ No newline at end of file +export default MediaMermaid; \ No newline at end of file diff --git a/src/ts/component/util/media/video.tsx b/src/ts/component/util/media/video.tsx index f2d3ae2b82..e337dc8fbb 100644 --- a/src/ts/component/util/media/video.tsx +++ b/src/ts/component/util/media/video.tsx @@ -4,10 +4,10 @@ import { U } from 'Lib'; import { Icon } from 'Component'; interface Props { - src: string; + src: string; canPlay?: boolean; - onPlay?(): void; - onPause?(): void; + onPlay?(): void; + onPause?(): void; onClick?(e: any): void; }; @@ -18,54 +18,54 @@ class MediaVideo extends React.Component<Props> { src: '', }; - node: any = null; - speed = 1; + node: any = null; + speed = 1; - constructor (props: Props) { - super(props); + constructor (props: Props) { + super(props); - this.onPlayClick = this.onPlayClick.bind(this); - }; + this.onPlayClick = this.onPlayClick.bind(this); + }; - render () { - const { src, onClick } = this.props; + render () { + const { src, onClick } = this.props; - return ( - <div - ref={ref => this.node = ref} - className="mediaVideo" + return ( + <div + ref={ref => this.node = ref} + className="mediaVideo" onClick={onClick} - > - <video className="media" controls={false} preload="auto" src={src} /> - - <div className="controls"> - <Icon className="play" onClick={this.onPlayClick} /> - </div> - </div> - ); - }; + > + <video className="media" controls={false} preload="auto" src={src} /> + + <div className="controls"> + <Icon className="play" onClick={this.onPlayClick} /> + </div> + </div> + ); + }; - componentDidMount () { - this.rebind(); - }; + componentDidMount () { + this.rebind(); + }; - rebind () { - this.unbind(); + rebind () { + this.unbind(); - const node = $(this.node); - const video = node.find('video'); + const node = $(this.node); + const video = node.find('video'); - video.on('play', () => this.onPlay()); - video.on('pause', () => this.onPause()); - video.on('ended', () => this.onEnded()); - }; + video.on('play', () => this.onPlay()); + video.on('pause', () => this.onPause()); + video.on('ended', () => this.onEnded()); + }; - unbind () { - const node = $(this.node); - const video = node.find('video'); + unbind () { + const node = $(this.node); + const video = node.find('video'); - video.off('canplay ended pause play'); - }; + video.off('canplay ended pause play'); + }; onPlay () { const { onPlay } = this.props; @@ -77,7 +77,7 @@ class MediaVideo extends React.Component<Props> { }; video.get(0).controls = true; - node.addClass('isPlaying'); + node.addClass('isPlaying'); if (onPlay) { onPlay(); @@ -87,7 +87,7 @@ class MediaVideo extends React.Component<Props> { onPause () { const { onPause } = this.props; - if (onPause) { + if (onPause) { onPause(); }; }; @@ -106,7 +106,7 @@ class MediaVideo extends React.Component<Props> { this.onPause(); }; - onPlayClick (e: any) { + onPlayClick (e: any) { if (!this.props.canPlay) { return; }; @@ -121,9 +121,9 @@ class MediaVideo extends React.Component<Props> { return; }; - U.Common.pauseMedia(); + U.Common.pauseMedia(); video.get(0).play(); - }; + }; }; diff --git a/src/ts/component/util/object/cover.tsx b/src/ts/component/util/object/cover.tsx index f30683404b..5fe5e2216d 100644 --- a/src/ts/component/util/object/cover.tsx +++ b/src/ts/component/util/object/cover.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { FC } from 'react'; import { Cover, MediaAudio, MediaVideo } from 'Component'; import { I, S, U } from 'Lib'; @@ -6,12 +6,12 @@ interface Props { object: any; }; -class ObjectCover extends React.Component<Props> { +const ObjectCover: FC<Props> = ({ + object = {} +}) => { + object = object || {}; - render () { - const object = this.props.object || {}; - - if (!object) { + if (!object) { return null; }; @@ -55,8 +55,6 @@ class ObjectCover extends React.Component<Props> { }; return content ? <div className={cn.join(' ')}>{content}</div> : null; - }; - }; export default ObjectCover; \ No newline at end of file diff --git a/src/ts/component/util/object/description.tsx b/src/ts/component/util/object/description.tsx index 87b7c064b2..bd19c16953 100644 --- a/src/ts/component/util/object/description.tsx +++ b/src/ts/component/util/object/description.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { FC } from 'react'; import { U } from 'Lib'; interface Props { @@ -6,28 +6,23 @@ interface Props { className?: string; }; -class Description extends React.Component<Props> { +const ObjectDescription: FC<Props> = ({ + object = {}, + className = 'descr', +}) => { + object = object || {}; - public static defaultProps = { - className: 'descr', + let { description } = object; + if (U.Object.isNoteLayout(object.layout)) { + description = ''; }; - render () { - const { className } = this.props; - const object = this.props.object || {}; - - let { description } = object; - if (U.Object.isNoteLayout(object.layout)) { - description = ''; - }; + if (!description) { + return null; + }; - if (!description) { - return null; - }; + return <div className={className} dangerouslySetInnerHTML={{ __html: U.Common.sanitize(description) }} />; - return <div className={className} dangerouslySetInnerHTML={{ __html: U.Common.sanitize(description) }} />; - }; - }; -export default Description; \ No newline at end of file +export default ObjectDescription; \ No newline at end of file diff --git a/src/ts/component/util/object/name.tsx b/src/ts/component/util/object/name.tsx index b8072cb953..b5b41c802d 100644 --- a/src/ts/component/util/object/name.tsx +++ b/src/ts/component/util/object/name.tsx @@ -1,49 +1,48 @@ -import * as React from 'react'; -import { I, U, translate } from 'Lib'; +import React, { FC, forwardRef, MouseEvent } from 'react'; +import { U, translate } from 'Lib'; interface Props { object: any; className?: string; - onClick?(e: any): void; - onMouseDown?(e: any): void; - onMouseEnter?(e: any): void; - onMouseLeave?(e: any): void; + onClick? (e: MouseEvent): void; + onMouseDown? (e: MouseEvent): void; + onMouseEnter? (e: MouseEvent): void; + onMouseLeave? (e: MouseEvent): void; }; -class Name extends React.Component<Props> { +const ObjectName: FC<Props> = ({ + object = {}, + className = 'name', + onClick, + onMouseDown, + onMouseEnter, + onMouseLeave, +}) => { + object = object || {}; - public static defaultProps = { - className: 'name', - }; - - render () { - const { className, onMouseDown, onMouseEnter, onMouseLeave, onClick } = this.props; - const object = this.props.object || {}; - const { layout, snippet, isDeleted } = object; - - let name = String(object.name || ''); + const { layout, snippet, isDeleted } = object; - if (!isDeleted) { - if (U.Object.isNoteLayout(layout)) { - name = snippet || <span className="empty">{translate('commonEmpty')}</span>; - } else { - name = U.Object.name(object); - }; + let name = String(object.name || ''); + if (!isDeleted) { + if (U.Object.isNoteLayout(layout)) { + name = snippet || <span className="empty">{translate('commonEmpty')}</span>; + } else { + name = U.Object.name(object); }; - - return ( - <div - className={className} - onClick={onClick} - onMouseDown={onMouseDown} - onMouseEnter={onMouseEnter} - onMouseLeave={onMouseLeave} - > - <span>{name}</span> - </div> - ); }; - + + return ( + <div + className={className} + onClick={onClick} + onMouseDown={onMouseDown} + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} + > + <span>{name}</span> + </div> + ); + }; -export default Name; \ No newline at end of file +export default ObjectName; \ No newline at end of file diff --git a/src/ts/component/util/object/type.tsx b/src/ts/component/util/object/type.tsx index e529cb4c2a..fed61a83ce 100644 --- a/src/ts/component/util/object/type.tsx +++ b/src/ts/component/util/object/type.tsx @@ -1,22 +1,23 @@ -import * as React from 'react'; +import React, { FC } from 'react'; import { U, translate } from 'Lib'; interface Props { object: any; }; -class Type extends React.Component<Props> { +const ObjectType: FC<Props> = ({ + object = {}, +}) => { + object = object || {}; + + return !object._empty_ && !object.isDeleted ? ( + <>{U.Common.shorten(object.name, 32)}</> + ): ( + <span className="textColor-red"> + {translate('commonDeletedType')} + </span> + ); - render () { - const object = this.props.object || {}; - - return !object._empty_ && !object.isDeleted ? U.Common.shorten(object.name, 32) : ( - <span className="textColor-red"> - {translate('commonDeletedType')} - </span> - ); - }; - }; -export default Type; \ No newline at end of file +export default ObjectType; \ No newline at end of file diff --git a/src/ts/component/util/progress.tsx b/src/ts/component/util/progress.tsx index 03f222a16a..8fceecdaf4 100644 --- a/src/ts/component/util/progress.tsx +++ b/src/ts/component/util/progress.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; -import { observer } from 'mobx-react'; import $ from 'jquery'; -import { Icon, Label } from 'Component'; -import { S, U, C, J, Storage, keyboard } from 'Lib'; +import { observer } from 'mobx-react'; +import { Icon, Label, Error } from 'Component'; +import { I, S, U, C, J, Storage, keyboard, translate } from 'Lib'; const Progress = observer(class Progress extends React.Component { @@ -22,26 +22,49 @@ const Progress = observer(class Progress extends React.Component { }; render () { - const { progress } = S.Common; - const { status, current, total, isUnlocked, canCancel } = progress || {}; + const { show } = S.Progress; + const list = S.Progress.getList(); + const cn = [ 'progress' ]; - if (!status) { + if (!show || !list.length) { return null; }; - - const text = U.Common.sprintf(status, current, total); - const cn = [ 'progress', (isUnlocked ? 'isUnlocked' : '') ]; - + + const Item = (item: any) => { + const percent = item.total > 0 ? Math.min(100, Math.ceil(item.current / item.total * 100)) : 0; + const isError = item.state == I.ProgressState.Error; + const canCancel = item.canCancel && !isError; + + return ( + <div className="item"> + <div className="nameWrap"> + <Label text={translate(U.Common.toCamelCase(`progress-${item.type}`))} /> + {canCancel ? <Icon className="close" onClick={() => this.onCancel(item.id)} /> : ''} + </div> + + {isError ? ( + <Error text={item.error} /> + ) : ( + <div className="bar"> + <div className="fill" style={{width: `${percent}%` }} /> + </div> + )} + </div> + ); + }; + return ( <div ref={node => this.node = node} className={cn.join(' ')} > <div id="inner" className="inner" onMouseDown={this.onDragStart}> - <Label text={text} /> - {canCancel ? <Icon className="close" onClick={this.onCancel} /> : ''} - <div className="bar"> - <div className="fill" style={{width: (Math.ceil(current / total * 100)) + '%'}} /> + <div className="titleWrap"> + <Label text={translate('commonProgress')} /> + <Label className="percent" text={`${S.Progress.getPercent()}%`} /> + </div> + <div className="items"> + {list.map(item => <Item key={item.id} {...item} />)} </div> </div> </div> @@ -50,39 +73,22 @@ const Progress = observer(class Progress extends React.Component { componentDidMount () { this._isMounted = true; + this.resize(); }; componentDidUpdate () { - const { progress } = S.Common; - if (!progress) { - return; - }; - - const { current, total } = progress; const win = $(window); - const node = $(this.node); - node.removeClass('hide'); this.resize(); - win.off('resize.progress').on('resize.progress', () => this.resize()); - - if (total && (current >= total)) { - node.addClass('hide'); - win.off('resize.progress'); - - window.setTimeout(() => S.Common.progressClear(), 200); - }; }; componentWillUnmount () { this._isMounted = false; + $(window).off('resize.progress'); }; - onCancel (e: any) { - const { progress } = S.Common; - const { id } = progress; - + onCancel (id: string) { C.ProcessCancel(id); }; @@ -107,6 +113,7 @@ const Progress = observer(class Progress extends React.Component { const y = e.pageY - this.dy - win.scrollTop(); this.setStyle(x, y); + Storage.set('progress', { x, y }, true); }; onDragEnd (e: any) { @@ -119,6 +126,9 @@ const Progress = observer(class Progress extends React.Component { checkCoords (x: number, y: number): { x: number, y: number } { const { ww, wh } = U.Common.getWindowDimensions(); + this.width = Number(this.width) || 0; + this.height = Number(this.height) || 0; + x = Number(x) || 0; x = Math.max(0, x); x = Math.min(ww - this.width, x); @@ -139,6 +149,10 @@ const Progress = observer(class Progress extends React.Component { const coords = Storage.get('progress'); this.obj = node.find('#inner'); + if (!this.obj.length) { + return; + }; + this.height = this.obj.outerHeight(); this.width = this.obj.outerWidth(); @@ -150,10 +164,7 @@ const Progress = observer(class Progress extends React.Component { setStyle (x: number, y: number) { const coords = this.checkCoords(x, y); - if ((coords.x !== null) && (coords.y !== null)) { - this.obj.css({ margin: 0, left: coords.x, top: coords.y }); - Storage.set('progress', coords, true); - }; + this.obj.css({ margin: 0, left: coords.x, top: coords.y, bottom: 'auto' }); }; }); diff --git a/src/ts/component/util/sync.tsx b/src/ts/component/util/sync.tsx index f60bef9ff2..74a3b6881d 100644 --- a/src/ts/component/util/sync.tsx +++ b/src/ts/component/util/sync.tsx @@ -1,58 +1,33 @@ -import * as React from 'react'; -import { observer } from 'mobx-react'; +import React, { forwardRef, useRef, MouseEvent } from 'react'; +import { useLocalObservable } from 'mobx-react'; import { Icon, Label } from 'Component'; -import { I, S, J, analytics, translate } from 'Lib'; +import { I, S, U, analytics, translate } from 'Lib'; interface Props { id?: string; className?: string; - rootId: string; onClick: (e: any) => void; }; -const Sync = observer(class Sync extends React.Component<Props> { - - public static defaultProps = { - className: '', - }; - - node: any = null; - - constructor (props: Props) { - super(props); - - this.onClick = this.onClick.bind(this); - }; - - render () { - const { id, className } = this.props; - const { icon, error } = this.getStatus(); - const { account } = S.Auth; - const cn = [ 'sync' ]; - const isStaging = account?.info?.networkId == J.Constant.networkId.development; - - if (className) { - cn.push(className); - }; - if (error) { - cn.push(`error${I.SyncStatusError[error]}`); - }; - - return ( - <div - ref={node => this.node = node} - id={id} - className={cn.join(' ')} - onClick={this.onClick} - > - <Icon className={icon} /> - {isStaging ? <Label className="badge" text={translate('syncButtonStaging')} /> : ''} - </div> - ); +const Sync = forwardRef<HTMLDivElement, Props>(({ + id = '', + className = '', + onClick, +}, ref) => { + + const nodeRef = useRef<HTMLDivElement>(null); + const { account, syncStatus } = useLocalObservable(() => ({ + syncStatus: S.Auth.getSyncStatus(), + account: S.Auth.account, + })); + const isDevelopment = U.Data.isDevelopmentNetwork(); + const cn = [ 'sync', className ]; + + if (syncStatus.error) { + cn.push(`error${I.SyncStatusError[syncStatus.error]}`); }; - onClick (e: any) { - const { onClick } = this.props; + const onClickHandler = (e: MouseEvent) => { const syncStatus = S.Auth.getSyncStatus(); if (onClick) { @@ -62,21 +37,25 @@ const Sync = observer(class Sync extends React.Component<Props> { analytics.event('ClickSyncStatus', { status: syncStatus.status }); }; - getStatus (): any { - const syncStatus = S.Auth.getSyncStatus(); - const { status, network, error } = syncStatus; + const getIcon = (): string => { + const { status, network } = syncStatus; + const icon = network == I.SyncStatusNetwork.LocalOnly ? I.SyncStatusSpace.Offline : I.SyncStatusSpace[status]; - let icon: any = ''; - if (network == I.SyncStatusNetwork.LocalOnly) { - icon = I.SyncStatusSpace.Offline; - } else { - icon = I.SyncStatusSpace[status]; - }; - - icon = String(icon).toLowerCase(); - return { icon, error }; + return String(icon).toLowerCase(); }; + return ( + <div + ref={nodeRef} + id={id} + className={cn.join(' ')} + onClick={onClickHandler} + > + <Icon className={getIcon()} /> + {isDevelopment ? <Label className="badge" text={translate('syncButtonStaging')} /> : ''} + </div> + ); + }); -export default Sync; +export default Sync; \ No newline at end of file diff --git a/src/ts/component/util/title.tsx b/src/ts/component/util/title.tsx index a581a84652..5340c70ba2 100644 --- a/src/ts/component/util/title.tsx +++ b/src/ts/component/util/title.tsx @@ -1,4 +1,4 @@ -import * as React from 'react'; +import React, { forwardRef, useEffect, useRef } from 'react'; import { I, U } from 'Lib'; import $ from 'jquery'; @@ -8,32 +8,27 @@ interface Props { dataset?: any; }; -class Title extends React.Component<Props> { +const Title = forwardRef<{}, Props>(({ + text = '', + className = '', + dataset = {}, +}, ref) => { + const nodeRef = useRef<HTMLDivElement | null>(null); - node: any = null; - - render () { - const { text, className, dataset } = this.props; - const cn = [ 'title' ]; - - if (className) { - cn.push(className); + useEffect(() => { + if (nodeRef.current) { + U.Common.renderLinks($(nodeRef.current)); }; - - return ( - <div - ref={node => this.node = node} - className={cn.join(' ')} - dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} - {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} - /> - ); - }; - - componentDidMount () { - U.Common.renderLinks($(this.node)); - }; - -}; - -export default Title; + }, []); + + return ( + <div + ref={nodeRef} + className={[ 'title', className ].join(' ')} + dangerouslySetInnerHTML={{ __html: U.Common.sanitize(text) }} + {...U.Common.dataProps({ ...dataset, content: text, 'animation-type': I.AnimType.Text })} + /> + ); +}); + +export default Title; \ No newline at end of file diff --git a/src/ts/component/util/toast.tsx b/src/ts/component/util/toast.tsx index bed0aab345..d0741df5ce 100644 --- a/src/ts/component/util/toast.tsx +++ b/src/ts/component/util/toast.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { observer } from 'mobx-react'; import { Button, IconObject, ObjectName } from 'Component'; -import { I, S, U, Preview, Action, translate, keyboard } from 'Lib'; +import { I, S, U, Preview, Action, translate, keyboard, analytics } from 'Lib'; interface State { object: any; @@ -11,11 +11,11 @@ interface State { const Toast = observer(class Toast extends React.Component<object, State> { - state = { - object: null, - target: null, - origin: null, - }; + state = { + object: null, + target: null, + origin: null, + }; constructor (props: any) { super(props); @@ -23,20 +23,20 @@ const Toast = observer(class Toast extends React.Component<object, State> { this.close = this.close.bind(this); }; - render () { - const { toast } = S.Common; + render () { + const { toast } = S.Common; if (!toast) { return null; }; - const { count, action, text, value, object, target, origin, ids } = toast; + const { count, action, text, value, object, target, origin, ids } = toast; - let buttons = []; - let textObject = null; - let textAction = null; - let textOrigin = null; - let textActionTo = null; - let textTarget = null; + let buttons = []; + let textObject = null; + let textAction = null; + let textOrigin = null; + let textActionTo = null; + let textTarget = null; const Element = (item: any) => ( <div className="chunk"> @@ -45,24 +45,20 @@ const Toast = observer(class Toast extends React.Component<object, State> { </div> ); - switch (action) { + switch (action) { default: { textAction = text; break; }; - case I.ToastAction.Lock: { - if (!object) { - break; - }; - - textObject = <Element {...object} />; - textAction = translate(value ? 'toastIsLocked' : 'toastIsUnlocked'); - break; + case I.ToastAction.Lock: { + textObject = object ? <Element {...object} /> : translate('commonObject'); + textAction = translate(value ? 'toastIsLocked' : 'toastIsUnlocked'); + break; }; - case I.ToastAction.Move: { - if (!target) { + case I.ToastAction.Move: { + if (!target) { break; }; @@ -81,12 +77,12 @@ const Toast = observer(class Toast extends React.Component<object, State> { { action: 'open', label: translate('commonOpen') }, { action: 'undo', label: translate('commonUndo') } ]); - break; + break; }; case I.ToastAction.Collection: - case I.ToastAction.Link: { - if (!object || !target) { + case I.ToastAction.Link: { + if (!object || !target) { break; }; @@ -94,31 +90,31 @@ const Toast = observer(class Toast extends React.Component<object, State> { textObject = <Element {...object} />; textTarget = <Element {...target} />; - if (target.id != keyboard.getRootId()) { - buttons = buttons.concat([ - { action: 'open', label: translate('commonOpen') } - ]); - }; - break; + if (target.id != keyboard.getRootId()) { + buttons = buttons.concat([ + { action: 'open', label: translate('commonOpen') } + ]); + }; + break; }; - case I.ToastAction.StorageFull: { - textAction = translate('toastUploadLimitExceeded'); + case I.ToastAction.StorageFull: { + textAction = translate('toastUploadLimitExceeded'); - buttons = buttons.concat([ + buttons = buttons.concat([ { action: 'manageStorage', label: translate('toastManageFiles') } ]); - }; + }; - case I.ToastAction.TemplateCreate: { - if (!object) { - break; - }; + case I.ToastAction.TemplateCreate: { + if (!object) { + break; + }; - textObject = <Element {...object} />; - textAction = translate('toastTemplateCreate'); - break; - }; + textObject = <Element {...object} />; + textAction = translate('toastTemplateCreate'); + break; + }; case I.ToastAction.Archive: { if (!ids) { @@ -133,70 +129,70 @@ const Toast = observer(class Toast extends React.Component<object, State> { ]); break; }; - }; - - return ( - <div id="toast" className="toast" onClick={this.close}> - <div className="inner"> - <div className="message"> - {textObject} - {textAction ? <span dangerouslySetInnerHTML={{ __html: U.Common.sanitize(textAction) }} /> : ''} - {textOrigin} + }; + + return ( + <div id="toast" className="toast" onClick={this.close}> + <div className="inner"> + <div className="message"> + {textObject} + {textAction ? <span dangerouslySetInnerHTML={{ __html: U.Common.sanitize(textAction) }} /> : ''} + {textOrigin} {textActionTo ? <span dangerouslySetInnerHTML={{ __html: U.Common.sanitize(textActionTo) }} /> : ''} - {textTarget} - </div> + {textTarget} + </div> - {buttons.length ? ( + {buttons.length ? ( <div className="buttons"> {buttons.map((item: any, i: number) => ( <Button key={i} text={item.label} onClick={e => this.onClick(e, item)} /> ))} </div> ) : ''} - </div> - </div> - ); - }; + </div> + </div> + ); + }; - componentDidUpdate () { - Preview.toastPosition(); - }; + componentDidUpdate () { + Preview.toastPosition(); + }; close () { Preview.toastHide(true); }; - onClick (e: any, item: any) { + onClick (e: any, item: any) { switch (item.action) { - case 'open': { - this.onOpen(e); - break; + case 'open': { + this.onOpen(e); + break; }; - case 'undo': { - keyboard.onUndo(S.Common.toast.originId, 'Toast'); - break; + case 'undo': { + keyboard.onUndo(S.Common.toast.originId, 'Toast'); + break; }; case 'undoArchive': { if (item.data) { - Action.restore(item.data); + Action.restore(item.data, analytics.route.toast); }; break; }; - case 'manageStorage': { - S.Popup.open('settings', { data: { page: 'storageManager' }}); - S.Common.toastClear(); - }; - }; + case 'manageStorage': { + S.Popup.open('settings', { data: { page: 'storageManager' }}); + S.Common.toastClear(); + }; + }; this.close(); - }; + }; - onOpen (e: any) { - U.Object.openEvent(e, S.Common.toast.target); - }; + onOpen (e: any) { + U.Object.openEvent(e, S.Common.toast.target); + }; }); diff --git a/src/ts/component/vault/index.tsx b/src/ts/component/vault/index.tsx index ee4bcd3448..728b970d08 100644 --- a/src/ts/component/vault/index.tsx +++ b/src/ts/component/vault/index.tsx @@ -26,7 +26,7 @@ const Vault = observer(class Vault extends React.Component { this.onScroll = this.onScroll.bind(this); }; - render () { + render () { const items = U.Menu.getVaultItems(); const Item = item => { @@ -52,12 +52,12 @@ const Vault = observer(class Vault extends React.Component { </div> )); - return ( - <div + return ( + <div ref={node => this.node = node} id="vault" className="vault" - > + > <div className="head" /> <div className="body"> <List @@ -76,9 +76,9 @@ const Vault = observer(class Vault extends React.Component { <Item id="settings" isButton={true} name={translate('commonSettings')} /> </div> </div> - </div> + </div> ); - }; + }; componentDidMount (): void { this.resize(); @@ -207,7 +207,11 @@ const Vault = observer(class Vault extends React.Component { }; case 'gallery': { - S.Popup.open('usecase', {}); + S.Popup.open('usecase', { + data: { + route: analytics.route.usecaseApp, + }, + }); break; }; @@ -336,7 +340,7 @@ const Vault = observer(class Vault extends React.Component { const element = node.find(`#item-${item.id}`); Preview.tooltipShow({ - text: item.name, + text: U.Common.htmlSpecialChars(item.name), element, className: 'fromVault', typeX: I.MenuDirection.Left, diff --git a/src/ts/component/vault/item.tsx b/src/ts/component/vault/item.tsx index 3ca1ba38cc..900c606c8a 100644 --- a/src/ts/component/vault/item.tsx +++ b/src/ts/component/vault/item.tsx @@ -14,7 +14,7 @@ interface Props { const VaultItem = observer(class Vault extends React.Component<Props> { - render () { + render () { const { id, isButton, onClick, onMouseEnter, onMouseLeave, onContextMenu } = this.props; const cn = [ 'item' ]; @@ -27,8 +27,8 @@ const VaultItem = observer(class Vault extends React.Component<Props> { cn.push(`isButton ${id}`); }; - return ( - <div + return ( + <div id={`item-${id}`} className={cn.join(' ')} onClick={onClick} @@ -41,7 +41,7 @@ const VaultItem = observer(class Vault extends React.Component<Props> { </div> </div> ); - }; + }; }); diff --git a/src/ts/component/widget/buttons.tsx b/src/ts/component/widget/buttons.tsx index e258944b82..b55b563c81 100644 --- a/src/ts/component/widget/buttons.tsx +++ b/src/ts/component/widget/buttons.tsx @@ -5,10 +5,11 @@ import { I, S, U, sidebar, translate } from 'Lib'; const WidgetButtons = observer(class WidgetSpace extends React.Component<I.WidgetComponent> { + isSubcribed = false; + constructor (props: I.WidgetComponent) { super(props); - this.onMore = this.onMore.bind(this); this.onClick = this.onClick.bind(this); }; @@ -31,12 +32,13 @@ const WidgetButtons = observer(class WidgetSpace extends React.Component<I.Widge }; }; - if (item.id == 'all') { - button = <Icon className="more" onClick={this.onMore} />; - }; - return ( - <div key={i} id={`item-${item.id}`} className="item" onClick={e => this.onClick(e, item)}> + <div + key={i} + id={`item-${item.id}`} + className="item" + onClick={e => this.onClick(e, item)} + > <div className="side left"> <Icon className={item.id} /> <div className="name"> @@ -64,7 +66,7 @@ const WidgetButtons = observer(class WidgetSpace extends React.Component<I.Widge ret.unshift({ id: 'member', name: translate('commonMembers') }); }; - if (space.spaceMainChatId) { + if (space.chatId && U.Common.isChatAllowed()) { ret.push({ id: 'chat', name: translate('commonMainChat') }); }; @@ -89,32 +91,12 @@ const WidgetButtons = observer(class WidgetSpace extends React.Component<I.Widge }; case 'chat': { - U.Object.openAuto({ id: space.spaceMainChatId, layout: I.ObjectLayout.Chat }); + U.Object.openAuto({ id: S.Block.workspace, layout: I.ObjectLayout.Chat }); break; }; }; }; - onMore (e: any) { - e.preventDefault(); - e.stopPropagation(); - - S.Menu.open('select', { - element: '#widget-buttons #item-all .icon.more', - horizontal: I.MenuDirection.Center, - data: { - options: [ - { id: 'bin', icon: 'bin-black', name: translate('commonBin') }, - ], - onSelect: (e: any, item: any) => { - if (item.id == 'bin') { - U.Object.openEvent(e, { layout: I.ObjectLayout.Archive }); - }; - }, - } - }); - }; - }); -export default WidgetButtons; +export default WidgetButtons; \ No newline at end of file diff --git a/src/ts/component/widget/index.tsx b/src/ts/component/widget/index.tsx index 8e2622dab4..dfd38fbd51 100644 --- a/src/ts/component/widget/index.tsx +++ b/src/ts/component/widget/index.tsx @@ -190,6 +190,7 @@ const WidgetIndex = observer(class WidgetIndex extends React.Component<Props> { id={block.id} dropType={I.DropType.Widget} canDropMiddle={false} + onClick={onClick} /> ); @@ -417,12 +418,6 @@ const WidgetIndex = observer(class WidgetIndex extends React.Component<Props> { typeKey = J.Constant.typeKey.collection; break; }; - - case J.Constant.widgetId.chat: { - details.layout = I.ObjectLayout.Chat; - typeKey = J.Constant.typeKey.chat; - break; - }; }; }; @@ -493,8 +488,9 @@ const WidgetIndex = observer(class WidgetIndex extends React.Component<Props> { const isClosed = Storage.checkToggle('widget', block.id); if (!isPreview) { - isClosed ? node.addClass('isClosed') : node.removeClass('isClosed'); - isClosed ? icon.addClass('isClosed') : node.removeClass('isClosed'); + node.toggleClass('isClosed', isClosed); + icon.toggleClass('isClosed', isClosed); + isClosed ? innerWrap.hide() : innerWrap.show(); }; }; @@ -626,11 +622,6 @@ const WidgetIndex = observer(class WidgetIndex extends React.Component<Props> { filters.push({ relationKey: 'layout', condition: I.FilterCondition.Equal, value: I.ObjectLayout.Collection }); break; }; - - case J.Constant.widgetId.chat: { - filters.push({ relationKey: 'layout', condition: I.FilterCondition.Equal, value: I.ObjectLayout.Chat }); - break; - }; }; U.Data.searchSubscribe({ diff --git a/src/ts/component/widget/space.tsx b/src/ts/component/widget/space.tsx index 67b6e27b48..2081bf5564 100644 --- a/src/ts/component/widget/space.tsx +++ b/src/ts/component/widget/space.tsx @@ -70,11 +70,10 @@ const WidgetSpace = observer(class WidgetSpace extends React.Component<I.WidgetC const participants = U.Space.getParticipantsList([ I.ParticipantStatus.Active, I.ParticipantStatus.Joining, I.ParticipantStatus.Removing ]); const requestCnt = participants.filter(it => it.isJoining || it.isRemoving).length; const isSpaceOwner = U.Space.isMyOwner(); - const showCnt = isSpaceOwner && requestCnt; + const showCnt = isSpaceOwner && !!requestCnt; showCnt ? cnt.show() : cnt.hide(); - showCnt ? node.addClass('withCnt') : node.removeClass('withCnt'); - + node.toggleClass('withCnt', showCnt); cnt.text(requestCnt); }; diff --git a/src/ts/component/widget/view/gallery/item.tsx b/src/ts/component/widget/view/gallery/item.tsx index 7e2d0309a9..694a0bcea1 100644 --- a/src/ts/component/widget/view/gallery/item.tsx +++ b/src/ts/component/widget/view/gallery/item.tsx @@ -166,9 +166,8 @@ const WidgetBoardItem = observer(class WidgetBoardItem extends React.Component<P this.frame = raf(() => { const node = $(this.node); - const icon = node.find('.iconObject'); - icon.length ? node.addClass('withIcon') : node.removeClass('withIcon'); + node.toggleClass('withIcon', !!node.find('.iconObject').length); }); }; diff --git a/src/ts/component/widget/view/graph/index.tsx b/src/ts/component/widget/view/graph/index.tsx index 0523a2443e..adeb42bd24 100644 --- a/src/ts/component/widget/view/graph/index.tsx +++ b/src/ts/component/widget/view/graph/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { observer } from 'mobx-react'; import { I, C, S, U, J, Dataview } from 'Lib'; -import { Graph } from 'Component'; +import { GraphProvider } from 'Component'; const WidgetViewGraph = observer(class WidgetViewGraph extends React.Component<I.WidgetViewComponent> { @@ -23,7 +23,7 @@ const WidgetViewGraph = observer(class WidgetViewGraph extends React.Component<I ref={node => this.node = node} className="wrap" > - <Graph + <GraphProvider key="graph" {...this.props} ref={ref => this.refGraph = ref} diff --git a/src/ts/component/widget/view/index.tsx b/src/ts/component/widget/view/index.tsx index 988ef411cd..3c1e7c1b2b 100644 --- a/src/ts/component/widget/view/index.tsx +++ b/src/ts/component/widget/view/index.tsx @@ -162,9 +162,16 @@ const WidgetView = observer(class WidgetView extends React.Component<I.WidgetCom const { viewId } = parent.content; const view = Dataview.getView(this.getRootId(), J.Constant.blockId.dataview); - this.refSelect?.setValue(viewId); - if (!isSystemTarget() && view && viewId && (viewId != view.id)) { + const ref = this.refSelect; + + if (ref) { + const selectValue = ref.getValue(); + if (viewId != selectValue) { + ref.setValue(viewId); + }; + }; + this.load(viewId); }; }; diff --git a/src/ts/component/widget/view/list/item.tsx b/src/ts/component/widget/view/list/item.tsx index 085802146f..c8b53e0bb7 100644 --- a/src/ts/component/widget/view/list/item.tsx +++ b/src/ts/component/widget/view/list/item.tsx @@ -184,9 +184,8 @@ const WidgetListItem = observer(class WidgetListItem extends React.Component<Pro this.frame = raf(() => { const node = $(this.node); - const icon = node.find('.iconObject'); - icon.length ? node.addClass('withIcon') : node.removeClass('withIcon'); + node.toggleClass('withIcon', !!node.find('.iconObject').length); }); }; diff --git a/src/ts/docs/help/onboarding.ts b/src/ts/docs/help/onboarding.ts index 691eb92b84..c3b8a344c6 100644 --- a/src/ts/docs/help/onboarding.ts +++ b/src/ts/docs/help/onboarding.ts @@ -1,15 +1,15 @@ -import { I, U, translate } from 'Lib'; +import { I, U, translate, S, Onboarding } from 'Lib'; export default { - mainGraph: () => ({ - category: translate('onboardingMainGraph'), - items: [ - { - description: translate('onboardingMainGraph11'), - video: './img/help/onboarding/space.mp4', + mainGraph: () => ({ + category: translate('onboardingMainGraph'), + items: [ + { + description: translate('onboardingMainGraph11'), + video: './img/help/onboarding/space.mp4', buttonText: translate('commonFinish'), - } - ], + } + ], param: { element: '#page.isFull #footer #button-help', @@ -22,61 +22,70 @@ export default { passThrough: true, offsetY: -4, }, - }), + }), - objectCreationStart: () => ({ - category: translate('onboardingObjectCreationStart'), - items: [ - { - description: ` - <p>${translate('onboardingObjectCreationStart11')}</p> - `, - video: './img/help/onboarding/object-1-default-object-type.mp4', - }, - { - description: ` + emailCollection: () => ({ + items: [ { noButton: true } ], + param: { + element: '#page.isFull #footer #button-help', + classNameWrap: 'fixed', + className: 'invertedColor', + vertical: I.MenuDirection.Top, + horizontal: I.MenuDirection.Right, + noArrow: true, + noClose: true, + passThrough: true, + offsetY: -4, + }, + }), + + objectCreationStart: () => ({ + category: translate('onboardingObjectCreationStart'), + items: [ + { + description: ` <p>${translate('onboardingObjectCreationStart21')}</p> `, - video: './img/help/onboarding/object-2-type-menu.mp4', - buttonText: translate('onboardingObjectCreationStart2Button'), - }, - ], - param: { - element: '#page.isFull #footer #button-help', - classNameWrap: 'fixed', - className: 'isWizard', - vertical: I.MenuDirection.Top, - horizontal: I.MenuDirection.Right, - noArrow: true, - noClose: true, - passThrough: true, - offsetY: -4, - }, - }), + video: './img/help/onboarding/object-2-type-menu.mp4', + buttonText: translate('onboardingObjectCreationStart2Button'), + }, + ], + param: { + element: '#page.isFull #footer #button-help', + classNameWrap: 'fixed', + className: 'isWizard', + vertical: I.MenuDirection.Top, + horizontal: I.MenuDirection.Right, + noArrow: true, + noClose: true, + passThrough: true, + offsetY: -4, + }, + }), - objectCreationFinish: () => ({ - category: translate('onboardingObjectCreationFinish'), - items: [ - { - description: ` + objectCreationFinish: () => ({ + category: translate('onboardingObjectCreationFinish'), + items: [ + { + description: ` <p>${translate('onboardingObjectCreationFinish11')}</p> `, - video: './img/help/onboarding/object-layout.mp4', - buttonText: translate('onboardingObjectCreationFinish1Button'), - }, - ], - param: { - element: '#page.isFull #footer #button-help', - classNameWrap: 'fixed', - className: 'isWizard', - vertical: I.MenuDirection.Top, - horizontal: I.MenuDirection.Right, - noArrow: true, - noClose: true, - passThrough: true, - offsetY: -4, - }, - }), + video: './img/help/onboarding/object-layout.mp4', + buttonText: translate('onboardingObjectCreationFinish1Button'), + }, + ], + param: { + element: '#page.isFull #footer #button-help', + classNameWrap: 'fixed', + className: 'isWizard', + vertical: I.MenuDirection.Top, + horizontal: I.MenuDirection.Right, + noArrow: true, + noClose: true, + passThrough: true, + offsetY: -4, + }, + }), basics: () => ({ showDimmer: true, @@ -88,7 +97,14 @@ export default { offsetX: -312, noClose: true, highlightElements: [], - hiddenElements: [ '#widget-buttons', '.widgetView', '.widgetTree', '#containerWidget #list .buttons' ], + hiddenElements: [ + '#widget-buttons', + '.widget', + '#containerWidget #list .buttons', + ], + onClose: () => { + Onboarding.start('emailCollection', false); + }, }, items: [ { @@ -110,7 +126,7 @@ export default { description: translate('onboardingWidgetsText'), param: { element: '.widgetView', - highlightElements: [ '#containerWidget .widget.widgetView', '#containerWidget .widget.widgetTree' ] + highlightElements: [ '#containerWidget .widget.widgetView', '#containerWidget .widget.widgetTree', '#containerWidget .widget.widgetLink' ] } }, { @@ -167,6 +183,7 @@ export default { width: 288, noClose: true, highlightElements: [], + classNameWrap: 'fixed', }, items: [ { @@ -237,7 +254,7 @@ export default { ] }), - typeDeleted: () => ({ + typeDeleted: () => ({ items: [ { name: translate('onboardingTypeDeleted1Title'), @@ -247,9 +264,9 @@ export default { element: '#block-featuredRelations', offsetY: 10, }, - buttons: [ - { text: translate('blockFeaturedTypeMenuChangeType'), action: 'changeType' }, - ], + buttons: [ + { text: translate('blockFeaturedTypeMenuChangeType'), action: 'changeType' }, + ], }, ], }), diff --git a/src/ts/docs/help/whatsNew.ts b/src/ts/docs/help/whatsNew.ts index 69edec5340..3d980dec91 100644 --- a/src/ts/docs/help/whatsNew.ts +++ b/src/ts/docs/help/whatsNew.ts @@ -20,6 +20,23 @@ const link = (url: string, t: string) => `<a href="${url}">${t}</a>`; export default [ { type: I.BlockType.IconPage, icon: '👋' }, + h1(`Desktop 0.43.7 Released!`), + callout(`This follow-up update to the previous release brings improved performance and a few additional enhancements.`, '📃'), + text(''), + + h2(`Changelog `), + bullet(`Improved stabilization and overall app performance.`), + bullet(`Added support for Chinese language search.`), + bullet(`Headers in Sets and Collections are now fixed at the top when scrolling in Grid view.`), + bullet(`Added an ${hl('Open as Object')} action for images and videos opened in fullscreen.`), + bullet(`Typing text with multiple selected blocks now deletes them and starts a new text block.`), + bullet(`Implemented a new progress bars system.`), + bullet(`Fixed an issue where pressing Enter or arrow keys didn’t create a new block below callouts. Thanks, @${link('https://community.anytype.io/t/24175', 'Daria_Sweet97')}!`), + text(''), + + div(), + // --------------------------------------------// + title(`Desktop 0.43.0 Released!`), callout(`A big thank you to our amazing Community for the valuable suggestions and reports that continue to help us along the way!`, '💌'), @@ -170,7 +187,7 @@ export default [ h3(`New Sync Status Indicator 🧘`), text(`Now, you'll get more informative updates for Objects and files. Look out for these handy indicators when there's no network connection or sync. `), img(`42/3.png`), - text(''), + text(''), h3(`Inline LaTeX 🧑‍🔬`), text(`We’re absolutely geeked to finally deliver ${link('https://community.anytype.io/t/2315', 'this long-awaited feature to the community')}! You can now easily add mathematical notation right into your text, making it possible to include complex equations and formulas. Thanks everyone who voted for it! `), @@ -188,7 +205,7 @@ export default [ bullet(`Typed text after a linked object no longer becomes part of the link and can be unlinked. Thanks, @${link('https://community.anytype.io/t/8075', 'floseq')}!`), bullet(`Select all ${hl(`${cmd} + A`)} twice now excludes the title. Thanks, @${link('https://community.anytype.io/t/ctrl-a-behaviour-inconsistent-unpredictable/7612', 'qualquertipo')}!`), bullet(`You can now use crypto (BTC, ETH, USDT, USDC, BNB, Dai, etc.) to pay for memberships.`), - bullet(`Added a menu for selecting filter/sorting options after clicking "New Sort/Filter".`), + bullet(`Added a menu for selecting filter/sorting options after clicking "New Sort/Filter".`), bullet(`Clicking the "Join" button on the Pricing page will now open the app to purchase the subscription if it’s installed, or take you to the download page if it’s not.`), bullet(`Search panel now reopens with previously entered text and selected objects in "Related to" mode.`), text(''), @@ -212,8 +229,8 @@ export default [ bullet(`The Query of the set now updates correctly in the pop-up.`), bullet(`Fixed issue with using library images for type Icons. Thanks, @${link('https://community.anytype.io/t/22297', 'Self-Perfection')}!`), bullet(`Keyboard cursor no longer disappears after cutting a whole line (block). Thanks, @${link('https://community.anytype.io/t/20781', 'SirCaptain')}!`), - bullet(`Clarified the prompt for image uploads when no images are present.`), - bullet(`Made sizes dropdown menu consistent throughout UI.`), + bullet(`Clarified the prompt for image uploads when no images are present.`), + bullet(`Made sizes dropdown menu consistent throughout UI.`), bullet(`Fixed manual reordering of favorites in the widget. Thanks, @elias`), bullet(`Fixed issue where cursor couldn't break out of box when using text-style inline code. Thanks, @${link('https://community.anytype.io/t/8944', 'Xonline')}!`), bullet(`Fixed Markdown behavior for underscores and dashes. Thanks, @${link('https://community.anytype.io/t/17152', 'katcher')}!`), diff --git a/src/ts/hook/index.ts b/src/ts/hook/index.ts new file mode 100644 index 0000000000..32eea2581c --- /dev/null +++ b/src/ts/hook/index.ts @@ -0,0 +1,5 @@ +import useElementMovement from './useElementMovement'; + +export { + useElementMovement, +}; \ No newline at end of file diff --git a/src/ts/hook/useElementMovement.ts b/src/ts/hook/useElementMovement.ts new file mode 100644 index 0000000000..649c32a909 --- /dev/null +++ b/src/ts/hook/useElementMovement.ts @@ -0,0 +1,103 @@ +import { useEffect } from 'react'; + +interface Position { + x: number; + y: number; + width: number; + height: number; +} + +class ElementMovementObserver { + + private movementObserver: MutationObserver; + private resizeObserver: ResizeObserver; + + private element: HTMLElement; + private lastPosition: Position; + + private onMove: (position: Position) => void; + + constructor(element: HTMLElement, callback: (position: Position) => void) { + this.element = element; + this.onMove = callback; + this.lastPosition = this.getPosition(); + + this.movementObserver = new MutationObserver(() => { + this.checkForMovement(); + }); + + this.resizeObserver = new ResizeObserver(() => { + this.checkForMovement(); + }); + + this.startObserving(); + }; + + private checkForMovement = () => { + const currentPosition = this.getPosition(); + + if (this.hasPositionChanged(currentPosition)) { + this.lastPosition = currentPosition; + this.onMove(currentPosition); + }; + }; + + private getPosition (): Position { + const rect = this.element.getBoundingClientRect(); + + return { + x: rect.left + window.scrollX, + y: rect.top + window.scrollY, + width: rect.width, + height: rect.height + }; + }; + + private hasPositionChanged (current: Position): boolean { + return ( + (current.x !== this.lastPosition.x) || + (current.y !== this.lastPosition.y) || + (current.width !== this.lastPosition.width) || + (current.height !== this.lastPosition.height) + ); + }; + + private startObserving (): void { + const config: MutationObserverInit = { + attributes: true, + childList: true, + subtree: true, + characterData: true + }; + + // Observe the element and its descendants for movement + this.movementObserver.observe(this.element, config); + + // Observe the document body for layout changes + this.movementObserver.observe(document.body, config); + + // Observe the element for size changes + this.resizeObserver.observe(this.element); + + // And handle scroll + window.addEventListener('scroll', this.checkForMovement); + }; + + public disconnect (): void { + this.movementObserver.disconnect(); + this.resizeObserver.disconnect(); + window.removeEventListener('scroll', this.checkForMovement); + }; +}; + +export default function useElementMovement (element: HTMLElement | null, callback: (position: Position) => void ) { + useEffect(() => { + if (!element) { + return; + }; + + const movementObserver = new ElementMovementObserver(element, callback); + + return () => movementObserver.disconnect(); + }, [ element, callback ]); +}; \ No newline at end of file diff --git a/src/ts/interface/account.ts b/src/ts/interface/account.ts index 0500080856..f305675e5e 100644 --- a/src/ts/interface/account.ts +++ b/src/ts/interface/account.ts @@ -1,8 +1,8 @@ export enum AccountStatusType { Active = 0, - PendingDeletion = 1, + PendingDeletion = 1, StartedDeletion = 2, - Deleted = 3, + Deleted = 3, }; export interface Account { @@ -24,6 +24,7 @@ export interface AccountInfo { widgetsId: string; analyticsId: string; networkId: string; + workspaceObjectId: string; }; export interface AccountConfig { diff --git a/src/ts/interface/block/chat.ts b/src/ts/interface/block/chat.ts index 627c2aa72f..cbb52ec358 100644 --- a/src/ts/interface/block/chat.ts +++ b/src/ts/interface/block/chat.ts @@ -40,4 +40,17 @@ export interface ChatMessageAttachment { type: AttachmentType; }; +export interface ChatMessageComponent extends I.BlockComponent { + blockId: string; + id: string; + isThread: boolean; + isNew: boolean; + onThread: (id: string) => void; + onContextMenu: (e: any) => void; + onMore: (e: any) => void; + onReplyEdit: (e: any) => void; + onReplyClick: (e: any) => void; + getReplyContent: (message: any) => any; +}; + export interface BlockChat extends I.Block {}; \ No newline at end of file diff --git a/src/ts/interface/block/dataview.ts b/src/ts/interface/block/dataview.ts index f3faaa47c0..9092e30bf1 100644 --- a/src/ts/interface/block/dataview.ts +++ b/src/ts/interface/block/dataview.ts @@ -1,9 +1,9 @@ import { I } from 'Lib'; export enum CardSize { - Small = 0, - Medium = 1, - Large = 2, + Small = 0, + Medium = 1, + Large = 2, }; export enum DateFormat { @@ -15,46 +15,35 @@ export enum DateFormat { }; export enum TimeFormat { - H12 = 0, - H24 = 1, + H12 = 0, + H24 = 1, }; export enum ViewType { - Grid = 0, - List = 1, - Gallery = 2, - Board = 3, - Calendar = 4, - Graph = 5, -}; - -export enum SortId { - All = 'all', - Orphan = 'orphan', - Updated = 'updated', - Created = 'created', - Name = 'name', - LastUsed = 'lastUsed', - List = 'list', - Compact = 'compact', + Grid = 0, + List = 1, + Gallery = 2, + Board = 3, + Calendar = 4, + Graph = 5, }; export enum SortType { - Asc = 0, - Desc = 1, - Custom = 2, + Asc = 0, + Desc = 1, + Custom = 2, }; export enum EmptyType { - None = 0, - Start = 1, - End = 2, + None = 0, + Start = 1, + End = 2, }; export enum FilterOperator { - None = 0, - And = 1, - Or = 2, + None = 0, + And = 1, + Or = 2, }; export enum FilterCondition { @@ -74,7 +63,7 @@ export enum FilterCondition { AllIn = 13, NotAllIn = 14, ExactIn = 15, - NotExactIn = 16, + NotExactIn = 16, }; export enum FilterQuickOption { @@ -92,6 +81,30 @@ export enum FilterQuickOption { NumberOfDaysNow = 11, }; +export enum FormulaType { + None = 0, + Count = 1, + CountDistinct = 2, + CountEmpty = 3, + CountNotEmpty = 4, + PercentEmpty = 5, + PercentNotEmpty = 6, + MathSum = 7, + MathAverage = 8, + MathMedian = 9, + MathMin = 10, + MathMax = 11, + Range = 12, +}; + +export enum FormulaSection { + None = 0, + Count = 1, + Percent = 2, + Math = 3, + Date = 4, +}; + export interface Sort { id?: string; relationKey: string; @@ -119,6 +132,7 @@ export interface ViewRelation { includeTime?: boolean; dateFormat?: I.DateFormat; timeFormat?: I.TimeFormat; + formulaType?: I.FormulaType; }; export interface ViewComponent { @@ -197,6 +211,7 @@ export interface View { defaultTemplateId?: string; defaultTypeId?: string; getVisibleRelations?: () => I.ViewRelation[]; + getRelations?: () => I.ViewRelation[]; getRelation?: (relationKey: string) => I.ViewRelation; isGrid?(): boolean; isList?(): boolean; diff --git a/src/ts/interface/block/index.ts b/src/ts/interface/block/index.ts index 60d4c58697..c3eaa3c584 100644 --- a/src/ts/interface/block/index.ts +++ b/src/ts/interface/block/index.ts @@ -87,9 +87,9 @@ export interface BlockComponent { onUpdate?(): void; getWrapperWidth?(): number; blockRemove?(focused?: I.Block): void; - renderMentions?(rootId: string, node: any, marks: I.Mark[], value: string): void; - renderObjects?(rootId: string, node: any, marks: I.Mark[], value: string, props: any): void; - renderLinks?(node: any, marks: I.Mark[], value: string, props: any): void; + renderMentions?(rootId: string, node: any, marks: I.Mark[], getValue: () => string): void; + renderObjects?(rootId: string, node: any, marks: I.Mark[], getValue: () => string, props: any): void; + renderLinks?(node: any, marks: I.Mark[], getValue: () => string, props: any): void; renderEmoji?(node: any): void; checkMarkOnBackspace?(value: string, range: I.TextRange, marks: I.Mark[]): { value: string, marks: I.Mark[], save: boolean }; }; diff --git a/src/ts/interface/block/text.ts b/src/ts/interface/block/text.ts index 34cffd3e66..85cafbcdd2 100644 --- a/src/ts/interface/block/text.ts +++ b/src/ts/interface/block/text.ts @@ -1,5 +1,13 @@ import { I } from 'Lib'; +export enum MarkerType { + Bulleted = 0, + Numbered = 1, + Checkbox = 2, + Task = 3, + Toggle = 4, +}; + export enum TextStyle { Paragraph = 0, Header1 = 1, diff --git a/src/ts/interface/common.ts b/src/ts/interface/common.ts index 480bd8c170..80d21a2be9 100644 --- a/src/ts/interface/common.ts +++ b/src/ts/interface/common.ts @@ -123,8 +123,8 @@ export enum Usecase { None = 0, GetStarted = 1, Personal = 2, - Knowledge = 3, - Notes = 4, + Knowledge = 3, + Notes = 4, Strategic = 5, Empty = 6, }; @@ -201,9 +201,9 @@ export enum SurveyType { export enum SliceOperation { None = 0, Add = 1, - Move = 2, + Move = 2, Remove = 3, - Replace = 4, + Replace = 4, }; export enum FileSyncStatus { @@ -283,4 +283,39 @@ export interface RouteParam { onFadeOut: () => void; onFadeIn?: () => void; onRouteChange?: () => void; +}; + +export interface SearchSubscribeParam { + spaceId: string; + subId: string; + idField: string; + filters: I.Filter[]; + sorts: I.Sort[]; + keys: string[]; + sources: string[]; + collectionId: string; + afterId: string; + beforeId: string; + offset: number; + limit: number; + ignoreHidden: boolean; + ignoreDeleted: boolean; + ignoreArchived: boolean; + noDeps: boolean; +}; + +export enum SortId { + All = 'all', + Orphan = 'orphan', + Updated = 'updated', + Created = 'created', + Name = 'name', + LastUsed = 'lastUsed', + List = 'list', + Compact = 'compact', +}; + +export enum LoaderType { + Loader = 'loader', + Dots = 'dots', }; \ No newline at end of file diff --git a/src/ts/interface/menu.ts b/src/ts/interface/menu.ts index 1252d040d6..ab3d4395e3 100644 --- a/src/ts/interface/menu.ts +++ b/src/ts/interface/menu.ts @@ -83,7 +83,6 @@ export interface MenuItem { readonly?: boolean; style?: any; iconSize?: number; - withDefault?: boolean; options?: I.Option[]; selectMenuParam?: any; isActive?: boolean; diff --git a/src/ts/interface/notification.ts b/src/ts/interface/notification.ts index 03174a4e83..32c89d8525 100644 --- a/src/ts/interface/notification.ts +++ b/src/ts/interface/notification.ts @@ -14,14 +14,14 @@ export enum NotificationType { }; export enum NotificationStatus { - Created = 0, - Shown = 1, - Read = 2, - Replied = 3, + Created = 0, + Shown = 1, + Read = 2, + Replied = 3, }; export enum NotificationAction { - Close = 0, + Close = 0, }; export interface Notification { diff --git a/src/ts/interface/object.ts b/src/ts/interface/object.ts index bf2a8d5400..63e92c3579 100644 --- a/src/ts/interface/object.ts +++ b/src/ts/interface/object.ts @@ -20,8 +20,8 @@ export enum ObjectLayout { SpaceView = 18, Participant = 19, Pdf = 20, - Chat = 21, - ChatDerived = 22, + ChatOld = 21, + Chat = 22, Empty = 100, Navigation = 101, @@ -59,7 +59,7 @@ export enum RelationScope { export enum ObjectFlag { DeleteEmpty = 0, SelectType = 1, - SelectTemplate = 2, + SelectTemplate = 2, }; export enum ObjectOrigin { diff --git a/src/ts/interface/progress.ts b/src/ts/interface/progress.ts index bb7b9b6813..a9be23ba08 100644 --- a/src/ts/interface/progress.ts +++ b/src/ts/interface/progress.ts @@ -1,26 +1,28 @@ export enum ProgressType { - File = 0, - Import = 1, - Export = 2, - Download = 3, - Recover = 4, - Migration = 5, + Drop = 'dropFiles', + Import = 'import', + Export = 'export', + Save = 'saveFile', + Migrate = 'migration', + Update = 'update', + UpdateCheck = 'updateCheck', }; export enum ProgressState { - None = 0, - Running = 1, - Done = 2, - Canceled = 3, - Error = 4, + None = 0, + Running = 1, + Done = 2, + Canceled = 3, + Error = 4, }; export interface Progress { id?: string; + spaceId?: string; type?: ProgressType; - status?: string; current?: number; total?: number; - isUnlocked?: boolean; + state?: ProgressState; canCancel?: boolean; + error?: string; }; \ No newline at end of file diff --git a/src/ts/lib/action.ts b/src/ts/lib/action.ts index 822cc99a38..75e2f91892 100644 --- a/src/ts/lib/action.ts +++ b/src/ts/lib/action.ts @@ -449,14 +449,14 @@ class Action { }); }; - archive (ids: string[], callBack?: () => void) { + archive (ids: string[], route: string, callBack?: () => void) { C.ObjectListSetIsArchived(ids, true, (message: any) => { if (message.error.code) { return; }; Preview.toastShow({ action: I.ToastAction.Archive, ids }); - analytics.event('MoveToBin', { count: ids.length }); + analytics.event('MoveToBin', { route, count: ids.length }); if (callBack) { callBack(); @@ -464,13 +464,13 @@ class Action { }); }; - restore (ids: string[], callBack?: () => void) { + restore (ids: string[], route: string, callBack?: () => void) { C.ObjectListSetIsArchived(ids, false, (message: any) => { if (message.error.code) { return; }; - analytics.event('RestoreFromBin', { count: ids.length }); + analytics.event('RestoreFromBin', { route, count: ids.length }); if (callBack) { callBack(); diff --git a/src/ts/lib/analytics.ts b/src/ts/lib/analytics.ts index de7f6c5014..379056a04b 100644 --- a/src/ts/lib/analytics.ts +++ b/src/ts/lib/analytics.ts @@ -47,6 +47,9 @@ class Analytics { allObjects: 'AllObjects', vault: 'Vault', void: 'Void', + chat: 'Chat', + archive: 'Bin', + toast: 'Toast', menuOnboarding: 'MenuOnboarding', menuObject: 'MenuObject', @@ -68,7 +71,10 @@ class Analytics { addWidgetMain: 'Main', addWidgetEditor: 'Editor', addWidgetMenu: 'Menu', - addWidgetDnD: 'DnD' + addWidgetDnD: 'DnD', + + usecaseApp: 'App', + usecaseSite: 'Site', }; debug () { @@ -127,7 +133,7 @@ class Analytics { const { config } = S.Common; const platform = U.Common.getPlatform(); const electron = U.Common.getElectron(); - const { version, isPackaged } = electron; + const { version, isPackaged, userPath } = electron; if (!version) { return; @@ -145,7 +151,7 @@ class Analytics { ret.push(config.channel); }; - C.MetricsSetParameters(platform, ret.join('-')); + C.InitialSetParameters(platform, ret.join('-'), userPath(), '', true); }; profile (id: string, networkId: string) { @@ -380,6 +386,15 @@ class Analytics { break; }; + case 'ClickGridFormula': + case 'ChangeGridFormula': { + data.format = Number(data.format) || 0; + data.format = I.RelationType[data.format]; + data.type = Number(data.type) || 0; + data.type = I.FormulaType[data.type]; + break; + }; + case 'OpenAsObject': { if (data.type == I.BlockType.File) { if (undefined !== data.params?.fileType) { @@ -455,6 +470,11 @@ class Analytics { break; }; + case 'ChangeLibraryType': { + data.type = data.type ? U.Common.toUpperCamelCase(`-${data.type}`) : ''; + break; + }; + case 'DeleteSpace': { data.type = Number(data.type) || 0; data.type = I.SpaceType[data.type]; diff --git a/src/ts/lib/animation.ts b/src/ts/lib/animation.ts index 399b7fff52..32b781f6b2 100644 --- a/src/ts/lib/animation.ts +++ b/src/ts/lib/animation.ts @@ -3,7 +3,7 @@ import $ from 'jquery'; import { I } from 'Lib'; const Duration = { - Normal: 0.1, + Normal: 0.05, Word: 0.01, }; diff --git a/src/ts/lib/api/command.ts b/src/ts/lib/api/command.ts index 12ce301685..5bafdb5c9d 100644 --- a/src/ts/lib/api/command.ts +++ b/src/ts/lib/api/command.ts @@ -4,13 +4,16 @@ import { I, S, U, J, Mark, Storage, dispatcher, Encode, Mapper, keyboard } from const { Rpc, Empty } = Commands; -export const MetricsSetParameters = (platform: I.Platform, version: string, callBack?: (message: any) => void) => { - const request = new Rpc.Metrics.SetParameters.Request(); +export const InitialSetParameters = (platform: I.Platform, version: string, workDir: string, logLevel: string, doNotSendLogs: boolean, callBack?: (message: any) => void) => { + const request = new Rpc.Initial.SetParameters.Request(); request.setPlatform(platform); request.setVersion(version); + request.setWorkdir(workDir); + request.setLoglevel(logLevel); + request.setDonotsendlogs(doNotSendLogs); - dispatcher.request(MetricsSetParameters.name, request, callBack); + dispatcher.request(InitialSetParameters.name, request, callBack); }; export const ProcessCancel = (id: string, callBack?: (message: any) => void) => { @@ -104,19 +107,21 @@ export const WalletCloseSession = (token: string, callBack?: (message: any) => v // ---------------------- WORKSPACE ---------------------- // -export const WorkspaceCreate = (details: any, usecase: I.Usecase, callBack?: (message: any) => void) => { +export const WorkspaceCreate = (details: any, usecase: I.Usecase, withChat: boolean, callBack?: (message: any) => void) => { const request = new Rpc.Workspace.Create.Request(); request.setDetails(Encode.struct(details)); request.setUsecase(usecase as number); + request.setWithchat(withChat); dispatcher.request(WorkspaceCreate.name, request, callBack); }; -export const WorkspaceOpen = (spaceId: string, callBack?: (message: any) => void) => { +export const WorkspaceOpen = (spaceId: string, withChat: boolean, callBack?: (message: any) => void) => { const request = new Rpc.Workspace.Open.Request(); request.setSpaceid(spaceId); + request.setWithchat(withChat); dispatcher.request(WorkspaceOpen.name, request, callBack); }; @@ -495,8 +500,8 @@ export const BlockCopy = (contextId: string, blocks: I.Block[], range: I.TextRan const request = new Rpc.Block.Copy.Request(); request.setContextid(contextId); - request.setBlocksList(blocks.map(Mapper.To.Block)); - request.setSelectedtextrange(Mapper.To.Range(range)); + request.setBlocksList(blocks.map(Mapper.To.Block)); + request.setSelectedtextrange(Mapper.To.Range(range)); dispatcher.request(BlockCopy.name, request, callBack); }; @@ -507,8 +512,8 @@ export const BlockCut = (contextId: string, blocks: I.Block[], range: I.TextRang const request = new Rpc.Block.Cut.Request(); request.setContextid(contextId); - request.setBlocksList(blocks.map(Mapper.To.Block)); - request.setSelectedtextrange(Mapper.To.Range(range)); + request.setBlocksList(blocks.map(Mapper.To.Block)); + request.setSelectedtextrange(Mapper.To.Range(range)); dispatcher.request(BlockCut.name, request, callBack); }; @@ -519,11 +524,11 @@ export const BlockPaste = (contextId: string, focusedId: string, range: I.TextRa const request = new Rpc.Block.Paste.Request(); request.setContextid(contextId); - request.setFocusedblockid(focusedId); - request.setSelectedtextrange(Mapper.To.Range(range)); - request.setIspartofblock(isPartOfBlock); - request.setSelectedblockidsList(blockIds); - request.setTextslot(data.text); + request.setFocusedblockid(focusedId); + request.setSelectedtextrange(Mapper.To.Range(range)); + request.setIspartofblock(isPartOfBlock); + request.setSelectedblockidsList(blockIds); + request.setTextslot(data.text); request.setHtmlslot(data.html); request.setAnyslotList((data.anytype || []).map(Mapper.To.Block)); request.setFileslotList((data.files || []).map(Mapper.To.PasteFile)); @@ -536,10 +541,10 @@ export const BlockListMoveToExistingObject = (contextId: string, targetContextId const request = new Rpc.Block.ListMoveToExistingObject.Request(); request.setContextid(contextId); - request.setTargetcontextid(targetContextId); - request.setBlockidsList(blockIds); - request.setDroptargetid(targetId); - request.setPosition(position as number); + request.setTargetcontextid(targetContextId); + request.setBlockidsList(blockIds); + request.setDroptargetid(targetId); + request.setPosition(position as number); dispatcher.request(BlockListMoveToExistingObject.name, request, callBack); }; @@ -548,7 +553,7 @@ export const BlockListConvertToObjects = (contextId: string, blockIds: string[], const request = new Rpc.Block.ListConvertToObjects.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); + request.setBlockidsList(blockIds); request.setObjecttypeuniquekey(typeKey); request.setTemplateid(templateId); request.setBlock(Mapper.To.Block(block)); @@ -561,9 +566,9 @@ export const BlockListDuplicate = (contextId: string, targetContextId: string, b request.setContextid(contextId); request.setTargetcontextid(targetContextId); - request.setBlockidsList(blockIds); - request.setTargetid(targetId); - request.setPosition(position as number); + request.setBlockidsList(blockIds); + request.setTargetid(targetId); + request.setPosition(position as number); dispatcher.request(BlockListDuplicate.name, request, callBack); }; @@ -572,8 +577,8 @@ export const BlockListTurnInto = (contextId: string, blockIds: string[], style: const request = new Rpc.Block.ListTurnInto.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setStyle(style as number); + request.setBlockidsList(blockIds); + request.setStyle(style as number); dispatcher.request(BlockListTurnInto.name, request, callBack); }; @@ -593,8 +598,8 @@ export const BlockDivListSetStyle = (contextId: string, blockIds: string[], styl const request = new Rpc.BlockDiv.ListSetStyle.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setStyle(style as number); + request.setBlockidsList(blockIds); + request.setStyle(style as number); dispatcher.request(BlockDivListSetStyle.name, request, callBack); }; @@ -797,8 +802,8 @@ export const BlockFileListSetStyle = (contextId: string, blockIds: string[], sty const request = new Rpc.BlockFile.ListSetStyle.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setStyle(style as number); + request.setBlockidsList(blockIds); + request.setStyle(style as number); dispatcher.request(BlockFileListSetStyle.name, request, callBack); }; @@ -807,8 +812,8 @@ export const BlockFileSetTargetObjectId = (contextId: string, blockId: string, o const request = new Rpc.BlockFile.SetTargetObjectId.Request(); request.setContextid(contextId); - request.setBlockid(blockId); - request.setObjectid(objectId); + request.setBlockid(blockId); + request.setObjectid(objectId); dispatcher.request(BlockFileSetTargetObjectId.name, request, callBack); }; @@ -819,8 +824,8 @@ export const BlockTextListSetColor = (contextId: string, blockIds: string[], col const request = new Rpc.BlockText.ListSetColor.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setColor(color); + request.setBlockidsList(blockIds); + request.setColor(color); dispatcher.request(BlockTextListSetColor.name, request, callBack); }; @@ -829,8 +834,8 @@ export const BlockTextListSetMark = (contextId: string, blockIds: string[], mark const request = new Rpc.BlockText.ListSetMark.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setMark(Mapper.To.Mark(mark)); + request.setBlockidsList(blockIds); + request.setMark(Mapper.To.Mark(mark)); dispatcher.request(BlockTextListSetMark.name, request, callBack); }; @@ -849,7 +854,7 @@ export const BlockTextListClearStyle = (contextId: string, blockIds: string[], c const request = new Rpc.BlockText.ListClearStyle.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); + request.setBlockidsList(blockIds); dispatcher.request(BlockTextListClearStyle.name, request, callBack); }; @@ -858,7 +863,7 @@ export const BlockTextListClearContent = (contextId: string, blockIds: string[], const request = new Rpc.BlockText.ListClearContent.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); + request.setBlockidsList(blockIds); dispatcher.request(BlockTextListClearContent.name, request, callBack); }; @@ -869,7 +874,7 @@ export const BlockListSetFields = (contextId: string, fields: any, callBack?: (m const request = new Rpc.Block.ListSetFields.Request(); request.setContextid(contextId); - request.setBlockfieldsList(fields); + request.setBlockfieldsList(fields); dispatcher.request(BlockListSetFields.name, request, callBack); }; @@ -878,8 +883,8 @@ export const BlockListSetBackgroundColor = (contextId: string, blockIds: string[ const request = new Rpc.Block.ListSetBackgroundColor.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setColor(color); + request.setBlockidsList(blockIds); + request.setColor(color); dispatcher.request(BlockListSetBackgroundColor.name, request, callBack); }; @@ -888,8 +893,8 @@ export const BlockListSetAlign = (contextId: string, blockIds: string[], align: const request = new Rpc.Block.ListSetAlign.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setAlign(align as number); + request.setBlockidsList(blockIds); + request.setAlign(align as number); dispatcher.request(BlockListSetAlign.name, request, callBack); }; @@ -898,8 +903,8 @@ export const BlockListSetVerticalAlign = (contextId: string, blockIds: string[], const request = new Rpc.Block.ListSetVerticalAlign.Request(); request.setContextid(contextId); - request.setBlockidsList(blockIds); - request.setVerticalalign(align as number); + request.setBlockidsList(blockIds); + request.setVerticalalign(align as number); dispatcher.request(BlockListSetVerticalAlign.name, request, callBack); }; @@ -1654,7 +1659,7 @@ export const ObjectSetLayout = (contextId: string, layout: I.ObjectLayout, callB const request = new Rpc.Object.SetLayout.Request(); request.setContextid(contextId); - request.setLayout(layout as number); + request.setLayout(layout as number); dispatcher.request(ObjectSetLayout.name, request, callBack); }; @@ -1663,7 +1668,7 @@ export const ObjectSetIsFavorite = (contextId: string, isFavorite: boolean, call const request = new Rpc.Object.SetIsFavorite.Request(); request.setContextid(contextId); - request.setIsfavorite(isFavorite); + request.setIsfavorite(isFavorite); dispatcher.request(ObjectSetIsFavorite.name, request, callBack); }; @@ -1673,7 +1678,7 @@ export const ObjectGraph = (spaceId: string, filters: any[], limit: number, type request.setSpaceid(spaceId); request.setFiltersList(filters.map(Mapper.To.Filter)); - request.setLimit(limit); + request.setLimit(limit); request.setObjecttypefilterList(types); request.setKeysList(keys); request.setCollectionid(collectionId); @@ -1909,6 +1914,14 @@ export const DebugStat = (callBack?: (message: any) => void) => { dispatcher.request(DebugStat.name, request, callBack); }; +export const DebugNetCheck = (config: string, callBack?: (message: any) => void) => { + const request = new Rpc.Debug.NetCheck.Request(); + + request.setClientyml(config); + + dispatcher.request(DebugNetCheck.name, request, callBack); +}; + // ---------------------- NOTIFICATION ---------------------- // export const NotificationList = (includeRead: boolean, limit: number, callBack?: (message: any) => void) => { @@ -1985,11 +1998,13 @@ export const MembershipGetPortalLinkUrl = (callBack?: (message: any) => void) => dispatcher.request(MembershipGetPortalLinkUrl.name, request, callBack); }; -export const MembershipGetVerificationEmail = (email: string, isSubscribed: boolean, callBack?: (message: any) => void) => { +export const MembershipGetVerificationEmail = (email: string, subscribeNews: boolean, subscribeTips: boolean, isOnboardingList: boolean, callBack?: (message: any) => void) => { const request = new Rpc.Membership.GetVerificationEmail.Request(); request.setEmail(email); - request.setSubscribetonewsletter(isSubscribed); + request.setSubscribetonewsletter(subscribeNews); + request.setInsidertipsandtutorials(subscribeTips); + request.setIsonboardinglist(isOnboardingList); dispatcher.request(MembershipGetVerificationEmail.name, request, callBack); }; diff --git a/src/ts/lib/api/dispatcher.ts b/src/ts/lib/api/dispatcher.ts index c5a66f80fd..c21111834b 100644 --- a/src/ts/lib/api/dispatcher.ts +++ b/src/ts/lib/api/dispatcher.ts @@ -244,7 +244,6 @@ class Dispatcher { if (id == rootId) { S.Block.checkBlockType(rootId); - S.Block.checkBlockChat(rootId); }; updateParents = true; @@ -816,7 +815,6 @@ class Dispatcher { S.Detail.delete(rootId, id, keys); S.Block.checkBlockType(rootId); - S.Block.checkBlockChat(rootId); updateMarkup = true; break; @@ -977,40 +975,38 @@ class Dispatcher { break; }; - case 'ProcessNew': - case 'ProcessUpdate': - case 'ProcessDone': { + case 'ProcessNew': { const { process } = mapped; - const { id, progress, state, type } = process; - - switch (state) { - case I.ProgressState.Running: { - let canCancel = true; - let isUnlocked = true; + const { progress, type } = process; + + S.Progress.update({ + ...process, + current: progress.done, + total: progress.total, + canCancel: [ + I.ProgressType.Migrate, + I.ProgressType.Import, + I.ProgressType.Export, + I.ProgressType.Drop, + ].includes(type), + }); + break; + }; - if ([ I.ProgressType.Recover, I.ProgressType.Migration ].includes(type)) { - canCancel = false; - isUnlocked = false; - }; + case 'ProcessUpdate': { + const { process } = mapped; + const { progress } = process; - S.Common.progressSet({ - id, - status: translate(`progress${type}`), - current: progress.done, - total: progress.total, - isUnlocked, - canCancel, - }); - break; - }; + S.Progress.update({ + ...process, + current: progress.done, + total: progress.total, + }); + break; + }; - case I.ProgressState.Error: - case I.ProgressState.Done: - case I.ProgressState.Canceled: { - S.Common.progressClear(); - break; - }; - }; + case 'ProcessDone': { + S.Progress.delete(mapped.process.id); break; }; @@ -1073,7 +1069,6 @@ class Dispatcher { }; S.Block.checkBlockType(rootId); - S.Block.checkBlockChat(rootId); }; if (undefined !== details.setOf) { @@ -1178,7 +1173,6 @@ class Dispatcher { S.Block.updateNumbers(contextId); S.Block.updateMarkup(contextId); S.Block.checkBlockType(contextId); - S.Block.checkBlockChat(contextId); keyboard.setWindowTitle(); }; diff --git a/src/ts/lib/api/mapper.ts b/src/ts/lib/api/mapper.ts index 4f19061676..879f71ced8 100644 --- a/src/ts/lib/api/mapper.ts +++ b/src/ts/lib/api/mapper.ts @@ -57,6 +57,19 @@ export const Mapper = { return t; }, + ProcessType (v: Events.Model.Process.MessageCase) { + const V = Events.Model.Process.MessageCase; + + let t = ''; + if (v == V.DROPFILES) t = 'dropFiles'; + if (v == V.IMPORT) t = 'import'; + if (v == V.EXPORT) t = 'export'; + if (v == V.SAVEFILE) t = 'saveFile'; + if (v == V.MIGRATION) t = 'migration'; + + return t; + }, + From: { Account: (obj: Model.Account): I.Account => { @@ -81,6 +94,7 @@ export const Mapper = { widgetsId: obj.getWidgetsid(), analyticsId: obj.getAnalyticsid(), networkId: obj.getNetworkid(), + workspaceObjectId: obj.getWorkspaceobjectid(), }; }, @@ -124,15 +138,15 @@ export const Mapper = { }, PreviewLink: (obj: Model.LinkPreview) => { - return { - type: obj.getType(), - title: obj.getTitle(), - description: obj.getDescription(), - faviconUrl: obj.getFaviconurl(), - imageUrl: obj.getImageurl(), - url: obj.getUrl(), - }; - }, + return { + type: obj.getType(), + title: obj.getTitle(), + description: obj.getDescription(), + faviconUrl: obj.getFaviconurl(), + imageUrl: obj.getImageurl(), + url: obj.getUrl(), + }; + }, Details: (obj: any): any => { return { @@ -334,15 +348,16 @@ export const Mapper = { }, ViewRelation: (obj: Model.Block.Content.Dataview.Relation) => { - return { - relationKey: obj.getKey(), - isVisible: obj.getIsvisible(), - width: obj.getWidth(), + return { + relationKey: obj.getKey(), + isVisible: obj.getIsvisible(), + width: obj.getWidth(), includeTime: obj.getDateincludetime(), - timeFormat: obj.getTimeformat(), + timeFormat: obj.getTimeformat(), dateFormat: obj.getDateformat(), - }; - }, + formulaType: obj.getFormula(), + }; + }, Filter: (obj: Model.Block.Content.Dataview.Filter): I.Filter => { return { @@ -376,7 +391,7 @@ export const Mapper = { }, GraphEdge: (obj: Rpc.Object.Graph.Edge) => { - return { + return { type: obj.getType(), source: obj.getSource(), target: obj.getTarget(), @@ -385,16 +400,16 @@ export const Mapper = { iconImage: obj.getIconimage(), iconEmoji: obj.getIconemoji(), isHidden: obj.getHidden(), - }; - }, + }; + }, UnsplashPicture: (obj: Rpc.Unsplash.Search.Response.Picture) => { return { - id: obj.getId(), + id: obj.getId(), url: obj.getUrl(), artist: obj.getArtist(), artistUrl: obj.getArtisturl(), - }; + }; }, ObjectView: (obj: Model.ObjectView) => { @@ -590,11 +605,15 @@ export const Mapper = { }, Process: (obj: Events.Model.Process) => { + const type = Mapper.ProcessType(obj.getMessageCase()); + return { id: obj.getId(), state: obj.getState() as number, - type: obj.getType() as number, - progress: Mapper.From.Progress(obj.getProgress()) + type, + spaceId: obj.getSpaceid(), + progress: Mapper.From.Progress(obj.getProgress()), + error: obj.getError(), }; }, @@ -665,7 +684,7 @@ export const Mapper = { return reactions; }, - }, + }, //------------------------------------------------------------ @@ -888,6 +907,7 @@ export const Mapper = { item.setDateincludetime(obj.includeTime); item.setTimeformat(obj.timeFormat); item.setDateformat(obj.dateFormat); + item.setFormula(obj.formulaType); return item; }, diff --git a/src/ts/lib/api/response.ts b/src/ts/lib/api/response.ts index 5de5b4cb04..12ce7d565f 100644 --- a/src/ts/lib/api/response.ts +++ b/src/ts/lib/api/response.ts @@ -56,6 +56,12 @@ export const DebugStat = (response: Rpc.Debug.Stat.Response) => { return res; }; +export const DebugNetCheck = (response: Rpc.Debug.NetCheck.Response) => { + return { + result: response.getResult(), + }; +}; + export const Export = (response: any) => { return { path: response.getPath(), diff --git a/src/ts/lib/dataview.ts b/src/ts/lib/dataview.ts index 9d30bdc29f..fb569410e6 100644 --- a/src/ts/lib/dataview.ts +++ b/src/ts/lib/dataview.ts @@ -97,6 +97,7 @@ class Dataview { param = Object.assign({ rootId: '', blockId: '', + subId: '', newViewId: '', keys: J.Relation.default, offset: 0, @@ -116,7 +117,7 @@ class Dataview { return; }; - const subId = S.Record.getSubId(rootId, blockId); + const subId = param.subId || S.Record.getSubId(rootId, blockId); const { viewId } = S.Record.getMeta(subId, ''); const viewChange = newViewId != viewId; const meta: any = { offset }; @@ -502,7 +503,7 @@ class Dataview { viewUpdate (rootId: string, blockId: string, viewId: string, param: Partial<I.View>, callBack?: (message: any) => void) { const view = U.Common.objectCopy(S.Record.getView(rootId, blockId, viewId)); - if (view) { + if (view && view.id) { C.BlockDataviewViewUpdate(rootId, blockId, view.id, Object.assign(view, param), callBack); }; }; @@ -545,6 +546,141 @@ class Dataview { return ret; }; + getFormulaResult (subId: string, viewRelation: I.ViewRelation): any { + if (!viewRelation) { + return null; + }; + + const { formulaType, includeTime, timeFormat, dateFormat, relationKey } = viewRelation; + const relation = S.Record.getRelationByKey(relationKey); + + if (!relation) { + return null; + }; + + const { total } = S.Record.getMeta(subId, ''); + const isDate = relation.format == I.RelationType.Date; + + let records = []; + let needRecords = false; + + if (![ I.FormulaType.None, I.FormulaType.Count ].includes(formulaType)) { + needRecords = true; + }; + + if (needRecords) { + records = S.Record.getRecords(subId, [ relationKey ], true); + }; + + const date = (t: number) => { + const date = U.Date.dateWithFormat(dateFormat, t); + const time = U.Date.timeWithFormat(timeFormat, t); + + return includeTime ? [ date, time ].join(' ') : date; + }; + + const min = () => { + return Math.min(...records.map(it => Number(it[relationKey] || 0))); + }; + const max = () => { + return Math.max(...records.map(it => Number(it[relationKey] || 0))); + }; + + let ret = null; + + switch (formulaType) { + case I.FormulaType.None: { + break; + }; + + case I.FormulaType.Count: { + ret = total; + break; + }; + + case I.FormulaType.CountDistinct: { + ret = U.Common.arrayUniqueObjects(records, relationKey).length; + break; + }; + + case I.FormulaType.CountEmpty: { + ret = records.filter(it => Relation.isEmpty(it[relationKey])).length; + ret = records.filter(it => { + return relation.format == I.RelationType.Checkbox ? !it[relationKey] : Relation.isEmpty(it[relationKey]); + }).length; + break; + }; + + case I.FormulaType.CountNotEmpty: { + ret = records.filter(it => { + return relation.format == I.RelationType.Checkbox ? !!it[relationKey] : !Relation.isEmpty(it[relationKey]); + }).length; + break; + }; + + case I.FormulaType.PercentEmpty: { + ret = U.Common.sprintf('%0.2f%', records.filter(it => Relation.isEmpty(it[relationKey])).length / total * 100); + break; + }; + + case I.FormulaType.PercentNotEmpty: { + ret = U.Common.sprintf('%0.2f%', records.filter(it => !Relation.isEmpty(it[relationKey])).length / total * 100); + break; + }; + + case I.FormulaType.MathSum: { + ret = records.reduce((acc, it) => acc + Number(it[relationKey] || 0), 0); + break; + }; + + case I.FormulaType.MathAverage: { + ret = U.Common.sprintf('%0.4f%', records.reduce((acc, it) => acc + Number(it[relationKey] || 0), 0) / total); + break; + }; + + case I.FormulaType.MathMedian: { + const data = records.map(it => Number(it[relationKey] || 0)); + const n = data.length; + + data.sort((a, b) => a - b); + + if (n % 2 == 1) { + ret = data[Math.floor(n / 2)]; + } else { + ret = (data[n / 2 - 1] + data[n / 2]) / 2; + }; + break; + }; + + case I.FormulaType.MathMin: { + ret = min(); + if (isDate) { + ret = date(ret); + }; + break; + }; + + case I.FormulaType.MathMax: { + ret = max(); + if (isDate) { + ret = date(ret); + }; + break; + }; + + case I.FormulaType.Range: { + if (isDate) { + ret = U.Date.duration(max() - min()); + } else { + ret = [ min(), max() ].join(' - '); + }; + break; + }; + }; + + return ret; + }; + }; -export default new Dataview(); +export default new Dataview(); \ No newline at end of file diff --git a/src/ts/lib/focus.ts b/src/ts/lib/focus.ts index 91a7bc536a..090d38ce04 100644 --- a/src/ts/lib/focus.ts +++ b/src/ts/lib/focus.ts @@ -99,11 +99,11 @@ class Focus { const ch = container.height(); const no = node.offset().top; const hh = J.Size.header; - const o = J.Size.lastBlock + ch / 2 + hh; + const o = J.Size.lastBlock + hh; const st = container.scrollTop(); const y = isPopup ? (no - container.offset().top + st) : no; - if ((y >= st) && (y <= st + ch / 2 - o)) { + if ((y >= st) && (y <= st + ch - o)) { return; }; diff --git a/src/ts/lib/highlight.ts b/src/ts/lib/highlight.ts index 668bf3c844..b360937105 100644 --- a/src/ts/lib/highlight.ts +++ b/src/ts/lib/highlight.ts @@ -2,59 +2,59 @@ import $ from 'jquery'; import { Storage } from 'Lib'; const HIGHLIGHTS_MAP = { - whatsNew: [ '#button-help', '#menuHelp #item-whatsNew' ], - shortcut: [ '#button-help', '#menuHelp #item-shortcut' ], - hints: [ '#button-help', '#menuHelp #item-hints' ], + whatsNew: [ '#button-help', '#menuHelp #item-whatsNew' ], + shortcut: [ '#button-help', '#menuHelp #item-shortcut' ], + hints: [ '#button-help', '#menuHelp #item-hints' ], }; class Highlight { - showAll () { - const highlights = Storage.get('highlights') || {}; + showAll () { + const highlights = Storage.get('highlights') || {}; - Object.keys(highlights).forEach((el) => { - if (highlights[el]) { - this.show(el); - }; - }); - }; + Object.keys(highlights).forEach((el) => { + if (highlights[el]) { + this.show(el); + }; + }); + }; - show (key: string) { - if (!HIGHLIGHTS_MAP[key] || !Storage.getHighlight(key)) { - return; - }; + show (key: string) { + if (!HIGHLIGHTS_MAP[key] || !Storage.getHighlight(key)) { + return; + }; - HIGHLIGHTS_MAP[key].forEach(item => this.add($(item))); - }; + HIGHLIGHTS_MAP[key].forEach(item => this.add($(item))); + }; - hide (key: string) { - Storage.setHighlight(key, false); + hide (key: string) { + Storage.setHighlight(key, false); - if (HIGHLIGHTS_MAP[key]) { - HIGHLIGHTS_MAP[key].forEach(item => { this.remove($(item)); }); - }; - }; + if (HIGHLIGHTS_MAP[key]) { + HIGHLIGHTS_MAP[key].forEach(item => { this.remove($(item)); }); + }; + }; - add (node) { + add (node) { if (!node || !node.length) { return; }; - if (node.find('.highlightMark').length) { - return; - }; + if (node.find('.highlightMark').length) { + return; + }; - const dot = $('<div />').addClass('highlightMark'); - node.append(dot); - }; + const dot = $('<div />').addClass('highlightMark'); + node.append(dot); + }; - remove (node) { + remove (node) { if (!node || !node.length) { return; }; - node.find('.highlightMark').remove(); - }; + node.find('.highlightMark').remove(); + }; }; diff --git a/src/ts/lib/index.ts b/src/ts/lib/index.ts index 110492f404..70a9f297be 100644 --- a/src/ts/lib/index.ts +++ b/src/ts/lib/index.ts @@ -4,6 +4,7 @@ import * as M from 'Model'; // Models import * as S from 'Store'; // Stores import * as U from './util'; // Utils import * as C from './api/command'; // Commands +import * as H from 'Hook'; // React Hooks import Renderer from './renderer'; import { dispatcher } from './api/dispatcher'; @@ -34,6 +35,7 @@ export { S, U, J, + H, keyboard, sidebar, focus, diff --git a/src/ts/lib/keyboard.ts b/src/ts/lib/keyboard.ts index 168b2c563e..f96f71357e 100644 --- a/src/ts/lib/keyboard.ts +++ b/src/ts/lib/keyboard.ts @@ -592,6 +592,34 @@ class Keyboard { break; }; + case 'debugNet': { + const { networkConfig } = S.Auth; + const { path } = networkConfig; + + C.DebugNetCheck(path, (message: any) => { + const result = String(message.result || '').trim(); + + if (!result) { + return; + }; + + S.Popup.open('confirm', { + className: 'isWide techInfo isLeft', + data: { + title: translate('menuHelpNet'), + text: U.Common.lbBr(result), + textConfirm: translate('commonCopy'), + colorConfirm: 'blank', + canCancel: false, + onConfirm: () => { + U.Common.copyToast(translate('libKeyboardNetInformation'), result); + }, + } + }); + }); + break; + }; + case 'resetOnboarding': { Storage.delete('onboarding'); break; diff --git a/src/ts/lib/mark.ts b/src/ts/lib/mark.ts index d58d9c6901..47f5efa555 100644 --- a/src/ts/lib/mark.ts +++ b/src/ts/lib/mark.ts @@ -305,12 +305,16 @@ class Mark { }; const attr = this.paramToAttr(mark.type, param); - const data = [ `data-range="${mark.range.from}-${mark.range.to}"` ]; + const data = []; if (param) { data.push(`data-param="${param}"`); }; + if ([ I.MarkType.Link, I.MarkType.Object, I.MarkType.Mention ].includes(mark.type)) { + data.push(`data-range="${mark.range.from}-${mark.range.to}"`); + }; + let prefix = ''; let suffix = ''; @@ -533,7 +537,7 @@ class Mark { }; marks = this.adjust(marks, from, -length); - marks = this.adjust(marks, to, -length); + marks = this.adjust(marks, to, -length + 1); marks.push({ type, range: { from, to }, param: '' }); text = U.Common.stringInsert(text, replace, o + p1l, o + p1l + p2l); diff --git a/src/ts/lib/preview.ts b/src/ts/lib/preview.ts index 89d963849d..c625d6c54f 100644 --- a/src/ts/lib/preview.ts +++ b/src/ts/lib/preview.ts @@ -49,12 +49,14 @@ class Preview { const delay = Number(param.delay) || DELAY_TOOLTIP; const offsetX = Number(param.offsetX) || 0; const offsetY = Number(param.offsetY) || 0; - const text = String(param.text || '').replace(/\\n/g, '\n'); - + if (!element.length || keyboard.isResizing) { return; }; + let text = String(param.text || '').replace(/\\n/g, '\n'); + text = U.Common.lbBr(U.Common.sanitize(text)); + this.delayTooltip = delay; window.clearTimeout(this.timeout.tooltip); @@ -66,7 +68,7 @@ class Preview { const ew = element.outerWidth(); const eh = element.outerHeight(); const { ww } = U.Common.getWindowDimensions(); - const node = $(`<div class="tooltip anim"><div class="txt">${U.Common.lbBr(text)}</div></div>`); + const node = $(`<div class="tooltip anim"><div class="txt">${text}</div></div>`); if (param.className) { node.addClass(param.className); @@ -200,7 +202,7 @@ class Preview { }); }; - passThrough ? obj.addClass('passThrough') : obj.removeClass('passThrough'); + obj.toggleClass('passThrough', passThrough); obj.off('mouseleave.preview').on('mouseleave.preview', () => this.previewHide(true)); this.previewHide(true); diff --git a/src/ts/lib/relation.ts b/src/ts/lib/relation.ts index b8a36ccb11..518f54b38c 100644 --- a/src/ts/lib/relation.ts +++ b/src/ts/lib/relation.ts @@ -109,6 +109,65 @@ class Relation { return ret; }; + public formulaByType (type: I.RelationType): { id: string, name: string, short?: string, section: I.FormulaSection }[] { + const common = [ + { id: I.FormulaType.Count, name: translate('formulaCount'), section: I.FormulaSection.Count }, + { id: I.FormulaType.CountDistinct, name: translate('formulaDistinct'), short: translate('formulaDistinctShort'), section: I.FormulaSection.Count }, + { id: I.FormulaType.CountEmpty, name: translate('formulaEmpty'), short: translate('formulaEmptyShort'), section: I.FormulaSection.Count }, + { id: I.FormulaType.CountNotEmpty, name: translate('formulaNotEmpty'), short: translate('formulaNotEmptyShort'), section: I.FormulaSection.Count }, + { id: I.FormulaType.PercentEmpty, name: translate('formulaPercentEmpty'), short: translate('formulaEmptyShort'), section: I.FormulaSection.Percent }, + { id: I.FormulaType.PercentNotEmpty, name: translate('formulaPercentNotEmpty'), short: translate('formulaNotEmptyShort'), section: I.FormulaSection.Percent }, + ]; + + let ret: any[] = [ + { id: I.FormulaType.None, name: translate('formulaNone') }, + ]; + + switch (type) { + case I.RelationType.Date: { + ret = ret.concat([ + ...common, + { id: I.FormulaType.MathMin, name: translate('formulaDateMin'), short: translate('formulaDateMinShort'), section: I.FormulaSection.Date }, + { id: I.FormulaType.MathMax, name: translate('formulaDateMax'), short: translate('formulaDateMaxShort'), section: I.FormulaSection.Date }, + { id: I.FormulaType.Range, name: translate('formulaDateRange'), short: translate('formulaDateRangeShort'), section: I.FormulaSection.Date }, + ]); + break; + }; + + case I.RelationType.Checkbox: { + ret = ret.concat([ + { id: I.FormulaType.Count, name: translate('formulaCheckboxCount'), short: translate('formulaCount'), section: I.FormulaSection.Count }, + { id: I.FormulaType.CountNotEmpty, name: translate('formulaCheckboxNotEmpty'), short: translate('formulaNotEmptyShort'), section: I.FormulaSection.Count }, + { id: I.FormulaType.CountEmpty, name: translate('formulaCheckboxEmpty'), short: translate('formulaEmptyShort'), section: I.FormulaSection.Count }, + { id: I.FormulaType.PercentNotEmpty, name: translate('formulaCheckboxPercentNotEmpty'), short: translate('formulaNotEmptyShort'), section: I.FormulaSection.Percent }, + { id: I.FormulaType.PercentEmpty, name: translate('formulaCheckboxPercentEmpty'), short: translate('formulaEmptyShort'), section: I.FormulaSection.Percent }, + ]); + break; + }; + + case I.RelationType.Number: { + ret = ret.concat([ + ...common, + { id: I.FormulaType.MathSum, name: translate('formulaSum'), section: I.FormulaSection.Math }, + { id: I.FormulaType.MathAverage, name: translate('formulaAverage'), section: I.FormulaSection.Math }, + { id: I.FormulaType.MathMedian, name: translate('formulaMedian'), section: I.FormulaSection.Math }, + { id: I.FormulaType.MathMin, name: translate('formulaMin'), section: I.FormulaSection.Math }, + { id: I.FormulaType.MathMax, name: translate('formulaMax'), section: I.FormulaSection.Math }, + { id: I.FormulaType.Range, name: translate('formulaRange'), section: I.FormulaSection.Math }, + ]); + break; + }; + + default: { + ret = ret.concat(common); + break; + }; + + }; + + return ret.map(it => ({ ...it, id: String(it.id)})); + }; + public filterConditionsDictionary () { return [ { id: I.FilterCondition.None, name: translate('filterConditionNone') }, @@ -187,6 +246,10 @@ class Relation { }; public formatValue (relation: any, value: any, maxCount: boolean) { + if (!relation) { + return value; + }; + switch (relation.format) { default: { value = this.getStringValue(value); @@ -230,6 +293,10 @@ class Relation { }; public checkRelationValue (relation: any, value: any): boolean { + if (!relation) { + return false; + }; + value = this.formatValue(relation, value, false); let ret = false; @@ -471,7 +538,7 @@ class Relation { }; public isEmpty (v: any) { - return (v === null) || (v === undefined) || (v === ''); + return (v === null) || (v === undefined) || (v === '') || (Array.isArray(v) && !v.length); }; public isUrl (type: I.RelationType) { @@ -486,7 +553,7 @@ class Relation { value = String(value || ''); let ret = ''; - if (type == I.RelationType.Url && !value.match(/:\/\//)) { + if (type == I.RelationType.Url) { ret = 'http://'; }; if (type == I.RelationType.Email) { @@ -498,6 +565,17 @@ class Relation { return ret; }; + public checkUrlScheme (type: I.RelationType, value: string): string { + value = String(value || ''); + + if (!value) { + return ''; + }; + + const scheme = U.Common.getScheme(value); + return scheme ? value : this.getUrlScheme(type, value) + value; + }; + public getSetOfObjects (rootId: string, objectId: string, layout: I.ObjectLayout): any[] { const object = S.Detail.get(rootId, objectId, [ 'setOf' ]); const setOf = this.getArrayValue(object.setOf); diff --git a/src/ts/lib/sidebar.ts b/src/ts/lib/sidebar.ts index 02790c7027..a12cb9180d 100644 --- a/src/ts/lib/sidebar.ts +++ b/src/ts/lib/sidebar.ts @@ -44,13 +44,10 @@ class Sidebar { this.resizePage(J.Size.sidebar.width.default, false); }; - if (this.data.isClosed) { - vault.addClass('isClosed'); - this.obj.addClass('isClosed'); - } else { - vault.removeClass('isClosed'); - this.obj.removeClass('isClosed'); - }; + const { isClosed } = this.data; + + vault.toggleClass('isClosed', isClosed); + this.obj.toggleClass('isClosed', isClosed); }; initObjects () { @@ -237,22 +234,14 @@ class Sidebar { this.footer.css({ width: '' }); this.dummy.css({ width: width + vw }); - if (animate) { - this.header.addClass('sidebarAnimation'); - this.page.addClass('sidebarAnimation'); - this.footer.addClass('sidebarAnimation'); - this.dummy.addClass('sidebarAnimation'); - this.toggleButton.addClass('sidebarAnimation'); - } else { - this.header.removeClass('sidebarAnimation'); - this.page.removeClass('sidebarAnimation'); - this.footer.removeClass('sidebarAnimation'); - this.dummy.removeClass('sidebarAnimation'); - this.toggleButton.removeClass('sidebarAnimation'); - }; + this.header.toggleClass('sidebarAnimation', animate); + this.footer.toggleClass('sidebarAnimation', animate); + this.page.toggleClass('sidebarAnimation', animate); + this.dummy.toggleClass('sidebarAnimation', animate); + this.toggleButton.toggleClass('sidebarAnimation', animate); navigation?.position(width + vw, animate); - width ? this.header.addClass('withSidebar') : this.header.removeClass('withSidebar'); + this.header.toggleClass('withSidebar', !!width); this.page.css({ width: pageWidth }); this.loader.css({ width: pageWidth, right: 0 }); diff --git a/src/ts/lib/util/common.ts b/src/ts/lib/util/common.ts index f95528bc25..3bad68fead 100644 --- a/src/ts/lib/util/common.ts +++ b/src/ts/lib/util/common.ts @@ -414,12 +414,12 @@ class UtilCommon { }; mapToObject (list: any[], field: string) { - const obj: any = {}; - for (let i = 0; i < list.length; i++) { - obj[list[i][field]] = list[i]; - }; - return obj; - }; + const obj: any = {}; + for (let i = 0; i < list.length; i++) { + obj[list[i][field]] = list[i]; + }; + return obj; + }; unmap (map: any) { let ret: any[] = [] as any[]; @@ -441,7 +441,7 @@ class UtilCommon { const scheme = this.getScheme(url); if (!scheme) { - url = 'http://' + url; + url = `http://${url}`; }; return url; @@ -636,7 +636,9 @@ class UtilCommon { getScheme (url: string): string { url = String(url || ''); - return url.indexOf('://') >= 0 ? String(url.split('://')[0] || '') : ''; + + const m = url.match(/^([a-z]+):/); + return m ? m[1] : ''; }; intercept (obj: any, change: any) { @@ -1007,6 +1009,26 @@ class UtilCommon { }; }; + isAlphaVersion (): boolean { + return !!this.getElectron().version.app.match(/alpha/); + }; + + isBetaVersion (): boolean { + return !!this.getElectron().version.app.match(/beta/); + }; + + isChatAllowed () { + const { config, space } = S.Common; + return config.experimental; + + //return config.experimental || (space == J.Constant.localLoversSpaceId); + //return this.isAlphaVersion() || this.isBetaVersion() || !this.getElectron().isPackaged; + }; + + checkRtl (s: string): boolean { + return /^[\u04c7-\u0591\u05D0-\u05EA\u05F0-\u05F4\u0600-\u06FF]/.test(s); + }; + }; export default new UtilCommon(); diff --git a/src/ts/lib/util/data.ts b/src/ts/lib/util/data.ts index 972a0145bd..b03bbfe515 100644 --- a/src/ts/lib/util/data.ts +++ b/src/ts/lib/util/data.ts @@ -1,25 +1,6 @@ import * as Sentry from '@sentry/browser'; import { I, C, M, S, J, U, keyboard, translate, Storage, analytics, dispatcher, Mark, focus, Renderer, Action, Survey, Onboarding, Preview } from 'Lib'; -type SearchSubscribeParams = Partial<{ - spaceId: string; - subId: string; - idField: string; - filters: I.Filter[]; - sorts: I.Sort[]; - keys: string[]; - sources: string[]; - collectionId: string; - afterId: string; - beforeId: string; - offset: number; - limit: number; - ignoreHidden: boolean; - ignoreDeleted: boolean; - withArchived: boolean; - noDeps: boolean; -}>; - const SYSTEM_DATE_RELATION_KEYS = [ 'lastModifiedDate', 'lastOpenedDate', @@ -160,6 +141,7 @@ class UtilData { S.Block.widgetsSet(info.widgetsId); S.Block.profileSet(info.profileObjectId); S.Block.spaceviewSet(info.spaceViewId); + S.Block.workspaceSet(info.workspaceObjectId); S.Common.gatewaySet(info.gatewayUrl); S.Common.spaceSet(info.accountSpaceId); @@ -548,7 +530,7 @@ class UtilData { }; getObjectTypesForNewObject (param?: any) { - const { withSet, withCollection, withChat, limit } = param || {}; + const { withSet, withCollection, limit } = param || {}; const { space, config } = S.Common; const pageLayouts = U.Object.getPageLayouts(); const skipLayouts = U.Object.getSetLayouts(); @@ -570,10 +552,6 @@ class UtilData { items.push(S.Record.getSetType()); }; - if (withChat) { - items.push(S.Record.getChatType()); - }; - if (withCollection) { items.push(S.Record.getCollectionType()); }; @@ -786,11 +764,12 @@ class UtilData { searchDefaultFilters (param: any) { const { config } = S.Common; - const { ignoreHidden, ignoreDeleted, withArchived } = param; + const { ignoreHidden, ignoreDeleted, ignoreArchived } = param; const filters = param.filters || []; - const chatDerivedType = S.Record.getChatDerivedType(); + const skipLayouts = [ I.ObjectLayout.Chat, I.ObjectLayout.ChatOld ]; - filters.push({ relationKey: 'uniqueKey', condition: I.FilterCondition.NotEqual, value: J.Constant.typeKey.chatDerived }); + filters.push({ relationKey: 'layout', condition: I.FilterCondition.NotIn, value: skipLayouts }); + filters.push({ relationKey: 'recommendedLayout', condition: I.FilterCondition.NotIn, value: skipLayouts }); if (ignoreHidden && !config.debug.hiddenObject) { filters.push({ relationKey: 'isHidden', condition: I.FilterCondition.NotEqual, value: true }); @@ -801,24 +780,10 @@ class UtilData { filters.push({ relationKey: 'isDeleted', condition: I.FilterCondition.NotEqual, value: true }); }; - if (!withArchived) { + if (ignoreArchived) { filters.push({ relationKey: 'isArchived', condition: I.FilterCondition.NotEqual, value: true }); }; - /*if (!config.experimental) { - const chatType = S.Record.getChatType(); - - if (chatType) { - filters.push({ relationKey: 'type', condition: I.FilterCondition.NotEqual, value: chatType?.id }); - }; - - filters.push({ relationKey: 'uniqueKey', condition: I.FilterCondition.NotEqual, value: J.Constant.typeKey.chat }); - };*/ - - if (chatDerivedType) { - filters.push({ relationKey: 'type', condition: I.FilterCondition.NotEqual, value: chatDerivedType.id }); - }; - return filters; }; @@ -844,7 +809,7 @@ class UtilData { S.Record.recordsSet(subId, '', message.records.map(it => it[idField]).filter(it => it)); }; - searchSubscribe (param: SearchSubscribeParams, callBack?: (message: any) => void) { + searchSubscribe (param: Partial<I.SearchSubscribeParam>, callBack?: (message: any) => void) { const { space } = S.Common; param = Object.assign({ @@ -859,7 +824,7 @@ class UtilData { limit: 0, ignoreHidden: true, ignoreDeleted: true, - withArchived: false, + ignoreArchived: true, noDeps: false, afterId: '', beforeId: '', @@ -872,6 +837,19 @@ class UtilData { if (!subId) { console.error('[U.Data].searchSubscribe: subId is empty'); + + if (callBack) { + callBack({}); + }; + return; + }; + + if (!spaceId) { + console.error('[U.Data].searchSubscribe: spaceId is empty'); + + if (callBack) { + callBack({}); + }; return; }; @@ -905,10 +883,28 @@ class UtilData { if (!subId) { console.error('[U.Data].subscribeIds: subId is empty'); + + if (callBack) { + callBack({}); + }; return; }; + + if (!spaceId) { + console.error('[U.Data].subscribeIds: spaceId is empty'); + + if (callBack) { + callBack({}); + }; + return; + }; + if (!ids.length) { console.error('[U.Data].subscribeIds: ids list is empty'); + + if (callBack) { + callBack({}); + }; return; }; @@ -933,7 +929,7 @@ class UtilData { }); }; - search (param: SearchSubscribeParams & { fullText?: string }, callBack?: (message: any) => void) { + search (param: Partial<I.SearchSubscribeParam> & { fullText?: string }, callBack?: (message: any) => void) { const { space } = S.Common; param = Object.assign({ @@ -947,13 +943,22 @@ class UtilData { limit: 0, ignoreHidden: true, ignoreDeleted: true, - withArchived: false, + ignoreArchived: true, }, param); const { spaceId, idField, sorts, offset, limit } = param; const keys: string[] = [ ...new Set(param.keys as string[]) ]; const filters = this.searchDefaultFilters(param); + if (!spaceId) { + console.error('[U.Data].search: spaceId is empty'); + + if (callBack) { + callBack({}); + }; + return; + }; + if (!keys.includes(idField)) { keys.push(idField); }; @@ -1079,12 +1084,12 @@ class UtilData { return Object.values(J.Constant.networkId).includes(S.Auth.account?.info?.networkId); }; - isLocalNetwork (): boolean { - return !S.Auth.account?.info?.networkId; + isDevelopmentNetwork (): boolean { + return S.Auth.account?.info?.networkId == J.Constant.networkId.development; }; - isLocalOnly (): boolean { - return S.Auth.account?.info?.networkId == ''; + isLocalNetwork (): boolean { + return !S.Auth.account?.info?.networkId; }; accountCreate (onError?: (text: string) => void, callBack?: () => void) { diff --git a/src/ts/lib/util/date.ts b/src/ts/lib/util/date.ts index 089f9abf66..c37865c129 100644 --- a/src/ts/lib/util/date.ts +++ b/src/ts/lib/util/date.ts @@ -162,7 +162,7 @@ class UtilDate { }, N: () => { return (f.w() + 6) % 7; - }, + }, }; return format.replace(/[\\]?([a-zA-Z])/g, (t: string, s: string) => { let ret = null; @@ -265,9 +265,14 @@ class UtilDate { return ''; }; - const d = Math.floor(t / 86400); + const DAY_IN_SECONDS = 86400; + const y = Math.floor(t / (DAY_IN_SECONDS * 365)); + + t -= y * (DAY_IN_SECONDS * 365); - t -= d * 86400; + const d = Math.floor(t / DAY_IN_SECONDS); + + t -= d * DAY_IN_SECONDS; const h = Math.floor(t / 3600); t -= h * 3600; @@ -277,6 +282,9 @@ class UtilDate { const s = t; let ret = ''; + if (y > 0) { + ret = U.Common.sprintf('%dy', y); + } else if (d > 0) { ret = U.Common.sprintf('%dd', d); } else diff --git a/src/ts/lib/util/file.ts b/src/ts/lib/util/file.ts index 4ffd504be5..a87f3e0465 100644 --- a/src/ts/lib/util/file.ts +++ b/src/ts/lib/util/file.ts @@ -121,13 +121,7 @@ class UtilFile { }; iconPath (object: any) { - const tp = S.Common.getThemePath(); - return `img/${tp}icon/file/${this.icon(object)}.svg`; - }; - - iconImage (object: any): string { - const tp = S.Common.getThemePath(); - return require(`img/${tp}icon/file/${this.icon(object)}.svg`).default; + return `./img/${S.Common.getThemePath()}icon/file/${this.icon(object)}.svg`; }; loadPreviewCanvas (file: any, param: any, success?: (canvas: any) => void) { diff --git a/src/ts/lib/util/menu.ts b/src/ts/lib/util/menu.ts index be6dab9e90..df32b594ad 100644 --- a/src/ts/lib/util/menu.ts +++ b/src/ts/lib/util/menu.ts @@ -1,6 +1,7 @@ import $ from 'jquery'; import raf from 'raf'; -import { I, C, S, U, J, keyboard, translate, Dataview, Action, analytics, Relation, Storage, sidebar } from 'Lib'; +import { observable } from 'mobx'; +import { I, C, S, U, J, M, keyboard, translate, Dataview, Action, analytics, Relation, Storage, sidebar } from 'Lib'; class UtilMenu { @@ -108,7 +109,7 @@ class UtilMenu { }; getBlockObject () { - const items = U.Data.getObjectTypesForNewObject({ withSet: true, withCollection: true, withChat: true }); + const items = U.Data.getObjectTypesForNewObject({ withSet: true, withCollection: true }); const ret: any[] = [ { type: I.BlockType.Page, id: 'existingPage', icon: 'existing', lang: 'ExistingPage', arrow: true, aliases: [ 'link' ] }, { type: I.BlockType.File, id: 'existingFile', icon: 'existing', lang: 'ExistingFile', arrow: true, aliases: [ 'file' ] } @@ -334,9 +335,21 @@ class UtilMenu { window.setTimeout(() => { switch (option.id) { - case 'edit': $(`#button-${blockId}-settings`).trigger('click'); break; - case 'copy': onCopy(view); break; - case 'remove': onRemove(view); break; + case 'edit': { + $(`#button-${blockId}-settings`).trigger('click'); + S.Menu.updateData('dataviewViewSettings', { view: observable.box(new M.View(view)) }); + break; + }; + + case 'copy': { + onCopy(view); + break; + }; + + case 'remove': { + onRemove(view); + break; + }; }; }, S.Menu.getTimeout()); } @@ -413,7 +426,6 @@ class UtilMenu { if ([ J.Constant.widgetId.set, J.Constant.widgetId.collection, - J.Constant.widgetId.chat, ].includes(id)) { options = options.filter(it => it != I.WidgetLayout.Tree); }; @@ -842,7 +854,6 @@ class UtilMenu { const { config } = S.Common; return [ { id: J.Constant.widgetId.favorite, name: translate('widgetFavorite'), iconEmoji: '⭐' }, - { id: J.Constant.widgetId.chat, name: translate('widgetChat'), iconEmoji: '💬' }, { id: J.Constant.widgetId.set, name: translate('widgetSet'), iconEmoji: '🔍' }, { id: J.Constant.widgetId.collection, name: translate('widgetCollection'), iconEmoji: '🗂️' }, { id: J.Constant.widgetId.recentEdit, name: translate('widgetRecent'), iconEmoji: '📝' }, @@ -1045,6 +1056,24 @@ class UtilMenu { ]; }; + participant (object: any, param: Partial<I.MenuParam>) { + S.Menu.open('participant', { + className: 'fixed', + classNameWrap: 'fromPopup', + horizontal: I.MenuDirection.Center, + rect: { + x: keyboard.mouse.page.x, + y: keyboard.mouse.page.y + 10, + width: 0, + height: 0, + }, + ...param, + data: { + object, + } + }); + }; + }; export default new UtilMenu(); diff --git a/src/ts/lib/util/object.ts b/src/ts/lib/util/object.ts index 327cff4ce2..1a2e046457 100644 --- a/src/ts/lib/util/object.ts +++ b/src/ts/lib/util/object.ts @@ -24,6 +24,7 @@ class UtilObject { case I.ObjectLayout.Archive: r = 'archive'; break; case I.ObjectLayout.Block: r = 'block'; break; case I.ObjectLayout.Empty: r = 'empty'; break; + case I.ObjectLayout.Space: case I.ObjectLayout.Chat: r = 'chat'; break; }; return r; @@ -58,11 +59,20 @@ class UtilObject { return object ? `object?objectId=${object.id}&spaceId=${object.spaceId}` : ''; }; + checkParam (param: any) { + param = param || {}; + param.routeParam = param.routeParam || {}; + param.menuParam = param.menuParam || {}; + return param; + }; + openEvent (e: any, object: any, param?: any) { if (!object) { return; }; + param = this.checkParam(param); + e.preventDefault(); e.stopPropagation(); @@ -81,6 +91,13 @@ class UtilObject { return; }; + param = this.checkParam(param); + + if (this.isParticipantLayout(object.layout)) { + U.Menu.participant(object, param.menuParam); + return; + }; + // Prevent opening object in popup from different space if (object.spaceId && (object.spaceId != S.Common.space)) { this.openRoute(object, param); @@ -91,13 +108,15 @@ class UtilObject { }; openRoute (object: any, param?: any) { + param = this.checkParam(param); + const route = this.route(object); if (!route) { return; }; keyboard.setSource(null); - U.Router.go(`/${route}`, param || {}); + U.Router.go(`/${route}`, param); }; openWindow (object: any) { @@ -112,6 +131,13 @@ class UtilObject { return; }; + param = this.checkParam(param); + + if (this.isParticipantLayout(object.layout)) { + U.Menu.participant(object, param.menuParam); + return; + }; + // Prevent opening object in popup from different space if (object.spaceId && (object.spaceId != S.Common.space)) { this.openRoute(object, param); @@ -138,6 +164,9 @@ class UtilObject { window.setTimeout(() => S.Popup.open('page', param), S.Popup.getTimeout()); }; + /** + Opens object based on user setting 'Open objects in fullscreen mode' + */ openConfig (object: any, param?: any) { S.Common.fullscreenObject ? this.openAuto(object, param) : this.openPopup(object, param); }; @@ -243,20 +272,24 @@ class UtilObject { return name; }; - getById (id: string, callBack: (object: any) => void) { - this.getByIds([ id ], objects => { + getById (id: string, param: Partial<I.SearchSubscribeParam>, callBack: (object: any) => void) { + this.getByIds([ id ], param, objects => { if (callBack) { callBack(objects[0]); }; }); }; - getByIds (ids: string[], callBack: (objects: any[]) => void) { + getByIds (ids: string[], param: Partial<I.SearchSubscribeParam>, callBack: (objects: any[]) => void) { const filters = [ { relationKey: 'id', condition: I.FilterCondition.In, value: ids } ]; - U.Data.search({ filters, keys: J.Relation.default.concat([ 'links', 'backlinks' ]) }, (message: any) => { + param = param || {}; + param.filters = (param.filters || []).concat(filters); + param.keys = (param.keys || []).concat(J.Relation.default).concat([ 'links', 'backlinks' ]); + + U.Data.search(param, (message: any) => { if (callBack) { callBack((message.records || []).filter(it => !it._empty_)); }; @@ -295,6 +328,10 @@ class UtilObject { return layout == I.ObjectLayout.SpaceView; }; + isSpaceLayout (layout: I.ObjectLayout): boolean { + return layout == I.ObjectLayout.Space; + }; + isSetLayout (layout: I.ObjectLayout): boolean { return layout == I.ObjectLayout.Set; }; @@ -392,7 +429,6 @@ class UtilObject { I.ObjectLayout.Dashboard, I.ObjectLayout.Space, I.ObjectLayout.SpaceView, - I.ObjectLayout.ChatDerived, ]; }; @@ -430,7 +466,6 @@ class UtilObject { I.ObjectLayout.Option, I.ObjectLayout.SpaceView, I.ObjectLayout.Space, - I.ObjectLayout.ChatDerived, ]; }; @@ -445,7 +480,7 @@ class UtilObject { }; isAllowedObject (layout: I.ObjectLayout): boolean { - return this.getPageLayouts().concat(I.ObjectLayout.Chat).includes(layout); + return this.getPageLayouts().includes(layout); }; }; diff --git a/src/ts/lib/util/router.ts b/src/ts/lib/util/router.ts index 4633ac5b7d..83909d5c3c 100644 --- a/src/ts/lib/util/router.ts +++ b/src/ts/lib/util/router.ts @@ -4,6 +4,7 @@ import { I, C, S, U, J, Preview, analytics, Storage } from 'Lib'; class UtilRouter { history: any = null; + isOpening = false; init (history: any) { this.history = history; @@ -129,18 +130,29 @@ class UtilRouter { }; switchSpace (id: string, route: string, sendEvent: boolean, routeParam: any) { + if (this.isOpening) { + return; + }; + if (!id) { console.log('[UtilRouter].swithSpace: id is empty'); return; }; + const withChat = U.Common.isChatAllowed(); + S.Menu.closeAllForced(); + S.Progress.showSet(false); if (sendEvent) { analytics.event('SwitchSpace'); }; - C.WorkspaceOpen(id, (message: any) => { + this.isOpening = true; + + C.WorkspaceOpen(id, withChat, (message: any) => { + this.isOpening = false; + if (message.error.code) { U.Data.onAuthWithoutSpace(); return; diff --git a/src/ts/lib/util/space.ts b/src/ts/lib/util/space.ts index a1d0ac6bdd..98fc1a3961 100644 --- a/src/ts/lib/util/space.ts +++ b/src/ts/lib/util/space.ts @@ -1,4 +1,4 @@ -import { I, S, U, J, Storage, translate } from 'Lib'; +import { I, C, S, U, J, Storage, translate } from 'Lib'; class UtilSpace { @@ -93,7 +93,7 @@ class UtilSpace { }; getList () { - return S.Record.getRecords(J.Constant.subId.space, U.Data.spaceRelationKeys()).filter(it => it.isAccountActive && it.isLocalOk); + return S.Record.getRecords(J.Constant.subId.space, U.Data.spaceRelationKeys()).filter(it => it.isAccountActive); }; getSpaceview (id?: string) { @@ -248,6 +248,12 @@ class UtilSpace { }; }; + getInvite (id: string, callBack: (cid: string, key: string) => void) { + C.SpaceInviteGetCurrent(id, (message: any) => { + callBack(message.inviteCid, message.inviteKey); + }); + }; + }; -export default new UtilSpace(); +export default new UtilSpace(); \ No newline at end of file diff --git a/src/ts/model/account.ts b/src/ts/model/account.ts index affb32956b..50684eda0a 100644 --- a/src/ts/model/account.ts +++ b/src/ts/model/account.ts @@ -14,6 +14,7 @@ class AccountInfo implements I.AccountInfo { widgetsId = ''; analyticsId = ''; networkId = ''; + workspaceObjectId = ''; constructor (props: I.AccountInfo) { this.homeObjectId = String(props.homeObjectId || ''); @@ -27,6 +28,7 @@ class AccountInfo implements I.AccountInfo { this.widgetsId = String(props.widgetsId || ''); this.analyticsId = String(props.analyticsId || ''); this.networkId = String(props.networkId || ''); + this.workspaceObjectId = String(props.workspaceObjectId || ''); makeObservable(this, { homeObjectId: observable, @@ -40,6 +42,7 @@ class AccountInfo implements I.AccountInfo { widgetsId: observable, analyticsId: observable, networkId: observable, + workspaceObjectId: observable, }); intercept(this as any, change => U.Common.intercept(this, change)); diff --git a/src/ts/model/notification.ts b/src/ts/model/notification.ts index e296203fce..193ed19370 100644 --- a/src/ts/model/notification.ts +++ b/src/ts/model/notification.ts @@ -42,16 +42,8 @@ class Notification implements I.Notification { switch (this.type) { case I.NotificationType.Import: { - const codes = [ - J.Error.Code.NO_OBJECTS_TO_IMPORT, - J.Error.Code.IMPORT_IS_CANCELED, - J.Error.Code.LIMIT_OF_ROWS_OR_RELATIONS_EXCEEDED, - J.Error.Code.FILE_LOAD_ERROR, - J.Error.Code.INSUFFICIENT_PERMISSIONS, - ]; - - if (codes.includes(errorCode)) { - this.title = translate(`notificationImportErrorTitle${errorCode}`); + if (Object.values(J.Error.Code.Import).includes(errorCode)) { + this.title = translate('commonError'); this.text = translate(`notificationImportErrorText${errorCode}`); }; break; diff --git a/src/ts/model/viewRelation.ts b/src/ts/model/viewRelation.ts index a54b434aa2..adfa564f94 100644 --- a/src/ts/model/viewRelation.ts +++ b/src/ts/model/viewRelation.ts @@ -9,6 +9,7 @@ class ViewRelation implements I.ViewRelation { includeTime = false; dateFormat: I.DateFormat = I.DateFormat.MonthAbbrBeforeDay; timeFormat: I.TimeFormat = I.TimeFormat.H12; + formulaType: I.FormulaType = I.FormulaType.None; constructor (props: I.ViewRelation) { this.relationKey = String(props.relationKey || ''); @@ -17,6 +18,7 @@ class ViewRelation implements I.ViewRelation { this.includeTime = Boolean(props.includeTime); this.dateFormat = Number(props.dateFormat) || I.DateFormat.MonthAbbrBeforeDay; this.timeFormat = Number(props.timeFormat) || I.TimeFormat.H12; + this.formulaType = Number(props.formulaType) || I.FormulaType.None; makeObservable(this, { width: observable, @@ -24,6 +26,7 @@ class ViewRelation implements I.ViewRelation { includeTime: observable, dateFormat: observable, timeFormat: observable, + formulaType: observable, }); intercept(this as any, change => U.Common.intercept(this, change)); diff --git a/src/ts/store/auth.ts b/src/ts/store/auth.ts index e356b70479..f6823bc45b 100644 --- a/src/ts/store/auth.ts +++ b/src/ts/store/auth.ts @@ -37,9 +37,9 @@ class AuthStore { return this.accountList; }; - get account (): I.Account { + get account (): I.Account { return this.accountItem; - }; + }; get accountSpaceId (): string { return String(this.accountItem?.info?.accountSpaceId || ''); @@ -64,7 +64,7 @@ class AuthStore { appTokenSet (v: string) { this.appToken = String(v || ''); - }; + }; networkConfigSet (obj: NetworkConfig) { Storage.set('networkConfig', obj, true); @@ -94,11 +94,11 @@ class AuthStore { account.config = account.config || {}; this.accountList.push(new M.Account(account)); - }; + }; accountListClear () { this.accountList = []; - }; + }; accountSet (account: any) { account = account || {}; @@ -116,7 +116,7 @@ class AuthStore { Storage.set('accountId', account.id); Renderer.send('setAccount', this.accountItem); }; - }; + }; accountSetStatus (status: I.AccountStatus) { if (this.accountItem) { @@ -162,7 +162,7 @@ class AuthStore { C.AccountStop(removeData, () => { C.WalletCloseSession(this.token); - this.tokenSet(''); + this.tokenSet(''); }); Renderer.send('logout'); @@ -185,7 +185,7 @@ class AuthStore { this.clearAll(); Storage.logout(); - }; + }; }; diff --git a/src/ts/store/block.ts b/src/ts/store/block.ts index b6f9a403e0..3a685e0549 100644 --- a/src/ts/store/block.ts +++ b/src/ts/store/block.ts @@ -4,44 +4,49 @@ import { I, M, S, U, J, Storage, Mark, translate, keyboard } from 'Lib'; class BlockStore { - public profileId = ''; + public profileId = ''; public widgetsId = ''; public rootId = ''; public spaceviewId = ''; + public workspaceId = ''; - public treeMap: Map<string, Map<string, I.BlockStructure>> = new Map(); - public blockMap: Map<string, Map<string, I.Block>> = new Map(); - public restrictionMap: Map<string, Map<string, any>> = new Map(); + public treeMap: Map<string, Map<string, I.BlockStructure>> = new Map(); + public blockMap: Map<string, Map<string, I.Block>> = new Map(); + public restrictionMap: Map<string, Map<string, any>> = new Map(); public participantMap: Map<string, Map<string, string>> = new Map(); - constructor() { - makeObservable(this, { + constructor() { + makeObservable(this, { rootId: observable, - profileId: observable, + profileId: observable, spaceviewId: observable, widgetsId: observable, + workspaceId: observable, - profile: computed, + profile: computed, root: computed, spaceview: computed, widgets: computed, + workspace: computed, rootSet: action, - profileSet: action, - widgetsSet: action, + profileSet: action, + widgetsSet: action, spaceviewSet: action, - set: action, - clear: action, - clearAll: action, - add: action, - update: action, + workspaceSet: action, + + set: action, + clear: action, + clearAll: action, + add: action, + update: action, updateContent: action, - updateStructure: action, - delete: action, - }); - }; + updateStructure: action, + delete: action, + }); + }; - get profile (): string { + get profile (): string { return String(this.profileId || ''); }; @@ -57,6 +62,10 @@ class BlockStore { return String(this.spaceviewId || ''); }; + get workspace (): string { + return String(this.workspaceId || ''); + }; + profileSet (id: string) { this.profileId = String(id || ''); }; @@ -72,8 +81,12 @@ class BlockStore { spaceviewSet (id: string) { this.spaceviewId = String(id || ''); }; + + workspaceSet (id: string) { + this.workspaceId = String(id || ''); + }; - set (rootId: string, blocks: I.Block[]) { + set (rootId: string, blocks: I.Block[]) { const map: Map<string, I.Block> = new Map(); blocks.forEach((it: I.Block) => { @@ -83,14 +96,14 @@ class BlockStore { this.blockMap.set(rootId, map); }; - add (rootId: string, block: I.Block) { + add (rootId: string, block: I.Block) { const map = this.blockMap.get(rootId); if (map) { map.set(block.id, block); }; }; - update (rootId: string, blockId: string, param: any) { + update (rootId: string, blockId: string, param: any) { const block = this.getLeaf(rootId, blockId); if (!block) { return; @@ -113,7 +126,7 @@ class BlockStore { this.participantMap.delete(rootId); }; - clearAll () { + clearAll () { this.profileSet(''); this.widgetsSet(''); this.rootSet(''); @@ -142,7 +155,7 @@ class BlockStore { }; }; - updateStructure (rootId: string, blockId: string, childrenIds: string[]) { + updateStructure (rootId: string, blockId: string, childrenIds: string[]) { const element = this.getMapElement(rootId, blockId); if (!element) { const map = this.getMap(rootId); @@ -166,7 +179,7 @@ class BlockStore { }; }; - delete (rootId: string, id: string) { + delete (rootId: string, id: string) { const blocks = this.getBlocks(rootId); const map = this.getMap(rootId); @@ -174,7 +187,7 @@ class BlockStore { map.delete(id); }; - restrictionsSet (rootId: string, restrictions: any) { + restrictionsSet (rootId: string, restrictions: any) { let map = this.restrictionMap.get(rootId); if (!map) { @@ -204,11 +217,11 @@ class BlockStore { this.participantMap.set(rootId, map); }; - getMap (rootId: string) { + getMap (rootId: string) { return this.treeMap.get(rootId) || new Map(); }; - getMapElement (rootId: string, blockId: string): I.BlockStructure { + getMapElement (rootId: string, blockId: string): I.BlockStructure { const map = this.getMap(rootId); return map ? map.get(blockId) : null; }; @@ -228,7 +241,7 @@ class BlockStore { return element ? this.getLeaf(rootId, element.parentId) : null; }; - getBlocks (rootId: string, filter?: (it: any) => boolean): I.Block[] { + getBlocks (rootId: string, filter?: (it: any) => boolean): I.Block[] { const map = this.blockMap.get(rootId); if (!map) { return []; @@ -238,19 +251,19 @@ class BlockStore { return filter ? blocks.filter(it => filter(it)) : blocks; }; - getChildrenIds (rootId: string, blockId: string): string[] { + getChildrenIds (rootId: string, blockId: string): string[] { const element = this.getMapElement(rootId, blockId); return element ? (element.childrenIds || []) : []; }; - getChildren (rootId: string, blockId: string, filter?: (it: any) => boolean): I.Block[] { + getChildren (rootId: string, blockId: string, filter?: (it: any) => boolean): I.Block[] { return this.getChildrenIds(rootId, blockId).map(id => this.getLeaf(rootId, id)).filter((it: any) => { return it ? (filter ? filter(it) : true) : false; }); }; - // If check is present - find next block if check passes or continue to next block in "dir" direction, else just return next block; - getNextBlock (rootId: string, id: string, dir: number, check?: (item: I.Block) => any, list?: any): any { + // If check is present - find next block if check passes or continue to next block in "dir" direction, else just return next block; + getNextBlock (rootId: string, id: string, dir: number, check?: (item: I.Block) => any, list?: any): any { if (!list) { list = this.unwrapTree([ this.wrapTree(rootId, rootId) ]); }; @@ -270,12 +283,12 @@ class BlockStore { }; }; - getFirstBlock (rootId: string, dir: number, check: (item: I.Block) => any): I.Block { + getFirstBlock (rootId: string, dir: number, check: (item: I.Block) => any): I.Block { const list = this.unwrapTree([ this.wrapTree(rootId, rootId) ]).filter(check); return dir > 0 ? list[0] : list[list.length - 1]; }; - getHighestParent (rootId: string, blockId: string): I.Block { + getHighestParent (rootId: string, blockId: string): I.Block { const block = this.getLeaf(rootId, blockId); if (!block) { return null; @@ -339,7 +352,7 @@ class BlockStore { return parent && parent.isTableRow(); }; - updateNumbers (rootId: string) { + updateNumbers (rootId: string) { const root = this.wrapTree(rootId, rootId); if (!root) { return; @@ -393,7 +406,7 @@ class BlockStore { cb(unwrap(tree)); }; - getTree (rootId: string, list: any[]): any[] { + getTree (rootId: string, list: any[]): any[] { list = U.Common.objectCopy(list || []); for (const item of list) { item.childBlocks = this.getTree(item.id, this.getChildren(rootId, item.id)); @@ -401,7 +414,7 @@ class BlockStore { return list; }; - wrapTree (rootId: string, blockId: string) { + wrapTree (rootId: string, blockId: string) { const map = this.getMap(rootId); const ret: any = {}; @@ -416,7 +429,7 @@ class BlockStore { return ret[blockId]; }; - unwrapTree (tree: any[]): any[] { + unwrapTree (tree: any[]): any[] { tree = (tree || []).filter(it => it); let ret = [] as I.Block[]; @@ -445,7 +458,7 @@ class BlockStore { return { childrenIds, columnContainer, columns, rowContainer, rows }; }; - getRestrictions (rootId: string, blockId: string) { + getRestrictions (rootId: string, blockId: string) { const map = this.restrictionMap.get(rootId); if (!map) { return []; @@ -471,7 +484,7 @@ class BlockStore { return this.isAllowed(this.getRestrictions(rootId, blockId), flags); }; - isAllowed (restrictions: any[], flags: any[]): boolean { + isAllowed (restrictions: any[], flags: any[]): boolean { if (!U.Space.canMyParticipantWrite()) { return false; }; @@ -487,10 +500,10 @@ class BlockStore { return true; }; - toggle (rootId: string, blockId: string, v: boolean) { + toggle (rootId: string, blockId: string, v: boolean) { const element = $(`#block-${blockId}`); - v ? element.addClass('isToggled') : element.removeClass('isToggled'); + element.toggleClass('isToggled', v); Storage.setToggle(rootId, blockId, v); U.Common.triggerResizeEditor(keyboard.isPopup()); @@ -522,7 +535,7 @@ class BlockStore { const { from, to } = mark.range; const object = S.Detail.get(rootId, mark.param, [ 'name', 'layout', 'snippet', 'fileExt' ], true); - if (object._empty_) { + if (object._empty_ || U.Object.isDateLayout(object.layout)) { continue; }; @@ -572,8 +585,9 @@ class BlockStore { checkBlockType (rootId: string) { const { header, type } = J.Constant.blockId; const element = this.getMapElement(rootId, header); + const canWrite = U.Space.canMyParticipantWrite(); - if (!element) { + if (!element || !canWrite) { return; }; @@ -593,32 +607,6 @@ class BlockStore { return header ? header.childrenIds.includes(J.Constant.blockId.type) : false; }; - checkBlockChat (rootId: string) { - return; - - const element = this.getMapElement(rootId, rootId); - - if (!element) { - return; - }; - - const object = S.Detail.get(rootId, rootId, [ 'layout', 'chatId' ], true); - if (U.Object.isChatLayout(object.layout)) { - return; - }; - - if (object.chatId && !this.checkBlockChatExists(rootId)) { - const childrenIds = element.childrenIds.concat(J.Constant.blockId.chat); - - this.updateStructure(rootId, rootId, childrenIds); - }; - }; - - checkBlockChatExists (rootId: string): boolean { - const element = this.getMapElement(rootId, rootId); - return element ? element.childrenIds.includes(J.Constant.blockId.chat) : false; - }; - getLayoutIds (rootId: string, ids: string[]) { if (!ids.length) { return []; diff --git a/src/ts/store/chat.ts b/src/ts/store/chat.ts index 0a99038231..a82ec476e0 100644 --- a/src/ts/store/chat.ts +++ b/src/ts/store/chat.ts @@ -3,17 +3,17 @@ import { I, M } from 'Lib'; class ChatStore { - public messageMap: Map<string, any[]> = observable(new Map()); + public messageMap: Map<string, any[]> = observable(new Map()); public replyMap: Map<string, Map<string, I.ChatMessage>> = observable(new Map()); - constructor () { - makeObservable(this, { + constructor () { + makeObservable(this, { add: action, update: action, delete: action, setReply: action, - }); - }; + }); + }; set (rootId: string, list: I.ChatMessage[]): void { list = list.map(it => new M.ChatMessage(it)); diff --git a/src/ts/store/common.ts b/src/ts/store/common.ts index 17445be19c..ccf16d7246 100644 --- a/src/ts/store/common.ts +++ b/src/ts/store/common.ts @@ -19,12 +19,12 @@ interface SpaceStorage { class CommonStore { public dataPathValue = ''; - public progressObj: I.Progress = null; - public filterObj: Filter = { from: 0, text: '' }; - public gatewayUrl = ''; + public progressObj: I.Progress = null; + public filterObj: Filter = { from: 0, text: '' }; + public gatewayUrl = ''; public toastObj: I.Toast = null; - public configObj: any = {}; - public cellId = ''; + public configObj: any = {}; + public cellId = ''; public themeId = ''; public nativeThemeIsDark = false; public defaultType = ''; @@ -82,14 +82,14 @@ class CommonStore { public membershipTiersList: I.MembershipTier[] = []; - constructor () { - makeObservable(this, { - progressObj: observable, - filterObj: observable, - gatewayUrl: observable, - previewObj: observable, + constructor () { + makeObservable(this, { + progressObj: observable, + filterObj: observable, + gatewayUrl: observable, + previewObj: observable, toastObj: observable, - configObj: observable, + configObj: observable, spaceStorageObj: observable, themeId: observable, nativeThemeIsDark: observable, @@ -105,12 +105,12 @@ class CommonStore { showObjectValue: observable, spaceId: observable, membershipTiersList: observable, - config: computed, - progress: computed, - preview: computed, + showRelativeDatesValue: observable, + config: computed, + preview: computed, toast: computed, - filter: computed, - gateway: computed, + filter: computed, + gateway: computed, theme: computed, nativeTheme: computed, membershipTiers: computed, @@ -118,13 +118,12 @@ class CommonStore { isOnline: computed, shareTooltip: computed, showVault: computed, - gatewaySet: action, - progressSet: action, - progressClear: action, - filterSetFrom: action, - filterSetText: action, - filterSet: action, - previewSet: action, + showRelativeDates: computed, + gatewaySet: action, + filterSetFrom: action, + filterSetText: action, + filterSet: action, + previewSet: action, toastSet: action, toastClear: action, themeSet: action, @@ -138,12 +137,13 @@ class CommonStore { membershipTiersListSet: action, showVaultSet: action, showObjectSet: action, + showRelativeDatesSet: action, }); intercept(this.configObj as any, change => U.Common.intercept(this.configObj, change)); - }; + }; - get config (): any { + get config (): any { const config = window.AnytypeGlobalConfig || this.configObj || {}; config.languages = config.languages || []; @@ -153,11 +153,7 @@ class CommonStore { return config; }; - get progress (): I.Progress { - return this.progressObj; - }; - - get preview (): I.Preview { + get preview (): I.Preview { return this.previewObj; }; @@ -165,11 +161,11 @@ class CommonStore { return this.toastObj; }; - get filter (): Filter { + get filter (): Filter { return this.filterObj; }; - get gateway (): string { + get gateway (): string { return String(this.gatewayUrl || ''); }; @@ -283,40 +279,32 @@ class CommonStore { return ret; }; - gatewaySet (v: string) { + gatewaySet (v: string) { this.gatewayUrl = v; }; - fileUrl (id: string) { + fileUrl (id: string) { return [ this.gateway, 'file', String(id || '') ].join('/'); }; - imageUrl (id: string, width: number) { + imageUrl (id: string, width: number) { return [ this.gateway, 'image', String(id || '') ].join('/') + `?width=${Number(width) || 0}`; }; - progressSet (v: I.Progress) { - this.progressObj = v; - }; - - progressClear () { - this.progressObj = null; - }; - - filterSetFrom (from: number) { + filterSetFrom (from: number) { this.filterObj.from = from; }; - filterSetText (text: string) { + filterSetText (text: string) { this.filterObj.text = text; }; - filterSet (from: number, text: string) { + filterSet (from: number, text: string) { this.filterSetFrom(from); this.filterSetText(text); }; - previewSet (preview: I.Preview) { + previewSet (preview: I.Preview) { this.previewObj = preview; }; @@ -330,7 +318,7 @@ class CommonStore { const ids = [ objectId, targetId, originId ].filter(it => it); if (ids.length) { - U.Object.getByIds(ids, (objects: any[]) => { + U.Object.getByIds(ids, {}, (objects: any[]) => { const map = U.Common.mapToObject(objects, 'id'); if (targetId && map[targetId]) { @@ -399,11 +387,9 @@ class CommonStore { }; fullscreenSet (v: boolean) { - const body = $('body'); - this.isFullScreen = v; - v ? body.addClass('isFullScreen') : body.removeClass('isFullScreen'); + $('body').toggleClass('isFullScreen', v); $(window).trigger('resize'); }; @@ -527,7 +513,7 @@ class CommonStore { set(this.configObj, newConfig); this.configObj.debug = this.configObj.debug || {}; - this.configObj.debug.ui ? html.addClass('debug') : html.removeClass('debug'); + html.toggleClass('debug', this.configObj.debug.ui); }; spaceStorageSet (value: Partial<SpaceStorage>) { diff --git a/src/ts/store/detail.ts b/src/ts/store/detail.ts index 84e8db21b5..1418816308 100644 --- a/src/ts/store/detail.ts +++ b/src/ts/store/detail.ts @@ -13,18 +13,18 @@ interface Item { class DetailStore { - private map: Map<string, Map<string, Detail[]>> = new Map(); - - constructor() { - makeObservable(this, { - set: action, - update: action, - delete: action - }); - }; + private map: Map<string, Map<string, Detail[]>> = new Map(); + + constructor() { + makeObservable(this, { + set: action, + update: action, + delete: action + }); + }; /** Idempotent. adds details to the detail store. */ - public set (rootId: string, items: Item[]) { + public set (rootId: string, items: Item[]) { if (!rootId) { console.log('[S.Detail].set: rootId is not defined'); return; @@ -54,7 +54,7 @@ class DetailStore { }; /** Idempotent. updates details in the detail store. if clear is set, map wil delete details by item id. */ - public update (rootId: string, item: Item, clear: boolean): void { + public update (rootId: string, item: Item, clear: boolean): void { if (!rootId) { console.log('[S.Detail].update: rootId is not defined'); return; @@ -129,7 +129,7 @@ class DetailStore { }; /** Idempotent. Clears details by keys provided, if they exist. if no keys are provided, all details are cleared. */ - public delete (rootId: string, id: string, keys?: string[]): void { + public delete (rootId: string, id: string, keys?: string[]): void { const map = this.map.get(rootId); if (!map) { @@ -147,7 +147,7 @@ class DetailStore { }; /** gets the object. if no keys are provided, all properties are returned. if force keys is set, J.Relation.default are included */ - public get (rootId: string, id: string, withKeys?: string[], forceKeys?: boolean): any { + public get (rootId: string, id: string, withKeys?: string[], forceKeys?: boolean): any { let list = this.map.get(rootId)?.get(id) || []; if (!list.length) { return { id, _empty_: true }; @@ -286,8 +286,8 @@ class DetailStore { object.readersLimit = Number(object.readersLimit) || 0; object.writersLimit = Number(object.writersLimit) || 0; object.spaceId = Relation.getStringValue(object.spaceId); - object.spaceMainChatId = Relation.getStringValue(object.spaceMainChatId); object.spaceDashboardId = Relation.getStringValue(object.spaceDashboardId); + object.chatId = Relation.getStringValue(object.chatId); object.targetSpaceId = Relation.getStringValue(object.targetSpaceId); object.iconOption = Number(object.iconOption) || 1; diff --git a/src/ts/store/extension.ts b/src/ts/store/extension.ts index 10c47502af..083c388de7 100644 --- a/src/ts/store/extension.ts +++ b/src/ts/store/extension.ts @@ -10,7 +10,7 @@ class ExtensionStore { public htmlValue = ''; constructor() { - makeObservable(this, { + makeObservable(this, { htmlValue: observable, setHtml: action, }); diff --git a/src/ts/store/index.ts b/src/ts/store/index.ts index 8f2230b6e6..7884aff344 100644 --- a/src/ts/store/index.ts +++ b/src/ts/store/index.ts @@ -8,6 +8,7 @@ import { Popup } from './popup'; import { Notification } from './notification'; import { Extension } from './extension'; import { Chat } from './chat'; +import { Progress } from './progress'; export { Common, @@ -20,4 +21,5 @@ export { Notification, Extension, Chat, + Progress, }; \ No newline at end of file diff --git a/src/ts/store/menu.ts b/src/ts/store/menu.ts index 6fa16c8c72..596c02bd47 100644 --- a/src/ts/store/menu.ts +++ b/src/ts/store/menu.ts @@ -4,28 +4,28 @@ import { I, U, J, Preview } from 'Lib'; class MenuStore { - public menuList: I.Menu[] = []; + public menuList: I.Menu[] = []; - timeout = 0; + timeout = 0; isAnimatingFlag: Map<string, boolean> = new Map(); - constructor () { - makeObservable(this, { - menuList: observable, - list: computed, - open: action, - update: action, - updateData: action, - close: action, - closeAll: action - }); - }; - - get list(): I.Menu[] { + constructor () { + makeObservable(this, { + menuList: observable, + list: computed, + open: action, + update: action, + updateData: action, + close: action, + closeAll: action + }); + }; + + get list(): I.Menu[] { return this.menuList; }; - open (id: string, param: I.MenuParam) { + open (id: string, param: I.MenuParam) { if (!id) { return; }; @@ -56,7 +56,7 @@ class MenuStore { return param; }; - update (id: string, param: any) { + update (id: string, param: any) { const item = this.get(id); if (item) { param.data = Object.assign(item.param.data, param.data); @@ -64,7 +64,7 @@ class MenuStore { }; }; - updateData (id: string, data: any) { + updateData (id: string, data: any) { const item = this.get(id); if (item) { set(item.param.data, data); @@ -80,11 +80,11 @@ class MenuStore { }; }; - get (id: string): I.Menu { + get (id: string): I.Menu { return this.menuList.find(it => it.id == id); }; - isOpen (id?: string, key?: string, filter?: string[]): boolean { + isOpen (id?: string, key?: string, filter?: string[]): boolean { if (!id) { let length = 0; if (filter) { @@ -103,7 +103,7 @@ class MenuStore { return key ? (item.param.menuKey == key) : true; }; - isOpenList (ids: string[]) { + isOpenList (ids: string[]) { for (const id of ids) { if (this.isOpen(id)) { return true; @@ -112,9 +112,8 @@ class MenuStore { return false; }; - close (id: string, callBack?: () => void) { + close (id: string, callBack?: () => void) { const item = this.get(id); - if (!item) { if (callBack) { callBack(); @@ -132,7 +131,7 @@ class MenuStore { }; if (el.length) { - noAnimation ? el.addClass('noAnimation') : el.removeClass('noAnimation'); + el.toggleClass('noAnimation', noAnimation); el.css({ transform: '' }).removeClass('show'); }; @@ -166,7 +165,7 @@ class MenuStore { return !!this.isAnimatingFlag.get(id); }; - closeAll (ids?: string[], callBack?: () => void) { + closeAll (ids?: string[], callBack?: () => void) { const items = this.getItems(ids); const timeout = this.getTimeout(); @@ -212,7 +211,7 @@ class MenuStore { }; }; - clearTimeout () { + clearTimeout () { window.clearTimeout(this.timeout); }; diff --git a/src/ts/store/notification.ts b/src/ts/store/notification.ts index 87862c37f0..ec33ffa6b1 100644 --- a/src/ts/store/notification.ts +++ b/src/ts/store/notification.ts @@ -3,19 +3,19 @@ import { I, M, Renderer } from 'Lib'; class NotificationStore { - public itemList: I.Notification[] = []; + public itemList: I.Notification[] = []; - constructor () { - makeObservable(this, { - itemList: observable, - list: computed, + constructor () { + makeObservable(this, { + itemList: observable, + list: computed, add: action, update: action, delete: action, - }); - }; + }); + }; - get list (): I.Notification[] { + get list (): I.Notification[] { return this.itemList || []; }; diff --git a/src/ts/store/popup.ts b/src/ts/store/popup.ts index dd7c8bd52e..153bf44a6c 100644 --- a/src/ts/store/popup.ts +++ b/src/ts/store/popup.ts @@ -24,27 +24,27 @@ const SHOW_DIMMER = [ class PopupStore { - public popupList: I.Popup[] = []; - - timeout = 0; - - constructor () { - makeObservable(this, { - popupList: observable, - list: computed, - open: action, - update: action, - updateData: action, - close: action, - closeAll: action, - }); - }; - - get list(): I.Popup[] { + public popupList: I.Popup[] = []; + + timeout = 0; + + constructor () { + makeObservable(this, { + popupList: observable, + list: computed, + open: action, + update: action, + updateData: action, + close: action, + closeAll: action, + }); + }; + + get list(): I.Popup[] { return this.popupList; }; - open (id: string, param: I.PopupParam) { + open (id: string, param: I.PopupParam) { if (AUTH_IDS.includes(id) && !S.Auth.account) { return; }; @@ -78,11 +78,11 @@ class PopupStore { }; }; - get (id: string): I.Popup { + get (id: string): I.Popup { return this.popupList.find(it => it.id == id); }; - update (id: string, param: any) { + update (id: string, param: any) { const item = this.get(id); if (!item) { return; @@ -92,7 +92,7 @@ class PopupStore { set(item, { param: Object.assign(item.param, param) }); }; - updateData (id: string, data: any) { + updateData (id: string, data: any) { const item = this.get(id); if (item) { item.param.data = Object.assign(item.param.data, data); @@ -100,7 +100,7 @@ class PopupStore { }; }; - isOpen (id?: string, filter?: string[]): boolean { + isOpen (id?: string, filter?: string[]): boolean { if (!id) { let length = 0; if (filter) { @@ -113,7 +113,7 @@ class PopupStore { return this.get(id) ? true : false; }; - isOpenList (ids: string[]) { + isOpenList (ids: string[]) { for (const id of ids) { if (this.isOpen(id)) { return true; @@ -126,7 +126,7 @@ class PopupStore { return this.isOpenList([ 'search', 'template' ]); }; - close (id: string, callBack?: () => void, force?: boolean) { + close (id: string, callBack?: () => void, force?: boolean) { const item = this.get(id); if (!item) { if (callBack) { @@ -170,7 +170,7 @@ class PopupStore { }; }; - closeAll (ids?: string[], callBack?: () => void) { + closeAll (ids?: string[], callBack?: () => void) { const items = this.getItems(ids); const timeout = items.length ? J.Constant.delay.popup : 0; @@ -202,7 +202,7 @@ class PopupStore { }; }; - clearTimeout () { + clearTimeout () { window.clearTimeout(this.timeout); }; diff --git a/src/ts/store/progress.ts b/src/ts/store/progress.ts new file mode 100644 index 0000000000..4416ffc197 --- /dev/null +++ b/src/ts/store/progress.ts @@ -0,0 +1,84 @@ +import { observable, action, makeObservable, set, computed } from 'mobx'; +import { I, S } from 'Lib'; + +class ProgressStore { + + public showValue = false; + public listValue: I.Progress[] = []; + + constructor () { + makeObservable(this, { + listValue: observable, + showValue: observable, + list: computed, + show: computed, + add: action, + update: action, + delete: action, + showSet: action, + }); + }; + + get show (): boolean { + return this.showValue; + }; + + get list (): I.Progress[] { + return this.listValue || []; + }; + + add (item: Partial<I.Progress>): void { + this.listValue.unshift(item); + }; + + update (param: Partial<I.Progress>): void { + const item = this.getItem(param.id); + + if (item) { + set(item, param); + } else { + this.add(param); + }; + }; + + delete (id: string) { + this.listValue = this.listValue.filter(it => it.id != id); + }; + + showSet (v: boolean): void { + this.showValue = Boolean(v); + }; + + getList () { + const { space } = S.Common; + const skip = [ I.ProgressState.Done, I.ProgressState.Canceled ]; + + return this.list.filter(it => (!it.spaceId || (it.spaceId == space)) && !skip.includes(it.state)); + }; + + getItem (id: string): I.Progress { + return this.getList().find(it => it.id == id); + }; + + getField (field: string): number { + return this.getList().reduce((acc, it) => acc + (Number(it[field]) || 0), 0); + }; + + getCurrent (): number { + return this.getField('current'); + }; + + getTotal (): number { + return this.getField('total'); + }; + + getPercent (): number { + const current = this.getCurrent(); + const total = this.getTotal(); + + return total > 0 ? Math.min(100, Math.ceil(current / total * 100)) : 0; + }; + +}; + +export const Progress: ProgressStore = new ProgressStore(); \ No newline at end of file diff --git a/src/ts/store/record.ts b/src/ts/store/record.ts index 07ee2b9073..521d71e51f 100644 --- a/src/ts/store/record.ts +++ b/src/ts/store/record.ts @@ -8,12 +8,12 @@ enum KeyMapType { class RecordStore { - public relationMap: Map<string, any[]> = observable(new Map()); + public relationMap: Map<string, any[]> = observable(new Map()); public relationKeyMap: Map<string, Map<string, string>> = new Map(); public typeKeyMap: Map<string, Map<string, string>> = new Map(); - public viewMap: Map<string, I.View[]> = observable.map(new Map()); - public recordMap: Map<string, string[]> = observable.map(new Map()); - public metaMap: Map<string, any> = observable.map(new Map()); + public viewMap: Map<string, I.View[]> = observable.map(new Map()); + public recordMap: Map<string, string[]> = observable.map(new Map()); + public metaMap: Map<string, any> = observable.map(new Map()); public groupMap: Map<string, any> = observable.map(new Map()); constructor() { @@ -94,7 +94,7 @@ class RecordStore { return ret; }; - relationsSet (rootId: string, blockId: string, list: any[]) { + relationsSet (rootId: string, blockId: string, list: any[]) { const key = this.getId(rootId, blockId); const relations = (this.relationMap.get(this.getId(rootId, blockId)) || []). concat(list.map(it => ({ relationKey: it.relationKey, format: it.format }))); @@ -282,10 +282,6 @@ class RecordStore { return this.getTypeByKey(J.Constant.typeKey.chat); }; - getChatDerivedType () { - return this.getTypeByKey(J.Constant.typeKey.chatDerived); - }; - getSpaceType () { return this.getTypeByKey(J.Constant.typeKey.space); }; @@ -320,7 +316,7 @@ class RecordStore { return this.getObjectRelationKeys(rootId, blockId).map(it => this.getRelationByKey(it)).filter(it => it); }; - getRelationByKey (relationKey: string): any { + getRelationByKey (relationKey: string): any { const id = this.relationKeyMapGet(relationKey); return id ? this.getRelationById(id) : null; }; diff --git a/tsconfig.json b/tsconfig.json index 69137db4ce..ab03859de7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,9 @@ "allowJs": true, "baseUrl": "./src", "lib": [ "es5", "dom" ], + "isolatedModules": true, + "incremental": true, + "types": [ "node", "@rspack/core/module" ], "paths": { "json": [ @@ -53,6 +56,12 @@ ], "Store": [ "ts/store", + ], + "Hook/*": [ + "ts/hook/*", + ], + "Hook": [ + "ts/hook", ], "dist/*": [ "../dist/*" diff --git a/update.sh b/update.sh index 3e1ee8141f..1dea52a68c 100755 --- a/update.sh +++ b/update.sh @@ -11,7 +11,7 @@ folder="build"; if [ "$platform" = "ubuntu-latest" ]; then arch="linux-$arch"; folder="$arch"; -elif [ "$platform" = "macos-12" ]; then +elif [ "$platform" = "macos-13" ]; then arch="darwin-$arch"; folder="$arch"; elif [ "$platform" = "windows-latest" ]; then @@ -34,7 +34,7 @@ mwv=`cat middleware.version` version=`curl -H "Accept: application/vnd.github.v3+json" -sL https://$GITHUB/repos/$REPO/releases/tags/v$mwv | jq .` tag=`echo $version | jq ".tag_name"` -asset_id=`echo $version | jq ".assets | map(select(.name | match(\"js_v[0-9]+.[0-9]+.[0-9]+(-rc[0-9]+)?_$arch\";\"i\")))[0].id"` +asset_id=`echo $version | jq ".assets | map(select(.name | match(\"js_v[0-9]+.[0-9]+.[0-9]+([^_]+)?_$arch\";\"i\")))[0].id"` if [ "$asset_id" = "" ]; then echo "ERROR: version not found"