diff --git a/.gitignore b/.gitignore index 346d62bce..78212683a 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,9 @@ www/common/onlyoffice/v* www/common/worker.bundle.js _build +FUNDING.json +funding.json + # ---> Node # Logs logs diff --git a/CHANGELOG.md b/CHANGELOG.md index ff02bb4b6..bfa98597c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,58 @@ SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and cont SPDX-License-Identifier: AGPL-3.0-or-later --> -# Release (2025.3.1) +# 2025.3.1 + +## Goals + +This release introduces version 8 of OnlyOffice applications (Document, Sheet, Presentation) alongside smaller fixes and improvements. + +## Features + +- Upgrade OnlyOffice to version 8.3 [#1807](https://github.com/cryptpad/cryptpad/pull/1807) + +## Improvements + +- Show error message when x2t conversion fails in OO editor [#1890](https://github.com/cryptpad/cryptpad/pull/1890) +- Add x2t warning [#1887](https://github.com/cryptpad/cryptpad/pull/1887) + +## Fixes + +- Fix OnlyOffice document copy [#1864](https://github.com/cryptpad/cryptpad/pull/1864) +- Fix u8 increment issue in file-crypto [#1860](https://github.com/cryptpad/cryptpad/pull/1860) thanks @ansuz +- Fix eviction issues [#1856](https://github.com/cryptpad/cryptpad/pull/1856) + +## Dependencies + +- Upgrade TweetNaCl [#1854](https://github.com/cryptpad/cryptpad/pull/1854) + +## Upgrade notes > [!NOTE] > The new version of OnlyOffice is much bigger than the previous versions. When installing version 8.3 with `install-onlyoffice.sh` ~830MB additional disk space is needed. +If you are upgrading from a version older than `2025.3.0` please read the upgrade notes of all versions between yours and `2025.3.1` to avoid configuration issues. + +To upgrade: + +1. Stop your server +2. Get the latest code with git + +```bash +git fetch --depth 1 origin tag 2025.3.1 +git checkout 2025.3.1 +npm ci +npm run install:components +``` + +1. Restart your server +2. Review your instance's checkup page to ensure that you are passing all tests + +## Contributors + +Alumni: @ansuz +CryptPad team: @AAAMON @wginolas @yflory + # 💐 Spring 2025 release (2025.3.0) ## Goals diff --git a/FUNDING.json b/FUNDING.json new file mode 100644 index 000000000..8f17bc63f --- /dev/null +++ b/FUNDING.json @@ -0,0 +1,7 @@ +{ + "drips": { + "ethereum": { + "ownedBy": "0xa117114b3a22e038c1545043d610dbd4029355b1" + } + } +} \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md index 3cadf5ceb..c596e676c 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -18,7 +18,7 @@ Note that every GitHub release page has an RSS compatible feed that you can subs We do also communicate about this topic on: - [Our blog](https://blog.cryptpad.org) - [Our Matrix public space](https://matrix.to/#/#cryptpad:matrix.xwiki.com) -- [Our Mastodon account](https://fosstodon.org/@cryptpad) +- [Our Mastodon account](https://social.xwiki.com/@CryptPad) ## Reporting a Vulnerability diff --git a/customize.dist/contact.html b/customize.dist/contact.html index 11c4dd5ff..ac533a682 100644 --- a/customize.dist/contact.html +++ b/customize.dist/contact.html @@ -10,7 +10,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later CryptPad: Collaboration suite, encrypted and open-source - + diff --git a/customize.dist/images/forum.svg b/customize.dist/images/forum.svg new file mode 100644 index 000000000..0eb00a9d6 --- /dev/null +++ b/customize.dist/images/forum.svg @@ -0,0 +1,63 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/customize.dist/images/forum.svg.license b/customize.dist/images/forum.svg.license new file mode 100644 index 000000000..1cea3b60d --- /dev/null +++ b/customize.dist/images/forum.svg.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: Font Awesome by Dave Gandy + +SPDX-License-Identifier: CC-BY-SA-3.0 diff --git a/customize.dist/images/irc.svg b/customize.dist/images/irc.svg deleted file mode 100644 index 58a9e707d..000000000 --- a/customize.dist/images/irc.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/customize.dist/images/irc.svg.license b/customize.dist/images/irc.svg.license deleted file mode 100644 index ff0da3695..000000000 --- a/customize.dist/images/irc.svg.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors - -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/customize.dist/images/issue.svg b/customize.dist/images/issue.svg deleted file mode 100644 index 27d5276c7..000000000 --- a/customize.dist/images/issue.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - diff --git a/customize.dist/images/issue.svg.license b/customize.dist/images/issue.svg.license deleted file mode 100644 index ff0da3695..000000000 --- a/customize.dist/images/issue.svg.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors - -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/customize.dist/images/twiitter.svg b/customize.dist/images/twiitter.svg deleted file mode 100644 index 785e36cc2..000000000 --- a/customize.dist/images/twiitter.svg +++ /dev/null @@ -1,69 +0,0 @@ - -image/svg+xml - - - - - - - diff --git a/customize.dist/images/twiitter.svg.license b/customize.dist/images/twiitter.svg.license deleted file mode 100644 index ff0da3695..000000000 --- a/customize.dist/images/twiitter.svg.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors - -SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/customize.dist/loading.js b/customize.dist/loading.js index 917439dcc..394fb5128 100644 --- a/customize.dist/loading.js +++ b/customize.dist/loading.js @@ -15,13 +15,13 @@ define([ elem.innerHTML = [ '', '
', '
', '', '
', - '
', + '', diff --git a/customize.dist/login.js b/customize.dist/login.js index a21de0cfc..31567afcb 100644 --- a/customize.dist/login.js +++ b/customize.dist/login.js @@ -7,7 +7,7 @@ define([ 'chainpad-listmap', '/components/chainpad-crypto/crypto.js', '/common/common-util.js', - '/common/outer/network-config.js', + '/common/network-config.js', '/common/common-login.js', '/common/common-credential.js', '/components/chainpad/chainpad.dist.js', @@ -104,9 +104,9 @@ define([ var proceed = function (result) { hashing = false; - if (cb && typeof cb === "function" && cb(result)) { return; } - LocalStore.clearLoginToken(); Realtime.whenRealtimeSyncs(result.realtime, function () { + if (cb && typeof cb === "function" && cb(result)) { return; } + LocalStore.clearLoginToken(); Exports.redirect(); }); }; diff --git a/customize.dist/messages.js b/customize.dist/messages.js index e84f4453c..96745fb55 100755 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -136,14 +136,27 @@ define(req, function(AppConfig, Default, Language) { Messages.admin_documentsDeletionHint = "Archive a list of documents using their id (one document id per line)"; Messages.admin_documentsDeletionTitle = "Archive multiple documents"; - - // XXX + Messages.help_close_button = 'Close help notification'; // XXX Messages.badges_admin = "Instance administrator"; Messages.badges_moderator = "Instance moderator"; Messages.badges_premium = "Premium user"; Messages.badges_error = "Error while validating this user's data"; Messages.profile_badges = "Badges"; - + Messages.user_profile = 'Go to user profile'; + Messages.add_password = "Add your document password"; + Messages.show_password = "Show password"; + Messages.hide_password = "Hide password"; + Messages.page_next = "Next page"; + Messages.page_previous = "Previous page"; + Messages.contact_mastodon = 'Mastodon'; // XXX + Messages.contact_forum = 'Forum'; // XXX + Messages.toolbar_text_tools = "Text tools"; + Messages.toolbar_show_text_tools = "Show text tools"; + Messages.toolbar_hide_text_tools = "Hide text tools"; + Messages.settings_profileAvatarLabel = "Avatar"; + Messages.settings_profileHeaderTitle = "Edit your profile"; + Messages.settings_profileHeaderHint = "Edit your public profile..."; + Messages.fc_open_formaud = 'Open (as auditor)'; return Messages; }); diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 51ebb4d08..c4e03beaa 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -10,8 +10,10 @@ define([ '/customize/messages.js', 'jquery', '/api/config', + '/common/extensions.js', 'optional!/api/instance', -], function (h, Language, Util, AppConfig, Msg, $, ApiConfig, Instance) { +], function (h, Language, Util, AppConfig, Msg, $, ApiConfig, + Extensions, Instance) { var Pages = {}; Pages.setHTML = function (e, html) { @@ -49,15 +51,8 @@ define([ return Pages.externalLink(el, Pages.localizeDocsLink(href)); }; - var accounts = Pages.accounts = { + Pages.accounts = { donateURL: AppConfig.donateURL || "https://opencollective.com/cryptpad/", - upgradeURL: AppConfig.upgradeURL - }; - - Pages.areSubscriptionsAllowed = function () { - try { - return ApiConfig.allowSubscriptions && accounts.upgradeURL && !ApiConfig.restrictRegistration; - } catch (err) { return void console.error(err); } }; var languageSelector = function () { @@ -82,6 +77,7 @@ define([ if (!ref) { return; } var attrs = { href: ref, + role: 'button', }; var iconName = ''; if (!/^\//.test(ref)) { @@ -160,7 +156,7 @@ define([ return h('footer.cp-footer', [ h('div.cp-footer-left', [ - h('a', {href:"https://cryptpad.org"}, [ + h('a', {href:"https://cryptpad.org", role: 'button'}, [ h('div.cp-logo-foot', [ h('img', { src: '/customize/CryptPad_logo.svg', @@ -193,7 +189,7 @@ define([ var registerLink; if (!ApiConfig.restrictRegistration) { - registerLink = h('a.nav-item.nav-link.cp-register-btn', { href: '/register/'}, [ + registerLink = h('a.nav-item.nav-link.cp-register-btn', { href: '/register/', role: 'button'}, [ h('i.fa.fa-user', {'aria-hidden':'true'}), Msg.login_register ]); @@ -201,14 +197,14 @@ define([ if (username === null) { rightLinks = [ - h('a.nav-item.nav-link.cp-login-btn', { href: '/login/'}, [ + h('a.nav-item.nav-link.cp-login-btn', { href: '/login/', role: 'button'}, [ h('i.fa.fa-sign-in', {'aria-hidden':'true'}), Msg.login_login ]), registerLink, ]; } else { - rightLinks = h('a.nav-item.nav-link.cp-user-btn', { href: '/drive/' }, [ + rightLinks = h('a.nav-item.nav-link.cp-user-btn', { href: '/drive/', role: 'button'}, [ h('i.fa.fa-user-circle', {'aria-hidden':'true'}), " ", username @@ -216,7 +212,7 @@ define([ } var isHome = ['/', '/index.html'].includes(window.location.pathname); - var homeLink = h('a.nav-item.nav-link.cp-back-home' /* .navbar-brand */, { href: '/index.html' }, [ + var homeLink = h('a.nav-item.nav-link.cp-back-home' /* .navbar-brand */, { href: '/index.html', role: 'button'}, [ h('i.fa.fa-arrow-left'), h('img', { src: '/customize/CryptPad_logo.svg', @@ -226,12 +222,19 @@ define([ Msg.homePage ]); + let pricingName = Msg.features; + Extensions.getExtensionsSync('PRICING_NAME').some(ext => { + if (!ext.name) { return; } + pricingName = ext.name; + return true; + }); + return h('nav.navbar.navbar-expand-lg', [ !isHome? homeLink: undefined, - h('a.nav-item.nav-link', { href: '/features.html'}, [ + h('a.nav-item.nav-link', { href: '/features.html', role: 'button'}, [ h('i.fa.fa-info-circle'), - Pages.areSubscriptionsAllowed()? Msg.pricing: Msg.features + pricingName ]), h('a.nav-item.nav-link', { href: 'https://docs.cryptpad.org'}, [h('i.fa.fa-book', {'aria-hidden':'true'}),Msg.docs_link]), diff --git a/customize.dist/pages/contact.js b/customize.dist/pages/contact.js index 32023f78d..36f1b401f 100644 --- a/customize.dist/pages/contact.js +++ b/customize.dist/pages/contact.js @@ -19,10 +19,38 @@ define([ ].indexOf(Config.adminEmail) === -1; var adminMailbox = Config.supportMailbox && LocalStore.isLoggedIn(); + let contacts = [ + { + name: Msg.contact_chat || "Chat", + image: "/customize/images/sayhi.svg", + href: "https://matrix.to/#/#cryptpad:matrix.xwiki.com", + }, + { + name: Msg.contact_mastodon || "Mastodon", + image: "/customize/images/mastodon.svg", + href: "https://social.xwiki.com/@CryptPad", + }, + { + name: Msg.contact_bug || "Bug report", + image: "/customize/images/github.svg", + href: "https://github.com/cryptpad/cryptpad/issues/", + }, + { + name: Msg.contact_forum || "Forum", + image: "/customize/images/forum.svg", + href: "https://forum.cryptpad.org/", + }, + { + name: Msg.contact_email || "Email", + image: "/customize/images/email.svg", + href: 'mailto:' + developerEmail, + }, + ]; + return h('div#cp-main', [ Pages.infopageTopbar(), h('div.container.cp-container', [ - h('div.row.cp-page-title',[ + h('div.row.cp-page-title', [ h('div.col-12.text-center', h('h1', Msg.contact)), ]), (adminEmail || adminMailbox) ? h('div.row.cp-iconCont.align-items-center', [ @@ -64,76 +92,22 @@ define([ Pages.setHTML(h('h2.text-center'), Msg.contact_dev), h('p.center', Msg.contact_devHint) ), + ].concat(contacts.map(item => h('div', - h('a.card-small', {href : "https://matrix.to/#/#cryptpad:matrix.xwiki.com"}, + h('a.card-small', { href: item.href }, h('div.card-body', h('p', [ h('img', { - src: '/customize/images/sayhi.svg', + src: item.image, alt: '', 'aria-hidden': 'true' }), - Msg.contact_chat || 'Chat' + item.name ]) ) ) - ), - h('div', - h('a.card-small', {href : "https://fosstodon.org/@cryptpad"}, - h('div.card-body', - h('p', [ - h('img', { - src: '/customize/images/mastodon.svg', - alt: '', - 'aria-hidden': 'true' - }), - 'Mastodon' - ]) - ) - ) - ), - h('div', - h('a.card-small', {href : "https://twitter.com/cryptpad"}, - h('div.card-body', - h('p', [ - // this is not a typo. adblock plus blocks images with src *twitter* apparently - h('img', { - src: '/customize/images/twiitter.svg', - alt: '', - 'aria-hidden': 'true'}), - 'Twitter' - ]) - ) - ) - ), - h('div', - h('a.card-small', {href : "https://github.com/cryptpad/cryptpad/issues/"}, - h('div.card-body', - h('p', [ - h('img', { - src: '/customize/images/github.svg', - alt: '', - 'aria-hidden': 'true'}), - Msg.contact_bug || 'Bug report' - ]) - ) - ) - ), - h('div', - h('a.card-small', {href : "mailto:" + developerEmail}, - h('div.card-body', - h('p', [ - h('img', { - src: '/customize/images/email.svg', - alt: '', - 'aria-hidden': 'true' - }), - Msg.contact_email || 'Email' - ]) - ) - ) - ), - ]), + ) + ))), ]), Pages.infopageFooter(), ]); diff --git a/customize.dist/pages/features.js b/customize.dist/pages/features.js index 0b863b34e..c402159d7 100644 --- a/customize.dist/pages/features.js +++ b/customize.dist/pages/features.js @@ -13,9 +13,8 @@ define([ '/common/common-ui-elements.js', '/common/common-constants.js', '/common/pad-types.js', -], function ($, h, Msg, AppConfig, LocalStore, Pages, Config, UIElements, Constants, PadTypes) { - var accounts = Pages.accounts; - + '/common/extensions.js' +], function ($, h, Msg, AppConfig, LocalStore, Pages, Config, UIElements, Constants, PadTypes, Extensions) { return function () { document.title = Msg.features; Msg.features_f_apps_note = PadTypes.availableTypes.map(function (app) { @@ -25,12 +24,6 @@ define([ AppConfig.enableEarlyAccess) { return; } return Msg.type[app]; }).filter(function (x) { return x; }).join(', '); - var premiumButton = h('a', { - href: accounts.upgradeURL, - target: '_blank', - rel: 'noopener noreferrer', - class: 'cp-features-register-button', - }, Msg.features_f_subscribe); var groupItemTemplate = function (title, content) { return h('li.list-group-item', [ @@ -127,39 +120,24 @@ define([ ]), ]), ]); - var premiumFeatures = - h('div.col-12.col-sm-4.cp-premium-user',[ - h('div.card',[ - h('div.title-card',[ - h('h3.text-center',Msg.features_premium) - ]), - h('div.card-body.cp-pricing',[ - h('div.text-center', h('a', { - href: accounts.upgradeURL, - target: '_blank' - }, Msg._getKey('features_pricing', ['5', '10', '15']))), - h('div.text-center', Msg.features_emailRequired), - ]), - h('ul.list-group.list-group-flush', [ - 'reg', // Msg.features_f_reg, .features_f_reg_note - 'storage2', - 'support', // Msg.features_f_support, .features_f_support_note - 'supporter' // Msg.features_f_supporter, .features_f_supporter_note - ].map(groupItem)), - h('div.card-body',[ - h('div.cp-features-register#cp-features-subscribe', [ - premiumButton - ]), - LocalStore.isLoggedIn() ? undefined : h('div.cp-note', Msg.features_f_subscribe_note) - ]), - ]), - ]); + var availableFeatures = [ anonymousFeatures, registeredFeatures, - Pages.areSubscriptionsAllowed() ? premiumFeatures: undefined, ]; + // Msg.features_premium + // Msg.features_pricing + // Msg.features_emailRequired + // Msg.features_f_subscribe, .features_f_subscribe_note + // Msg.features_f_reg, .features_f_reg_note + // Msg.features_f_support, .features_f_support_note + // Msg.features_f_supporter, .features_f_supporter_note + Extensions.getExtensionsSync('EXTRA_PRICING').forEach(ext => { + if (!ext.getContent) { return; } + availableFeatures.push(ext.getContent(groupItem)); + }); + return h('div#cp-main', [ Pages.infopageTopbar(), h('div.container.cp-container',[ diff --git a/customize.dist/pages/index.js b/customize.dist/pages/index.js index 43e2b44d5..7cf01a82d 100644 --- a/customize.dist/pages/index.js +++ b/customize.dist/pages/index.js @@ -149,20 +149,15 @@ define([ locationBlock = h('div', h('br')); } - var subButton = function () { - if (Pages.areSubscriptionsAllowed() && !LocalStore.getPremium()) { - var sub = h('div.cp-sub-prompt', [ - h('span', Msg.home_morestorage), - h('a', {href:"/accounts/", class:'subscribe-btn'}, [ - h('i.fa.fa-ticket'), - Msg.features_f_subscribe - ]) - ]); - return sub; - } else { - return h('div'); - } - }; + let extraButtons = []; + // Messages.home_morestorage + // Messages.features_f_subscribe + Extensions.getExtensionsSync('HOMEPAGE_BUTTON').forEach(ext => { + if (!ext.getButton) { return; } + const b = ext.getButton(); + if (!b) { return; } + extraButtons.push(b); + }); let popup = h('div.cp-extensions-popups'); @@ -220,7 +215,7 @@ define([ h('i.fa.fa-hdd-o', {'aria-hidden': 'true'}), Msg.team_cat_drive ]), - subButton + extraButtons ]) ]) ]), diff --git a/customize.dist/pre-loading.js b/customize.dist/pre-loading.js index 8b737922b..5a033aa6a 100644 --- a/customize.dist/pre-loading.js +++ b/customize.dist/pre-loading.js @@ -12,7 +12,7 @@ var elem = document.createElement('div'); elem.setAttribute('id', 'placeholder'); elem.innerHTML = [ '
', - '', + '', '
', '
', '

Loading...

', diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 7b7b35986..43a3d0828 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -7,6 +7,7 @@ @import (reference) "./tools.less"; @import (reference) "./colortheme-all.less"; @import (reference) "./variables.less"; +@import (reference) "./badges.less"; .avatar_vars( @width: 30px ) { @@ -22,16 +23,21 @@ .avatar_vars(@width); --avatar-width: @avatar-width; --avatar-font-size: @avatar-font-size; + @badge-width: min(0.4*@width, 100px); + --badges-width: @badge-width; + --badges-offset: ceil(-1*@badge-width/5); + --badges-font: ceil(@badge-width*2/3); } & { .avatar_vars(); &.cp-avatar { - overflow: hidden; + overflow: visible; text-overflow: ellipsis; font-size: 16px; display: flex; align-items: center; border-radius: @variables_radius; + position: relative; .cp-avatar-default, media-tag { display: inline-flex; @@ -77,6 +83,14 @@ max-height: none; // To override 'media-tag img' in slide.less } } + .badges_include(); + & > i.cp-badge { + position: absolute; + z-index: 10; + bottom: var(--badges-offset); + right: var(--badges-offset); + border: 1px solid @cp_badges-color; + } } } diff --git a/customize.dist/src/less2/include/badges.less b/customize.dist/src/less2/include/badges.less index 6e73d4dbe..cad7eb91b 100644 --- a/customize.dist/src/less2/include/badges.less +++ b/customize.dist/src/less2/include/badges.less @@ -17,18 +17,33 @@ --badges-width: @badges-width; --badges-font: ceil(@badges-width*2/3); } +.badges_include() { + --LessLoader_require: LessLoader_currentFile(); +} + & { - .badges_vars(); i.cp-badge { width: var(--badges-width); height: var(--badges-width); - box-sizing: border-box; - border: 1px solid @cryptpad_text_col; + box-sizing: content-box; border-radius: 50%; display: inline-flex; justify-content: center; align-items: center; font-size: var(--badges-font); + color: @cp_badges-color; + background-color: @cryptpad_color_link; + z-index: 10; + &.cp-selected { + outline-offset: 3px; + outline: 2px solid @cryptpad_text_col; + } + each(@cp_badges-bg, { + &[data-badge="@{key}"] { + background-color: @value; + } + }); + } } diff --git a/customize.dist/src/less2/include/colortheme-dark.less b/customize.dist/src/less2/include/colortheme-dark.less index 609eadd88..ac04aaa25 100644 --- a/customize.dist/src/less2/include/colortheme-dark.less +++ b/customize.dist/src/less2/include/colortheme-dark.less @@ -98,6 +98,14 @@ darken(desaturate(extract(@cp_palette, 7),60%), 60%), darken(desaturate(extract(@cp_palette, 8),70%), 60%); +@cp_badges-color: @cp_app-bg; +@cp_badges-bg: { + admin: #99cfff; + moderator: #ffb8a6; + premium: #deb2ff; + error: @cryptpad_color_red,; +} + @cryptpad_color_link:@cryptpad_color_brand_300; // Premium plans colors @@ -321,6 +329,8 @@ @cp_toolbar-bottom-bg: @cryptpad_text_col; @cp_toolbar-bottom-fg: @cryptpad_color_grey_900; @cp_toolbar-logo-bg: @cryptpad_color_grey_200; +@cp_toolbar-bg2: @cryptpad_color_grey_850; +@cp_toolbar-bg3: @cryptpad_color_grey_800; @cp_toolbar-fade1: fade(@cryptpad_text_col, 10%); @cp_toolbar-fade3: fade(@cryptpad_text_col, 30%); diff --git a/customize.dist/src/less2/include/colortheme.less b/customize.dist/src/less2/include/colortheme.less index cb3b2e2dc..8c2759445 100644 --- a/customize.dist/src/less2/include/colortheme.less +++ b/customize.dist/src/less2/include/colortheme.less @@ -97,6 +97,14 @@ darken(extract(@cp_palette, 7), 50%), darken(extract(@cp_palette, 8), 50%); +@cp_badges-color: @cp_app-bg; +@cp_badges-bg: { + admin: #0087ff; + moderator: #ff6038; + premium: #b864f7; + error: @cryptpad_color_red; +} + @cryptpad_color_link: @cryptpad_color_brand; // Premium plans colors @@ -320,6 +328,10 @@ @cp_toolbar-bottom-bg: @cryptpad_color_grey_200; @cp_toolbar-bottom-fg: @cryptpad_text_col; @cp_toolbar-logo-bg: @cryptpad_color_white; +//@cp_toolbar-bg2: #e5e5e5; +//@cp_toolbar-bg3: #b2b2b2; +@cp_toolbar-bg2: @cryptpad_color_grey_200; +@cp_toolbar-bg3: @cryptpad_color_grey_300; @cp_toolbar-fade1: fade(@cryptpad_color_black, 10%); @cp_toolbar-fade3: fade(@cryptpad_color_black, 30%); diff --git a/customize.dist/src/less2/include/creation.less b/customize.dist/src/less2/include/creation.less index f61f20d90..6f2b19da0 100644 --- a/customize.dist/src/less2/include/creation.less +++ b/customize.dist/src/less2/include/creation.less @@ -33,6 +33,11 @@ .creation_vars(); #cp-creation-container { + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } + position: absolute; z-index: 100000000; // #loading * 10 top: 0px; @@ -122,6 +127,10 @@ font-size: 16px; color: inherit; } + a:focus-visible { + border-radius: 50%; + outline: @variables_focus_style; + } } } .cp-creation-early { @@ -142,11 +151,14 @@ border: none; border-radius: @variables_radius; cursor: pointer; - outline: none; text-transform: uppercase; - &:hover { + &:hover, &:focus-visible { background: contrast(@cp_creation-button-fg, lighten(@cp_creation-button-bg, 5%), darken(@cp_creation-button-bg, 5%)); } + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } } @@ -186,12 +198,13 @@ } } .cp-creation-slider { - display: block; + display: none; overflow: hidden; max-height: 0px; max-width: 0px; //margin-top: 10px; &.active { + display: block; transition: max-height 0.5s ease-in-out; max-width: none; max-height: 100px; @@ -259,13 +272,19 @@ input { width: 45px; margin: 0 5px; - padding: 0; - padding-left: 3px; - margin: 0 5px; + padding: 0 0 0 3px; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } select { - margin-right: 5px; border-radius: @variables_radius; + margin: 0.2rem; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } } &.active { @@ -286,10 +305,22 @@ input { width: 150px; padding: 0 5px; + margin: 0.2rem; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } label { flex: none; } + .cp-password-reveal { + margin:0.2rem; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } + } } } } @@ -313,9 +344,12 @@ justify-content: space-between; .cp-creation-template-more { font-size: 30px; - cursor: pointer; margin: 0 5px; text-align: center; + background-color: transparent; + border-color: transparent; + color: @cryptpad_text_col; + border-radius: @variables_radius; &:first-child { left: 5px; } @@ -328,6 +362,10 @@ &.hidden { visibility: hidden; } + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } } .cp-creation-template-container { @@ -366,6 +404,10 @@ color: var(--creation-color); } } + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } transition: all 0.1s; diff --git a/customize.dist/src/less2/include/drive.less b/customize.dist/src/less2/include/drive.less index f9982fe2b..7d7adbf65 100644 --- a/customize.dist/src/less2/include/drive.less +++ b/customize.dist/src/less2/include/drive.less @@ -138,6 +138,12 @@ display: none; } } + + #cp-app-drive-content-container { + .cp-splitter { + display: none; + } + } } } @@ -493,7 +499,7 @@ } } } - + /* CONTENT */ #cp-app-drive-content-container { display: flex; @@ -512,6 +518,13 @@ display: flex; align-items: center; justify-content: flex-end; + touch-action: none; + -ms-touch-action: none; + -webkit-touch-action: none; + user-select: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; &:hover { border-left: 1px solid @cryptpad_text_col; } diff --git a/customize.dist/src/less2/include/forms.less b/customize.dist/src/less2/include/forms.less index dedf7f74d..8d2cf791b 100644 --- a/customize.dist/src/less2/include/forms.less +++ b/customize.dist/src/less2/include/forms.less @@ -251,6 +251,21 @@ } } + &.btn-case { + text-transform: capitalize; + font-size: 16px; + } + &.btn-primary-alt { + background-color: @cryptpad_color_brand_300; + border-color: @cryptpad_color_brand_300; + color: @cryptpad_color_grey_800; + &:hover, &:not(:disabled):active, &:focus { + color: @cryptpad_color_grey_800; + border-color: @cryptpad_color_brand_300; + background-color: lighten(@cryptpad_color_brand_300, 5%); + } + } + &.btn-light { border-color: @cryptpad_text_col; color: @cryptpad_text_col; diff --git a/customize.dist/src/less2/include/help.less b/customize.dist/src/less2/include/help.less index 26d324c20..dc0c6fc26 100644 --- a/customize.dist/src/less2/include/help.less +++ b/customize.dist/src/less2/include/help.less @@ -5,6 +5,7 @@ */ @import (reference) "./colortheme-all.less"; +@import (reference) "./variables.less"; .help_main () { --LessLoader_require: LessLoader_currentFile(); @@ -15,17 +16,21 @@ position: relative; background-color: @cp_help-bg; max-height: 50%; - overflow-y: auto; &.cp-help-hidden { display: none; } .cp-help-close { + background: none; + border: none; position: absolute; color: @cryptpad_text_col; top: 5px; right: 5px; - cursor: pointer; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } .cp-help-text { color: @cp_help-fg; @@ -34,6 +39,10 @@ a { color: @cp_help-link; text-decoration: underline; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } h1 { font-size: 20px; diff --git a/customize.dist/src/less2/include/loading.less b/customize.dist/src/less2/include/loading.less index dd89dff2b..b7e5fa732 100644 --- a/customize.dist/src/less2/include/loading.less +++ b/customize.dist/src/less2/include/loading.less @@ -110,6 +110,7 @@ overflow-y: auto; a { color: @cp_loading-link; + border-radius: @variables_radius; } p:last-child { margin-bottom: 0; @@ -126,17 +127,25 @@ .cp-password-form { display: flex; flex-wrap: wrap; + gap:0.5rem; width: 100%; .cp-password-container { flex-shrink: 1; min-width: 0; } .cp-password-reveal { - padding: 0px 24px; + margin-left: 0.5rem; + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } } .cp-password-input { font-size: 16px; + &:focus-visible { + outline: @variables_focus_style; + } } .tools_placeholder-color(); } diff --git a/customize.dist/src/less2/include/markdown.less b/customize.dist/src/less2/include/markdown.less index 16e6654ed..4147dbcbd 100644 --- a/customize.dist/src/less2/include/markdown.less +++ b/customize.dist/src/less2/include/markdown.less @@ -289,3 +289,32 @@ } } +//reusable styling for the markdown toggle button across all apps +.markdown-toolbar-button-style() { + padding: 3px 5px; + height: fit-content; + margin: 0; + line-height: 1; + border-radius: @variables_radius; + display: inline-flex; + background-color: @cp_toolbar-bottom-bg; + color: @cp_toolbar-bottom-fg; + + &:hover { + background-color: fade(@cryptpad_text_col, 20%); + border-color: @cryptpad_text_col; + color: @cryptpad_text_col; + } + + &.cp-toolbar-button-active { + background-color: @cp_toolbar-bg; + border-color: @cp_toolbar-fg; + color: @cp_toolbar-fg; + + &:hover { + background-color: fade(@cryptpad_text_col, 20%); + } + } +} + + diff --git a/customize.dist/src/less2/include/messenger.less b/customize.dist/src/less2/include/messenger.less index c2f227f9e..3bf3f4409 100644 --- a/customize.dist/src/less2/include/messenger.less +++ b/customize.dist/src/less2/include/messenger.less @@ -5,6 +5,7 @@ */ @import (reference) './avatar.less'; +@import (reference) './badges.less'; @import (reference) "./colortheme-all.less"; .messenger_vars ( @@ -12,12 +13,12 @@ ) { @msg-color: @cryptpad_text_col; @msg-color-hover: contrast(@msg-color, lighten(@msg-color, 10%), darken(@msg-color, 10%)); - @msg-bg-color: @bg-color; - @invert: @bg-color; - @msg-bg-color-light: contrast(@invert, lighten(@bg-color, 5%), darken(@bg-color, 5%)); - @msg-bg-color-lighter: contrast(@invert, lighten(@bg-color, 10%), darken(@bg-color, 10%)); - @msg-bg-color-dark: fade(@cp_messenger-fg, 10%); - @msg-bg-color-darker: contrast(@bg-color, lighten(@bg-color, 10%), darken(@bg-color, 10%)); + + @msg-bg-color: @cp_app-bg; + @msg-bg-color-dark: @cp_toolbar-bg2; + @msg-bg-color-darker: @cp_toolbar-bg3; + @msg-bg-color-light: @cp_toolbar-bg2; + @msg-bg-color-lighter: @cp_toolbar-bg3; }; .messenger_main( @bg-color: @cp_messenger-bg, @@ -116,9 +117,17 @@ } } } + i.cp-badge { + color: var(--msg-bg-color-dark); + border-color: var(--msg-bg-color-dark); + } &:hover { background-color: @msg-bg-color-darker; background-color: var(--msg-bg-color-darker); + i.cp-badge { + color: var(--msg-bg-color-darker); + border-color: var(--msg-bg-color-darker); + } } &.cp-app-contacts-notify { animation: notif 2s ease-in-out infinite; @@ -163,7 +172,6 @@ } .cp-app-contacts-muted-button { margin: 10px; - border: 0; display: none; order: 3; .fa-bell-slash { @@ -192,7 +200,7 @@ } #cp-app-contacts-friendlist .cp-app-contacts-friend, #cp-app-contacts-messaging .cp-avatar { - .avatar_main(30px); + .avatar_main(35px); &.cp-avatar { display: flex; } @@ -207,7 +215,6 @@ //margin-right: 5px; flex-shrink: 0; z-index: 1; - margin: 4px; } .cp-app-contacts-status { display: inline-block; @@ -238,8 +245,12 @@ padding: 20px; } .cp-app-contacts-header { - background-color: @msg-bg-color-dark; - background-color: var(--msg-bg-color-dark); + background-color: @msg-bg-color-lighter; + background-color: var(--msg-bg-color-lighter); + i.cp-badge { + color: var(--msg-bg-color-lighter); + border-color: var(--msg-bg-color-lighter); + } padding: 0; display: flex; justify-content: space-between; @@ -256,15 +267,20 @@ } } - .cp-avatar, + .cp-avatar-container, .cp-app-contacts-right-col { flex: 1 1 auto; + text-align: center; } .cp-app-contacts-remove-history { .hover; } + .cp-avatar-container { + display: flex; + align-items: center; + } .cp-avatar { - margin: 10px; + margin: 0 10px; } .cp-app-contacts-more-history { //display: none; diff --git a/customize.dist/src/less2/include/modals-ui-elements.less b/customize.dist/src/less2/include/modals-ui-elements.less index 1880100ce..a693857c2 100644 --- a/customize.dist/src/less2/include/modals-ui-elements.less +++ b/customize.dist/src/less2/include/modals-ui-elements.less @@ -355,4 +355,19 @@ color: @cp_form-invalid; } } + + .cp-userteam-picker { + .cp-userteam-filter { + margin: 5px 0; + input { + margin-bottom: 0 !important; + } + } + .cp-usergrid-container { + label { + margin-bottom: 0; + } + } + } + } diff --git a/customize.dist/src/less2/include/toolbar.less b/customize.dist/src/less2/include/toolbar.less index b904d26d8..83bec9481 100644 --- a/customize.dist/src/less2/include/toolbar.less +++ b/customize.dist/src/less2/include/toolbar.less @@ -64,7 +64,10 @@ } .cp-markdown-toolbar { - height: @toolbar_line-height; + min-height: @toolbar_line-height; + padding: 0.1rem 0; + height: auto; + flex-wrap: wrap; background-color: @cp_toolbar-bg; color: @cp_toolbar-fg; display: none; @@ -74,7 +77,6 @@ border-radius: @variables_radius; color: @toolbar-color; .toolbar_button; - font: normal normal normal 14px/1 FontAwesome; &:hover { background-color: contrast(@cp_toolbar-bg, darken(@cp_toolbar-bg, 5%), lighten(@cp_toolbar-bg, 5%)); } @@ -85,6 +87,11 @@ button:nth-of-type(1) { margin-left: 0.3rem; } + @media screen and (max-width: @browser_media-medium-screen) { + button:nth-of-type(1) { + margin-left: 0; + } + } } .cp-toolbar-container { @@ -108,7 +115,7 @@ border: 1px solid transparent; color: inherit; font: @toolbar_button-font; - * { + *:not(i) { color: inherit; font: @toolbar_button-font; } @@ -152,8 +159,8 @@ } .cp-toolbar-userlist-drawer { font: @colortheme_app-font-size @colortheme_font; - min-width: 175px; - width: 175px; + min-width: 200px; + width: 200px; display: block; overflow-y: auto; overflow-x: hidden; @@ -203,20 +210,30 @@ flex-flow: column; margin: 10px 0; margin-bottom: 20px; + .cp-userlist-entry { + display: flex; + align-items: center; + } &>span { height: 48px; padding: 5px; margin: 2px 0; - background: @cp_toolbar-fade1; + background: @cp_toolbar-bg2; + border-radius: @variables_radius; border-right: 3px solid transparent; - .avatar_main(30px); - .cp-avatar-default, media-tag { - margin-right: 5px; + .avatar_main(35px); + i.cp-badge { + color: @cp_toolbar-bg2; + border-color: @cp_toolbar-bg2; } &.cp-userlist-clickable { cursor: pointer; &:hover { - background: @cp_toolbar-fade3; + background: @cp_toolbar-bg3; + i.cp-badge { + color: @cp_toolbar-bg3; + border-color: @cp_toolbar-bg3; + } } } .cp-toolbar-userlist-rightcol { @@ -224,6 +241,7 @@ flex: 1; overflow: hidden; text-overflow: ellipsis; + margin-left: 5px; white-space: nowrap; display: flex; flex-flow: column; @@ -398,7 +416,6 @@ .fa { font: normal normal normal 14px/1 FontAwesome; - font-family: FontAwesome; } .tools_unselectable(); diff --git a/customize.dist/src/less2/include/usergrid.less b/customize.dist/src/less2/include/usergrid.less index bfddc84a3..d6d7694a9 100644 --- a/customize.dist/src/less2/include/usergrid.less +++ b/customize.dist/src/less2/include/usergrid.less @@ -51,6 +51,14 @@ margin-right: 0px !important; } } + &:not(.radio) { + .cp-usergrid-user { + transition: order 0.5s, background-color 0.5s; + &.cp-selected { + order: -1 !important; + } + } + } .cp-usergrid-user { width: 70px; height: 70px; @@ -62,14 +70,12 @@ border-radius: @variables_radius; margin: 3px !important; cursor: default; - transition: order 0.5s, background-color 0.5s; margin-top: 1px; .tools_unselectable(); &.cp-selected { background-color: @cp_usergrid-selected-bg; color: @cp_usergrid-selected-fg; - order: -1 !important; .cp-usergrid-avatar { media-tag, .cp-avatar-default { opacity: 0.7; diff --git a/docker-compose.yml b/docker-compose.yml index 84ffc0e1b..661b7122e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,7 +5,7 @@ --- services: cryptpad: - image: "cryptpad/cryptpad:version-2025.3.0" + image: "cryptpad/cryptpad:version-2025.6.0" hostname: cryptpad environment: diff --git a/docs/example-advanced.nginx.conf b/docs/example-advanced.nginx.conf index b33c37e51..78d00d81b 100644 --- a/docs/example-advanced.nginx.conf +++ b/docs/example-advanced.nginx.conf @@ -290,5 +290,5 @@ server { } # Finally, serve anything the above exceptions don't govern. - try_files /customize/www/$uri /customize/www/$uri/index.html /www/$uri /www/$uri/index.html /customize/$uri; + try_files /customize/www/$uri /customize/www/$uri/index.html /src/$uri /www/$uri /www/$uri/index.html /src/$uri /customize/$uri; } diff --git a/funding.json b/funding.json index 58189e512..6840ae3f0 100644 --- a/funding.json +++ b/funding.json @@ -1,10 +1,5 @@ { "version": "v1.0.0", - "drips": { - "ethereum": { - "ownedBy": "0xa117114b3a22e038c1545043d610dbd4029355b1" - } - }, "entity": { "type": "organisation", "role": "owner", diff --git a/install-onlyoffice.sh b/install-onlyoffice.sh index 5a134a6a7..4931b98e9 100755 --- a/install-onlyoffice.sh +++ b/install-onlyoffice.sh @@ -27,19 +27,79 @@ main() { ask_for_license - # Remember the 1st version that is installed. This will help us install only - # needed OnlyOffice versions in a later version of this script. - set_prop oldest_needed_version v1 + # Check if 'oldest_needed_version' is already set, if not, set it to v8 + if [ -z "${PROPS['oldest_needed_version']+set}" ]; then + echo "'oldest_needed_version' is not set. Setting it to v8." + set_prop "oldest_needed_version" "v8" + else + echo "'oldest_needed_version' is already set to ${PROPS['oldest_needed_version']}. No changes made." + fi mkdir -p "$OO_DIR" - install_old_version v1 4f370beb - install_old_version v2b d9da72fd - install_old_version v4 6ebc6938 - install_old_version v5 88a356f0 - install_old_version v6 abd8a309 - install_version v7 v7.3.3.60+11 1e65be6dc87d97e82b4972f303956e5397b34d637ca80a4239c48e49ab829ee5afc8f5b1680b2fb14230d63ff872ec5f9b562bb6c3f1811316b68f8b436f7ee6 - install_version v8 v8.3.3.23+4 01abfb3e13dae2066c9fcdc9fd3a3a21cd08212feb7ee2f927d8acaa5c3e560f8ce7c78c533c6aad7048aaecc14f7445891f06cb38a1720e1637a971c0a02295 - install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1 + + available_versions=(v1 v2b v4 v5 v6 v7 v8 x2t) + + start_installing=false + for version in "${available_versions[@]}"; do + if [ "$start_installing" = true ]; then + selected_versions+=("$version") + elif [ "$version" = "${PROPS['oldest_needed_version']}" ]; then + start_installing=true + selected_versions+=("$version") + fi + done + + + for version in "${selected_versions[@]}"; do + case $version in + v1) + set_prop oldest_needed_version v1; install_old_version v1 4f370beb + # We delete 'help' from previous versions as they are useless and take up storage + rm -rf "$OO_DIR/v1/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v1/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v1/web-apps/apps/spreadsheeteditor/main/resources/help" + ;; + v2b) + install_old_version v2b d9da72fd + rm -rf "$OO_DIR/v2b/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v2b/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v2b/web-apps/apps/spreadsheeteditor/main/resources/help" + ;; + v4) + install_old_version v4 6ebc6938 + rm -rf "$OO_DIR/v4/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v4/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v4/web-apps/apps/spreadsheeteditor/main/resources/help" + ;; + v5) + install_old_version v5 88a356f0 + rm -rf "$OO_DIR/v5/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v5/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v5/web-apps/apps/spreadsheeteditor/main/resources/help" + ;; + v6) + install_old_version v6 abd8a309 + rm -rf "$OO_DIR/v6/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v6/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v6/web-apps/apps/spreadsheeteditor/main/resources/help" + ;; + v7) + install_version v7 v7.3.3.60+11 1e65be6dc87d97e82b4972f303956e5397b34d637ca80a4239c48e49ab829ee5afc8f5b1680b2fb14230d63ff872ec5f9b562bb6c3f1811316b68f8b436f7ee6 + rm -rf "$OO_DIR/v7/web-apps/apps/documenteditor/main/resources/help" + rm -rf "$OO_DIR/v7/web-apps/apps/presentationeditor/main/resources/help" + rm -rf "$OO_DIR/v7/web-apps/apps/spreadsheeteditor/main/resources/help" + rm -rf "$OO_DIR/v7/web-apps/apps/common/main/resources/help/" + # From all the older versions only v7 has 'dictionaries', we remove it for the same reasons + rm -rf "$OO_DIR/v7/dictionaries/" + ;; + v8) install_version v8 v8.3.3.23+4 01abfb3e13dae2066c9fcdc9fd3a3a21cd08212feb7ee2f927d8acaa5c3e560f8ce7c78c533c6aad7048aaecc14f7445891f06cb38a1720e1637a971c0a02295 ;; + x2t) install_x2t v7.3+1 ab0c05b0e4c81071acea83f0c6a8e75f5870c360ec4abc4af09105dd9b52264af9711ec0b7020e87095193ac9b6e20305e446f2321a541f743626a598e5318c1 ;; + *) + echo "Unknown version: $version" + exit 1 + ;; + esac + done rm -rf "$BUILDS_DIR" diff --git a/lib/challenge-commands/base.js b/lib/challenge-commands/base.js index 2e23d1dee..0af6ead56 100644 --- a/lib/challenge-commands/base.js +++ b/lib/challenge-commands/base.js @@ -86,4 +86,28 @@ removeBlock.complete = function (Env, body, cb) { Block.removeLoginBlock(Env, publicKey, reason, edPublic, cb); }; +// Get an upload cookie +// Get a cookie allowing you to upload to the blobstage of your user +const uploadCookie = Commands.UPLOAD_COOKIE = function (Env, body, cb) { + const { publicKey } = body; + + // they must provide a valid public key + if (publicKey && typeof(publicKey) === "string" + && publicKey.length === 44) { + return cb(); + } + + cb("INVALID_KEY"); +}; + +uploadCookie.complete = function (Env, body, cb) { + const { publicKey } = body; + + const safeKey = Util.escapeKeyCharacters(publicKey); + Env.blobStore.uploadCookie(safeKey, (err, cookie) => { + if (err) { return void cb(err); } + cb(void 0, {cookie}); + }); +}; + diff --git a/lib/commands/quota.js b/lib/commands/quota.js index 6fb33bee3..648d8c5d7 100644 --- a/lib/commands/quota.js +++ b/lib/commands/quota.js @@ -196,7 +196,6 @@ Quota.shouldContactServer = function (Env) { ( typeof(Env.blockDailyCheck) === 'undefined' && Env.adminEmail === false - && Env.allowSubscriptions === false ) ); }; @@ -225,22 +224,23 @@ var queryQuotaServer = function (Env, cb) { } }; + const accountsOrigin = Env.accounts_api; var H = Https; - if (typeof(Env.accounts_api) === 'string') { + if (typeof(accountsOrigin) === 'string') { try { - let url = new URL(Env.accounts_api); + let url = new URL(accountsOrigin); if (!['https:', 'http:'].includes(url.protocol)) { throw new Error("INVALID_PROTOCOL"); } if (url.protocol === 'http:') { H = Http; } let port = Number(url.port); if (port && typeof(port) === 'number') { options.port = port; } options.host = url.hostname; Env.Log.info("USING_CUSTOM_ACCOUNTS_API", { - value: Env.accounts_api, + value: accountsOrigin, }); } catch (err) { Env.Log.error("INVALID_CUSTOM_QUOTA_API", { error: err.message, - value: Env.accounts_api, + value: accountsOrigin, }); } } @@ -282,9 +282,11 @@ Quota.queryQuotaServer = function (Env, cb) { Quota.updateCachedLimits = function (Env, _cb) { var cb = Util.mkAsync(_cb); - Quota.applyCustomLimits(Env); - if (!Env.allowSubscriptions || !Env.accounts_api) { return void cb(); } + if (!Env.accounts_api) { + Quota.applyCustomLimits(Env); + return void cb(); + } Quota.queryQuotaServer(Env, function (err, json) { if (err) { return void cb(err); } if (!json) { return void cb(); } diff --git a/lib/commands/upload.js b/lib/commands/upload.js index 999f003f0..8a85d1177 100644 --- a/lib/commands/upload.js +++ b/lib/commands/upload.js @@ -75,7 +75,7 @@ Upload.status = function (Env, safeKey, filesize, _cb) { // FIXME FILES }; Upload.upload = function (Env, safeKey, chunk, cb) { - Env.blobStore.upload(safeKey, chunk, cb); + Env.blobStore.uploadWs(safeKey, chunk, cb); }; Upload.cancel = function (Env, safeKey, arg, cb) { diff --git a/lib/common-hash.js b/lib/common-hash.js index 7a3beddab..20dec3f80 100644 --- a/lib/common-hash.js +++ b/lib/common-hash.js @@ -2,5 +2,5 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -module.exports = require("../www/common/common-hash"); +module.exports = require("../src/common/common-hash"); diff --git a/lib/common-util.js b/lib/common-util.js index 400d8472d..497e25b28 100644 --- a/lib/common-util.js +++ b/lib/common-util.js @@ -2,4 +2,4 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -module.exports = require("../www/common/common-util"); +module.exports = require("../src/common/common-util"); diff --git a/lib/env.js b/lib/env.js index 737355ede..2c7f18c1a 100644 --- a/lib/env.js +++ b/lib/env.js @@ -103,7 +103,7 @@ module.exports.create = function (config) { httpSafePort: httpSafePort, websocketPort: config.websocketPort, - accounts_api: config.accounts_api || undefined, // this simplifies integration with an accounts page + accounts_api: config.accounts_api, shouldUpdateNode: !isRecentVersion(), @@ -212,7 +212,6 @@ module.exports.create = function (config) { See also the cached 'restrictRegistration' value in server.js#serveConfig */ restrictRegistration: false, - allowSubscriptions: config.allowSubscriptions === true, blockDailyCheck: config.blockDailyCheck === true, consentToContact: false, @@ -225,8 +224,6 @@ module.exports.create = function (config) { instanceJurisdiction: {}, instanceNotice: {}, - myDomain: config.myDomain, - mySubdomain: config.mySubdomain, // only exists for the accounts integration customLimits: {}, // FIXME this attribute isn't in the default conf // but it is referenced in Quota @@ -259,6 +256,14 @@ module.exports.create = function (config) { selfDestructTo: {}, }; + Object.keys(plugins || {}).forEach(name => { + let plugin = plugins[name]; + if (!plugin.customizeEnv) { return; } + try { plugin.customizeEnv(Env); } + catch (e) {} + }); + + (function () { var max = config.maxWorkers; // if the supplied value is not a positive number, leave maxWorkers undefined diff --git a/lib/http-commands.js b/lib/http-commands.js index 4f05da9ae..2d2ad7436 100644 --- a/lib/http-commands.js +++ b/lib/http-commands.js @@ -69,6 +69,7 @@ const NOAUTH = require("./challenge-commands/base.js"); COMMANDS.MFA_CHECK = NOAUTH.MFA_CHECK; COMMANDS.WRITE_BLOCK = NOAUTH.WRITE_BLOCK; // Account creation + password change COMMANDS.REMOVE_BLOCK = NOAUTH.REMOVE_BLOCK; +COMMANDS.UPLOAD_COOKIE = NOAUTH.UPLOAD_COOKIE; const TOTP = require("./challenge-commands/totp.js"); COMMANDS.TOTP_SETUP = TOTP.TOTP_SETUP; diff --git a/lib/http-worker.js b/lib/http-worker.js index 90b399f16..6a46c2a57 100644 --- a/lib/http-worker.js +++ b/lib/http-worker.js @@ -19,6 +19,7 @@ const BlobStore = require("./storage/blob"); const BlockStore = require("./storage/block"); const plugins = require("./plugin-manager"); const gzipStatic = require('connect-gzip-static'); +const CPCrypto = require('./crypto'); const DEFAULT_QUERY_TIMEOUT = 5000; const PID = process.pid; @@ -26,6 +27,8 @@ const PID = process.pid; let SSOUtils = plugins.SSO && plugins.SSO.utils; var Env = JSON.parse(process.env.Env); +let blobStore; +let cpcrypto; Env.plugins = plugins; const response = Util.response(function (errLabel, info) { if (!Env.Log) { return; } @@ -70,6 +73,7 @@ const EVENTS = {}; EVENTS.ENV_UPDATE = function (data /*, cb */) { try { Env = JSON.parse(data); + Env.blobStore = blobStore; Env.Log = Log; Env.plugins = plugins; Env.sendMessage = sendMessage; @@ -263,7 +267,6 @@ app.use('/ssoauth', (req, res, next) => { next(); }); - app.use('/blob', function (req, res, next) { /* Head requests are used to check the size of a blob. Clients can configure a maximum size to download automatically, @@ -340,6 +343,8 @@ Object.keys(plugins || {}).forEach(name => { app.use(Express.static(Path.resolve('./customize/www'))); app.use(gzipStatic(Path.resolve('./www'))); +app.use("/common", Express.static('./src/common')); + var mainPages = Env.mainPages || Default.mainPages(); var mainPagePattern = new RegExp('^\/(' + mainPages.join('|') + ').html$'); app.get(mainPagePattern, Express.static('./customize')); @@ -609,7 +614,7 @@ var serveConfig = makeRouteCache(function () { urlArgs: 'ver=' + Env.version + cacheString(), }, removeDonateButton: (Env.removeDonateButton === true), - allowSubscriptions: (Env.allowSubscriptions === true), + accounts_api: Env.accounts_api, websocketPath: Env.websocketPath, httpUnsafeOrigin: Env.httpUnsafeOrigin, adminEmail: Env.adminEmail, @@ -629,7 +634,6 @@ var serveConfig = makeRouteCache(function () { fileHost: Env.fileHost, shouldUpdateNode: Env.shouldUpdateNode || undefined, listMyInstance: Env.listMyInstance, - accounts_api: Env.accounts_api, sso: ssoCfg, enforceMFA: Env.enforceMFA, onlyOffice: Env.onlyOffice @@ -772,6 +776,51 @@ app.get('/api/logo', function (req, res) { }); }); +app.post('/upload-blob', Express.json({limit:"500kb"}), (req, res) => { + const { chunk, sig, edPublic } = req.body; + if (!cpcrypto) { + return void res.status(500).send({error: 'NOCRYPTO'}); + } + + const forbidden = reason => { + return void res.status(403).send({error: reason}); + }; + + try { + // Check signature + const sigu8 = Util.decodeBase64(sig); + const vkey = Util.decodeBase64(edPublic); + const ok = cpcrypto.open(sigu8, vkey); + if (!ok) { return forbidden('INVALID_KEY'); } + const cookie = Util.encodeUTF8(sigu8.subarray(64)); + // Check cookie + const safeKey = Util.escapeKeyCharacters(edPublic); + Env.blobStore.checkUploadCookie(safeKey, value => { + if (value !== cookie) { + return forbidden('INVALID_COOKIE'); + } + // Upload chunk + Env.blobStore.upload(safeKey, chunk, (err) => { + if (err) { + return res.status(500).send({error: err}); + } + // Get new cookie + Env.blobStore.uploadCookie(safeKey, (err, _c) => { + if (err) { + return res.status(500).send({error: err}); + } + res.status(200).send({ + cookie: _c + }); + }); + }); + }); + + } catch (e) { + return void res.status(500).send({error: e.message}); + } +}); + // This endpoint handles authenticated RPCs over HTTP // via an interactive challenge-response protocol app.use(Express.json()); @@ -779,6 +828,7 @@ app.post('/api/auth', function (req, res, next) { AuthCommands.handle(Env, req, res, next); }); + app.use(function (req, res /*, next */) { if (/^(\/favicon\.ico\/|.*\.js\.map|.*\/translations\/.*\.json)/.test(req.url)) { // ignore common 404s @@ -822,7 +872,10 @@ nThen(function (w) { getSession: function () {}, }, w(function (err, blob) { if (err) { return; } - Env.blobStore = blob; + Env.blobStore = blobStore = blob; + })); + CPCrypto.init(w(function (err, crypto) { + cpcrypto = crypto; })); }).nThen(function () { // TODO inform the parent process that this worker is ready diff --git a/lib/keys.js b/lib/keys.js index 7d5a63934..bb454db98 100644 --- a/lib/keys.js +++ b/lib/keys.js @@ -2,4 +2,4 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -module.exports = require("../www/common/common-signing-keys"); +module.exports = require("../src/common/common-signing-keys"); diff --git a/lib/stats.js b/lib/stats.js index c2e148977..4a4fab916 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -14,8 +14,8 @@ Stats.instanceData = function (Env) { version: Env.version, installMethod: Env.installMethod, - domain: Env.myDomain, - subdomain: Env.mySubdomain, + domain: Env.accounts_domain, + subdomain: Env.accounts_subdomain, httpUnsafeOrigin: Env.httpUnsafeOrigin, httpSafeOrigin: Env.httpSafeOrigin, diff --git a/lib/storage/blob.js b/lib/storage/blob.js index eec755b22..3fda70217 100644 --- a/lib/storage/blob.js +++ b/lib/storage/blob.js @@ -10,6 +10,8 @@ var BlobStore = module.exports; var nThen = require("nthen"); var Semaphore = require("saferphore"); var Util = require("../common-util"); +const Crypto = require('crypto'); + const PERMISSIVE = 511; const readFileBin = require("../stream-file").readFileBin; @@ -270,15 +272,17 @@ var readBlobMetadata = function (env, blobId, handler, _cb) { /********** METHODS **************/ -var upload = function (Env, safeKey, content, cb) { +var uploadWs = function (Env, safeKey, content, cb) { var dec; try { dec = Buffer.from(content, 'base64'); } catch (e) { return void cb('DECODE_BUFFER'); } + var len = dec.length; var session = Env.getSession(safeKey); + /* if (typeof(session.currentUploadSize) !== 'number' || typeof(session.pendingUploadSize) !== 'number') { // improperly initialized... maybe they didn't check before uploading? @@ -289,6 +293,7 @@ var upload = function (Env, safeKey, content, cb) { if (session.currentUploadSize > session.pendingUploadSize) { return cb('E_OVER_LIMIT'); } + */ var stagePath = makeStagePath(Env, safeKey); @@ -300,15 +305,50 @@ var upload = function (Env, safeKey, content, cb) { blobstage.write(dec); session.currentUploadSize += len; cb(void 0, dec.length); - //Env.incrementBytesWritten(len); }); } else { session.blobstage.write(dec); session.currentUploadSize += len; cb(void 0, dec.length); - //Env.incrementBytesWritten(len); } }; +var upload = function (Env, safeKey, content, cb) { + var dec; + + try { dec = Buffer.from(content, 'base64'); } + catch (e) { return void cb('DECODE_BUFFER'); } + + var path = makeStagePath(Env, safeKey); + Fs.appendFile(path, dec, cb); +}; +const getRandomCookie = function () { + return Crypto.randomBytes(16).toString('hex'); +}; +var uploadCookie = function (Env, safeKey, cb) { + var stagePath = makeStagePath(Env, safeKey); + var cookiePath = stagePath + '.cookie'; + const cookie = getRandomCookie(); + + Fse.mkdirp(Path.dirname(cookiePath), PERMISSIVE, function (err) { + if (err && err.code !== 'EEXIST') { return void cb(err); } + Fs.writeFile(cookiePath, cookie, err => { + cb(err, cookie); + }); + }); +}; +var checkUploadCookie = function (Env, safeKey, cb) { + var stagePath = makeStagePath(Env, safeKey); + var cookiePath = stagePath + '.cookie'; + + Fs.readFile(cookiePath, function (err, content) { + if (err) { return void cb(); } + let expireTime = +new Date() - (5*60*1000); + Fs.stat(cookiePath, function (err, stats) { + if (stats.mtime < expireTime) { return void cb(); } + cb(content.toString('utf8')); + }); + }); +}; var closeBlobstage = function (Env, safeKey) { var session = Env.getSession(safeKey); @@ -370,6 +410,10 @@ var upload_complete = function (Env, safeKey, id, cb) { // FIXME we could just move and handle the EEXISTS instead of the above block Fse.move(oldPath, newPath, function (e) { if (e) { return void cb('RENAME_ERR'); } + + // clear upload cookie + Fs.unlink(oldPath+'.cookie', function () {}); + cb(void 0, id); }); }); @@ -448,6 +492,9 @@ var owned_upload_complete = function (Env, safeKey, id, cb) { // otherwise it worked... })); }).nThen(function () { + // clear upload cookie + Fs.unlink(oldPath+'.cookie', function () {}); + // clean up their session when you're done // call back with the blob id... cb(void 0, id); @@ -734,11 +781,26 @@ BlobStore.create = function (config, _cb) { if (!isValidSafeKey(safeKey)) { return void cb('INVALID_SAFEKEY'); } isFile(makeStagePath(Env, safeKey), cb); }, + uploadWs: function (safeKey, content, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); + if (!isValidSafeKey(safeKey)) { return void cb('INVALID_SAFEKEY'); } + uploadWs(Env, safeKey, content, Util.once(Util.mkAsync(cb))); + }, upload: function (safeKey, content, _cb) { var cb = Util.once(Util.mkAsync(_cb)); if (!isValidSafeKey(safeKey)) { return void cb('INVALID_SAFEKEY'); } upload(Env, safeKey, content, Util.once(Util.mkAsync(cb))); }, + uploadCookie: function (safeKey, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); + if (!isValidSafeKey(safeKey)) { return void cb('INVALID_SAFEKEY'); } + uploadCookie(Env, safeKey, Util.once(Util.mkAsync(cb))); + }, + checkUploadCookie: function (safeKey, _cb) { + var cb = Util.once(Util.mkAsync(_cb)); + if (!isValidSafeKey(safeKey)) { return void cb('INVALID_SAFEKEY'); } + checkUploadCookie(Env, safeKey, Util.once(Util.mkAsync(cb))); + }, cancel: function (safeKey, fileSize, _cb) { var cb = Util.once(Util.mkAsync(_cb)); diff --git a/move-merge-src.js b/move-merge-src.js deleted file mode 100644 index 7ed5bd88f..000000000 --- a/move-merge-src.js +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-FileCopyrightText: 2025 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -// Move file from "src" to "www" -// This script can be used to copy src files into their old location in order to -// merge code more easily. -// Set REVERSE to true to copy from "www" to "src" once the changes have been merged. - -const REVERSE = false; -const Fs = require('node:fs'); -const map = { - './src/worker/components/roster.js': './www/common/outer/roster.js', - './src/worker/components/sharedfolder.js': './www/common/outer/sharedfolder.js', - - - - './src/common/cache-store.js': './www/common/outer/cache-store.js', - './src/common/common-constants.js': './www/common/common-constants.js', - './src/common/common-credential.js': './www/common/common-credential.js', - './src/common/common-feedback.js': './www/common/common-feedback.js', - './src/common/common-hash.js': './www/common/common-hash.js', - './src/common/common-realtime.js': './www/common/common-realtime.js', - './src/common/common-signing-keys.js': './www/common/common-signing-keys.js', - './src/common/common-util.js': './www/common/common-util.js', - './src/common/cryptget.js': './www/common/cryptget.js', - './src/common/http-command.js': './www/common/outer/http-command.js', - './src/common/login-block.js': './www/common/outer/login-block.js', - './src/common/network-config.js': './www/common/outer/network-config.js', - './src/common/notify.js': './www/common/notify.js', - './src/common/onlyoffice/current-version.js': './www/common/onlyoffice/current-version.js', - './src/common/pad-types.js': './www/common/pad-types.js', - './src/common/pinpad.js': './www/common/pinpad.js', - './src/common/proxy-manager.js': './www/common/proxy-manager.js', - './src/common/recurrence.js': './www/calendar/recurrence.js', - './src/common/rpc.js': './www/common/rpc.js', - './src/common/user-object.js': './www/common/user-object.js', - './src/common/user-object-setter.js': './www/common/user-object-setter.js', - './src/common/worker-channel.js': './www/common/outer/worker-channel.js' -}; - -Object.keys(map).forEach(newPath => { - let oldPath = map[newPath]; - if (!Fs.existsSync(newPath)) { - throw new Error("File path mismatch: " + newPath); - } - if (!Fs.existsSync(oldPath)) { - throw new Error("File path mismatch: " + oldPath); - } - const from = REVERSE ? oldPath : newPath; - const to = REVERSE ? newPath : oldPath; - Fs.cpSync(from, to); -}); diff --git a/package-lock.json b/package-lock.json index 78f9d40b1..f256af770 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,127 +84,35 @@ "url": "https://opencollective.com/cryptpad" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@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.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "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==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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/@babel/highlight/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==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz", - "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, "funding": [ { @@ -216,17 +124,18 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz", - "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", "dev": true, "funding": [ { @@ -238,14 +147,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz", - "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", "dev": true, "funding": [ { @@ -257,18 +167,19 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, "node_modules/@csstools/selector-specificity": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz", - "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true, "funding": [ { @@ -280,11 +191,12 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": ">=18" }, "peerDependencies": { - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^7.0.0" } }, "node_modules/@dual-bundle/import-meta-resolve": { @@ -292,42 +204,62 @@ "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", + "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -335,43 +267,35 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/@eslint/config-helpers": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", + "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/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/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -390,64 +314,62 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@eslint/eslintrc/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/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", + "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", + "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", "dev": true, + "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.15.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", + "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -457,6 +379,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -470,6 +393,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -483,6 +407,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -492,10 +417,11 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -505,10 +431,11 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -523,6 +450,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -532,6 +460,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -541,6 +470,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -550,33 +480,48 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", + "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, "node_modules/@mcrowe/minibloom": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@mcrowe/minibloom/-/minibloom-0.2.0.tgz", - "integrity": "sha512-hce9MTbEkVIutibAkXAQddXCU9gMP/3OfcRaNo2V0v485iEzBRlniJG0ZTKumL8RbUA/fhpIGvrURiEZc+Crrg==" + "integrity": "sha512-hce9MTbEkVIutibAkXAQddXCU9gMP/3OfcRaNo2V0v485iEzBRlniJG0ZTKumL8RbUA/fhpIGvrURiEZc+Crrg==", + "license": "ISC" }, "node_modules/@mdn/browser-compat-data": { - "version": "5.6.21", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.6.21.tgz", - "integrity": "sha512-yFGyNC6llnRbCELh1vH5mhrdSkQCrBs+wOyFjcYa3E9K3qzz6aDKnUSlDfWx+7pMeVr/iSKIdl1P60g2Jxs5sg==", - "dev": true + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz", + "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/@node-saml/node-saml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@node-saml/node-saml/-/node-saml-4.0.5.tgz", "integrity": "sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==", + "license": "MIT", "dependencies": { "@types/debug": "^4.1.7", "@types/passport": "^1.0.11", @@ -594,32 +539,12 @@ "node": ">= 14" } }, - "node_modules/@node-saml/node-saml/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@node-saml/node-saml/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==" - }, "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, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -628,11 +553,12 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -642,6 +568,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -651,18 +578,19 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.0.tgz", - "integrity": "sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==", + "version": "28.0.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.6.tgz", + "integrity": "sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "fdir": "^6.1.1", + "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" @@ -676,23 +604,12 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, @@ -709,10 +626,11 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -732,28 +650,12 @@ } } }, - "node_modules/@rollup/plugin-node-resolve/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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@rollup/plugin-terser": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, + "license": "MIT", "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", @@ -772,10 +674,11 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.0.tgz", - "integrity": "sha512-Kzs8KGJofe7cfTRODsnG1jNGxSvU8gVoNNd7Z/QaY25AYwe2LSSUpx/kPxqF38NYkpR8de3m51r9uwJpDlz6dg==", + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.3.tgz", + "integrity": "sha512-gAx0AYwkyjqOw4JrZV34N/abvAobLhczyLkZ7FVL2UXPrO4zv8oqTfYT3DLBRan1EXasp4SUuEJXqPTk0gnJzw==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -797,32 +700,16 @@ } } }, - "node_modules/@rollup/plugin-typescript/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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", - "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -836,272 +723,337 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", + "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", + "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", + "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", + "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", + "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", + "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", + "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", + "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", + "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", + "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", + "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", + "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", + "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", + "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", + "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", + "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", + "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", + "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", + "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", + "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz", - "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", + "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.38", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.38.tgz", - "integrity": "sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -1110,14 +1062,16 @@ } }, "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.15", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", - "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1126,90 +1080,103 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mime": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.33", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.33.tgz", - "integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~7.8.0" } }, "node_modules/@types/passport": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", - "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==" + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" }, "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", - "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/xml-crypto": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/xml-crypto/-/xml-crypto-1.4.3.tgz", - "integrity": "sha512-pnvKYb7vUsUIMc+C6JM/j779YWQgOMcwjnqHJ9cdaWXwWEBE1hAqthzeszRx62V5RWMvS+XS9w9tXMOYyUc8zg==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/xml-crypto/-/xml-crypto-1.4.6.tgz", + "integrity": "sha512-A6jEW2FxLZo1CXsRWnZHUX2wzR3uDju2Bozt6rDbSmU/W8gkilaVbwFEVN0/NhnUdMVzwYobWtM6bU1QJJFb7Q==", + "license": "MIT", "dependencies": { "@types/node": "*", "xpath": "0.0.27" } }, "node_modules/@types/xml-encryption": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/xml-encryption/-/xml-encryption-1.2.2.tgz", - "integrity": "sha512-UeuYOqW3ZzUQfwb/mb3GNZ2/DlVdh5mjJNmB/yFXgQr8/pwlVJ9I2w+AHPfRDzLshe7YpgUB4T1//qgbk6U87Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/xml-encryption/-/xml-encryption-1.2.4.tgz", + "integrity": "sha512-I69K/WW1Dv7j6O3jh13z0X8sLWJRXbu5xnHDl9yHzUNDUBtUoBY058eb5s+x/WG6yZC1h8aKdI2EoyEPjyEh+Q==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/xml2js": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.12.tgz", - "integrity": "sha512-CZPpQKBZ8db66EP5hCjwvYrLThgZvnyZrPXK2W+UI1oOaWezGt34iOaUCX4Jah2X8+rQqjvl9VKEIT8TR1I0rA==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -1218,6 +1185,7 @@ "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -1226,6 +1194,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -1234,10 +1203,33 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1245,11 +1237,22 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1264,7 +1267,8 @@ "node_modules/alertify.js": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/alertify.js/-/alertify.js-1.0.11.tgz", - "integrity": "sha512-sNnALmmoiEO6cGI2nCCxSaHDFPUW6SkvDGuf4yW83Xog07LvDJtyvPtIBemOJ+EqqtxmPDreqzVvkqKAXkHLcA==" + "integrity": "sha512-sNnALmmoiEO6cGI2nCCxSaHDFPUW6SkvDGuf4yW83Xog07LvDJtyvPtIBemOJ+EqqtxmPDreqzVvkqKAXkHLcA==", + "license": "MIT" }, "node_modules/amd-resolve": { "version": "0.1.1", @@ -1278,6 +1282,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/amdetective/-/amdetective-0.0.1.tgz", "integrity": "sha512-z8+f9qhA7k3GTHUPbWOnOQyUaUBzgsI6EspAEQ0Iow/89pGCPPPnYjIe2JKH0ZMCJVkXqx8OT2d2js1ABuYCqg==", + "license": "BSD", "dependencies": { "esprima": "~1.0.4" } @@ -1286,6 +1291,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", "integrity": "sha512-tp8M/NCmSr6/skdteeo9UgJ2G1rG88X3ZVNZWXUxFw4Wh0PAGaAAWQS61sfBt/1QNcwMTY3EBKOMPujwioJLaw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1297,6 +1303,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", "integrity": "sha512-R8JmX2Xv3+ichUQE99oL+LvjsyK+CDWo/BtVb4QUz3hOfmf2bdEmiDot3fQcpn2WAHW3toSRdjSLm6bgtWRDlA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1308,6 +1315,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", "integrity": "sha512-6SByK9q2H978bmqzuzA5NPT1lRDXl3ODLz/DjC4URO5f/HqK7dnRKfoO/xQLx/makOz7zWIbRf6+Uf7bmaPSkQ==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1319,6 +1327,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", "integrity": "sha512-8TRtOKmIPOuxjpklrkhUbqD2NnVb4WZQuIjXrT+TGKFKzl7NrL7wuNvEap3leMt2kQaCngIN1ZzazSbJNzF+Aw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1330,6 +1339,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", "integrity": "sha512-UZYhobiGAlV4NiwOlKAKbkCyxOl1PPZNvdIdl/Ce5by45vwiyNdBetwHk/AjIpo1Ji9z+eE29PUBAjjfVmz5SA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1341,6 +1351,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", "integrity": "sha512-BpPHMnYmRBhcjY5knRWKjQmPDPvYU7wrgBSW34xj7JCH9+a/SEIV7+oSYVOgMFopRIadOz9Qm4zIy+mEBvUOPA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1352,6 +1363,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", "integrity": "sha512-KIF19t+HOYOorUnHTOhZpeZ3bJsjzStBG2hSGM0WZ8YQQe4c7lj9CtwnucscJDPrNwfdz6GBF+pFkVfvHBq6uw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1363,6 +1375,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", "integrity": "sha512-WyRoOFSIvOeM7e7YdlSjfAV82Z6K1+VUVbygIQ7C/VGzWYuO/d30F0PG7oXeo4uSvSywR0ozixDQvtXJEorq4Q==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1374,6 +1387,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", "integrity": "sha512-hl7re02lWus7lFOUG6zexhoF5gssAfG5whyr/fOWK9hxNjUFLTjhbU/b4UHWOh2dbJu9/STSUv+80uWYzYkbTQ==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1385,6 +1399,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", "integrity": "sha512-8Um59dYNDdQyoczlf49RgWLzYgC2H/28W3JAIyOAU/+WkMcfZmaznm+0i1ikrE0jME6Ypk9CJ9CY2+vxbPs7Fg==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1396,6 +1411,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", "integrity": "sha512-wWKwcViX1E28U6FohtWOP4sHFyArELHJ2p7+3BzbibqJiuISeskq6t7JnrLisUngMF5zMhgmXVw8Equjzz9OlA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1407,6 +1423,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", "integrity": "sha512-ScRNUT0TovnYw6+Xo3iKh6G+VXDw2Ds7ZRnMIuKBgHY02DgvT2T2K22/tc/916Fi0W/5Z1RzDaHQwnp75hqdbA==", + "license": "MIT", "dependencies": { "ansi-bgblack": "^0.1.1", "ansi-bgblue": "^0.1.1", @@ -1444,6 +1461,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1455,6 +1473,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", "integrity": "sha512-zAfb1fokXsq4BoZBkL0eK+6MfFctbzX3R4UMcoWrL1n2WHewFKentTvOZv2P11u6P4NtW/V47hVjaN7fJiefOg==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1466,6 +1485,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1477,6 +1497,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", "integrity": "sha512-WJ70OI4jCaMy52vGa/ypFSKFb/TrYNPaQ2xco5nUwE0C5H8piume/uAZNNdXXiMQ6DbRmiE7l8oNBHu05ZKkrw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1488,6 +1509,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", "integrity": "sha512-+J1nM4lC+whSvf3T4jsp1KR+C63lypb+VkkwtLQMc1Dlt+nOvdZpFT0wwFTYoSlSwCcLUAaOpHF6kPkYpSa24A==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1499,6 +1521,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", "integrity": "sha512-8gB1bo9ym9qZ/Obvrse1flRsfp2RE+40B23DhQcKxY+GSeaOJblLnzBOxzvmLTWbi5jNON3as7wd9rC0fNK73Q==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1510,6 +1533,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", "integrity": "sha512-Kq8Z0dBRhQhDMN/Rso1Nu9niwiTsRkJncfJZXiyj7ApbfJrGrrubHXqXI37feJZkYcIx6SlTBdNCeK0OQ6X6ag==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1521,6 +1545,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", "integrity": "sha512-jreCxifSAqbaBvcibeQxcwhQDbEj7gF69XnpA6x83qbECEBaRBD1epqskrmov1z4B+zzQuEdwbWxgzvhKa+PkA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1532,6 +1557,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", "integrity": "sha512-A1Giu+HRwyWuiXKyXPw2AhG1yWZjNHWO+5mpt+P+VWYkmGRpLPry0O5gmlJQEvpjNpl4RjFV7DJQ4iozWOmkbQ==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1543,6 +1569,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1554,6 +1581,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", "engines": { "node": ">=4" } @@ -1562,6 +1590,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", "integrity": "sha512-n+D0qD3B+h/lP0dSwXX1SZMoXufdUVotLMwUuvXa50LtBAh3f+WV8b5nFMfLL/hgoPBUt+rG/pqqzF8krlZKcw==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1573,6 +1602,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", "integrity": "sha512-gWkLPDvHH2pC9YEKqp8dIl0mg3sRglMPvioqGDIOXiwxjxUwIJ1gF86E2o4R5yLNh8IAkwHbaMtASkJfkQ2hIA==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1585,6 +1615,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1599,6 +1630,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", "integrity": "sha512-D+Bzwio/0/a0Fu5vJzrIT6bFk43TW46vXfSvzysOTEHcXOAUJTVMHWDbELIzGU4AVxVw2rCTb7YyWS4my2cSKQ==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1610,6 +1642,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", "integrity": "sha512-DJHaF2SRzBb9wZBgqIJNjjTa7JUJTO98sHeTS1sDopyKKRopL1KpaJ20R6W2f/ZGras8bYyIZDtNwYOVXNgNFg==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1621,6 +1654,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1629,6 +1663,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", "integrity": "sha512-6E3D4BQLXHLl3c/NwirWVZ+BCkMq2qsYxdeAGGOijKrx09FaqU+HktFL6QwAwNvgJiMLnv6AQ2C1gFZx0h1CBg==", + "license": "MIT", "dependencies": { "ansi-wrap": "0.1.0" }, @@ -1640,12 +1675,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1654,6 +1691,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/arr-swap/-/arr-swap-1.0.1.tgz", "integrity": "sha512-SxBKd/By8+AaREcv/ZhFqmapfpqK4kyaQkUHwmJjlczI5ZtuuT5gofKHlCrSJ4oR7zXezFhv+7zsnLEdg9uGgQ==", + "license": "MIT", "dependencies": { "is-number": "^3.0.0" }, @@ -1665,6 +1703,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -1676,6 +1715,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -1686,15 +1726,27 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/ast-metadata-inferer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.0.tgz", - "integrity": "sha512-jOMKcHht9LxYIEQu+RVd22vtgrPaVCtDRQ/16IGmurdzxvYbDd5ynxjnyrzLnieG96eTcAyaoj/wN/4/1FyyeA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz", + "integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==", "dev": true, + "license": "MIT", "dependencies": { - "@mdn/browser-compat-data": "^5.2.34" + "@mdn/browser-compat-data": "^5.6.19" } }, "node_modules/astral-regex": { @@ -1702,6 +1754,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1709,25 +1762,50 @@ "node_modules/atoa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/atoa/-/atoa-1.0.0.tgz", - "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==" + "integrity": "sha512-VVE1H6cc4ai+ZXo/CRWoJiHXrA1qfA31DPnx6D20+kSI547hQN5Greh51LQ1baMRMfxO5K5M4ImMtZbZt2DODQ==", + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -1747,6 +1825,21 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/bootstrap": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", @@ -1761,6 +1854,7 @@ "url": "https://opencollective.com/bootstrap" } ], + "license": "MIT", "peerDependencies": { "jquery": "1.9.1 - 3", "popper.js": "^1.16.1" @@ -1775,9 +1869,10 @@ } }, "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==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1787,6 +1882,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1798,14 +1894,21 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.2.4.tgz", "integrity": "sha512-z8CRZZEv/MVAuJ9u9/LwzAcGswFtWbdAHh8f8ZkHgThUb88rBZbpwoxYZaQnmbAxvCoOA1gFIONrspStOhldkg==", + "license": "MIT", "dependencies": { "resolve": "0.6.3" } }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "license": "MIT" + }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -1821,11 +1924,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -1834,35 +1938,95 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/cacheable": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", + "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.8.2", + "keyv": "^5.3.3" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", + "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.3" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -1871,10 +2035,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001686", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz", - "integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "dev": true, "funding": [ { @@ -1889,12 +2063,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chainpad": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/chainpad/-/chainpad-5.2.7.tgz", - "integrity": "sha512-5+cf06B4mpHcfbDFGPwg6iqQypYgRhQjb+jqRxFIHFYNJtNvBLrInqlVY9HRhQyIbj/IxNSy2rE0gHfFuh7Tvw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chainpad/-/chainpad-5.3.0.tgz", + "integrity": "sha512-S8ctJfd3XqRW6t7GsNcN6ldXmXfIlbFLqA6mukSPhXWo0DueiOF1bT3lAHIvJEwkI9ax5adJmpA50GfW95YKBA==", + "license": "LGPL-2.1", "dependencies": { "fast-diff": "^1.1.2", "gluejs": "~2.4.0", @@ -1927,6 +2103,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/json.sortify/-/json.sortify-2.1.0.tgz", "integrity": "sha512-otSldRQcu9PaQJJDeB1qGZUIoL7C4nxZunUVHieWPUMJvvVxIUhsMQUhR+r4OUZBwA1McnbS7sqDf5dYHzJsbw==", + "license": "Apache-2.0", "engines": { "node": ">=0.10.0" } @@ -1952,6 +2129,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1967,6 +2145,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/choices-separator/-/choices-separator-2.0.0.tgz", "integrity": "sha512-BCKlzRcP2V6X+85TSKn09oGZkO2zK2zytGyZeHvM2s+kv/ydAzJtsc+rZqYRWNlojIBfkOnPxgKXrBefTFZbTQ==", + "license": "MIT", "dependencies": { "ansi-dim": "^0.1.1", "debug": "^2.6.6", @@ -1976,16 +2155,33 @@ "node": ">=0.10.0" } }, + "node_modules/choices-separator/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/choices-separator/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/ckeditor": { "name": "ckeditor4", "version": "4.22.1", "resolved": "https://registry.npmjs.org/ckeditor4/-/ckeditor4-4.22.1.tgz", - "integrity": "sha512-Yj4vTHX5YxHwc48gNqUqTm+KLkRr9tuyb4O2VIABu4oKHWRNVIdLdy6vUNe/XNx+RiTavMejfA1MVOU/MxLjqQ==" + "integrity": "sha512-Yj4vTHX5YxHwc48gNqUqTm+KLkRr9tuyb4O2VIABu4oKHWRNVIdLdy6vUNe/XNx+RiTavMejfA1MVOU/MxLjqQ==", + "license": "(GPL-2.0 OR LGPL-2.1 OR MPL-1.1)" }, "node_modules/clone-deep": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-1.0.0.tgz", "integrity": "sha512-hmJRX8x1QOJVV+GUjOBzi6iauhPqc9hIF6xitWRBbiPZOBb6vGo/mDRIK9P74RTKSQK7AE8B0DDWY/vpRrPmQw==", + "license": "MIT", "dependencies": { "for-own": "^1.0.0", "is-plain-object": "^2.0.4", @@ -1996,15 +2192,29 @@ "node": ">=0.10.0" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + "version": "5.65.19", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.19.tgz", + "integrity": "sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==", + "license": "MIT" }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "license": "MIT", "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -2018,6 +2228,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2029,30 +2240,35 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -2060,21 +2276,26 @@ "node_modules/components-font-awesome": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/components-font-awesome/-/components-font-awesome-4.7.0.tgz", - "integrity": "sha512-kwptdKxXBD4mMxQK5mv+5qzw0hIoxC6z30+obfZKJ4mEcaQRqXm7/S0Y87ENixy0GI77GyONPcEXvmVk2AulmA==" + "integrity": "sha512-kwptdKxXBD4mMxQK5mv+5qzw0hIoxC6z30+obfZKJ4mEcaQRqXm7/S0Y87ENixy0GI77GyONPcEXvmVk2AulmA==", + "license": [ + "MIT", + "OFL-1.1" + ] }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/connect-gzip-static": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/connect-gzip-static/-/connect-gzip-static-4.2.1.tgz", - "integrity": "sha512-6qC1NYUEZU6mftg2gPspcoPjgBzADm+fB1fPXu3RxBVe59P/Q9HQGQEHnuDaGRDJUoJwl5NX2OgoaaZp7RdpfQ==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/connect-gzip-static/-/connect-gzip-static-4.2.2.tgz", + "integrity": "sha512-9mfCKkVhSC+GHY/nWTkeSGxqDHvMYW06VSeKD9zsrpoE8QXgPtRRvhGbk1gSNmY0d+jZEgm5FXew/dxmb2OByQ==", "license": "MIT", "dependencies": { "debug": "~2||~3||~4", - "mime-types": "~2", + "mime-types": "~2||~3", "parseurl": "~1", "send": "~0 || ~1", "serve-static": "~1 || ~2" @@ -2087,6 +2308,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -2098,6 +2320,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2106,15 +2329,17 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/contra/-/contra-1.9.4.tgz", "integrity": "sha512-N9ArHAqwR/lhPq4OdIAwH4e1btn6EIZMAz4TazjnzCiVECcWUPTma+dRAM38ERImEJBh8NiCCpjoQruSZ+agYg==", + "license": "MIT", "dependencies": { "atoa": "1.0.0", "ticky": "1.0.1" } }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2123,6 +2348,7 @@ "version": "1.4.7", "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", "dependencies": { "cookie": "0.7.2", "cookie-signature": "1.0.6" @@ -2131,23 +2357,17 @@ "node": ">= 0.8.0" } }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2155,18 +2375,48 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/croppie": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz", - "integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ==" + "integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ==", + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2180,15 +2430,17 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/crossvent/-/crossvent-1.5.4.tgz", "integrity": "sha512-b6gEmNAh3kemyfNJ0LQzA/29A+YeGwevlSkNp2x0TzLOMYc0b85qRAD06OUuLWLQpR7HdJHNZQTlD1cfwoTrzg==", + "license": "MIT", "dependencies": { "custom-event": "1.0.0" } }, "node_modules/css-functions-list": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", - "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -2197,17 +2449,19 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", "dependencies": { "utrie": "^1.0.2" } }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, + "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -2219,6 +2473,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" }, @@ -2229,14 +2484,24 @@ "node_modules/custom-event": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.0.tgz", - "integrity": "sha512-6nOXX3UitrmdvSJWoVR2dlzhbX5bEUqmqsMUyx1ypCLZkHHkcuYtdpW3p94RGvcFkTV7DkLo+Ilbwnlwi8L+jw==" + "integrity": "sha512-6nOXX3UitrmdvSJWoVR2dlzhbX5bEUqmqsMUyx1ypCLZkHHkcuYtdpW3p94RGvcFkTV7DkLo+Ilbwnlwi8L+jw==", + "license": "MIT" }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/debuglog": { @@ -2244,6 +2509,7 @@ "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-0.0.2.tgz", "integrity": "sha512-R6Bl6JxzWVrquXohdoHkyGMgaL8esUXhSzB6WUfSX1N+1dFg30Yo9gshTu7ExV6ntKN4VoJFw8zVdPsVVYGmKg==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", "optional": true, "engines": { "node": "*" @@ -2253,37 +2519,24 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -2295,6 +2548,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2303,6 +2557,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2311,6 +2566,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -2320,15 +2576,42 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/detective/-/detective-4.3.2.tgz", "integrity": "sha512-a1rssac1j40ueg2uKcyxfK21OwCQW5sOIXF2Ceela1u2IIjOOF2FhN+mTrQ1arYQTSk3DQHkh/w68aikgpLV9w==", + "license": "MIT", "dependencies": { "acorn": "^3.1.0", "defined": "^1.0.0" } }, + "node_modules/detective/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dragula": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/dragula/-/dragula-3.7.2.tgz", "integrity": "sha512-iDPdNTPZY7P/l0CQ800QiX+PNA2XF9iC3ePLWfGxeb/j8iPPedRuQdfSOfZrazgSpmaShYvYQ/jx7keWb4YNzA==", + "license": "MIT", "dependencies": { "contra": "1.9.4", "crossvent": "1.5.4" @@ -2338,10 +2621,25 @@ "version": "21.8.2+5", "resolved": "git+ssh://git@github.com/cryptpad/drawio-npm.git#62293580fc6211bc5576ed1cbcfa125d5deba70e" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" } @@ -2349,24 +2647,28 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.68", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz", - "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==", - "dev": true + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2376,6 +2678,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2385,6 +2688,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -2393,17 +2697,16 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", "integrity": "sha512-VyjaKxUmeDX/m2lxm/aknsJ1GWDWUO2Ze2Ad8S1Pb9dykAm9TjSKp5CjrNyltYqZ5W/PO6TInAmO2/BfwMyT1g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2412,6 +2715,19 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } @@ -2421,6 +2737,7 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2428,13 +2745,15 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2443,31 +2762,33 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", + "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.20.1", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.29.0", + "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2502,15 +2823,16 @@ } }, "node_modules/eslint-plugin-compat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.1.tgz", - "integrity": "sha512-0MeIEuoy8kWkOhW38kK8hU4vkb6l/VvyjpuYDymYOXmUY9NvTgyErF16lYuX+HPS5hkmym7lfA+XpYZiWYWmYA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.0.2.tgz", + "integrity": "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==", "dev": true, + "license": "MIT", "dependencies": { "@mdn/browser-compat-data": "^5.5.35", - "ast-metadata-inferer": "^0.8.0", - "browserslist": "^4.23.1", - "caniuse-lite": "^1.0.30001639", + "ast-metadata-inferer": "^0.8.1", + "browserslist": "^4.24.2", + "caniuse-lite": "^1.0.30001687", "find-up": "^5.0.0", "globals": "^15.7.0", "lodash.memoize": "^4.1.2", @@ -2524,10 +2846,11 @@ } }, "node_modules/eslint-plugin-compat/node_modules/globals": { - "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2536,10 +2859,11 @@ } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -2552,39 +2876,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2592,33 +2888,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/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/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2627,39 +2906,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", @@ -2673,10 +2919,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2689,6 +2936,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2701,6 +2949,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2709,13 +2958,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2724,6 +2975,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2731,12 +2983,14 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" }, "node_modules/express": { "version": "4.21.2", "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -2778,18 +3032,83 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/encodeurl": { + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/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==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/express/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -2801,48 +3120,102 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "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, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, + "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -2857,6 +3230,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -2867,12 +3241,14 @@ "node_modules/file-saver": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.1.tgz", - "integrity": "sha512-RRTE4zhfibKpfVS233QDawwPhQIaEyxm6Zp6AcLoAy/qIx8MlEgNyQuGoTryZb+toizwSMeB/GhIzw/eWXTePw==" + "integrity": "sha512-RRTE4zhfibKpfVS233QDawwPhQIaEyxm6Zp6AcLoAy/qIx8MlEgNyQuGoTryZb+toizwSMeB/GhIzw/eWXTePw==", + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2884,6 +3260,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -2897,19 +3274,27 @@ "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2926,6 +3311,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2935,21 +3321,23 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "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==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2963,6 +3351,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2971,6 +3360,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "license": "MIT", "dependencies": { "for-in": "^1.0.1" }, @@ -2982,6 +3372,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2990,6 +3381,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2998,6 +3390,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -3013,6 +3406,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -3025,6 +3419,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3032,12 +3427,15 @@ "node_modules/gar": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", - "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==" + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" }, "node_modules/get-folder-size": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "license": "MIT", "dependencies": { "gar": "^1.0.4", "tiny-each-async": "2.0.3" @@ -3047,15 +3445,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3064,16 +3468,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/global-modules": { @@ -3081,6 +3499,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -3093,6 +3512,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -3107,6 +3527,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3116,6 +3537,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3128,6 +3550,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3135,16 +3558,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gluejs": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/gluejs/-/gluejs-2.4.0.tgz", "integrity": "sha512-ONu5oMBNppp7ybu5PvrnCDh7nv6B6YHKiCrvU9KHFv/ML94Kw18kLilc1z+VucPUeprqrHKMBwNq0nnxWbn1qg==", + "license": "BSD-3-Clause", "dependencies": { "amd-resolve": "~0.1.1", "amdetective": "0.0.1", @@ -3166,14 +3612,22 @@ "node_modules/gluejs/node_modules/bytes": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==" + "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==", + "license": "MIT" + }, + "node_modules/gluejs/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "license": "MIT" }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3182,43 +3636,24 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3230,6 +3665,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3237,11 +3673,19 @@ "node": ">= 0.4" } }, + "node_modules/hookified": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz", + "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -3253,6 +3697,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" @@ -3265,6 +3710,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -3280,6 +3726,7 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -3306,44 +3753,17 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/http-proxy-middleware/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/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==" - }, "node_modules/hyper-json": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/hyper-json/-/hyper-json-1.4.0.tgz", - "integrity": "sha512-QQq/hSN8X7m+rirYZmJ3RxCanXEdKyC7iGXEnJcg3jJ6/qorDDywBJoP6tt9+LEfJvNHaXwoE2wjDAZtJVeLew==" + "integrity": "sha512-QQq/hSN8X7m+rirYZmJ3RxCanXEdKyC7iGXEnJcg3jJ6/qorDDywBJoP6tt9+LEfJvNHaXwoE2wjDAZtJVeLew==", + "license": "AGPL" }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -3351,11 +3771,33 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -3363,13 +3805,15 @@ "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3386,6 +3830,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -3394,6 +3839,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", "integrity": "sha512-qkc9wjLDQ+dYYZnY5uJXGNNHyZ0UOMDUnhvy0SEZGVVYmQ5s4i8cPAin2MbU6OxJgi8dfj/AnwqPx0CJE6+Lsw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3401,18 +3847,21 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3421,6 +3870,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -3432,18 +3882,21 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3458,6 +3911,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -3469,6 +3923,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -3481,6 +3936,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3489,6 +3945,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3497,6 +3954,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", "engines": { "node": ">=4" } @@ -3505,6 +3963,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3516,23 +3975,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-number": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz", "integrity": "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3542,6 +4001,7 @@ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -3550,6 +4010,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3557,18 +4018,21 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3577,6 +4041,7 @@ "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -3584,19 +4049,22 @@ "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3608,25 +4076,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json.sortify": { "version": "2.2.2", @@ -3641,6 +4113,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -3649,6 +4122,7 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -3666,15 +4140,11 @@ "npm": ">=6" } }, - "node_modules/jsonwebtoken/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==" - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -3685,12 +4155,14 @@ "node_modules/jszip/node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" }, "node_modules/jszip/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==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3704,14 +4176,16 @@ "node_modules/jszip/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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -3720,6 +4194,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -3730,6 +4205,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -3738,20 +4214,23 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/known-css-properties": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz", - "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==", - "dev": true + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" }, "node_modules/koalas": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/koalas/-/koalas-1.0.2.tgz", "integrity": "sha512-RYhBbYaTTTHId3l6fnMZc3eGQNW6FVCqMG6AMwA5I1Mafr6AflaXeoi6x3xQuATRotGYRLk6+1ELZH4dstFNOA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3760,6 +4239,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "license": "MIT", "dependencies": { "set-getter": "^0.1.0" }, @@ -3772,6 +4252,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3790,6 +4271,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -3798,12 +4280,14 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/localforage": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", "dependencies": { "lie": "3.1.1" } @@ -3812,6 +4296,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -3821,6 +4306,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3834,60 +4320,71 @@ "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" }, "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-ok": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", "integrity": "sha512-cc8VrkS6C+9TFuYAwuHpshrcrGRAv7d0tUJ0GdM72ZBlKXtlgjUZF84O+OhQUdiVHoF7U/nVxwpjOdwUJ8d3Vg==", + "license": "MIT", "dependencies": { "ansi-green": "^0.1.1", "success-symbol": "^0.1.0" @@ -3900,6 +4397,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", "integrity": "sha512-udyegKoMz9eGfpKAX//Khy7sVAZ8b1F7oLDnepZv/1/y8xTvsyPgqQrM94eG8V0vcc2BieYI2kVW4+aa6m+8Qw==", + "license": "MIT", "dependencies": { "ansi-colors": "^0.2.0", "error-symbol": "^0.1.0", @@ -3916,12 +4414,14 @@ "node_modules/looper": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/looper/-/looper-3.0.0.tgz", - "integrity": "sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg==" + "integrity": "sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg==", + "license": "MIT" }, "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==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3930,10 +4430,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -3942,6 +4443,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "license": "MIT", "dependencies": { "object-visit": "^1.0.0" }, @@ -3953,6 +4455,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -3960,31 +4463,44 @@ "node": ">= 12" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mathjax": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-3.0.5.tgz", - "integrity": "sha512-9M7VulhltkD8sIebWutK/VfAD+m+6BIFqfpjDh9Pz/etoKUtjO6UMnOhUcDmNl6iApE8C9xrUmaMyNZkZAlrMw==" + "integrity": "sha512-9M7VulhltkD8sIebWutK/VfAD+m+6BIFqfpjDh9Pz/etoKUtjO6UMnOhUcDmNl6iApE8C9xrUmaMyNZkZAlrMw==", + "license": "Apache-2.0" }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" }, "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==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3994,6 +4510,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4005,6 +4522,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -4014,6 +4532,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -4022,6 +4541,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4035,6 +4555,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4047,6 +4568,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4058,6 +4580,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -4066,19 +4589,21 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -4088,6 +4613,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/minilog/-/minilog-2.1.0.tgz", "integrity": "sha512-UPg2RLmS2JteQ8bn5xA69skwi7evHYcHgRULQIGnNsuXheOHUsFyWitMkqpa3Q9ezSpbDC7vaYKxYCLryCV4og==", + "license": "MIT", "dependencies": { "microee": "0.0.2" } @@ -4096,6 +4622,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4107,6 +4634,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4115,6 +4643,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/miniq/-/miniq-0.1.2.tgz", "integrity": "sha512-RrLjyiUep4m+ynM6viqtnh20qAdBzfjrmxTIcXU0oschLaEAqUKTxEhYq2Gm3V3IsgzOICG7PMkxuio+I6X6Rw==", + "license": "BSD", "dependencies": { "microee": "~0.0.5" } @@ -4122,12 +4651,14 @@ "node_modules/miniq/node_modules/microee": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", - "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==" + "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==", + "license": "BSD" }, "node_modules/minitask": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/minitask/-/minitask-0.2.3.tgz", "integrity": "sha512-Ka6EQ9R2XsLc80vr3rdh4C56guoKq5tItG50etoNxJ8wV/0p59og2BdGBtqnNhkWchI/B4W4GTQ/Fvdy5N2rng==", + "license": "BSD", "dependencies": { "miniq": "~0.1.1", "mkdirp": "~0.5.0" @@ -4140,6 +4671,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", + "license": "MIT", "dependencies": { "for-in": "^0.1.3", "is-extendable": "^0.1.1" @@ -4152,6 +4684,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4160,6 +4693,7 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -4168,19 +4702,21 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", + "license": "ISC" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -4188,6 +4724,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4199,32 +4736,37 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/netflux-websocket": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/netflux-websocket/-/netflux-websocket-1.2.1.tgz", - "integrity": "sha512-8oQOyEyh0MCnifNIfyvkNXpEELlVRzDleRivRgsDGh+5ZDG109axweVZ0RIOIpkQmTZk4/xVsBk/oLXpMSWEOw==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/netflux-websocket/-/netflux-websocket-1.2.2.tgz", + "integrity": "sha512-sroG7pBW4QctLtgW55eYNLfzXTbwHBTp7jMXBcY2Dk043PFBL+dpymVgJJWvb2EEbxGFFoaoqc6a8M9w1hIYMQ==", + "license": "LGPL-2.1" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4240,12 +4782,14 @@ "node_modules/nthen": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/nthen/-/nthen-0.1.8.tgz", - "integrity": "sha512-Oh2CwIbhj+wUT94lQV7LKmmgw3UYAGGd8oLIqp6btQN3Bz3PuWp4BuvtUo35H3rqDknjPfKx5P6mt7v+aJNjcw==" + "integrity": "sha512-Oh2CwIbhj+wUT94lQV7LKmmgw3UYAGGd8oLIqp6btQN3Bz3PuWp4BuvtUo35H3rqDknjPfKx5P6mt7v+aJNjcw==", + "license": "MIT" }, "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "license": "MIT", "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -4259,6 +4803,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -4270,6 +4815,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -4282,6 +4828,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -4293,14 +4840,19 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4309,6 +4861,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "license": "MIT", "dependencies": { "isobject": "^3.0.0" }, @@ -4317,9 +4870,10 @@ } }, "node_modules/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.1.0.tgz", + "integrity": "sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==", + "license": "MIT", "engines": { "node": "^10.13.0 || >=12.0.0" } @@ -4328,6 +4882,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -4338,12 +4893,14 @@ "node_modules/open-sans-fontface": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/open-sans-fontface/-/open-sans-fontface-1.4.0.tgz", - "integrity": "sha512-d1VXrt1qPScsZnDHbZTOf1SmUnanr3KQgQM6+ye6KoFgrLo8a8mkX/J/ZJ2+w7vf0sCC02lRia5SAiaz0JPEog==" + "integrity": "sha512-d1VXrt1qPScsZnDHbZTOf1SmUnanr3KQgQM6+ye6KoFgrLo8a8mkX/J/ZJ2+w7vf0sCC02lRia5SAiaz0JPEog==", + "license": "Apache License version 2.0" }, "node_modules/openid-client": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.7.1.tgz", "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", "dependencies": { "jose": "^4.15.9", "lru-cache": "^6.0.0", @@ -4358,23 +4915,25 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "license": "MIT/X11", "dependencies": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -4385,6 +4944,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4400,6 +4960,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4413,13 +4974,15 @@ "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4427,19 +4990,30 @@ "node": ">=6" } }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "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": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -4449,6 +5023,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4458,6 +5033,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4466,26 +5042,38 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "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": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "optional": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4497,6 +5085,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/pointer-symbol/-/pointer-symbol-1.0.0.tgz", "integrity": "sha512-pozTTFO3kG9HQWXCSTJkCgq4fBF8lUQf+5bLddTEW6v4zdjQhcBVfLmKzABEMJMA7s8jhzi0sgANIwdrf4kq+A==", + "license": "MIT", "engines": { "node": ">=4" } @@ -4506,6 +5095,7 @@ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", "peer": true, "funding": { "type": "opencollective", @@ -4513,9 +5103,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -4531,9 +5121,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -4545,6 +5136,7 @@ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz", "integrity": "sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4556,12 +5148,13 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", - "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, "funding": [ { @@ -4577,6 +5170,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=18.0" }, @@ -4585,10 +5179,11 @@ } }, "node_modules/postcss-selector-parser": { - "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==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4601,13 +5196,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -4615,7 +5212,8 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/progress": { "version": "1.1.8", @@ -4629,6 +5227,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/prompt-actions/-/prompt-actions-3.0.2.tgz", "integrity": "sha512-dhz2Fl7vK+LPpmnQ/S/eSut4BnH4NZDLyddHKi5uTU/2PDn3grEMGkgsll16V5RpVUh/yxdiam0xsM0RD4xvtg==", + "license": "MIT", "dependencies": { "debug": "^2.6.8" }, @@ -4636,10 +5235,26 @@ "node": ">=4" } }, + "node_modules/prompt-actions/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/prompt-actions/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/prompt-base": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/prompt-base/-/prompt-base-4.1.0.tgz", "integrity": "sha512-svGzgLUKZoqomz9SGMkf1hBG8Wl3K7JGuRCXc/Pv7xw8239hhaTBXrmjt7EXA9P/QZzdyT8uNWt9F/iJTXq75g==", + "license": "MIT", "dependencies": { "component-emitter": "^1.2.1", "debug": "^3.0.1", @@ -4659,19 +5274,16 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/prompt-base/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==" - }, "node_modules/prompt-choices": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/prompt-choices/-/prompt-choices-4.1.0.tgz", "integrity": "sha512-ZNYLv6rW9z9n0WdwCkEuS+w5nUAGzRgtRt6GQ5aFNFz6MIcU7nHFlHOwZtzy7RQBk80KzUGPSRQphvMiQzB8pg==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "arr-swap": "^1.0.1", @@ -4698,6 +5310,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -4711,6 +5324,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -4719,29 +5333,32 @@ "node": ">=0.10.0" } }, + "node_modules/prompt-choices/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prompt-choices/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/prompt-choices/node_modules/set-value": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.3.tgz", - "integrity": "sha512-Xsn/XSatoVOGBbp5hs3UylFDs5Bi9i+ArpVJKdHPniZHoEgRniXTqHWrWrGQ0PbEClVT6WtfnBwR8CAHC9sveg==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/prompt-choices/node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -4753,6 +5370,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/prompt-confirm/-/prompt-confirm-2.0.4.tgz", "integrity": "sha512-X5lzbC8/kMNHdPOqQPfMKpH4VV2f7v2OTRJoN69ZYBirSwTeQaf9ZhmzPEO9ybMA0YV2Pha5MV27u2/U4ahWfg==", + "license": "MIT", "dependencies": { "ansi-cyan": "^0.1.1", "prompt-base": "^4.0.1" @@ -4765,6 +5383,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/prompt-question/-/prompt-question-5.0.2.tgz", "integrity": "sha512-wreaLbbu8f5+7zXds199uiT11Ojp59Z4iBi6hONlSLtsKGTvL2UY8VglcxQ3t/X4qWIxsNCg6aT4O8keO65v6Q==", + "license": "MIT", "dependencies": { "clone-deep": "^1.0.0", "debug": "^3.0.1", @@ -4782,19 +5401,16 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/prompt-question/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==" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -4806,13 +5422,15 @@ "node_modules/pull-stream": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/pull-stream/-/pull-stream-3.7.0.tgz", - "integrity": "sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==" + "integrity": "sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==", + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4821,6 +5439,7 @@ "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -4849,12 +5468,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/radio-symbol": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/radio-symbol/-/radio-symbol-2.0.0.tgz", "integrity": "sha512-fpuWhwGD4XG1BfUWKXhCqdguCXzGi/DDb6RzmAGZo9R75enjlx0l+ZhHF93KNG7iNpT0Vi7wEqbf8ZErbe+JtQ==", + "license": "MIT", "dependencies": { "ansi-gray": "^0.1.1", "ansi-green": "^0.1.1", @@ -4869,6 +5490,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -4877,6 +5499,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4885,6 +5508,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -4899,6 +5523,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.9.tgz", "integrity": "sha512-Xz7W+ck1vQnTauU5Uo2zYK/Ae8Ou5mRJrKkGFDZX+VF921HwsjL6lz3ga+vT8jQa6HT/0ZbamKffh9OE7xJ4vQ==", + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0" }, @@ -4910,6 +5535,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/readline-ui/-/readline-ui-2.2.3.tgz", "integrity": "sha512-ix7jz0PxqQqcIuq3yQTHv1TOhlD2IHO74aNO+lSuXsRYm1d+pdyup1yF3zKyLK1wWZrVNGjkzw5tUegO2IDy+A==", + "license": "MIT", "dependencies": { "component-emitter": "^1.2.1", "debug": "^2.6.8", @@ -4920,10 +5546,26 @@ "node": ">=4.0" } }, + "node_modules/readline-ui/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/readline-ui/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/readline-utils": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/readline-utils/-/readline-utils-2.2.3.tgz", "integrity": "sha512-cjFo7R7e7AaFOz2JLQ4EgsHh4+l7mw29Eu3DAEPgGeWbYQFKqyxWsL61/McC6b2oJAvn14Ea8eUms9o8ZFC1iQ==", + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "extend-shallow": "^2.0.1", @@ -4943,6 +5585,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -4954,6 +5597,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -4971,6 +5615,7 @@ "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, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4979,6 +5624,7 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", + "license": "MIT", "bin": { "r_js": "bin/r.js", "r.js": "bin/r.js" @@ -4990,44 +5636,65 @@ "node_modules/requirejs-plugins": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/requirejs-plugins/-/requirejs-plugins-1.0.2.tgz", - "integrity": "sha512-bX1vGnjDd1iIod3hst47oM/Nv9JiYw4qodWNKgyeQw5ahzSvPI3j1K6hMcK0HtiGRKxebCf+QUrtWzbrZtzQog==" + "integrity": "sha512-bX1vGnjDd1iIod3hst47oM/Nv9JiYw4qodWNKgyeQw5ahzSvPI3j1K6hMcK0HtiGRKxebCf+QUrtWzbrZtzQog==", + "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" }, "node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", + "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -5037,22 +5704,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.44.0", + "@rollup/rollup-android-arm64": "4.44.0", + "@rollup/rollup-darwin-arm64": "4.44.0", + "@rollup/rollup-darwin-x64": "4.44.0", + "@rollup/rollup-freebsd-arm64": "4.44.0", + "@rollup/rollup-freebsd-x64": "4.44.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", + "@rollup/rollup-linux-arm-musleabihf": "4.44.0", + "@rollup/rollup-linux-arm64-gnu": "4.44.0", + "@rollup/rollup-linux-arm64-musl": "4.44.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-musl": "4.44.0", + "@rollup/rollup-linux-s390x-gnu": "4.44.0", + "@rollup/rollup-linux-x64-gnu": "4.44.0", + "@rollup/rollup-linux-x64-musl": "4.44.0", + "@rollup/rollup-win32-arm64-msvc": "4.44.0", + "@rollup/rollup-win32-ia32-msvc": "4.44.0", + "@rollup/rollup-win32-x64-msvc": "4.44.0", "fsevents": "~2.3.2" } }, @@ -5075,6 +5746,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -5096,32 +5768,38 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/saferphore": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/saferphore/-/saferphore-0.0.1.tgz", - "integrity": "sha512-/KaXQyumYbALQwhl4/Qov6voayHwtBD12AWRI3zxYBW7cY3Mjtkk7PLttZPq+25nyfu/k3APHUptPLZI9A7yHA==" + "integrity": "sha512-/KaXQyumYbALQwhl4/Qov6voayHwtBD12AWRI3zxYBW7cY3Mjtkk7PLttZPq+25nyfu/k3APHUptPLZI9A7yHA==", + "license": "MIT" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/scrypt-async": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/scrypt-async/-/scrypt-async-1.2.0.tgz", - "integrity": "sha512-BtT7+xPLdoeXsh6wOblaq6sRy/AsffFXgcwBNGtQJXeNgm9UD3HM3nWEmAERjdCNfE6jWglAtRbAPZ7rc2WtsQ==" + "integrity": "sha512-BtT7+xPLdoeXsh6wOblaq6sRy/AsffFXgcwBNGtQJXeNgm9UD3HM3nWEmAERjdCNfE6jWglAtRbAPZ7rc2WtsQ==", + "license": "BSD" }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -5130,84 +5808,66 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", "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" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, - "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==" + "node_modules/send/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "node": ">= 18" } }, "node_modules/set-getter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "license": "MIT", "dependencies": { "to-object-path": "^0.3.0" }, @@ -5215,20 +5875,47 @@ "node": ">=0.10.0" } }, + "node_modules/set-value": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-3.0.3.tgz", + "integrity": "sha512-Xsn/XSatoVOGBbp5hs3UylFDs5Bi9i+ArpVJKdHPniZHoEgRniXTqHWrWrGQ0PbEClVT6WtfnBwR8CAHC9sveg==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shallow-clone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "license": "MIT", "dependencies": { "is-extendable": "^0.1.1", "kind-of": "^5.0.0", @@ -5243,6 +5930,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5255,19 +5943,75 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5281,6 +6025,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -5288,11 +6033,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -5310,6 +6066,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5318,17 +6075,20 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sortablejs": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.1.tgz", - "integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "license": "MIT" }, "node_modules/sortify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/sortify/-/sortify-1.0.4.tgz", "integrity": "sha512-q+jgY7dx4fmB47wEz3Sq5ok+ibO4caQLplk/U/JXtlt0uvqDNHHZZYYfGB6oEBRbXAb345hbYjOMN5zl8yGYXA==", + "license": "MIT", "dependencies": { "lex": "^1.7.9" } @@ -5338,6 +6098,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5347,6 +6108,7 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5356,6 +6118,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -5365,6 +6128,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "license": "MIT", "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -5377,6 +6141,7 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -5388,6 +6153,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -5400,6 +6166,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5408,6 +6175,7 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz", "integrity": "sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==", + "license": "MIT", "dependencies": { "looper": "^3.0.0", "pull-stream": "^3.2.3" @@ -5417,6 +6185,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -5424,12 +6193,14 @@ "node_modules/string_decoder/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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -5442,6 +6213,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -5453,6 +6225,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5462,6 +6235,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -5470,9 +6244,9 @@ } }, "node_modules/stylelint": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz", - "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==", + "version": "16.21.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.21.0.tgz", + "integrity": "sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==", "dev": true, "funding": [ { @@ -5484,45 +6258,45 @@ "url": "https://github.com/sponsors/stylelint" } ], + "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.1", - "@csstools/css-tokenizer": "^3.0.1", - "@csstools/media-query-list-parser": "^3.0.1", - "@csstools/selector-specificity": "^4.0.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.2", - "css-tree": "^2.3.1", - "debug": "^4.3.6", - "fast-glob": "^3.3.2", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.1", + "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^9.0.0", + "file-entry-cache": "^10.1.1", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.2", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.34.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.1", - "postcss": "^8.4.41", + "picocolors": "^1.1.1", + "postcss": "^8.5.5", "postcss-resolve-nested-selector": "^0.1.6", - "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.1.2", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^7.1.0", - "supports-hyperlinks": "^3.1.0", + "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", - "table": "^6.8.2", + "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { @@ -5547,6 +6321,7 @@ "url": "https://github.com/sponsors/stylelint" } ], + "license": "MIT", "engines": { "node": ">=18.12.0" }, @@ -5559,6 +6334,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-less/-/stylelint-config-recommended-less-3.0.1.tgz", "integrity": "sha512-4vp9Z+W0KwxgPL4L3WxXtlMurfen0NXKFFxPHzDYn2s6WVS26Gg7jt3FIO4ZLM1x8WalCR02nwK2h0TH/mafBg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-less": "^6.0.0", "stylelint-config-recommended": "^14.0.0", @@ -5579,6 +6355,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-35.0.0.tgz", "integrity": "sha512-JyQrNZk2BZwVKFauGGxW2U6RuhIfQ4XoHHo+rBzMHcAkLnwI/knpszwXjzxiMgSfcxbZBckM7Vq4LHoANTR85g==", "dev": true, + "license": "MIT", "dependencies": { "stylelint-config-recommended": "^14.0.0" }, @@ -5594,6 +6371,7 @@ "resolved": "https://registry.npmjs.org/stylelint-config-standard-less/-/stylelint-config-standard-less-3.0.1.tgz", "integrity": "sha512-l6UrXbfy37hWbeOCYrJqnKzhiy5+rkxHNGNufvyhH2K1KpEWO+lO8YrLzoOTx0VyGMatPQlpR8EXrnLRcEcvhg==", "dev": true, + "license": "MIT", "dependencies": { "stylelint-config-recommended-less": "^3.0.1", "stylelint-config-standard": "^35.0.0" @@ -5613,6 +6391,7 @@ "resolved": "https://registry.npmjs.org/stylelint-less/-/stylelint-less-3.0.1.tgz", "integrity": "sha512-6GkZ4jhmReXxX61IiNaniZFuyTzYTTC4HvRLNNok883d1ux/wUodM1uik+iAHZM1VSCwNASaj0Th6ZX46WZLMw==", "dev": true, + "license": "MIT", "dependencies": { "postcss-resolve-nested-selector": "^0.1.1", "postcss-value-parser": "4.2.0" @@ -5622,32 +6401,12 @@ "stylelint": "^16.0.2" } }, - "node_modules/stylelint/node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5656,122 +6415,39 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "node_modules/stylelint/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/stylelint/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/stylelint/node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } + "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz", + "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^5.0.0" - }, - "engines": { - "node": ">=18" + "flat-cache": "^6.1.10" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", - "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz", + "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.3.1", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=18" + "cacheable": "^1.10.0", + "flatted": "^3.3.3", + "hookified": "^1.9.1" } }, - "node_modules/stylelint/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, "node_modules/stylelint/node_modules/is-fullwidth-code-point": { @@ -5779,48 +6455,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint/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/stylelint/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, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5830,15 +6465,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5848,6 +6475,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5857,20 +6485,12 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { + "node_modules/stylelint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5878,25 +6498,11 @@ "node": ">=8" } }, - "node_modules/stylelint/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/success-symbol": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", "integrity": "sha512-7S6uOTxPklNGxOSbDIg4KlVLBQw1UiGVyfCUYgYxrZUKRblUkmGj7r8xlfQoFudvqLv6Ap5gd76/IIFfI9JG2A==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5906,6 +6512,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -5914,10 +6521,11 @@ } }, "node_modules/supports-hyperlinks": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", - "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -5926,7 +6534,7 @@ "node": ">=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -5934,6 +6542,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5948,10 +6557,11 @@ "dev": true }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -5964,15 +6574,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "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, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -5984,6 +6595,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5993,6 +6605,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6001,13 +6614,15 @@ "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 + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6022,6 +6637,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6033,6 +6649,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/terminal-paginator/-/terminal-paginator-2.0.2.tgz", "integrity": "sha512-IZMT5ECF9p4s+sNCV8uvZSW9E1+9zy9Ji9xz2oee8Jfo7hUFpauyjxkhfRcIH6Lu3Wdepv5D1kVRc8Hx74/LfQ==", + "license": "MIT", "dependencies": { "debug": "^2.6.6", "extend-shallow": "^2.0.1", @@ -6042,14 +6659,30 @@ "node": ">=0.10.0" } }, + "node_modules/terminal-paginator/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/terminal-paginator/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/terser": { - "version": "5.34.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", - "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -6060,22 +6693,11 @@ "node": ">=10" } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/text-segmentation": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", "dependencies": { "utrie": "^1.0.2" } @@ -6091,12 +6713,14 @@ "node_modules/ticky": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ticky/-/ticky-1.0.1.tgz", - "integrity": "sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA==" + "integrity": "sha512-RX35iq/D+lrsqhcPWIazM9ELkjOe30MSeoBHQHSsRwd1YuhJO5ui1K1/R0r7N3mFvbLBs33idw+eR6j+w6i/DA==", + "license": "MIT" }, "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6104,12 +6728,14 @@ "node_modules/tiny-each-async": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", - "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==" + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "license": "MIT" }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -6121,6 +6747,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -6132,6 +6759,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==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6143,6 +6771,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -6151,6 +6780,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toggle-array/-/toggle-array-1.0.1.tgz", "integrity": "sha512-TZXgboKpD5Iu0Goi8hRXuJpE06Pbo+bies4I4jnTBhlRRgyen9c37nMylnquK/ZPKXXOeh1mJ14p9QdKp+9v7A==", + "license": "MIT", "dependencies": { "isobject": "^3.0.0" }, @@ -6162,15 +6792,17 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" }, "node_modules/tweetnacl": { "version": "1.0.3", @@ -6189,6 +6821,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6200,6 +6833,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -6208,11 +6842,33 @@ "node": ">= 0.6" } }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6230,14 +6886,16 @@ } }, "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==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "license": "MIT" }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -6246,14 +6904,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -6269,9 +6928,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6285,6 +6945,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -6292,12 +6953,14 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -6306,6 +6969,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", "dependencies": { "base64-arraybuffer": "^1.0.2" } @@ -6314,6 +6978,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6322,6 +6987,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", "integrity": "sha512-1S0lwbHo3kNUKA4VomBAhqn4DPjQkIKSdbOin5K7EFUQNwyIKx+wZMGXKI53RUjla8V2B8ouQduUlgtx8LoSMw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6331,6 +6997,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6345,6 +7012,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", + "license": "MIT", "dependencies": { "define-property": "^1.0.0", "is-number": "^3.0.0" @@ -6360,6 +7028,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -6371,6 +7040,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -6378,10 +7048,21 @@ "node": ">=0.10.0" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -6391,6 +7072,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -6400,9 +7082,10 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6423,6 +7106,7 @@ "version": "3.4.4", "resolved": "https://registry.npmjs.org/x2js/-/x2js-3.4.4.tgz", "integrity": "sha512-yG/ThaBCgnsa3aoMPAe7QwDpcyU4D70hjXC4Y1lZSfD/Tgd0MpE19FnZZRAjekryw0c8cffpOt9zsPEiqktO6Q==", + "license": "Apache-2.0", "dependencies": { "@xmldom/xmldom": "^0.8.3" } @@ -6452,27 +7136,27 @@ "version": "0.0.32", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "license": "MIT", "engines": { "node": ">=0.6.0" } }, "node_modules/xml-encryption": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.0.2.tgz", - "integrity": "sha512-VxYXPvsWB01/aqVLd6ZMPWZ+qaj0aIdF+cStrVJMcFj3iymwZeI0ABzB3VqMYv48DkSpRhnrXqTUkR34j+UDyg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xml-encryption/-/xml-encryption-3.1.0.tgz", + "integrity": "sha512-PV7qnYpoAMXbf1kvQkqMScLeQpjCMixddAKq9PtqVrho8HnYbBOWNfG0kA4R7zxQDo7w9kiYAyzS/ullAyO55Q==", + "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.5", "escape-html": "^1.0.3", "xpath": "0.0.32" - }, - "engines": { - "node": ">=12" } }, "node_modules/xml-encryption/node_modules/xpath": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.32.tgz", "integrity": "sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw==", + "license": "MIT", "engines": { "node": ">=0.6.0" } @@ -6481,6 +7165,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -6493,6 +7178,7 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", "engines": { "node": ">=4.0" } @@ -6501,6 +7187,7 @@ "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", "engines": { "node": ">=8.0" } @@ -6509,6 +7196,7 @@ "version": "0.0.27", "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "license": "MIT", "engines": { "node": ">=0.6.0" } @@ -6516,13 +7204,15 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/readme.md b/readme.md index a37e767ab..3eede8d62 100644 --- a/readme.md +++ b/readme.md @@ -80,7 +80,7 @@ More information about this can be found in [our translation guide](/customize.d The best places to reach the development team and the community are the [CryptPad Forum](https://forum.cryptpad.org) and the [Matrix chat](https://matrix.to/#/#cryptpad:matrix.xwiki.com) -The team is also on the fediverse: [@cryptpad@fosstodon.org](https://fosstodon.org/@cryptpad) +The team is also on the fediverse: [@cryptpad@xwiki.com](https://social.xwiki.com/@CryptPad) # Team diff --git a/scripts/api/testapi.js b/scripts/api/testapi.js index d86cf2cfe..c2f551c06 100644 --- a/scripts/api/testapi.js +++ b/scripts/api/testapi.js @@ -36,7 +36,10 @@ getApi('config', ApiConfig => { Messages, Broadcast }).then((store) => { - console.log(store); + console.log('API added to global "CP"'); + const api = globalThis.CP = store.api; + const cfg = { channel: '0123456789abcdef0123456789abcedf' }; + api.pad.join(cfg, console.log); }); }); }); diff --git a/scripts/check-accounts.js b/scripts/check-accounts.js deleted file mode 100644 index 81835f5c8..000000000 --- a/scripts/check-accounts.js +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -var Https = require('https'); -var Config = require("../lib/load-config"); -var Package = require("../package.json"); - -var body = JSON.stringify({ - domain: Config.myDomain, - subdomain: Config.mySubdomain || null, - adminEmail: Config.adminEmail, - version: Package.version, -}); - -var options = { - host: 'accounts.cryptpad.fr', - path: '/api/getauthorized', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body) - } -}; - -Https.request(options, function (response) { - if (!('' + response.statusCode).match(/^2\d\d$/)) { - throw new Error('SERVER ERROR ' + response.statusCode); - } - var str = ''; - response.on('data', function (chunk) { - str += chunk; - }); - response.on('end', function () { - try { - var json = JSON.parse(str); - console.log(json); - } catch (e) { - throw new Error(e); - } - }); -}).on('error', function (e) { - console.error(e); -}).end(body); diff --git a/src/common/cryptget.js b/src/common/cryptget.js index df3453225..3d4b60921 100644 --- a/src/common/cryptget.js +++ b/src/common/cryptget.js @@ -225,8 +225,8 @@ if (typeof(module) !== 'undefined' && module.exports) { '/common/common-util.js', '/common/common-hash.js', '/common/common-realtime.js', - '/common/outer/network-config.js', - '/common/outer/cache-store.js', + '/common/network-config.js', + '/common/cache-store.js', '/common/pinpad.js', '/components/nthen/index.js', '/components/chainpad/chainpad.dist.js', diff --git a/src/common/worker-channel.js b/src/common/events-channel.js similarity index 100% rename from src/common/worker-channel.js rename to src/common/events-channel.js diff --git a/src/common/http-command.js b/src/common/http-command.js deleted file mode 100644 index 6d62f809f..000000000 --- a/src/common/http-command.js +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(() => { -const factory = (nThen, Util, ApiConfig = {}, Nacl) => { - - const getApiOrigin = function () { - if (!Object.keys(ApiConfig).length) { return; } - var url; - var unsafeOriginURL = new URL(ApiConfig.httpUnsafeOrigin); - try { - url = new URL(ApiConfig.websocketPath, ApiConfig.httpUnsafeOrigin); - url.protocol = unsafeOriginURL.protocol; - return url.origin; - } catch (err) { - console.error(err); - return ApiConfig.httpUnsafeOrigin; - } - }; - var API_ORIGIN = getApiOrigin(); - - const setCustomize = data => { - ApiConfig = data.ApiConfig; - API_ORIGIN = getApiOrigin(); - }; - - var clone = o => JSON.parse(JSON.stringify(o)); - var randomToken = () => Util.encodeBase64(Nacl.randomBytes(24)); - var postData = function (url, data, cb) { - var CB = Util.once(Util.mkAsync(cb)); - fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(data), - }).then(response => { - if (response.ok) { - - return void response.text().then(result => { CB(void 0, Util.tryParse(result)); }); // checkup error when using .json() - //return void response.json().then(result => { CB(void 0, result); }); - } - - response.json().then().then(result => { - CB(response.status, result); - }); - //CB(response.status, response); - }).catch(error => { - CB(error); - }); - }; - - var serverCommand = function (keypair, my_data, cb) { - var obj = clone(my_data); - obj.publicKey = Util.encodeBase64(keypair.publicKey); - obj.nonce = randomToken(); - var href = new URL('/api/auth/', API_ORIGIN); - var txid, date; - nThen(function (w) { - // Tell the server we want to do some action - postData(href, obj, w((err, data) => { - if (err) { - w.abort(); - console.error(err); - // there might be more info here - if (data) { console.error(data); } - return void cb(err); - } - - // if the requested action is valid, it responds with a txid and a nonce - // bundle all that up into an object, stringify it, and sign it. - // respond with an object: {sig, txid} - if (!data.date || !data.txid) { - w.abort(); - return void cb('REQUEST_REJECTED'); - } - txid = data.txid; - date = data.date; - })); - }).nThen(function (w) { - var copy = clone(obj); - copy.txid = txid; - copy.date = date; - var toSign = Util.decodeUTF8(JSON.stringify(copy)); - var sig = Nacl.sign.detached(toSign, keypair.secretKey); - var encoded = Util.encodeBase64(sig); - var obj2 = { - sig: encoded, - txid: txid, - }; - postData(href, obj2, w((err, data) => { - if (err) { - w.abort(); - console.error(err); - // there might be more info here - if (data) { console.error(data); } - return void cb("RESPONSE_REJECTED", data); - } - cb(void 0, data); - })); - }); - }; - - serverCommand.setCustomize = setCustomize; - - return serverCommand; -}; - -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('nthen'), - require('./common-util'), - undefined, - require('tweetnacl/nacl-fast') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/components/nthen/index.js', - '/common/common-util.js', - '/api/config', - '/components/tweetnacl/nacl-fast.min.js', - ], (nThen, Util, ApiConfig) => { - return factory(nThen, Util, ApiConfig, window.nacl); - }); -} else { - // unsupported initialization -} - -})(); diff --git a/src/common/network-config.js b/src/common/network-config.js index af09e70ff..5805d3a2f 100644 --- a/src/common/network-config.js +++ b/src/common/network-config.js @@ -14,7 +14,7 @@ const factory = (ApiConfig = {}) => { var path = ApiConfig.websocketPath || '/cryptpad_websocket'; if (/^ws{1,2}:\/\//.test(path)) { return path; } - var l = new URL(origin || self?.location?.href); + var l = new URL(origin || globalThis?.location?.href || ApiConfig.httpUnsafeOrigin); if (origin) { l.href = origin; } diff --git a/www/common/outer/http-command.js b/src/common/outer/http-command.js similarity index 99% rename from www/common/outer/http-command.js rename to src/common/outer/http-command.js index 6d62f809f..19839469d 100644 --- a/www/common/outer/http-command.js +++ b/src/common/outer/http-command.js @@ -110,7 +110,7 @@ const factory = (nThen, Util, ApiConfig = {}, Nacl) => { if (typeof(module) !== 'undefined' && module.exports) { module.exports = factory( require('nthen'), - require('./common-util'), + require('../common-util'), undefined, require('tweetnacl/nacl-fast') ); diff --git a/src/common/login-block.js b/src/common/outer/login-block.js similarity index 99% rename from src/common/login-block.js rename to src/common/outer/login-block.js index 7b1223026..312e8b7e2 100644 --- a/src/common/login-block.js +++ b/src/common/outer/login-block.js @@ -224,7 +224,7 @@ const factory = (Util, ApiConfig = {}, ServerCommand, Nacl) => { if (typeof(module) !== 'undefined' && module.exports) { module.exports = factory( - require('./common-util'), + require('../common-util'), undefined, require('./http-command'), require('tweetnacl/nacl-fast') diff --git a/src/common/proxy-manager.js b/src/common/proxy-manager.js index cb465ebd1..4439db254 100644 --- a/src/common/proxy-manager.js +++ b/src/common/proxy-manager.js @@ -4,7 +4,7 @@ (() => { const factory = (UserObject, Util, Hash, - SF, Messages = {}, Feedback, nThen) => { + Messages = {}, Feedback, nThen, SF = {}) => { let setCustomize = data => { Messages = data.Messages; @@ -617,7 +617,7 @@ const factory = (UserObject, Util, Hash, if (data.password) { folderData.password = data.password; } if (data.owned) { folderData.owners = [Env.edPublic]; } }).nThen(function (waitFor) { - Env.Store.getPadMetadata(null, { + Env.Store.pad.getMetadata(null, { channel: folderData.channel }, waitFor(function (obj) { if (obj && (obj.error || obj.rejected)) { @@ -669,7 +669,7 @@ const factory = (UserObject, Util, Hash, } if (data.folderData) { // If we're importing a folder, check its serverside metadata - Env.Store.getPadMetadata(null, { channel: folderData.channel }, function (md) { + Env.Store.pad.getMetadata(null, { channel: folderData.channel }, function (md) { var fData = Env.user.proxy[UserObject.SHARED_FOLDERS][id]; if (md.owners) { fData.owners = md.owners; } if (md.expire) { fData.expire = +md.expire; } @@ -1843,20 +1843,20 @@ if (typeof(module) !== 'undefined' && module.exports) { require('./user-object'), require('./common-util'), require('./common-hash'), - require('../worker/components/sharedfolder'), undefined, require('./common-feedback'), - require('nthen') + require('nthen'), + require('../worker/components/sharedfolder'), ); } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { define([ '/common/user-object.js', '/common/common-util.js', '/common/common-hash.js', - '/common/outer/sharedfolder.js', '/customize/messages.js', '/common/common-feedback.js', '/components/nthen/index.js', + // sharedfolder.js not needed outside of worker ], factory); } else { // unsupported initialization diff --git a/src/common/recurrence.js b/src/common/recurrence.js index 9fbb786ba..e683fd78d 100644 --- a/src/common/recurrence.js +++ b/src/common/recurrence.js @@ -687,7 +687,6 @@ const factory = (Util) => { return; } - var stop = false; var newrule = false; _toAdd.some(function (_newS) { @@ -700,6 +699,11 @@ const factory = (Util) => { _ev.start = +_evS; _ev.end = +_evE; _ev._count = c; + + Rec.applyUpdates([_ev]); + _evS = new Date(_ev.start); + _evE = new Date(_ev.end); + if (_ev.isAllDay && _ev.startDay) { _ev.startDay = getDateStr(_evS); } if (_ev.isAllDay && _ev.endDay) { _ev.endDay = getDateStr(_evE); } diff --git a/src/common/user-object-setter.js b/src/common/user-object-setter.js index 4c778ff66..1223815a5 100644 --- a/src/common/user-object-setter.js +++ b/src/common/user-object-setter.js @@ -48,6 +48,12 @@ const factory = (Util, Hash, Realtime) => { var oldHref = exp.getHref(data); if (oldHref === href) { return; } data.href = exp.cryptor.encrypt(href); + // Recompute roHref for form (auditor link) + const parsed = Hash.parsePadUrl(href); + if (parsed.type !== "form") { return; } + const secret = Hash.getSecrets(parsed.type, + parsed.hash, data.password); + data.roHref = '/' + parsed.type + '/#' + Hash.getViewHashFromKeys(secret); }); }; diff --git a/src/worker/async-store.js b/src/worker/async-store.js index 21a7388ba..a562749eb 100644 --- a/src/worker/async-store.js +++ b/src/worker/async-store.js @@ -2,29 +2,29 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Sortify, UserObject, ProxyManager, Migrate, Hash, Util, Constants, Feedback, - Realtime, Messaging, Pinpad, Rpc, Merge, Cache, - SF, AccountTS, DriveTS, Cursor, + Realtime, Messaging, Pinpad, Rpc, Cache, + SF, AccountTS, DriveTS, PadTS, Cursor, Support, Integration, OnlyOffice, Mailbox, Profile, Team, Messenger, History, Calendar, BadgeTS, Block, NetConfig, Crypto, ChainPad, CpNetflux, Listmap, Netflux, nThen) => { - let ApiConfig = {}; - let AppConfig = {}; const Account = AccountTS.Account; const Drive = DriveTS.Drive; + const Pad = PadTS.Pad; const Badge = BadgeTS.Badge; const window = globalThis; globalThis.nacl = globalThis.nacl || Crypto.Nacl; + let ApiConfig = {}; + let AppConfig = {}; + const Saferphore = Util.Saferphore; var onReadyEvt = Util.mkEvent(true); var onCacheReadyEvt = Util.mkEvent(true); - var onJoinedEvt = Util.mkEvent(true); var onPadRejectedEvt = Util.mkEvent(true); const setCustomize = data => { @@ -63,16 +63,23 @@ const factory = (Sortify, UserObject, ProxyManager, Store.onReadyEvt = onReadyEvt; + Store.pad = Pad.init({ + Store, store, postMessage, broadcast + }); + Store.drive = Drive.initAPI({ + Store, store, postMessage, broadcast + }); + // Drive clients var driveEventClients = []; - var sendDriveEvent = function (q, data, sender) { + var sendDriveEvent = store.sendDriveEvent = function (q, data, sender) { driveEventClients.forEach(function (cId) { if (cId === sender) { return; } postMessage(cId, q, data); }); }; - var getStore = function (teamId) { + var getStore = Store.getStore = function (teamId) { if (!teamId) { return store; } try { var teams = store.modules['team']; @@ -136,37 +143,6 @@ const factory = (Sortify, UserObject, ProxyManager, onSync(data.teamId, cb); }; - const copyObject = (src, target) => { - Object.keys(src).forEach(k => { - delete src[k]; - }); - Object.keys(target).forEach(k => { - src[k] = Util.clone(target[k]); - }); - }; - const getProxy = teamId => { - let proxy; - if (!teamId) { - proxy = store.drive?.proxy; - } else { - const s = getStore(teamId); - proxy = s?.drive?.proxy; - } - return proxy; - }; - Store.drive = { - get: (clientId, data, cb) => { - let proxy = getProxy(data.teamId); - if (!proxy) { return void cb({error: 'ENOTFOUND'}); } - cb(proxy); - }, - set: (clientId, data, cb) => { - let proxy = getProxy(data.teamId); - if (!proxy) { return void cb({error: 'ENOTFOUND'}); } - copyObject(proxy, data.value); - onSync(data.teamId, cb); - } - }; Store.getSharedFolder = function (clientId, data, cb) { var s = getStore(data.teamId); @@ -351,17 +327,6 @@ const factory = (Sortify, UserObject, ProxyManager, }); }; - // Update for all users from accounts and return current user limits - Store.updatePinLimit = function (clientId, data, cb) { - if (!store.rpc) { return void cb({error: 'RPC_NOT_READY'}); } - store.rpc.updatePinLimits(function (e, limit, plan, note) { - if (e) { return void cb({error: e}); } - account.limit = limit; - account.plan = plan; - account.note = note; - cb(account); - }); - }; // Get current user limits Store.getPinLimit = function (clientId, data, cb) { var s = getStore(data && data.teamId); @@ -383,47 +348,6 @@ const factory = (Sortify, UserObject, ProxyManager, cb(account); }; - // clearOwnedChannel is only used for private chat and forms - Store.clearOwnedChannel = function (clientId, data, cb) { - var s = getStore(data && data.teamId); - if (!s.rpc) { return void cb({error: 'RPC_NOT_READY'}); } - s.rpc.clearOwnedChannel(data.channel, function (err) { - cb({error:err}); - }); - }; - - var myDeletions = {}; - Store.removeOwnedChannel = function (clientId, data, cb) { - // "data" used to be a string (channelID), now it can also be an object - // data.force tells us we can safely remove the drive ID - var channel = data; - var force = false; - var teamId; - var reason; - if (data && typeof(data) === "object") { - channel = data.channel; - force = data.force; - teamId = data.teamId; - reason = data.reason; - } - - if (channel === store.driveChannel && !force) { - return void cb({error: 'User drive removal blocked!'}); - } - - var s = getStore(teamId); - if (!s) { return void cb({ error: 'ENOTFOUND' }); } - if (!s.rpc) { return void cb({error: 'RPC_NOT_READY'}); } - - // If this channel is loaded, remember that we deleted it ourselves - if (Store.channels[channel]) { myDeletions[channel] = true; } - - s.rpc.removeOwnedChannel(channel, function (err) { - if (err) { delete myDeletions[channel]; } - cb({error:err}); - }, reason); - }; - var arePinsSynced = function (cb) { if (!store.rpc) { return void cb({error: 'RPC_NOT_READY'}); } @@ -499,7 +423,7 @@ const factory = (Sortify, UserObject, ProxyManager, var initTempRpc = (clientId, cb) => { if (store.rpc) { return void cb(store.rpc); } var kp = Crypto.Nacl.sign.keyPair(); - var keys = { + var keys = store.tempKeys = { edPublic: Util.encodeBase64(kp.publicKey), edPrivate: Util.encodeBase64(kp.secretKey) }; @@ -859,7 +783,7 @@ const factory = (Sortify, UserObject, ProxyManager, })); }).nThen(function (_w) { if (otherOwners) { - Store.setPadMetadata(null, { + Store.pad.setMetadata(null, { channel: c, command: 'RM_OWNERS', value: [edPublic], @@ -922,7 +846,7 @@ const factory = (Sortify, UserObject, ProxyManager, }).nThen(function (waitFor) { // Delete Drive store.ownDeletion = true; - Store.removeOwnedChannel(clientId, { + Store.pad.destroy(clientId, { channel: store.driveChannel, force: true }, waitFor()); @@ -973,15 +897,6 @@ const factory = (Sortify, UserObject, ProxyManager, }); }; - /** - * Merge the anonymous drive into the user drive at registration - * data - * - anonHash - */ - Store.migrateAnonDrive = function (clientId, data, cb) { - var hash = data.anonHash; - Merge.anonDriveIntoUser(store, hash, cb); - }; // Set the display name (username) in the proxy Store.setDisplayName = function (clientId, value, cb) { @@ -1204,7 +1119,7 @@ const factory = (Sortify, UserObject, ProxyManager, return void cb({ notStored: true }); } - var channelData = Store.channels && Store.channels[channel]; + var channelData = Store.pad.getChannels()[channel]; var owners; if (channelData && channelData.wc && channel === channelData.wc.id) { @@ -1679,8 +1594,6 @@ const factory = (Sortify, UserObject, ProxyManager, /////////////////////// PAD ////////////////////////////////////// ////////////////////////////////////////////////////////////////// - var channels = Store.channels = store.channels = {}; - Store.getSnapshot = function (clientId, data, cb) { Store.getHistoryRange(clientId, { cpCount: 1, @@ -1689,55 +1602,6 @@ const factory = (Sortify, UserObject, ProxyManager, }, cb); }; - var getVersionHash = function (clientId, data) { - var validateKey; - var fakeNetflux = Hash.createChannelId(); - nThen(function (waitFor) { - Store.getPadMetadata(null, { - channel: data.channel - }, waitFor(function (md) { - if (md && md.rejected) { - postMessage(clientId, "PAD_ERROR", {type: "ERESTRICTED"}); - waitFor.abort(); - return; - } - validateKey = md.validateKey; - })); - }).nThen(function () { - Store.getHistoryRange(clientId, { - cpCount: 1, - channel: data.channel, - lastKnownHash: data.versionHash - }, function (obj) { - if (obj && obj.error) { - postMessage(clientId, "PAD_ERROR", obj.error); - return; - } - var msgs = obj.messages || []; - if (msgs.length && msgs[msgs.length - 1].serverHash !== data.versionHash) { - postMessage(clientId, "PAD_ERROR", {type: "HASH_NOT_FOUND"}); - return; - } - postMessage(clientId, "PAD_CONNECT", { - myID: fakeNetflux, - id: data.channel, - members: [fakeNetflux] - }); - (obj.messages || []).forEach(function (data) { - postMessage(clientId, "PAD_MESSAGE", { - msg: data.msg, - time: data.time, - user: fakeNetflux.slice(0,16), // fake history keeper to avoid validate - }); - }); - if (validateKey && store.messenger) { - store.messenger.storeValidateKey(data.channel, validateKey); - } - postMessage(clientId, "PAD_READY"); - }); - }); - }; - Store.onRejected = function (allowed, _cb) { var cb = Util.once(Util.mkAsync(_cb)); if (!Array.isArray(allowed)) { return void cb('ERESTRICTED'); } @@ -1788,226 +1652,6 @@ const factory = (Sortify, UserObject, ProxyManager, }); }; - Store.joinPad = function (clientId, data) { - if (data.versionHash) { - return void getVersionHash(clientId, data); - } - if (!Hash.isValidChannel(data.channel)) { - return void postMessage(clientId, "PAD_ERROR", 'INVALID_CHAN'); - } - var isNew = typeof channels[data.channel] === "undefined"; - var channel = channels[data.channel] = channels[data.channel] || { - queue: [], - data: {}, - clients: [], - bcast: function (cmd, data, notMe) { - channel.clients.forEach(function (cId) { - if (cId === notMe) { return; } - postMessage(cId, cmd, data); - }); - }, - history: [], - pushHistory: function (msg, isCp) { - if (isCp) { - // the current message is a checkpoint. - // push it to your worker's history, prepending it with cp| - // cp| and anything else related to checkpoints has already - // been stripped by chainpad-netflux-worker or within async store - // when the message was outgoing. - channel.history.push('cp|' + msg); - // since the latest message is a checkpoint, we are able to drop - // some of the older history, but we can't rely on checkpoints being - // correct, as they might be checkpoints from different forks - var i; - for (i = channel.history.length - 101; i > 0; i--) { - if (/^cp\|/.test(channel.history[i])) { break; } - } - channel.history = channel.history.slice(Math.max(i, 0)); - return; - } - channel.history.push(msg); - } - }; - if (channel.clients.indexOf(clientId) === -1) { - channel.clients.push(clientId); - } - - if (!isNew && channel.wc) { - postMessage(clientId, "PAD_CONNECT", { - myID: channel.wc.myID, - id: channel.wc.id, - members: channel.wc.members - }); - channel.wc.members.forEach(function (m) { - postMessage(clientId, "PAD_JOIN", m); - }); - channel.history.forEach(function (msg) { - postMessage(clientId, "PAD_MESSAGE", { - msg: CpNetflux.removeCp(msg), - user: channel.wc.myID, - validateKey: channel.data.validateKey - }); - }); - postMessage(clientId, "PAD_READY"); - - return; - } - var onError = function (err) { - // If it's a deletion started from this worker, different UI message - if (err && err.type === "EDELETED" && myDeletions[data.channel]) { - delete myDeletions[channel]; - err.ownDeletion = true; - } - channel.bcast("PAD_ERROR", err); - - if (err && err.type === "EDELETED" && Cache && Cache.clearChannel) { - Cache.clearChannel(data.channel); - } - - // If this is a DELETED, EXPIRED or RESTRICTED pad, leave the channel - if (["EDELETED", "EEXPIRED", "ERESTRICTED"].indexOf(err.type) === -1) { return; } - Store.leavePad(null, data, function () {}); - }; - var conf = { - Cache: store.neverCache ? undefined : Cache, - priority: 1, - onCacheStart: function () { - postMessage(clientId, "PAD_CACHE"); - }, - onCacheReady: function () { - postMessage(clientId, "PAD_CACHE_READY"); - }, - onReady: function (pad) { - var padData = pad.metadata || {}; - channel.data = padData; - if (padData && padData.validateKey && store.messenger) { - store.messenger.storeValidateKey(data.channel, padData.validateKey); - } - postMessage(clientId, "PAD_READY", pad.noCache); - /* - if (!store.proxy) { - postMessage(clientId, "PAD_READY", pad.noCache); - return; - } - onReadyEvt.reg(function () { - postMessage(clientId, "PAD_READY", pad.noCache); - }); - */ - }, - onMessage: function (m, user, validateKey, isCp, hash) { - channel.lastHash = hash; - channel.pushHistory(m, isCp); - channel.bcast("PAD_MESSAGE", { - user: user, - msg: m, - validateKey: validateKey - }); - }, - onJoin: function (m) { - channel.bcast("PAD_JOIN", m); - }, - onLeave: function (m) { - channel.bcast("PAD_LEAVE", m); - }, - onError: onError, - onChannelError: onError, - onRejected: Store.onRejected, - onConnectionChange: function (info) { - if (!info.state) { - channel.bcast("PAD_DISCONNECT"); - } - }, - onMetadataUpdate: function (metadata) { - channel.data = metadata || {}; - getAllStores().forEach(function (s) { - var allData = s.manager.findChannel(data.channel, true); - allData.forEach(function (obj) { - obj.data.owners = metadata.owners; - obj.data.atime = +new Date(); - if (metadata.expire) { - obj.data.expire = +metadata.expire; - } - }); - var send = s.sendEvent || sendDriveEvent; - send('DRIVE_CHANGE', { - path: ['drive', UserObject.FILES_DATA] - }); - }); - channel.bcast("PAD_METADATA", metadata); - }, - crypto: { - // The encryption and decryption is done in the outer window. - // This async-store only deals with already encrypted messages. - encrypt: function (m) { return m; }, - decrypt: function (m) { return m; } - }, - noChainPad: true, - channel: data.channel, - metadata: data.metadata, - network: store.network || store.networkPromise, - websocketURL: NetConfig.getWebsocketURL(), - onInit: function () { - onJoinedEvt.fire(); - }, - //readOnly: data.readOnly, - onConnect: function (wc, sendMessage) { - channel.sendMessage = function (msg, cId, cb) { - // Send to server - sendMessage(msg, function (err) { - if (err) { - return void cb({ error: err }); - } - // Broadcast to other tabs - channel.lastHash = msg.slice(0,64); - channel.pushHistory(CpNetflux.removeCp(msg), /^cp\|/.test(msg)); - channel.bcast("PAD_MESSAGE", { - user: wc.myID, - msg: CpNetflux.removeCp(msg), - validateKey: channel.data.validateKey - }, cId); - cb(); - }); - }; - channel.wc = wc; - channel.queue.forEach(function (data) { - channel.sendMessage(data.message, clientId); - }); - channel.queue = []; - channel.bcast("PAD_CONNECT", { - myID: wc.myID, - id: wc.id, - members: wc.members - }); - } - }; - channel.cpNf = CpNetflux.start(conf); - }; - Store.leavePad = function (clientId, data, cb) { - var channel = channels[data.channel]; - if (!channel || !channel.cpNf) { return void cb ({error: 'EINVAL'}); } - Store.dropChannel(data.channel); - cb(); - }; - Store.sendPadMsg = function (clientId, data, cb) { - var msg = data.msg; - var channel = channels[data.channel]; - if (!channel) { - return; } - if (!channel.wc) { - channel.queue.push(msg); - return void cb(); - } - channel.sendMessage(msg, clientId, cb); - }; - - Store.corruptedCache = function (clientId, channel) { - var chan = channels[channel]; - if (!chan || !chan.cpNf) { return; } - Cache.clearChannel(channel); - if (!chan.cpNf.resetCache) { return; } - chan.cpNf.resetCache(); - }; - // Unpin and pin the new channel in all team when changing a pad password Store.changePadPasswordPin = function (clientId, data, cb) { var oldChannel = data.oldChannel; @@ -2084,15 +1728,6 @@ const factory = (Sortify, UserObject, ProxyManager, cb(); }; - Store.getLastHash = function (clientId, data, cb) { - var chan = channels[data.channel]; - if (!chan) { return void cb({error: 'ENOCHAN'}); } - if (!chan.lastHash) { return void cb({error: 'EINVAL'}); } - cb({ - hash: chan.lastHash - }); - }; - // Delete a pad received with a burn after reading URL var notifyOwnerPadRemoved = function (data, obj) { @@ -2152,7 +1787,7 @@ const factory = (Sortify, UserObject, ProxyManager, edPrivate: Hash.encodeBase64(pair.secretKey) }, function (e, rpc) { if (e) { return void console.error(e); } - Store.getPadMetadata(null, { + Store.pad.getMetadata(null, { channel: channel }, function (md) { rpc.removeOwnedChannel(channel, function (err) { @@ -2167,75 +1802,6 @@ const factory = (Sortify, UserObject, ProxyManager, } }; - // Fetch the latest version of the metadata on the server and return it. - // If the pad is stored in our drive, update the local values of "owners" and "expire" - Store.getPadMetadata = function (clientId, data, _cb) { - var cb = Util.once(Util.mkAsync(_cb)); - - if (store.offline || !store.anon_rpc) { return void cb({ error: 'OFFLINE' }); } - if (!data.channel) { return void cb({ error: 'ENOTFOUND'}); } - if (data.channel.length !== 32) { return void cb({ error: 'EINVAL'}); } - if (!Hash.isValidChannel(data.channel)) { - Feedback.send('METADATA_INVALID_CHAN'); - return void cb({ error: 'EINVAL' }); - } - store.anon_rpc.send('GET_METADATA', data.channel, function (err, obj) { - if (err) { return void cb({error: err}); } - var metadata = (obj && obj[0]) || {}; - cb(metadata); - - // If you don't have access to the metadata, stop here - // (we can't update the local data) - if (metadata.rejected) { return; } - - // Update owners and expire time in the drive - getAllStores().forEach(function (s) { - var allData = s.manager.findChannel(data.channel, true); - var changed = false; - allData.forEach(function (obj) { - if (Sortify(obj.data.owners) !== Sortify(metadata.owners)) { - changed = true; - } - obj.data.owners = metadata.owners; - obj.data.atime = +new Date(); - if (metadata.expire) { - obj.data.expire = +metadata.expire; - } - }); - // If we had to change the "owners" field, redraw the drive UI - if (!changed) { return; } - var send = s.sendEvent || sendDriveEvent; - send('DRIVE_CHANGE', { - path: ['drive', UserObject.FILES_DATA] - }); - }); - }); - }; - Store.setPadMetadata = function (clientId, data, cb) { - if (!data.channel) { return void cb({ error: 'ENOTFOUND'}); } - if (!data.command) { return void cb({ error: 'EINVAL' }); } - var s = getStore(data.teamId); - if (!s) { return void cb({ error: 'ENOTFOUND' }); } - - var otherChannels = data.channels; - delete data.channels; - s.rpc.setMetadata(data, function (err, res) { - if (err) { return void cb({ error: err }); } - if (!Array.isArray(res) || !res.length) { return void cb({}); } - cb(res[0]); - }); - // If we have other related channels, send the command for them too - if (Array.isArray(otherChannels)) { - otherChannels.forEach(function (chan) { - var _d = Util.clone(data); - _d.channel = chan; - Store.setPadMetadata(clientId, _d, function () { - - }); - }); - } - }; - Store.deleteMailboxMessage = function (clientId, data, cb) { if (!store.anon_rpc) { return void cb({error: 'RPC_NOT_READY'}); } store.anon_rpc.send('DELETE_MAILBOX_MESSAGE', data, function (e) { @@ -2598,114 +2164,21 @@ const factory = (Sortify, UserObject, ProxyManager, s.manager.command(cmdData, cb2); }; - // Check if this is a channel that we shouldn't leave when closing the debug app - var alwaysOnline = function (chanId) { - if (!store) { return; } - // Drive - if (store.driveChannel === chanId) { return true; } - // Shared folders - if (SF.isSharedFolderChannel(chanId)) { return true; } - // Teams - if (Util.find(store, ['proxy', 'teams'])) { - var t = Util.find(store, ['proxy', 'teams']) || {}; - return Object.keys(t).some(function (id) { - return t[id].channel === chanId; - }); - } - // Profile - if (Util.find(store, ['proxy', 'profile', 'href'])) { - return Hash.hrefToHexChannelId(Util.find(store, ['proxy', 'profile', 'href'])) - === chanId; - } - }; - - var dropChannel = Store.dropChannel = function (chanId) { - console.error('Drop channel', chanId); - - try { - store.messenger.leavePad(chanId); - } catch (e) { console.error(e); } - try { - store.modules['cursor'].leavePad(chanId); - } catch (e) { console.error(e); } - try { - store.modules['integration'].leavePad(chanId); - } catch (e) { console.error(e); } - try { - store.onlyoffice.leavePad(chanId); - } catch (e) { console.error(e); } - - try { - if (alwaysOnline(chanId)) { - delete Store.channels[chanId]; - return; - } - } catch (e) { console.error(e); } - - try { - Cache.leaveChannel(chanId); - } catch (e) { console.error(e); } - - if (!Store.channels[chanId]) { return; } - - if (Store.channels[chanId].cpNf) { - Store.channels[chanId].cpNf.stop(); - } - - delete Store.channels[chanId]; - }; Store._removeClient = function (clientId) { var driveIdx = driveEventClients.indexOf(clientId); if (driveIdx !== -1) { driveEventClients.splice(driveIdx, 1); } - try { - store.onlyoffice?.removeClient(clientId); - } catch (e) { console.error(e); } - try { - store.mailbox?.removeClient(clientId); - } catch (e) { console.error(e); } + store.onlyoffice?.removeClient?.(clientId); + store.mailbox?.removeClient?.(clientId); Object.keys(store.modules).forEach(function (key) { - if (!store.modules[key]) { return; } - if (!store.modules[key].removeClient) { return; } - try { - store.modules[key].removeClient(clientId); - } catch (e) { console.error(e); } + store.modules[key]?.removeClient?.(clientId); }); - Object.keys(Store.channels).forEach(function (chanId) { - var chanIdx = Store.channels[chanId].clients.indexOf(clientId); - if (chanIdx !== -1) { - Store.channels[chanId].clients.splice(chanIdx, 1); - } - if (Store.channels[chanId].clients.length === 0) { - dropChannel(chanId); - } - }); + Store.pad?.removeClient?.(clientId); }; - - - -/* - var loadProfile = function (waitFor) { - store.profile = Profile.init({ - store: store, - updateMetadata: function () { - broadcast([], "UPDATE_METADATA"); - }, - pinPads: function (data, cb) { Store.pinPads(null, data, cb); }, - }, waitFor, function (ev, data, clients) { - clients.forEach(function (cId) { - postMessage(cId, 'PROFILE_EVENT', { - ev: ev, - data: data - }); - }); - }); - }; -*/ var loadOnlyOffice = function () { if (store.onlyoffice) { return; } store.onlyoffice = OnlyOffice.init(store, function (ev, data, clients) { @@ -2776,7 +2249,7 @@ const factory = (Sortify, UserObject, ProxyManager, loadSharedFolder: loadSharedFolder, settings: proxy.settings, removeOwnedChannel: function (channel, cb) { - Store.removeOwnedChannel('', channel, cb); + Store.pad.destroy('', channel, cb); }, store: store, Store: Store @@ -3028,7 +2501,7 @@ const factory = (Sortify, UserObject, ProxyManager, // don't always call onCacheReady and onReady? // it depends on what was required by the first tab onAccountCacheReady(returned => { - store.returned ||= returned; + store.cacheReturned ||= returned; cacheCb(returned); }); onAccountReady(returned => { @@ -3051,8 +2524,9 @@ const factory = (Sortify, UserObject, ProxyManager, setInterval(function () { var clients = []; - Object.keys(Store.channels).forEach(function (chanId) { - var c = Store.channels[chanId].clients; + const channels = Store.pad.getChannels(); + Object.keys(channels).forEach(function (chanId) { + var c = channels[chanId].clients; Array.prototype.push.apply(clients, c); }); clients = Util.deduplicateString(clients); @@ -3092,7 +2566,7 @@ const factory = (Sortify, UserObject, ProxyManager, } = drive; onDriveCacheReady(() => { - cacheCb(store.returned); + cacheCb(store.cacheReturned || store.returned); }); onDriveReady(() => { cb(store.returned); @@ -3134,13 +2608,6 @@ const factory = (Sortify, UserObject, ProxyManager, */ var initialized = false; - // Are we still in noDrive mode? - Store.hasDrive = function (clientId, data, cb) { - cb({ - state: Boolean(store.proxy) - }); - }; - const loadHK = (cb) => { if (store?.network?.historyKeeper) { return setTimeout(cb); @@ -3170,7 +2637,8 @@ const factory = (Sortify, UserObject, ProxyManager, }; // If we load CryptPad for the first time from an existing pad, don't create a // drive automatically. - var onNoDrive = function (clientId, cb, initRpc) { + var onNoDrive = function (clientId, _cb, initRpc) { + const cb = Util.once(_cb); var andThen = function () { // Initialize modules that can be used by pads // and don't require account data @@ -3182,30 +2650,37 @@ const factory = (Sortify, UserObject, ProxyManager, cb({}); }); }; - if (initRpc) { - // In integration mode, we may need an RPC - return initTempRpc(clientId, getAnon); - } - getAnon(); + // We need to know the HistoryKeeper ID + // to initialize the anon RPC + loadHK(err => { + if (err) { return; } + if (initRpc) { + // In integration mode, we may need + // an authenticated RPC + return initTempRpc(clientId, getAnon); + } + getAnon(); + }); + // If initRpc is true, we need to wait for a network + // before calling back + if (!store.network && !initRpc) { cb({}); } }; // We need an anonymous RPC to be able to check if the pad exists and to get // its metadata, so we have to create a network first. if (!store.network) { var wsUrl = NetConfig.getWebsocketURL(); - return void Netflux.connect(wsUrl).then(function (network) { - // If we already haave a network (race condition), use the - // existing one and forget this one + store.networkPromise = Netflux.connect(wsUrl); + andThen(); + return store.networkPromise.then((network) => { + if (store.network === network) { return; } + // If we already haave a network (race condition) + // use the existing one and forget this one if (!store.network) { store.network = network; } else { network.disconnect(); network = store.network; } - // We need to know the HistoryKeeper ID to initialize the anon RPC - loadHK(err => { - if (err) { return void cb(err); } - andThen(); - }); }, function (err) { console.error(err); cb({error: 'OFFLINE'}); @@ -3240,6 +2715,10 @@ const factory = (Sortify, UserObject, ProxyManager, if (obj?.error) { Feedback.send("NO_DRIVE_ERROR", true); } + if (!!data.neverDrive) { + // Send temp RPC keys to the browser to allow upload + obj.tempKeys = store?.tempKeys; + } cb(obj); }, !!data.neverDrive); } @@ -3285,7 +2764,13 @@ const factory = (Sortify, UserObject, ProxyManager, startModules(clientId, ret, onInit); }); }); - onJoinedEvt.reg(next); + Store.pad.onCacheReady(() => { + // If we're online, wait for onJoined + if (store.network) { return; } + // Otherwise, continue with cached drive + next(); + }); + Store.pad.onJoined(next); onPadRejectedEvt.reg(next); }); } @@ -3402,8 +2887,9 @@ const factory = (Sortify, UserObject, ProxyManager, }); } - // If this is not the first tab (initialized is true), it means either we don't - // support offline or we're already online + // If this is not the first tab (initialized is true), + // it means either we don't support offline or we're + // already online if (initialized) { if (store.networkTimeout) { postMessage(clientId, "LOADING_DRIVE", { @@ -3471,48 +2957,41 @@ const factory = (Sortify, UserObject, ProxyManager, }; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('json.sortify'), - require('../common/user-object'), - require('../common/proxy-manager'), - require('./components/migrate-user-object'), - require('../common/common-hash'), - require('../common/common-util'), - require('../common/common-constants'), - require('../common/common-feedback'), - require('../common/common-realtime'), - require('./components/messaging'), - require('../common/pinpad'), - require('../common/rpc'), - require('./components/merge-drive'), - require('../common/cache-store'), - require('./components/sharedfolder'), - require('./components/account'), // .ts - require('./components/drive'), // .ts - require('./modules/cursor'), - require('./modules/support'), - require('./modules/integration'), - require('./modules/onlyoffice'), - require('./modules/mailbox'), - require('./modules/profile'), - require('./modules/team'), - require('./modules/messenger'), - require('./modules/history'), - require('./modules/calendar'), - require('./modules/badge'), - require('../common/login-block'), - require('../common/network-config'), - require('chainpad-crypto'), - require('chainpad'), - require('chainpad-netflux'), - require('chainpad-listmap'), - require('netflux-websocket'), - require('nthen') - ); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('json.sortify'), + require('../common/user-object'), + require('../common/proxy-manager'), + require('./components/migrate-user-object'), + require('../common/common-hash'), + require('../common/common-util'), + require('../common/common-constants'), + require('../common/common-feedback'), + require('../common/common-realtime'), + require('./components/messaging'), + require('../common/pinpad'), + require('../common/rpc'), + require('../common/cache-store'), + require('./components/sharedfolder'), + require('./components/account'), // .ts + require('./components/drive'), // .ts + require('./components/pad'), // .ts + require('./modules/cursor'), + require('./modules/support'), + require('./modules/integration'), + require('./modules/onlyoffice'), + require('./modules/mailbox'), + require('./modules/profile'), + require('./modules/team'), + require('./modules/messenger'), + require('./modules/history'), + require('./modules/calendar'), + require('./modules/badge'), // .ts + require('../common/outer/login-block'), + require('../common/network-config'), + require('chainpad-crypto'), + require('chainpad'), + require('chainpad-netflux'), + require('chainpad-listmap'), + require('netflux-websocket'), + require('nthen') +); diff --git a/src/worker/components/account.ts b/src/worker/components/account.ts index 64829bbf0..84a49c2e9 100644 --- a/src/worker/components/account.ts +++ b/src/worker/components/account.ts @@ -36,10 +36,12 @@ const init = (config) => { // Create account secret from hash const secret = Hash.getSecrets('drive', hash); + const network = config.store?.network || + config.store?.networkPromise; const listmapConfig = { data: {}, websocketURL: NetConfig.getWebsocketURL(), - network: config.store?.network, + network: network, channel: secret.channel, readOnly: false, validateKey: secret.keys?.validateKey || undefined, @@ -71,10 +73,14 @@ const init = (config) => { }).on('cacheready', function (info) { store.realtime = info.realtime; store.offline = true; - store.networkPromise = info.networkPromise; + const hadPromise = !!store.networkPromise; + store.networkPromise ||= info.networkPromise; store.cacheReturned = returned; - if (store.networkPromise && store.networkPromise.then) { + // Show error if we can't connect, but only if the accounts + // was required first + if (store.networkPromise && store.networkPromise.then + && !hadPromise) { // Check if we can connect const to = setTimeout(function () { store.networkTimeout = true; diff --git a/src/worker/components/drive.ts b/src/worker/components/drive.ts index 6a97e94d6..19dc0c885 100644 --- a/src/worker/components/drive.ts +++ b/src/worker/components/drive.ts @@ -3,7 +3,8 @@ // SPDX-License-Identifier: AGPL-3.0-or-later import nacl from 'tweetnacl/nacl-fast'; -import { Drive } from '../types' +import { Drive } from '../types'; +import * as Merge from './merge-drive'; // node modules import * as Listmap from 'chainpad-listmap'; @@ -21,10 +22,59 @@ const onReadyEvt: any = Util.mkEvent(true); const onDisconnectEvt: any = Util.mkEvent(); const onReconnectEvt: any = Util.mkEvent(); -const init = (config) => { - const { broadcast, store, account } = config; +const copyObject = (src, target) => { + Object.keys(src).forEach(k => { + delete src[k]; + }); + Object.keys(target).forEach(k => { + src[k] = Util.clone(target[k]); + }); +}; +const getProxy = (ctx, teamId) => { + const store = ctx.store; + const Store = ctx.Store; + let proxy; + if (!teamId) { + proxy = store.drive?.proxy; + } else { + const s = Store.getStore(teamId); + proxy = s?.proxy?.drive; + } + return proxy; +}; - const drive = store.drive = store.drive || {}; +const initAPI = (config) => { + const { broadcast, store, Store, account } = config; + const ctx = { + store, + Store + }; + + return { + exists: (clientId, data, cb) => { + cb({ state: Boolean(store.proxy) }); + }, + get: (clientId, data, cb) => { + let proxy = getProxy(ctx, data.teamId); + if (!proxy) { return void cb({error: 'ENOTFOUND'}); } + cb({drive: proxy}); + }, + set: (clientId, data, cb) => { + let proxy = getProxy(ctx, data.teamId); + if (!proxy) { return void cb({error: 'ENOTFOUND'}); } + copyObject(proxy, data.value); + Store.onSync(data.teamId, cb); + }, + migrateAnon: (clientId, data, cb) => { + Merge.anonDriveIntoUser(store, data.anonHash, cb); + } + }; + +}; +const init = (config) => { + const { broadcast, store, Store, account } = config; + + const drive = store.drive ||= {}; let data = store.proxy?.drive; const hash:string = data?.hash || Hash.createRandomHash('drive'); @@ -112,7 +162,8 @@ const init = (config) => { }; const Drive: Drive = { - init: init, + init, + initAPI }; export { Drive } diff --git a/src/worker/components/invitation.js b/src/worker/components/invitation.js index c066c7c21..0424809e5 100644 --- a/src/worker/components/invitation.js +++ b/src/worker/components/invitation.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(function () { var factory = function (Util, Cred, Nacl, Crypto) { var Invite = {}; @@ -102,21 +101,9 @@ var factory = function (Util, Cred, Nacl, Crypto) { return Invite; }; - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require("../../common/common-util"), - require("../../common/common-credential"), - require("tweetnacl/nacl-fast"), - require("chainpad-crypto") - ); - } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-credential.js', - '/components/chainpad-crypto/crypto.js', - '/components/tweetnacl/nacl-fast.min.js', - ], function (Util, Cred, Crypto) { - return factory(Util, Cred, window.nacl, Crypto); - }); - } -}()); +module.exports = factory( + require("../../common/common-util"), + require("../../common/common-credential"), + require("tweetnacl/nacl-fast"), + require("chainpad-crypto") +); diff --git a/src/worker/components/mailbox-handlers.js b/src/worker/components/mailbox-handlers.js index f5b00b386..d4b47f39e 100644 --- a/src/worker/components/mailbox-handlers.js +++ b/src/worker/components/mailbox-handlers.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Messaging, Hash, Util, Crypto, Block) => { // Random timeout between 10 and 30 times your sync time (lag + chainpad sync) @@ -222,14 +221,30 @@ const factory = (Messaging, Hash, Util, Crypto, Block) => { var curve = msg.author; var friend = ctx.store.proxy.friends && ctx.store.proxy.friends[curve]; if (!friend || typeof msg.content !== "object") { return void cb(true); } - Object.keys(msg.content).forEach(function (key) { - friend[key] = msg.content[key]; - }); - if (ctx.store.messenger) { - ctx.store.messenger.onFriendUpdate(curve); + const edPublic = msg.content.edPublic; + + const todo = () => { + Object.keys(msg.content).forEach(function (key) { + friend[key] = msg.content[key]; + }); + if (ctx.store.messenger) { + ctx.store.messenger.onFriendUpdate(curve); + } + ctx.updateMetadata(); + cb(true); + }; + + if (msg.content.badge && ctx.store.modules['badge']) { + return ctx.store.modules['badge'].listBadges({ + edPublic + }, (list => { + if (!list.includes(msg.content.badge)) { + delete msg.content['badge']; + } + todo(); + })); } - ctx.updateMetadata(); - cb(true); + todo(); }; // Encrypt the password under the right key before sending it via URL hash @@ -983,24 +998,10 @@ const factory = (Messaging, Hash, Util, Crypto, Block) => { }; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('./messaging'), - require('../../common/common-hash'), - require('../../common/common-util'), - require('chainpad-crypto'), - require('../../common/login-block') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/outer/messaging.js', - '/common/common-hash.js', - '/common/common-util.js', - '/components/chainpad-crypto/crypto.js', - '/common/outer/login-block.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('./messaging'), + require('../../common/common-hash'), + require('../../common/common-util'), + require('chainpad-crypto'), + require('../../common/outer/login-block') +); diff --git a/src/worker/components/merge-drive.js b/src/worker/components/merge-drive.js index c7dc5163a..6f950962b 100644 --- a/src/worker/components/merge-drive.js +++ b/src/worker/components/merge-drive.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Crypt, FO, Hash, Realtime) => { var exp = {}; @@ -91,22 +90,9 @@ const factory = (Crypt, FO, Hash, Realtime) => { return exp; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/cryptget'), - require('../../common/user-object'), - require('../../common/common-hash'), - require('../../common/common-realtime') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/cryptget.js', - '/common/user-object.js', - '/common/common-hash.js', - '/common/common-realtime.js', - ], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory( + require('../../common/cryptget'), + require('../../common/user-object'), + require('../../common/common-hash'), + require('../../common/common-realtime') +); diff --git a/src/worker/components/messaging.js b/src/worker/components/messaging.js index a00419f24..b286bfe1a 100644 --- a/src/worker/components/messaging.js +++ b/src/worker/components/messaging.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Crypto, Hash, Util, Constants, Realtime) => { var Msg = {}; @@ -140,23 +139,10 @@ const factory = (Crypto, Hash, Util, Constants, Realtime) => { return Msg; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('chainpad-crypto'), - require('../../common/common-hash'), - require('../../common/common-util'), - require('../../common/common-constants'), - require('../../common/common-realtime') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/components/chainpad-crypto/crypto.js', - '/common/common-hash.js', - '/common/common-util.js', - '/common/common-constants.js', - '/common/common-realtime.js', - ], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory( + require('chainpad-crypto'), + require('../../common/common-hash'), + require('../../common/common-util'), + require('../../common/common-constants'), + require('../../common/common-realtime') +); diff --git a/src/worker/components/migrate-user-object.js b/src/worker/components/migrate-user-object.js index 23ef1103a..a6d71cbe2 100644 --- a/src/worker/components/migrate-user-object.js +++ b/src/worker/components/migrate-user-object.js @@ -2,11 +2,11 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Feedback, Hash, Util, - Messaging, Crypt, Mailbox, Messages = {}, + Messaging, Crypt, Mailbox, Realtime, nThen, Crypto) => { + let Messages = {}; const setCustomize = data => { Messages = data.Messages; }; @@ -507,35 +507,14 @@ const factory = (Feedback, Hash, Util, return migrate; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('../../common/common-feedback'), - require('../../common/common-hash'), - require('../../common/common-util'), - require('./messaging'), - require('../../common/cryptget'), - require('../modules/mailbox'), - undefined, - require('../../common/common-realtime'), - require('nthen'), - require('chainpad-crypto') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-feedback.js', - '/common/common-hash.js', - '/common/common-util.js', - '/common/outer/messaging.js', - '/common/cryptget.js', - '/common/outer/mailbox.js', - '/customize/messages.js', - '/common/common-realtime.js', - '/components/nthen/index.js', - '/components/chainpad-crypto/crypto.js', - ], factory); -} else { - // unsupported initialization -} - -})(); - +module.exports = factory( + require('../../common/common-feedback'), + require('../../common/common-hash'), + require('../../common/common-util'), + require('./messaging'), + require('../../common/cryptget'), + require('../modules/mailbox'), + require('../../common/common-realtime'), + require('nthen'), + require('chainpad-crypto') +); diff --git a/src/worker/components/pad.ts b/src/worker/components/pad.ts new file mode 100644 index 000000000..d6abb221c --- /dev/null +++ b/src/worker/components/pad.ts @@ -0,0 +1,545 @@ +// SPDX-FileCopyrightText: 2025 XWiki CryptPad Team and contributors +// +// SPDX-License-Identifier: AGPL-3.0-or-later + +import nacl from 'tweetnacl/nacl-fast'; +import { Pad, RpcCall, Callback } from '../types' + +// node modules +import * as ChainPad from 'chainpad'; +import * as Crypto from 'chainpad-crypto'; +import * as CpNetflux from 'chainpad-netflux'; +import nThen from 'nthen'; +import Sortify from 'json.sortify'; +// custom modules +import * as NetConfig from '../../common/network-config.js'; +import * as Hash from '../../common/common-hash.js'; +import * as Util from '../../common/common-util.js'; +import * as Cache from '../../common/cache-store.js'; +import * as UserObject from '../../common/user-object.js'; + +import * as SF from './sharedfolder.js'; + +const onJoinedEvt: any = Util.mkEvent(true); +const onCacheReadyEvt: any = Util.mkEvent(true); + +const _getMetadata: Callback = (ctx, clientId, data, _cb) => { + const cb = Util.once(Util.mkAsync(_cb)); + const { store, Store } = ctx; + + if (store.offline || !store.anon_rpc) { + return void cb({ error: 'OFFLINE' }); + } + if (!data.channel) { + return void cb({ error: 'ENOTFOUND'}); + } + if (data.channel.length !== 32) { + return void cb({ error: 'EINVAL'}); + } + if (!Hash.isValidChannel(data.channel)) { + return void cb({ error: 'EINVAL' }); + } + + store.anon_rpc.send('GET_METADATA', data.channel, (err, obj) => { + if (err) { return void cb({error: err}); } + const metadata = (obj && obj[0]) || {}; + cb(metadata); + + // If you don't have access to the metadata, stop here + // (we can't update the local data) + if (metadata.rejected) { return; } + + // Update owners and expire time in the drive + Store.getAllStores().forEach(s => { + const allData = s.manager.findChannel(data.channel, true); + let changed = false; + allData.forEach(obj => { + if (Sortify(obj.data.owners) !== Sortify(metadata.owners)) { + changed = true; + } + obj.data.owners = metadata.owners; + obj.data.atime = +new Date(); + if (metadata.expire) { + obj.data.expire = +metadata.expire; + } + }); + + // If we had to change the "owners" field, + // redraw the drive UI + if (!changed) { return; } + var send = s.sendEvent || store.sendDriveEvent; + send('DRIVE_CHANGE', { + path: ['drive', UserObject.FILES_DATA] + }); + }); + }); +}; +const _setMetadata: Callback = (ctx, clientId, data, cb) => { + if (!data.channel) { return void cb({ error: 'ENOTFOUND'}); } + if (!data.command) { return void cb({ error: 'EINVAL' }); } + const { Store } = ctx; + const s = Store.getStore(data.teamId); + if (!s) { return void cb({ error: 'ENOTFOUND' }); } + + const otherChannels = data.channels; + delete data.channels; + s.rpc.setMetadata(data, (err, res) => { + if (err) { return void cb({ error: err }); } + if (!Array.isArray(res) || !res.length) { return void cb({}); } + cb(res[0]); + }); + // If we have other related channels, send the command for them too + if (Array.isArray(otherChannels)) { + otherChannels.forEach(chan => { + var _d = Util.clone(data); + _d.channel = chan; + Store.setPadMetadata(clientId, _d, () => {}); + }); + } +}; + +const _getVersionHash: Callback = (ctx, clientId, data) => { + let validateKey; + const { Store, store, postMessage } = ctx; + + const channel = data.channel; + const toFind = data.versionHash; + + // create fake history keeper to avoid validate + const fakeNetflux = Hash.createChannelId(); + + nThen(waitFor => { + _getMetadata(ctx, clientId, { channel }, waitFor(md => { + if (md && md.rejected) { + postMessage(clientId, "PAD_ERROR", { + type: "ERESTRICTED" + }); + waitFor.abort(); + return; + } + validateKey = md.validateKey; + })); + }).nThen(() => { + Store.getHistoryRange(clientId, { + cpCount: 1, + channel, + lastKnownHash: toFind + }, obj => { + if (obj && obj.error) { + return postMessage(clientId, "PAD_ERROR", obj.error); + } + const msgs = obj.messages || []; + if (msgs[msgs.length - 1]?.serverHash !== toFind) { + return postMessage(clientId, "PAD_ERROR", { + type: "HASH_NOT_FOUND" + }); + } + postMessage(clientId, "PAD_CONNECT", { + myID: fakeNetflux, + id: channel, + members: [fakeNetflux] + }); + (obj.messages || []).forEach(data => { + postMessage(clientId, "PAD_MESSAGE", { + msg: data.msg, + time: data.time, + user: fakeNetflux.slice(0,16) + }); + }); + if (validateKey) { + store?.messenger?.storeValidateKey(channel, validateKey); + } + postMessage(clientId, "PAD_READY"); + }); + }); +}; + +const _join: Callback = (ctx, clientId, data) => { + if (data.versionHash) { + return _getVersionHash(ctx, clientId, data); + } + + const { channels, store, Store, myDeletions, postMessage } = ctx; + const channelId = data.channel; + + if (!Hash.isValidChannel(channelId)) { + return postMessage(clientId, "PAD_ERROR", 'INVALID_CHAN'); + } + + const isNew = typeof channels[channelId] === "undefined"; + + // Create or get existing channel object + const channel = channels[channelId] ||= { + queue: [], + data: {}, + clients: [], + bcast: (cmd, data, notMe) => { + channel.clients.forEach(function (cId) { + if (cId === notMe) { return; } + postMessage(cId, cmd, data); + }); + }, + history: [], + pushHistory: (msg, isCp) => { + if (isCp) { + // Checkpoint, re-add "cp|" and clear older history + channel.history.push('cp|' + msg); + let i; + for (i = channel.history.length - 101; i > 0; i--) { + if (/^cp\|/.test(channel.history[i])) { break; } + } + channel.history = channel.history.slice(i); + return; + } + channel.history.push(msg); + } + }; + + // Add new client + if (channel.clients.indexOf(clientId) === -1) { + channel.clients.push(clientId); + } + + // Existing pad already loaded: send userlist and history + if (!isNew && channel.wc) { + postMessage(clientId, "PAD_CONNECT", { // Initialize + myID: channel.wc.myID, + id: channel.wc.id, + members: channel.wc.members + }); + channel.wc.members.forEach(m => { // Userlist + postMessage(clientId, "PAD_JOIN", m); + }); + channel.history.forEach(msg => { // History + postMessage(clientId, "PAD_MESSAGE", { + msg: CpNetflux.removeCp(msg), + user: channel.wc.myID, + validateKey: channel.data.validateKey + }); + }); + postMessage(clientId, "PAD_READY"); // Ready + return; + } + + // chainpad-netflux config + const onError = err => { + const type = err?.type; + // Deletion started from this worker => different UI message + if (type === "EDELETED" && myDeletions[channelId]) { + delete myDeletions[channelId]; + err.ownDeletion = true; + } + channel.bcast("PAD_ERROR", err); + + if (type === "EDELETED" && Cache?.clearChannel) { + Cache.clearChannel(channelId); + } + + // DELETED, EXPIRED or RESTRICTED pad => leave the channel + if (!["EDELETED","EEXPIRED","ERESTRICTED"].includes(type)) { + return; + } + ctx.leavePad(null, data, function () {}); + }; + const conf = { + Cache: store.neverCache ? undefined : Cache, + priority: 1, + onCacheStart: () => { + postMessage(clientId, "PAD_CACHE"); + }, + onCacheReady: () => { + postMessage(clientId, "PAD_CACHE_READY"); + onCacheReadyEvt.fire(); + }, + onReady: pad => { + const padData = pad.metadata || {}; + channel.data = padData; + if (padData?.validateKey && store.messenger) { + store.messenger.storeValidateKey(channelId, padData.validateKey); + } + postMessage(clientId, "PAD_READY", pad.noCache); + }, + onMessage: function (m, user, validateKey, isCp, hash) { + channel.lastHash = hash; + channel.pushHistory(m, isCp); + channel.bcast("PAD_MESSAGE", { + user: user, + msg: m, + validateKey: validateKey + }); + }, + onJoin: function (m) { + channel.bcast("PAD_JOIN", m); + }, + onLeave: function (m) { + channel.bcast("PAD_LEAVE", m); + }, + onError: onError, + onChannelError: onError, + onRejected: Store.onRejected, + onConnectionChange: info => { + if (!info.state) { + channel.bcast("PAD_DISCONNECT"); + } + }, + onMetadataUpdate: metadata => { + channel.data = metadata || {}; + Store.getAllStores().forEach(s => { + let allData = s.manager.findChannel(channelId, true); + allData.forEach(obj => { + obj.data.owners = metadata.owners; + obj.data.atime = +new Date(); + if (metadata.expire) { + obj.data.expire = +metadata.expire; + } + }); + const send = s.sendEvent || store.sendDriveEvent; + send('DRIVE_CHANGE', { + path: ['drive', UserObject.FILES_DATA] + }); + }); + channel.bcast("PAD_METADATA", metadata); + }, + crypto: { + // Encryption and decryption is done in the outer window + // Async-store only deals with encrypted messages + encrypt: function (m) { return m; }, + decrypt: function (m) { return m; } + }, + noChainPad: true, + channel: channelId, + metadata: data.metadata, + network: store.network || store.networkPromise, + websocketURL: NetConfig.getWebsocketURL(), + onInit: function () { + onJoinedEvt.fire(); + }, + //readOnly: data.readOnly, + onConnect: (wc, sendMessage) => { + channel.sendMessage = (msg, cId, cb) => { + // Send to server + sendMessage(msg, err => { + if (err) { return void cb({ error: err }); } + // Broadcast to other tabs + channel.lastHash = msg.slice(0,64); + channel.pushHistory(CpNetflux.removeCp(msg), /^cp\|/.test(msg)); + channel.bcast("PAD_MESSAGE", { + user: wc.myID, + msg: CpNetflux.removeCp(msg), + validateKey: channel.data.validateKey + }, cId); + cb(); + }); + }; + channel.wc = wc; + channel.queue.forEach(function (data) { + channel.sendMessage(data.message, clientId); + }); + channel.queue = []; + channel.bcast("PAD_CONNECT", { + myID: wc.myID, + id: wc.id, + members: wc.members + }); + } + }; + channel.cpNf = CpNetflux.start(conf); +}; + +// Send a message to a pad we already joined +const _sendMessage: Callback = (ctx, clientId, data, cb) => { + var msg = data.msg; + var channel = ctx.channels[data.channel]; + if (!channel) { return; } + if (!channel.wc) { + channel.queue.push(msg); + return void cb(); + } + channel.sendMessage(msg, clientId, cb); +}; + +const _onCorruptedCache: Callback = (ctx, clientId, channel) => { + var chan = ctx.channels[channel]; + if (!chan || !chan.cpNf) { return; } + Cache.clearChannel(channel); + if (!chan.cpNf.resetCache) { return; } + chan.cpNf.resetCache(); +}; + +const _getLastHash: Callback = (ctx, clientId, data, cb) => { + var chan = ctx.channels[data.channel]; + if (!chan) { return void cb({error: 'ENOCHAN'}); } + if (!chan.lastHash) { return void cb({error: 'EINVAL'}); } + cb({ + hash: chan.lastHash + }); +}; + +// clearOwnedChannel is only used for private chat and forms +const _clear: Callback = (ctx, clientId, data, cb) => { + const { Store } = ctx; + const s = Store.getStore(data && data.teamId); + if (!s.rpc) { return void cb({error: 'RPC_NOT_READY'}); } + s.rpc.clearOwnedChannel(data.channel, err => { + cb({error:err}); + }); +}; + +const _destroy: Callback = (ctx, clientId, data, cb) => { + const { store, Store, channels, myDeletions } = ctx; + + // "data" used to be a channelId, now it can also be an object + // data.force tells us we can safely remove the drive ID + let channel = data; + let force = false; + let teamId, reason; + if (data && typeof(data) === "object") { + ({ channel, force, teamId, reason } = data); + } + + if (channel === store.driveChannel && !force) { + return void cb({error: 'User drive removal blocked!'}); + } + + const s = Store.getStore(teamId); + if (!s) { return void cb({ error: 'ENOTFOUND' }); } + if (!s.rpc) { return void cb({error: 'RPC_NOT_READY'}); } + + // If this channel is loaded, store that we deleted it ourselves + if (channels[channel]) { myDeletions[channel] = true; } + + s.rpc.removeOwnedChannel(channel, err => { + if (err) { delete myDeletions[channel]; } + cb({error:err}); + }, reason); +}; + +const alwaysOnline = (ctx, chanId) => { + const { store } = ctx; + if (!store) { return false; } + // Drive + if (store.driveChannel === chanId) { return true; } + // Shared folders + if (SF.isSharedFolderChannel(chanId)) { return true; } + // Teams + if (Util.find(store, ['proxy', 'teams'])) { + var t = Util.find(store, ['proxy', 'teams']) || {}; + return Object.keys(t).some(id => { + return t[id].channel === chanId; + }); + } + // Profile + if (Util.find(store, ['proxy', 'profile', 'href'])) { + let href = Util.find(store, ['proxy', 'profile', 'href']); + return Hash.hrefToHexChannelId(href) === chanId; + } +}; +const dropChannel = (ctx, chanId) => { + const store = ctx.store; + store.messenger?.leavePad?.(chanId); + store.onlyoffice?.leavePad?.(chanId); + Object.keys(store.modules).forEach(key => { + store.modules[key]?.leavePad?.(chanId); + }); + + if (!alwaysOnline(ctx, chanId)) { + try { + Cache.leaveChannel(chanId); + } catch (e) { console.error(e); } + ctx.channels[chanId]?.cpNf?.stop(); + } + delete ctx.channels[chanId]; +}; + +const init = (config) => { + const { broadcast, postMessage, store, Store } = config; + + /** XXX + * Variables + * Store.channels, store.channels + * + * Methods + * sendPadMsg, corruptedCache, getLastHash + **/ + + const ctx = { + channels: [], + postMessage, + store, + Store, + myDeletions: [], + leavePad: (clientId, data, cb) => {} + }; + + const join: RpcCall = (clientId, data, cb) => { + _join(ctx, clientId, data, cb); + }; + const destroy: RpcCall = (clientId, data, cb) => { + _destroy(ctx, clientId, data, cb); + }; + const clear: RpcCall = (clientId, data, cb) => { + _clear(ctx, clientId, data, cb); + }; + const setMetadata: RpcCall = (clientId, data, cb) => { + _setMetadata(ctx, clientId, data, cb); + }; + const getMetadata: RpcCall = (clientId, data, cb) => { + _getMetadata(ctx, clientId, data, cb); + }; + const sendMessage: RpcCall = (clientId, data, cb) => { + _sendMessage(ctx, clientId, data, cb); + }; + const onCorruptedCache: RpcCall = (clientId, data, cb) => { + _onCorruptedCache(ctx, clientId, data, cb); + }; + const getLastHash: RpcCall = (clientId, data, cb) => { + _getLastHash(ctx, clientId, data, cb); + }; + + const removeClient = clientId => { + Object.keys(ctx.channels).forEach(chanId => { + let idx = ctx.channels[chanId].clients.indexOf(clientId); + if (idx !== -1) { + ctx.channels[chanId].clients.splice(idx, 1); + } + if (ctx.channels[chanId].clients.length === 0) { + dropChannel(ctx, chanId); + } + }); + }; + const leave: RpcCall = (clientId, data, cb) => { + const channel = ctx.channels[data.channel]; + if (!channel?.cpNf) { return void cb ({error: 'EINVAL'}); } + dropChannel(ctx, data.channel); + cb(); + }; + ctx.leavePad = leave; + + const getChannels = () => { + return ctx.channels; + }; + + return { + join, + destroy, + clear, + setMetadata, + getMetadata, + sendMessage, + onCorruptedCache, + getLastHash, + leave, + removeClient, + onJoined: onJoinedEvt.reg, + onCacheReady: onCacheReadyEvt.reg, + getChannels + }; +}; + +const Pad: Pad = { + init: init +}; + +export { Pad } + + diff --git a/src/worker/components/roster.js b/src/worker/components/roster.js index 9db315c3a..198b37f3c 100644 --- a/src/worker/components/roster.js +++ b/src/worker/components/roster.js @@ -2,8 +2,7 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(function () { -var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto, Feedback) { +var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto) { var Roster = {}; // this constant is somewhat arbitrary. @@ -618,7 +617,6 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto, Feedback) // deleted while you are open // emit an event var onChannelError = function (info) { - if (Feedback) { Feedback.send('ROSTER_CHANNEL_ERROR='+(info && info.type)); } if (info && info.type === "EUNKNOWN") { // chainpad-netflux should recover by itself return; @@ -926,39 +924,11 @@ var factory = function (Util, Hash, CPNetflux, Sortify, nThen, Crypto, Feedback) return Roster; }; - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require("../../common/common-util"), - require("../../common/common-hash"), - require('chainpad-netflux'), - require('json.sortify'), - require("nthen"), - require("chainpad-crypto"), - null // no feedback here - ); - } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - require.config({ paths: { 'json.sortify': '/components/json.sortify/dist/JSON.sortify' } }); - define([ - '/common/common-util.js', - '/common/common-hash.js', - 'chainpad-netflux', - 'json.sortify', - '/components/nthen/index.js', - '/components/chainpad-crypto/crypto.js', - '/common/common-feedback.js', - //'/components/tweetnacl/nacl-fast.min.js', - ], function (Util, Hash, CPNF, Sortify, nThen, Crypto, Feedback) { - return factory.apply(null, [ - Util, - Hash, - CPNF, - Sortify, - nThen, - Crypto, - Feedback - ]); - }); - } else { - // I'm not gonna bother supporting any other kind of instanciation - } -}()); +module.exports = factory( + require("../../common/common-util"), + require("../../common/common-hash"), + require('chainpad-netflux'), + require('json.sortify'), + require("nthen"), + require("chainpad-crypto") +); diff --git a/src/worker/components/sharedfolder.js b/src/worker/components/sharedfolder.js index 86832b9fa..4a65e599a 100644 --- a/src/worker/components/sharedfolder.js +++ b/src/worker/components/sharedfolder.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Hash, Util, UserObject, Cache, nThen, Crypto, Listmap, ChainPad) => { var SF = {}; @@ -387,31 +386,14 @@ const factory = (Hash, Util, UserObject, Cache, return SF; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('../../common/common-hash'), - require('../../common/common-util'), - require('../../common/user-object'), - require('../../common/cache-store'), - require('nthen'), - require('chainpad-crypto'), - require('chainpad-listmap'), - require('chainpad') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-hash.js', - '/common/common-util.js', - '/common/user-object.js', - '/common/outer/cache-store.js', +module.exports = factory( + require('../../common/common-hash'), + require('../../common/common-util'), + require('../../common/user-object'), + require('../../common/cache-store'), + require('nthen'), + require('chainpad-crypto'), + require('chainpad-listmap'), + require('chainpad') +); - '/components/nthen/index.js', - '/components/chainpad-crypto/crypto.js', - 'chainpad-listmap', - '/components/chainpad/chainpad.dist.js', - ], factory); -} else { - // unsupported initialization -} - -})(); diff --git a/src/worker/core/interface.js b/src/worker/core/interface.js index 0ddc77c4f..5d921861a 100644 --- a/src/worker/core/interface.js +++ b/src/worker/core/interface.js @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (SRpc, Channel, Util) => { const Interface = {}; let store; @@ -92,6 +91,7 @@ const factory = (SRpc, Channel, Util) => { cb(data); }); }); + // XXX allow multiple pads in same tab chan.on('JOIN_PAD', function (data, cb) { client.channelId = data.channel; try { @@ -122,19 +122,8 @@ const factory = (SRpc, Channel, Util) => { return Interface; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require('./store-rpc'), - require('../../common/worker-channel'), - require('../../common/common-util') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/outer/store-rpc.js', - '/common/outer/worker-channel.js', - '/common/common-util.js' - ], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory( + require('./store-rpc'), + require('../../common/events-channel'), + require('../../common/common-util') +); diff --git a/src/worker/core/store-rpc.js b/src/worker/core/store-rpc.js index 329a9a75c..b3c04a89f 100644 --- a/src/worker/core/store-rpc.js +++ b/src/worker/core/store-rpc.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = AStore => { var create = function (config) { var Store = AStore.create(config); @@ -13,23 +12,18 @@ const factory = AStore => { // Ready CONNECT: Store.init, DISCONNECT: Store.disconnect, - MIGRATE_ANON_DRIVE: Store.migrateAnonDrive, PING: function (cId, data, cb) { cb(); }, CACHE_DISABLE: Store.disableCache, - HAS_DRIVE: Store.hasDrive, // RPC - UPDATE_PIN_LIMIT: Store.updatePinLimit, GET_PIN_LIMIT: Store.getPinLimit, - CLEAR_OWNED_CHANNEL: Store.clearOwnedChannel, - REMOVE_OWNED_CHANNEL: Store.removeOwnedChannel, + PIN_PADS: Store.pinPads, + UNPIN_PADS: Store.unpinPads, + GET_PINNED_USAGE: Store.getPinnedUsage, + GET_DELETED_PADS: Store.getDeletedPads, UPLOAD_CHUNK: Store.uploadChunk, UPLOAD_COMPLETE: Store.uploadComplete, UPLOAD_STATUS: Store.uploadStatus, UPLOAD_CANCEL: Store.uploadCancel, - PIN_PADS: Store.pinPads, - UNPIN_PADS: Store.unpinPads, - GET_DELETED_PADS: Store.getDeletedPads, - GET_PINNED_USAGE: Store.getPinnedUsage, // ANON RPC ANON_RPC_MESSAGE: Store.anonRpcMsg, GET_FILE_SIZE: Store.getFileSize, @@ -37,8 +31,6 @@ const factory = AStore => { // Store GET: Store.get, SET: Store.set, - GET_DRIVE: Store.drive.get, - SET_DRIVE: Store.drive.set, ADD_PAD: Store.addPad, SET_PAD_TITLE: Store.setPadTitle, MOVE_TO_TRASH: Store.moveToTrash, @@ -74,9 +66,13 @@ const factory = AStore => { // Universal UNIVERSAL_COMMAND: Store.universal.execCommand, // Pad - SEND_PAD_MSG: Store.sendPadMsg, - JOIN_PAD: Store.joinPad, - LEAVE_PAD: Store.leavePad, + SEND_PAD_MSG: Store.pad.sendMessage, + JOIN_PAD: Store.pad.join, + LEAVE_PAD: Store.pad.leave, + REMOVE_OWNED_CHANNEL: Store.pad.destroy, + CLEAR_OWNED_CHANNEL: Store.pad.clear, + CORRUPTED_CACHE: Store.pad.onCorruptedCache, + GET_LAST_HASH: Store.pad.getLastHash, GET_FULL_HISTORY: Store.getFullHistory, GET_HISTORY: Store.getHistory, GET_HISTORY_RANGE: Store.getHistoryRange, @@ -84,15 +80,17 @@ const factory = AStore => { CONTACT_PAD_OWNER: Store.contactPadOwner, GIVE_PAD_ACCESS: Store.givePadAccess, BURN_PAD: Store.burnPad, - GET_PAD_METADATA: Store.getPadMetadata, - SET_PAD_METADATA: Store.setPadMetadata, + GET_PAD_METADATA: Store.pad?.getMetadata, + SET_PAD_METADATA: Store.pad?.setMetadata, CHANGE_PAD_PASSWORD_PIN: Store.changePadPasswordPin, - GET_LAST_HASH: Store.getLastHash, GET_SNAPSHOT: Store.getSnapshot, - CORRUPTED_CACHE: Store.corruptedCache, DELETE_MAILBOX_MESSAGE: Store.deleteMailboxMessage, // Drive DRIVE_USEROBJECT: Store.userObjectCommand, + GET_DRIVE: Store.drive.get, + SET_DRIVE: Store.drive.set, + MIGRATE_ANON_DRIVE: Store.drive.migrateAnon, + HAS_DRIVE: Store.drive.exists, // Settings, DELETE_ACCOUNT: Store.deleteAccount, REMOVE_OWNED_PADS: Store.removeOwnedPads, @@ -118,16 +116,6 @@ const factory = AStore => { return { create }; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../async-store') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/outer/async-store.js' - ], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory( + require('../async-store') +); diff --git a/src/worker/modules/badge.ts b/src/worker/modules/badge.ts index 0b3c844ab..893d39bc3 100644 --- a/src/worker/modules/badge.ts +++ b/src/worker/modules/badge.ts @@ -93,10 +93,34 @@ const Badge: BadgeModule = { updateMetadata: config.updateMetadata }; + const _listBadges = (data, cb) => { + listBadges(ctx, data, undefined, cb); + }; + + // On ready, check if our badge is still valid + const Store = ctx.Store; + Store.onReadyEvt.reg(() => { + const md = Store.getMetadata(void 0, 'drive', () => {}); + const myBadge:string = md?.user?.badge || ""; + if (!myBadge) { return; } + listBadges(ctx, {}, undefined, all => { + if (!all.includes(myBadge)) { + const profile = ctx?.store?.modules?.profile; + profile?.execCommand(void 0, { + cmd: 'SET', + data: { + key: 'badge', + value: '' + } + }, () => {}); + } + }); + }); + return { + listBadges: _listBadges, removeClient: () => {}, execCommand: (clientId, obj, cb) => { - console.log('Exex command', clientId, obj); const cmd = obj.cmd; const data = obj.data; if (cmd === 'LIST_BADGES') { diff --git a/src/worker/modules/calendar.js b/src/worker/modules/calendar.js index 22d1fe5e2..5aa9571a5 100644 --- a/src/worker/modules/calendar.js +++ b/src/worker/modules/calendar.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Util, Hash, Constants, Realtime, Cache, Rec, nThen, Listmap, FP, Crypto, ChainPad) => { var Calendar = {}; @@ -1208,38 +1207,16 @@ const factory = (Util, Hash, Constants, Realtime, Cache, Rec, return Calendar; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/common-constants'), - require('../../common/common-realtime'), - require('../../common/cache-store'), - require('../../common/recurrence'), - require('nthen'), - require('chainpad-listmap'), - require('../../../www/lib/datepicker/flatpickr'), - require('chainpad-crypto'), - require('chainpad'), - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-hash.js', - '/common/common-constants.js', - '/common/common-realtime.js', - '/common/outer/cache-store.js', - '/calendar/recurrence.js', - '/components/nthen/index.js', - 'chainpad-listmap', - '/lib/datepicker/flatpickr.js', - '/components/chainpad-crypto/crypto.js', - '/components/chainpad/chainpad.dist.js', - ], factory); -} else { - // unsupported initialization -} - -})(); - +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/common-constants'), + require('../../common/common-realtime'), + require('../../common/cache-store'), + require('../../common/recurrence'), + require('nthen'), + require('chainpad-listmap'), + require('../../../www/lib/datepicker/flatpickr'), + require('chainpad-crypto'), + require('chainpad'), +); diff --git a/src/worker/modules/cursor.js b/src/worker/modules/cursor.js index e7aa5840b..9a27f4dd9 100644 --- a/src/worker/modules/cursor.js +++ b/src/worker/modules/cursor.js @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { -const factory = (Util, Constants, Messages = {}, - AppConfig = {}, Crypto) => { - var Cursor = {}; +const factory = (Util, Constants, Crypto) => { + const Cursor = {}; + let Messages = {}; + let AppConfig = {}; Cursor.setCustomize = data => { Messages = data.Messages; @@ -286,25 +286,8 @@ const factory = (Util, Constants, Messages = {}, return Cursor; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/common-util'), - require('../../common/common-constants'), - undefined, - undefined, - require('chainpad-crypto') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-constants.js', - '/customize/messages.js', - '/customize/application_config.js', - '/components/chainpad-crypto/crypto.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-constants'), + require('chainpad-crypto') +); diff --git a/src/worker/modules/history.js b/src/worker/modules/history.js index f27b57b36..4e3ea258e 100644 --- a/src/worker/modules/history.js +++ b/src/worker/modules/history.js @@ -2,10 +2,9 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Util, Hash, UserObject, nThen) => { - var History = {}; - var commands = {}; + const History = {}; + const commands = {}; var getAccountChannels = function (ctx) { var channels = []; @@ -133,7 +132,7 @@ const factory = (Util, Hash, UserObject, nThen) => { history = messages.join('\n').length; }), true); // Metadata - Store.getPadMetadata(null, { + Store.pad.getMetadata(null, { channel: channel }, waitFor(function (obj) { if (obj && obj.error) { return; } @@ -257,22 +256,9 @@ const factory = (Util, Hash, UserObject, nThen) => { return History; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/user-object'), - require('nthen') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-hash.js', - '/common/user-object.js', - '/components/nthen/index.js', - ], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/user-object'), + require('nthen') +); diff --git a/src/worker/modules/integration.js b/src/worker/modules/integration.js index a3ee75c72..ac733cfcd 100644 --- a/src/worker/modules/integration.js +++ b/src/worker/modules/integration.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Crypto) => { var Integration = {}; @@ -203,17 +202,6 @@ const factory = (Crypto) => { return Integration; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('chainpad-crypto') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/components/chainpad-crypto/crypto.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('chainpad-crypto') +); diff --git a/src/worker/modules/mailbox.js b/src/worker/modules/mailbox.js index 48359a73e..1c0a5e10b 100644 --- a/src/worker/modules/mailbox.js +++ b/src/worker/modules/mailbox.js @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { -const factory = (BCast = {}, Util, Hash, +const factory = (Util, Hash, Realtime, Messaging, Notify, Handlers, CpNetflux, Crypto) => { - var Mailbox = {}; + const Mailbox = {}; + let BCast = {}; Mailbox.setCustomize = data => { BCast = data.Broadcast; @@ -673,32 +673,13 @@ proxy.mailboxes = { return Mailbox; }; -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - undefined, - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/common-realtime'), - require('../components/messaging'), - require('../../common/notify'), - require('../components/mailbox-handlers'), - require('chainpad-netflux'), - require('chainpad-crypto') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/api/broadcast', - '/common/common-util.js', - '/common/common-hash.js', - '/common/common-realtime.js', - '/common/outer/messaging.js', - '/common/notify.js', - '/common/outer/mailbox-handlers.js', - 'chainpad-netflux', - '/components/chainpad-crypto/crypto.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/common-realtime'), + require('../components/messaging'), + require('../../common/notify'), + require('../components/mailbox-handlers'), + require('chainpad-netflux'), + require('chainpad-crypto') +); diff --git a/src/worker/modules/messenger.js b/src/worker/modules/messenger.js index 281fc13d5..ad55143a7 100644 --- a/src/worker/modules/messenger.js +++ b/src/worker/modules/messenger.js @@ -2,12 +2,12 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Crypto, Hash, Util, Realtime, Messaging, - Constants, Messages = {}, PadTypes, nThen) => { + Constants, PadTypes, nThen) => { var Curve = Crypto.Curve; - var Msg = {}; + const Msg = {}; + let Messages = {}; Msg.setCustomize = data => { Messages = data.Messages; @@ -1119,34 +1119,13 @@ const factory = (Crypto, Hash, Util, Realtime, Messaging, return Msg; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('chainpad-crypto'), - require('../../common/common-hash'), - require('../../common/common-util'), - require('../../common/common-realtime'), - require('../components/messaging'), - require('../../common/common-constants'), - undefined, - require('../../common/pad-types'), - require('nthen') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/components/chainpad-crypto/crypto.js', - '/common/common-hash.js', - '/common/common-util.js', - '/common/common-realtime.js', - '/common/outer/messaging.js', - '/common/common-constants.js', - '/customize/messages.js', - '/common/pad-types.js', - - '/components/nthen/index.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('chainpad-crypto'), + require('../../common/common-hash'), + require('../../common/common-util'), + require('../../common/common-realtime'), + require('../components/messaging'), + require('../../common/common-constants'), + require('../../common/pad-types'), + require('nthen') +); diff --git a/src/worker/modules/onlyoffice.js b/src/worker/modules/onlyoffice.js index 720fefd44..ea89f2416 100644 --- a/src/worker/modules/onlyoffice.js +++ b/src/worker/modules/onlyoffice.js @@ -2,7 +2,6 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = () => { var OO = {}; @@ -354,12 +353,4 @@ const factory = () => { return OO; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory(); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([], factory); -} else { - // unsupported initialization -} -})(); +module.exports = factory(); diff --git a/src/worker/modules/profile.js b/src/worker/modules/profile.js index abd9a4816..41d509449 100644 --- a/src/worker/modules/profile.js +++ b/src/worker/modules/profile.js @@ -2,11 +2,12 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Util, Hash, Constants, Realtime, - Listmap, Crypto, ChainPad) => { + Messaging, Listmap, Crypto, ChainPad) => { var Profile = {}; + const onReady = Util.mkEvent(true); + var initializeProfile = function (ctx, cb) { var profile = ctx.profile; if (!profile.edit || !profile.view) { @@ -55,6 +56,15 @@ const factory = (Util, Hash, Constants, Realtime, if (!lm.proxy.edPublic) { lm.proxy.edPublic = ctx.store.proxy.edPublic; } + if (!lm.proxy.proof) { + let str = secret.channel; + let myIDu8 = Util.decodeUTF8(str); + let k = Util.decodeBase64(ctx.store.proxy.edPrivate); + let nacl = Crypto.Nacl; + let s = nacl.sign(myIDu8, k); + let signature = Util.encodeBase64(s); + lm.proxy.proof = signature; + } if (ctx.onReadyHandlers.length) { ctx.onReadyHandlers.forEach(function (f) { try { @@ -63,6 +73,7 @@ const factory = (Util, Hash, Constants, Realtime, }); ctx.onReadyHandlers = []; } + onReady.fire(); }).on('change', [], function () { ctx.emit('UPDATE', lm.proxy, ctx.clients); }); @@ -91,21 +102,26 @@ const factory = (Util, Hash, Constants, Realtime, }; var setValue = function (ctx, data, cId, cb) { - var key = data.key; - var value = data.value; - if (!key) { return; } - ctx.listmap.proxy[key] = value; - Realtime.whenRealtimeSyncs(ctx.listmap.realtime, function () { - ctx.emit('UPDATE', ctx.listmap.proxy, ctx.clients.filter(function (clientId) { - return clientId !== cId; - })); - if (key === 'badge') { - ctx.Store.set(null, { - key: ['profile', 'badge'], - value: value || undefined - }, () => {}); - } - cb(ctx.listmap.proxy); + onReady.reg(() => { + var key = data.key; + var value = data.value; + if (!key) { return; } + ctx.listmap.proxy[key] = value; + Realtime.whenRealtimeSyncs(ctx.listmap.realtime, function () { + ctx.emit('UPDATE', ctx.listmap.proxy, ctx.clients.filter(function (clientId) { + return clientId !== cId; + })); + if (key === 'badge') { + ctx.Store.set(null, { + key: ['profile', 'badge'], + value: value || undefined + }, () => { + Messaging.updateMyData(ctx.store); + ctx.updateMetadata(); + }); + } + cb(ctx.listmap.proxy); + }); }); }; @@ -163,29 +179,13 @@ const factory = (Util, Hash, Constants, Realtime, return Profile; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/common-constants'), - require('../../common/common-realtime'), - require('chainpad-listmap'), - require('chainpad-crypto'), - require('chainpad') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-hash.js', - '/common/common-constants.js', - '/common/common-realtime.js', - 'chainpad-listmap', - '/components/chainpad-crypto/crypto.js', - '/components/chainpad/chainpad.dist.js', - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/common-constants'), + require('../../common/common-realtime'), + require('../components/messaging'), + require('chainpad-listmap'), + require('chainpad-crypto'), + require('chainpad') +); diff --git a/src/worker/modules/support.js b/src/worker/modules/support.js index 3250e218c..262cb37f7 100644 --- a/src/worker/modules/support.js +++ b/src/worker/modules/support.js @@ -2,10 +2,10 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { -const factory = (ApiConfig = {}, Util, Hash, Realtime, Pinpad, Crypt, +const factory = (Util, Hash, Realtime, Pinpad, Crypt, nThen, Crypto, Listmap, ChainPad, CpNetflux) => { - var Support = {}; + const Support = {}; + let ApiConfig = {}; Support.setCustomize = data => { ApiConfig = data.ApiConfig; @@ -1420,37 +1420,15 @@ const factory = (ApiConfig = {}, Util, Hash, Realtime, Pinpad, Crypt, return Support; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - undefined, - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/common-realtime'), - require('../../common/pinpad'), - require('../../common/cryptget'), - require('nthen'), - require('chainpad-crypto'), - require('chainpad-listmap'), - require('chainpad'), - require('chainpad-netflux') - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/api/config', - '/common/common-util.js', - '/common/common-hash.js', - '/common/common-realtime.js', - '/common/pinpad.js', - '/common/cryptget.js', - '/components/nthen/index.js', - '/components/chainpad-crypto/crypto.js', - 'chainpad-listmap', - '/components/chainpad/chainpad.dist.js', - 'chainpad-netflux' - ], factory); -} else { - // unsupported initialization -} - -})(); +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/common-realtime'), + require('../../common/pinpad'), + require('../../common/cryptget'), + require('nthen'), + require('chainpad-crypto'), + require('chainpad-listmap'), + require('chainpad'), + require('chainpad-netflux') +); diff --git a/src/worker/modules/team.js b/src/worker/modules/team.js index cd67627b8..9e7ba7a77 100644 --- a/src/worker/modules/team.js +++ b/src/worker/modules/team.js @@ -2,12 +2,11 @@ // // SPDX-License-Identifier: AGPL-3.0-or-later -(() => { const factory = (Util, Hash, Constants, Realtime, ProxyManager, UserObject, SF, Roster, Messaging, Feedback, Invite, Crypt, Cache, Pinpad, Listmap, Crypto, CpNetflux, ChainPad, nThen, Nacl) => { - var Team = {}; + const Team = {}; Nacl = Nacl || (typeof(window) !== "undefined" && window.nacl); var onStoreReady = Util.mkEvent(true); @@ -298,7 +297,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, teamId: id }; } - ctx.Store.removeOwnedChannel('', data, cb); + ctx.Store.pad.destroy('', data, cb); }, Store: ctx.Store, store: ctx.store @@ -880,7 +879,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, })); }).nThen(function (_w) { if (otherOwners) { - ctx.Store.setPadMetadata(null, { + ctx.Store.pad.setMetadata(null, { channel: c, command: 'RM_OWNERS', value: [teamEdPublic], @@ -984,7 +983,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, var md; nThen(function (waitFor) { // Get pending owners - ctx.Store.getPadMetadata(null, { + ctx.Store.pad.getMetadata(null, { channel: teamData.channel }, waitFor(function (obj) { if (obj && obj.error) { @@ -1007,7 +1006,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, }); if (!member && teamData.owner) { var removeOwnership = function (chan) { - ctx.Store.setPadMetadata(null, { + ctx.Store.pad.setMetadata(null, { channel: chan, command: 'RM_PENDING_OWNERS', value: [ed], @@ -1120,7 +1119,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, } }; var addPendingOwner = function (chan) { - ctx.Store.setPadMetadata(null, { + ctx.Store.pad.setMetadata(null, { channel: chan, command: 'ADD_PENDING_OWNERS', value: [user.edPublic], @@ -1176,7 +1175,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, } }; var removeOwnership = function (chan) { - ctx.Store.setPadMetadata(null, { + ctx.Store.pad.setMetadata(null, { channel: chan, command: cmd, value: [user.edPublic], @@ -1393,7 +1392,7 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, var md; nThen(function (waitFor) { // Get pending owners - ctx.Store.getPadMetadata(null, { + ctx.Store.pad.getMetadata(null, { channel: teamData.channel }, waitFor(function (obj) { if (obj && obj.error) { @@ -2241,59 +2240,27 @@ const factory = (Util, Hash, Constants, Realtime, ProxyManager, return Team; }; -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory( - require('../../common/common-util'), - require('../../common/common-hash'), - require('../../common/common-constants'), - require('../../common/common-realtime'), +module.exports = factory( + require('../../common/common-util'), + require('../../common/common-hash'), + require('../../common/common-constants'), + require('../../common/common-realtime'), - require('../../common/proxy-manager'), - require('../../common/user-object'), - require('../components/sharedfolder'), - require('../components/roster'), - require('../components/messaging'), - require('../../common/common-feedback'), - require('../components/invitation'), - require('../../common/cryptget'), - require('../../common/cache-store'), - require('../../common/pinpad'), + require('../../common/proxy-manager'), + require('../../common/user-object'), + require('../components/sharedfolder'), + require('../components/roster'), + require('../components/messaging'), + require('../../common/common-feedback'), + require('../components/invitation'), + require('../../common/cryptget'), + require('../../common/cache-store'), + require('../../common/pinpad'), - require('chainpad-listmap'), - require('chainpad-crypto'), - require('chainpad-netflux'), - require('chainpad'), - require('nthen'), - require('tweetnacl/nacl-fast'), - ); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/common/common-hash.js', - '/common/common-constants.js', - '/common/common-realtime.js', - - '/common/proxy-manager.js', - '/common/user-object.js', - '/common/outer/sharedfolder.js', - '/common/outer/roster.js', - '/common/outer/messaging.js', - '/common/common-feedback.js', - '/common/outer/invitation.js', - '/common/cryptget.js', - '/common/outer/cache-store.js', - '/common/pinpad.js', - - 'chainpad-listmap', - '/components/chainpad-crypto/crypto.js', - 'chainpad-netflux', - '/components/chainpad/chainpad.dist.js', - '/components/nthen/index.js', - '/components/tweetnacl/nacl-fast.min.js', - ], factory); -} else { - // unsupported initialization -} - -})(); + require('chainpad-listmap'), + require('chainpad-crypto'), + require('chainpad-netflux'), + require('chainpad'), + require('nthen'), + require('tweetnacl/nacl-fast'), +); diff --git a/src/worker/store.ts b/src/worker/store.ts index 7929454ac..466c7eaff 100644 --- a/src/worker/store.ts +++ b/src/worker/store.ts @@ -23,7 +23,7 @@ import * as UOSetter from '../common/user-object-setter.js'; import * as Pinpad from '../common/pinpad.js'; import * as PadTypes from '../common/pad-types.js'; import * as NetworkConfig from '../common/network-config.js'; -import * as LoginBlock from '../common/login-block.js'; +import * as LoginBlock from '../common/outer/login-block.js'; // Core import * as Store from './async-store.js'; diff --git a/src/worker/types.ts b/src/worker/types.ts index 263575c45..07d0a8a6b 100644 --- a/src/worker/types.ts +++ b/src/worker/types.ts @@ -5,6 +5,7 @@ // Default CryptPad worker module, extended with // specific methods for each module export type Callback = (...args: any[]) => void +export type RpcCall = (clientId: string, data: any, cb: Callback) => void; export type ModuleConfig = { store: any, @@ -53,6 +54,7 @@ export interface Account { export type DriveConfig = { store: any, + Store: any, broadcast: (exclude: object, cmd: string, data?: any, cb?: any) => void, postMessage: (clientId: string, cmd: string, data?: any, cb?: any) => void } @@ -64,5 +66,31 @@ export interface DriveObject { onReconnect: any } export interface Drive { + initAPI: (config: DriveConfig) => any init: (config: DriveConfig) => DriveObject } + +export type PadConfig = { + Store: any, + store: any, + broadcast: (exclude: object, cmd: string, data?: any, cb?: any) => void, + postMessage: (clientId: string, cmd: string, data?: any, cb?: any) => void +} +export interface PadObject { + join: RpcCall, + destroy: RpcCall, + clear: RpcCall, + setMetadata: RpcCall, + getMetadata: RpcCall, + leave: RpcCall, + removeClient: (clientId: string) => void, + sendMessage: RpcCall, + getLastHash: RpcCall, + onCorruptedCache: RpcCall, + getChannels: () => string[], + onJoined: any, + onCacheReady: any, +} +export interface Pad { + init: (config: PadConfig) => PadObject +} diff --git a/www/admin/inner.js b/www/admin/inner.js index 7cd534e7f..4978e4218 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -734,20 +734,6 @@ define([ return tableObj.table; }; - // Msg.admin_updateLimitHint, .admin_updateLimitTitle, .admin_updateLimitButton - sidebar.addItem('update-limit', function (cb) { - var button = blocks.activeButton('primary', '', - Messages.admin_updateLimitButton, done => { - sFrameChan.query('Q_ADMIN_RPC', { - cmd: 'Q_UPDATE_LIMIT', - }, function (e, data) { - done(!!data); - UI.alert(data ? Messages.admin_updateLimitDone || 'done' : 'error' + e); - }); - }); - cb(button); - }); - // Msg.admin_enableembedsHint, .admin_enableembedsTitle sidebar.addCheckboxItem({ key: 'enableembeds', diff --git a/www/admin/main.js b/www/admin/main.js index 849a3feaf..654bf9c05 100644 --- a/www/admin/main.js +++ b/www/admin/main.js @@ -24,11 +24,6 @@ define([ sframeChan.on('Q_ADMIN_RPC', function (data, cb) { Cryptpad.adminRpc(data, cb); }); - sframeChan.on('Q_UPDATE_LIMIT', function (data, cb) { - Cryptpad.updatePinLimit(function (e) { - cb({error: e}); - }); - }); }; var category; if (window.location.hash) { diff --git a/www/calendar/app-calendar.less b/www/calendar/app-calendar.less index 245d08d6f..e4b5b8ea2 100644 --- a/www/calendar/app-calendar.less +++ b/www/calendar/app-calendar.less @@ -171,7 +171,7 @@ color: @cryptpad_text_col; border-radius: @variables_radius_L; font-weight: normal; - .tui-full-calendar-icon:not(.tui-full-calendar-calendar-dot):not(.tui-full-calendar-dropdown-arrow):not(.tui-full-calendar-ic-checkbox):not(.fa-map-marker) { + .tui-full-calendar-icon:not(.tui-full-calendar-calendar-dot):not(.tui-full-calendar-dropdown-arrow):not(.tui-full-calendar-ic-checkbox):not(.fa-map-marker):not(.fa-align-justify) { display: none; } .tui-full-calendar-icon { @@ -179,9 +179,46 @@ flex-shrink: 0; } .tui-full-calendar-popup-detail-item { + display: flex; + margin-bottom: 0.3rem; + align-items: center; + .event-location { + display: flex; + align-items: center; + } + .fa-align-justify { + margin-top: 3px; + } + &.tui-full-calendar-popup-detail-item-separate { + &>span { + display: flex; + width: 100%; + } + .event-description { + display: block; + line-height: 1.1em; + p, ul { + margin:0.1rem; + } + } + } a { + margin:0.1rem; + border-radius: @variables_radius; color: @cryptpad_color_link; text-decoration: underline; + &:focus-visible{ + outline: @variables_focus_style; + } + } + span { + overflow: hidden; + word-break: break-word; + white-space: nowrap; + text-overflow: ellipsis; + .event-description{ + white-space: normal; + } } } .tui-full-calendar-section-button-save { diff --git a/www/calendar/export.js b/www/calendar/export.js index 92ab261f4..e6662eee0 100644 --- a/www/calendar/export.js +++ b/www/calendar/export.js @@ -7,7 +7,7 @@ define([ '/customize/pages.js', '/common/common-util.js', - '/calendar/recurrence.js', + '/common/recurrence.js', '/lib/ical.min.js' ], function (Pages, Util, Rec) { @@ -97,6 +97,10 @@ define([ }); return; } + if (k === "until") { + rrule += ";"+k.toUpperCase()+"="+getICSDate(r[k]); + return; + } rrule += ";"+k.toUpperCase()+"="+r[k]; }); return rrule; diff --git a/www/calendar/inner.js b/www/calendar/inner.js index 82482d4ba..74b5d6d92 100644 --- a/www/calendar/inner.js +++ b/www/calendar/inner.js @@ -21,7 +21,7 @@ define([ '/customize/application_config.js', '/lib/calendar/tui-calendar.min.js', '/calendar/export.js', - '/calendar/recurrence.js', + '/common/recurrence.js', '/lib/datepicker/flatpickr.js', 'tui-date-picker', @@ -408,13 +408,16 @@ define([ str = `${str}`; APP.nextLocationUid = uid; } - let location_icon = h('i.fa.fa-map-marker.tui-full-calendar-icon', { 'aria-label': Messages.calendar_loc }, []); - return location_icon.outerHTML + str; + let location_icon = h('i.fa.fa-map-marker.tui-full-calendar-icon', { 'aria-hidden': true }, []); + return `
${location_icon.outerHTML} ${str}
`; }, popupDetailBody: function(schedule) { var str = schedule.body; delete APP.eventBody; - return diffMk.render(str, true); + + let description_icon = h('i.fa.fa-align-justify.tui-full-calendar-icon', { 'aria-hidden': true }, []); + let description = diffMk.render(str, true); + return `${description_icon.outerHTML}
${description}
`; }, popupIsAllDay: function() { return Messages.calendar_allDay; }, titlePlaceholder: function() { return Messages.calendar_title; }, @@ -997,7 +1000,8 @@ define([ // Mark selected months as done todo.forEach(function (monthId) { APP.recurringDone.push(monthId); }); - cal.createSchedules(applyUpdates(toAdd)); + //cal.createSchedules(applyUpdates(toAdd)); + cal.createSchedules(toAdd); }; updateRecurring = function () { try { @@ -2354,6 +2358,14 @@ APP.recurrenceRule = { }; var onCalendarEditPopup = function (el) { var $el = $(el); + + const $header = $el.find('.tui-full-calendar-section-header'); + $header.attr('id', 'tui-full-calendar-section-header'); + $el.attr('aria-labelledby', 'tui-full-calendar-section-header'); + const $desc = $el.find('.tui-full-calendar-section-detail'); + $desc.attr('id', 'tui-full-calendar-section-detail'); + $el.attr('aria-describedby', 'tui-full-calendar-section-detail'); + $el.find('.tui-full-calendar-popup-edit').addClass('btn btn-primary'); $el.find('.tui-full-calendar-popup-edit .tui-full-calendar-icon').addClass('fa fa-pencil').removeClass('tui-full-calendar-icon'); $el.find('.tui-full-calendar-content').removeClass('tui-full-calendar-content'); diff --git a/www/calendar/recurrence.js b/www/calendar/recurrence.js deleted file mode 100644 index 9fbb786ba..000000000 --- a/www/calendar/recurrence.js +++ /dev/null @@ -1,908 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(() => { -const factory = (Util) => { - var Rec = {}; - - const window = globalThis; - var debug = function () {}; - - // Get week number with any "WKST" (firts day of the week) - // Week 1 is the first week of the year containing at least 4 days in this year - // It depends on which day is considered the first day of the week (default Monday) - // In our case, wkst is a number matching the JS rule: 0 == Sunday - var getWeekNo = Rec.getWeekNo = function (date, wkst) { - if (typeof(wkst) !== "number") { wkst = 1; } // Default monday - - var newYear = new Date(date.getFullYear(),0,1); - var day = newYear.getDay() - wkst; //the day of week the year begins on - day = (day >= 0 ? day : day + 7); - var daynum = Math.floor((date.getTime() - newYear.getTime())/86400000) + 1; - var weeknum; - // Week 1 / week 53 - if (day < 4) { - weeknum = Math.floor((daynum+day-1)/7) + 1; - if (weeknum > 52) { - var nYear = new Date(date.getFullYear() + 1,0,1); - var nday = nYear.getDay() - wkst; - nday = nday >= 0 ? nday : nday + 7; - weeknum = nday < 4 ? 1 : 53; - } - } - else { - weeknum = Math.floor((daynum+day-1)/7); - } - return weeknum; - }; - - var getYearDay = function (date) { - var start = new Date(date.getFullYear(), 0, 0); - var diff = (date - start) + - ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000); - var oneDay = 1000 * 60 * 60 * 24; - return Math.floor(diff / oneDay); - }; - var setYearDay = function (date, day) { - if (typeof(day) !== "number" || Math.abs(day) < 1 || Math.abs(day) > 366) { return; } - if (day < 0) { - var max = getYearDay(new Date(date.getFullYear(), 11, 31)); - day = max + day + 1; - } - date.setMonth(0); - date.setDate(day); - return true; - }; - - var getEndData = function (s, e) { - if (s > e) { return void console.error("Wrong data"); } - var days; - if (e.getFullYear() === s.getFullYear()) { - days = getYearDay(e) - getYearDay(s); - } else { // eYear < sYear - var tmp = new Date(s.getFullYear(), 11, 31); - var d1 = getYearDay(tmp) - getYearDay(s); // Number of days before December 31st - var de = getYearDay(e); - days = d1 + de; - while ((tmp.getFullYear()+1) < e.getFullYear()) { - tmp.setFullYear(tmp.getFullYear()+1); - days += getYearDay(tmp); - } - } - return { - h: e.getHours(), - m: e.getMinutes(), - days: days - }; - }; - var setEndData = function (s, e, data) { - e.setTime(+s); - if (!data) { return; } - e.setHours(data.h); - e.setMinutes(data.m); - e.setSeconds(0); - e.setDate(s.getDate() + data.days); - }; - - var DAYORDER = Rec.DAYORDER = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]; - var getDayData = function (str) { - var pos = Number(str.slice(0,-2)); - var day = DAYORDER.indexOf(str.slice(-2)); - return pos ? [pos, day] : day; - }; - - var goToFirstWeekDay = function (date, wkst) { - var d = date.getDay(); - wkst = typeof(wkst) === "number" ? wkst : 1; - if (d >= wkst) { - date.setDate(date.getDate() - (d-wkst)); - } else { - date.setDate(date.getDate() - (7+d-wkst)); - } - }; - - var getDateStr = function (date) { - return date.getFullYear() + '-' + (date.getMonth()+1) + '-' + date.getDate(); - }; - var FREQ = {}; - FREQ['daily'] = function (s, i) { - s.setDate(s.getDate()+i); - }; - FREQ['weekly'] = function (s,i) { - s.setDate(s.getDate()+(i*7)); - }; - FREQ['monthly'] = function (s,i) { - s.setMonth(s.getMonth()+i); - }; - FREQ['yearly'] = function (s,i) { - s.setFullYear(s.getFullYear()+i); - }; - - // EXPAND is used to create iterations added from a BYxxx rule - // dateA is the start date and b is the number or id of the BYxxx rule item - var EXPAND = {}; - EXPAND['month'] = function (dateS, origin, b) { - var oS = new Date(origin.start); - var a = dateS.getMonth() + 1; - var toAdd = (b-a+12)%12; - var m = dateS.getMonth() + toAdd; - dateS.setMonth(m); - dateS.setDate(oS.getDate()); - if (dateS.getMonth() !== m) { return; } // Day 31 may move us to the next month - return true; - }; - - - EXPAND['weekno'] = function (dateS, origin, week, rule) { - var wkst = rule && rule.wkst; - if (typeof(wkst) !== "number") { wkst = 1; } // Default monday - var oS = new Date(origin.start); - - var lastD = new Date(dateS.getFullYear(), 11, 31); // December 31st - var lastW = getWeekNo(lastD, wkst); // Last week of the year is either 52 or 53 - - var doubleOne = lastW === 1; - if (lastW === 1) { lastW = 52; } - - var a = getWeekNo(dateS, wkst); - if (!week || week > lastW) { return false; } // Week 53 may not exist this year - - if (week < 0) { week = lastW + week + 1; } // Turn negative week number into positive - - var toAdd = week - a; - var weekS = new Date(+dateS); - // Go to the selected week - weekS.setDate(weekS.getDate() + (toAdd * 7)); - goToFirstWeekDay(weekS, wkst); - - // Then make sure we are in the correct start day - var all = 'aaaaaaa'.split('').map(function (o, i) { - var date = new Date(+weekS); - date.setDate(date.getDate() + i); - if (date.getFullYear() !== dateS.getFullYear()) { return; } - return date.toLocaleDateString() !== oS.toLocaleDateString() && date; - }).filter(Boolean); - - // If we're looking for week 1 and the last week is a week 1, add the days - if (week === 1 && doubleOne) { - goToFirstWeekDay(lastD, wkst); - 'aaaaaaa'.split('').some(function (o, i) { - var date = new Date(+lastD); - date.setDate(date.getDate() + i); - if (date.toLocaleDateString() === oS.toLocaleDateString()) { return; } - if (date.getFullYear() > dateS.getFullYear()) { return true; } - all.push(date); - }); - } - - return all.length ? all : undefined; - }; - EXPAND['yearday'] = function (dateS, origin, b) { - var y = dateS.getFullYear(); - var state = setYearDay(dateS, b); - if (!state) { return; } // Invalid day "b" - if (dateS.getFullYear() !== y) { return; } // Day 366 make move us to the next year - return true; - }; - EXPAND['monthday'] = function (dateS, origin, b, rule) { - if (typeof(b) !== "number" || Math.abs(b) < 1 || Math.abs(b) > 31) { return false; } - - var setMonthDay = function (date, day) { - var m = date.getMonth(); - if (day < 0) { - var tmp = new Date(date.getFullYear(), date.getMonth()+1, 0); // Last day - day = tmp.getDate() + day + 1; - } - date.setDate(day); - return date.getMonth() === m; // Don't push if day 31 moved us to the next month - - }; - - // Monthly events - if (rule.freq === 'monthly') { - return setMonthDay(dateS, b); - } - - var all = 'aaaaaaaaaaaa'.split('').map(function (o, i) { - var date = new Date(dateS.getFullYear(), i, 1); - var ok = setMonthDay(date, b); - return ok ? date : undefined; - }).filter(Boolean); - return all.length ? all : undefined; - }; - EXPAND['day'] = function (dateS, origin, b, rule) { - // Here "b" can be a single day ("TU") or a position and a day ("1MO") - var day = getDayData(b); - var pos; - if (Array.isArray(day)) { - pos = day[0]; - day = day[1]; - } - - var all = []; - if (![0,1,2,3,4,5,6].includes(day)) { return false; } - - var filterPos = function (m) { - if (!pos) { return; } - - var _all = []; - 'aaaaaaaaaaaa'.split('').some(function (a, i) { - if (typeof(m) !== "undefined" && i !== m) { return; } - - var _pos; - var tmp = all.filter(function (d) { - return d.getMonth() === i; - }); - if (pos < 0) { - _pos = tmp.length + pos; - } else { - _pos = pos - 1; // An array starts at 0 but the recurrence rule starts at 1 - } - _all.push(tmp[_pos]); - - return typeof(m) !== "undefined" && i === m; - }); - all = _all.filter(Boolean); // The "5th" {day} won't always exist - }; - - var tmp; - if (rule.freq === 'yearly') { - tmp = new Date(+dateS); - var y = dateS.getFullYear(); - while (tmp.getDay() !== day) { tmp.setDate(tmp.getDate()+1); } - while (tmp.getFullYear() === y) { - all.push(new Date(+tmp)); - tmp.setDate(tmp.getDate()+7); - } - filterPos(); - return all; - } - - if (rule.freq === 'monthly') { - tmp = new Date(+dateS); - var m = dateS.getMonth(); - while (tmp.getDay() !== day) { tmp.setDate(tmp.getDate()+1); } - while (tmp.getMonth() === m) { - all.push(new Date(+tmp)); - tmp.setDate(tmp.getDate()+7); - } - filterPos(m); - return all; - } - - if (rule.freq === 'weekly') { - while (dateS.getDay() !== day) { dateS.setDate(dateS.getDate()+1); } - } - return true; - }; - - var LIMIT = {}; - LIMIT['month'] = function (events, rule) { - return events.filter(function (s) { - return rule.includes(s.getMonth()+1); - }); - }; - LIMIT['weekno'] = function (events, weeks, rules) { - return events.filter(function (s) { - var wkst = rules && rules.wkst; - if (typeof(wkst) !== "number") { wkst = 1; } // Default monday - - var lastD = new Date(s.getFullYear(), 11, 31); // December 31st - var lastW = getWeekNo(lastD, wkst); // Last week of the year is either 52 or 53 - if (lastW === 1) { lastW = 52; } - - var w = getWeekNo(s, wkst); - - return weeks.some(function (week) { - if (week > 0) { return week === w; } - return w === (lastW + week + 1); - }); - }); - }; - LIMIT['yearday'] = function (events, days) { - return events.filter(function (s) { - var d = getYearDay(s); - var max = getYearDay(new Date(s.getFullYear(), 11, 31)); - - return days.some(function (day) { - if (day > 0) { return day === d; } - return d === (max + day + 1); - }); - }); - }; - LIMIT['monthday'] = function (events, rule) { - return events.filter(function (s) { - var r = Util.clone(rule); - // Transform the negative monthdays into positive for this specific month - r = r.map(function (b) { - if (b < 0) { - var tmp = new Date(s.getFullYear(), s.getMonth()+1, 0); // Last day - b = tmp.getDate() + b + 1; - } - return b; - }); - return r.includes(s.getDate()); - }); - }; - LIMIT['day'] = function (events, days, rules) { - return events.filter(function (s) { - var dayStr = s.toLocaleDateString(); - - // Check how to handle position in BYDAY rules (last day of the month or the year?) - var type = 'yearly'; - if (rules.freq === 'monthly' || - (rules.freq === 'yearly' && rules.by && rules.by.month)) { - type = 'monthly'; - } - - // Check if this event matches one of the allowed days - return days.some(function (r) { - // rule elements are strings with pos and day - var day = getDayData(r); - var pos; - if (Array.isArray(day)) { - pos = day[0]; - day = day[1]; - } - if (!pos) { - return s.getDay() === day; - } - - // If we have a position, we can use EXPAND.day to get the nth {day} of the - // year/month and compare if it matches with - var d = new Date(s.getFullYear(), s.getMonth(), 1); - if (type === 'yearly') { d.setMonth(0); } - var res = EXPAND["day"](d, {}, r, {freq: type}); - return res.some(function (date) { - return date.toLocaleDateString() === dayStr; - }); - }); - }); - }; - LIMIT['setpos'] = function (events, rule) { - var init = events.slice(); - var rules = Util.deduplicateString(rule.slice().map(function (n) { - if (n > 0) { return (n-1); } - if (n === 0) { return; } - return init.length + n; - })); - return events.filter(function (ev) { - var idx = init.indexOf(ev); - return rules.includes(idx); - }); - }; - - var BYORDER = ['month','weekno','yearday','monthday','day']; - var BYDAYORDER = ['month','monthday','day']; - - Rec.getMonthId = function (d) { - return d.getFullYear() + '-' + d.getMonth(); - }; - var cache = window.CP_calendar_cache = {}; - var recurringAcross = {}; - Rec.resetCache = function () { - cache = window.CP_calendar_cache = {}; - recurringAcross = {}; - }; - - var iterate = function (rule, _origin, s) { - // "origin" is the original event to detect the start of BYxxx - var origin = Util.clone(_origin); - var oS = new Date(origin.start); - - var id = origin.id.split('|')[0]; // Use same cache when updating recurrence rule - - // "uid" is used for the cache - var uid = s.toLocaleDateString(); - cache[id] = cache[id] || {}; - - var inter = rule.interval || 1; - var freq = rule.freq; - - var all = []; - var limit = function (byrule, n) { - all = LIMIT[byrule](all, n, rule); - }; - var expand = function (byrule) { - return function (n) { - // Set the start date at the beginning of the current FREQ - var _s = new Date(+s); - if (rule.freq === 'yearly') { - // January 1st - _s.setMonth(0); - _s.setDate(1); - } else if (rule.freq === 'monthly') { - _s.setDate(1); - } else if (rule.freq === 'weekly') { - goToFirstWeekDay(_s, rule.wkst); - } else if (rule.freq === 'daily') { - // We don't have < byday rules so we can't expand daily rules - } - - var add = EXPAND[byrule](_s, origin, n, rule); - - if (!add) { return; } - - if (Array.isArray(add)) { - add = add.filter(function (dateS) { - return dateS.toLocaleDateString() !== oS.toLocaleDateString(); - }); - Array.prototype.push.apply(all, add); - } else { - if (_s.toLocaleDateString() === oS.toLocaleDateString()) { return; } - all.push(_s); - } - }; - }; - - // Manage interval for the next iteration - var it = Util.once(function () { - FREQ[freq](s, inter); - }); - var addDefault = function () { - if (freq === "monthly") { - s.setDate(15); - } else if (freq === "yearly" && oS.getMonth() === 1 && oS.getDate() === 29) { - s.setDate(28); - } - - it(); - - var _s = new Date(+s); - if (freq === "monthly" || freq === "yearly") { - _s.setDate(oS.getDate()); - if (_s.getDate() !== oS.getDate()) { return; } // If 31st or Feb 29th doesn't exist - if (freq === "yearly" && _s.getMonth() !== oS.getMonth()) { return; } - - // FIXME if there is a recUpdate that moves the 31st to the 30th, the event - // will still only be displayed on months with 31 days - } - all.push(_s); - }; - - if (Array.isArray(cache[id][uid])) { - debug('Get cache', id, uid); - if (freq === "monthly") { - s.setDate(15); - } else if (freq === "yearly" && oS.getMonth() === 1 && oS.getDate() === 29) { - s.setDate(28); - } - it(); - return cache[id][uid]; - } - - if (rule.by && freq === 'yearly') { - var order = BYORDER.slice(); - var monthLimit = false; - if (rule.by.weekno || rule.by.yearday || rule.by.monthday || rule.by.day) { - order.shift(); - monthLimit = true; - } - var first = true; - order.forEach(function (_order) { - var r = rule.by[_order]; - if (!r) { return; } - if (first) { - r.forEach(expand(_order)); - first = false; - } else if (_order === "day") { - if (rule.by.yearday || rule.by.monthday || rule.by.weekno) { - limit('day', rule.by.day); - } else { - rule.by.day.forEach(expand('day')); - } - } else { - limit(_order, r); - } - }); - if (rule.by.month && monthLimit) { - limit('month', rule.by.month); - } - } - if (rule.by && freq === 'monthly') { - // We're going to compute all the entries for the coming month - if (!rule.by.monthday && !rule.by.day) { - addDefault(); - } else if (rule.by.monthday) { - rule.by.monthday.forEach(expand('monthday')); - } else if (rule.by.day) { - rule.by.day.forEach(expand('day')); - } - if (rule.by.month) { - limit('month', rule.by.month); - } - if (rule.by.day && rule.by.monthday) { - limit('day', rule.by.day); - } - } - if (rule.by && freq === 'weekly') { - // We're going to compute all the entries for the coming week - if (!rule.by.day) { - addDefault(); - } else { - rule.by.day.forEach(expand('day')); - } - if (rule.by.month) { - limit('month', rule.by.month); - } - } - if (rule.by && freq === 'daily') { - addDefault(); - BYDAYORDER.forEach(function (_order) { - var r = rule.by[_order]; - if (!r) { return; } - limit(_order, r); - }); - } - - all.sort(function (a, b) { - return a-b; - }); - - if (rule.by && rule.by.setpos) { - limit('setpos', rule.by.setpos); - } - - if (!rule.by || !Object.keys(rule.by).length) { - addDefault(); - } else { - it(); - } - - - var done = []; - all = all.filter(function (newS) { - var start = new Date(+newS).toLocaleDateString(); - if (done.includes(start)) { return false; } - done.push(start); - return true; - }); - - debug('Set cache', id, uid); - cache[id][uid] = all; - - return all; - }; - - var getNextRules = function (obj) { - if (!obj.recUpdate) { return []; } - var _allRules = {}; - var _obj = obj.recUpdate.from; - Object.keys(_obj || {}).forEach(function (d) { - var u = _obj[d]; - if (u.recurrenceRule) { _allRules[d] = u.recurrenceRule; } - }); - return Object.keys(_allRules).sort(function (a, b) { return Number(a)-Number(b); }) - .map(function (k) { - var r = Util.clone(_allRules[k]); - if (!FREQ[r.freq]) { return; } - if (r.interval && r.interval < 1) { return; } - r._start = Number(k); - return r; - }).filter(Boolean); - }; - - var fixTimeZone = function (evTimeZone, origin, target) { - var getOffset = function (date, tz) { - // Get an ISO string using Canadian local format - let iso = date.toLocaleString('en-CA', { timeZone:tz, hour12: false }).replace(', ', 'T'); - iso += '.' + date.getMilliseconds().toString().padStart(3, '0'); - - // Get a UTC version of this time - let utcDate = new Date(iso + 'Z'); - - // Return the difference in timestamps, as minutes (60*1000) - return -(utcDate - date); - }; - - var myTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - var offset = getOffset(origin, evTimeZone) - getOffset(target, evTimeZone); - var myOffset = getOffset(origin, myTimeZone) - getOffset(target, myTimeZone); - - return myOffset - offset; - }; - - Rec.getRecurring = function (months, events) { - if (window.CP_DEV_MODE) { debug = console.warn; } - - var toAdd = []; - months.forEach(function (monthId) { - // from 1st day of the month at 00:00 to last day at 23:59:59:999 - var ms = monthId.split('-'); - var _startMonth = new Date(ms[0], ms[1]); - var _endMonth = new Date(+_startMonth); - _endMonth.setMonth(_endMonth.getMonth() + 1); - _endMonth.setMilliseconds(-1); - - debug('Compute month', _startMonth.toLocaleDateString()); - - var rec = events || []; - rec.forEach(function (obj) { - var _start = new Date(obj.start); - var _end = new Date(obj.end); - var _origin = obj; - var rule = obj.recurrenceRule; - if (!rule) { return; } - - var nextRules = getNextRules(obj); - var nextRule = nextRules.shift(); - - if (_start >= _endMonth) { return; } - - // Check the "until" date of the latest rule we can use and stop now - // if the recurrence ends before the current month - var until = rule.until; - var _nextRules = nextRules.slice(); - var _nextRule = nextRule; - while (_nextRule && _nextRule._start && _nextRule._start < _startMonth) { - until = nextRule.until; - _nextRule = _nextRules.shift(); - } - if (until < _startMonth) { return; } - - var endData = getEndData(_start, _end); - - if (rule.interval && rule.interval < 1) { return; } - if (!FREQ[rule.freq]) { return; } - - /* - // Rule examples - rule.by = { - //month: [1, 4, 5, 8, 12], - //weekno: [1, 2, 4, 5, 32, 34, 35, 50], - //yearday: [1, 2, 29, 30, -2, -1, 250], - //monthday: [1, 2, 3, -3, -2, -1], - //day: ["MO", "WE", "FR"], - //setpos: [1, 2, -1, -2] - }; - rule.wkst = 0; - rule.interval = 2; - rule.freq = 'yearly'; - rule.count = 10; - */ - debug('Iterate over', obj.title, obj); - debug('Use rule', rule); - - var count = rule.count; - var c = 1; - - var next = function (start) { - var evS = new Date(+start); - - if (count && c >= count) { return; } - - debug('Start iteration', evS.toLocaleDateString()); - - var _toAdd = iterate(rule, obj, evS); - - debug('Iteration results', JSON.stringify(_toAdd.map(function (o) { return new Date(o).toLocaleDateString();}))); - - // Make sure to continue if the current year doesn't provide any result - if (!_toAdd.length) { - if (evS.getFullYear() < _startMonth.getFullYear() || - evS < _endMonth) { - return void next(evS); - } - return; - } - - - var stop = false; - var newrule = false; - _toAdd.some(function (_newS) { - // Make event with correct start and end time - var _ev = Util.clone(obj); - _ev.id = _origin.id + '|' + (+_newS); - var _evS = new Date(+_newS); - var _evE = new Date(+_newS); - setEndData(_evS, _evE, endData); - _ev.start = +_evS; - _ev.end = +_evE; - _ev._count = c; - if (_ev.isAllDay && _ev.startDay) { _ev.startDay = getDateStr(_evS); } - if (_ev.isAllDay && _ev.endDay) { _ev.endDay = getDateStr(_evE); } - - if (nextRule && _ev.start === nextRule._start) { - newrule = true; - } - - var useNewRule = function () { - if (!newrule) { return; } - debug('Use new rule', nextRule); - _ev._count = c; - count = nextRule.count; - c = 1; - evS = +_evS; - obj = _ev; - rule = nextRule; - nextRule = nextRules.shift(); - }; - - - if (c >= count) { // Limit reached - debug(_evS.toLocaleDateString(), 'count'); - stop = true; - return true; - } - if (_evS >= _endMonth) { // Won't affect us anymore - debug(_evS.toLocaleDateString(), 'endMonth'); - stop = true; - return true; - } - if (rule.until && _evS > rule.until) { - debug(_evS.toLocaleDateString(), 'until'); - stop = true; - return true; - } - if (_evS < _start) { // "Expand" rules may create events before the _start - debug(_evS.toLocaleDateString(), 'start'); - return; - } - c++; - if (_evE < _startMonth) { // Ended before the current month - // Nothing to display but continue the recurrence - debug(_evS.toLocaleDateString(), 'startMonth'); - if (newrule) { useNewRule(); } - return; - } - // If a recurring event start and end in different months, make sure - // it is only added once - if ((_evS < _endMonth && _evE >= _endMonth) || - (_evS < _startMonth && _evE >= _startMonth)) { - if (recurringAcross[_ev.id] && recurringAcross[_ev.id].includes(_ev.start)) { - return; - } else { - recurringAcross[_ev.id] = recurringAcross[_ev.id] || []; - recurringAcross[_ev.id].push(_ev.start); - } - - } - - // Add this event - if (_origin.timeZone && !_ev.isAllDay) { - var offset = fixTimeZone(_origin.timeZone, _start, _evS); - _ev.start += offset; - _ev.end += offset; - } - toAdd.push(_ev); - if (newrule) { - useNewRule(); - return true; - } - }); - if (!stop) { next(evS); } - }; - next(_start); - debug('Added this month (all events)', toAdd.map(function (ev) { - return new Date(ev.start).toLocaleDateString(); - })); - }); - }); - return toAdd; - }; - Rec.getAllOccurrences = function (ev) { - if (!ev.recurrenceRule) { return [ev.start]; } - var r = ev.recurrenceRule; - // In case of infinite recursion, we can't get all - if (!r.until && !r.count) { return false; } - var all = [ev.start]; - var d = new Date(ev.start); - d.setDate(15); // Make sure we won't skip a month if the event starts on day > 28 - var toAdd = []; - - var i = 0; - var check = function () { - return r.count ? (all.length < r.count) : (+d <= r.until); - }; - while ((toAdd = Rec.getRecurring([Rec.getMonthId(d)], [ev])) && check() && i < (r.count*12)) { - Array.prototype.push.apply(all, toAdd.map(function (_ev) { return _ev.start; })); - d.setMonth(d.getMonth() + 1); - i++; - } - - return all; - }; - - Rec.diffDate = function (oldTime, newTime) { - var n = new Date(newTime); - var o = new Date(oldTime); - - // Diff Days - var d = 0; - var mult = n < o ? -1 : 1; - while (n.toLocaleDateString() !== o.toLocaleDateString() || mult >= 10000) { - n.setDate(n.getDate() - mult); - d++; - } - d = mult * d; - - // Diff hours - n = new Date(newTime); - var h = n.getHours() - o.getHours(); - - // Diff minutes - var m = n.getMinutes() - o.getMinutes(); - - return { - d: d, - h: h, - m: m - }; - }; - - var sortUpdate = function (obj) { - return Object.keys(obj).sort(function (d1, d2) { - return Number(d1) - Number(d2); - }); - }; - Rec.applyUpdates = function (events) { - events.forEach(function (ev) { - ev.raw = { - start: ev.start, - end: ev.end, - }; - - if (!ev.recUpdate) { return; } - - var from = ev.recUpdate.from || {}; - var one = ev.recUpdate.one || {}; - var s = ev.start; - - // Add "until" date to our recurrenceRule if it has been modified in future occurences - var nextRules = getNextRules(ev).filter(function (r) { - return r._start > s; - }); - var nextRule = nextRules.shift(); - - var applyDiff = function (obj, k) { - var diff = obj[k]; // Diff is always compared to origin start/end - var d = new Date(ev.raw[k]); - d.setDate(d.getDate() + diff.d); - d.setHours(d.getHours() + diff.h); - d.setMinutes(d.getMinutes() + diff.m); - ev[k] = +d; - }; - - sortUpdate(from).forEach(function (d) { - if (s < Number(d)) { return; } - Object.keys(from[d]).forEach(function (k) { - if (k === 'start' || k === 'end') { return void applyDiff(from[d], k); } - if (k === "recurrenceRule" && !from[d][k]) { return; } - ev[k] = from[d][k]; - }); - }); - Object.keys(one[s] || {}).forEach(function (k) { - if (k === 'start' || k === 'end') { return void applyDiff(one[s], k); } - if (k === "recurrenceRule" && !one[s][k]) { return; } - ev[k] = one[s][k]; - }); - if (ev.deleted) { - Object.keys(ev).forEach(function (k) { - delete ev[k]; - }); - } - - if (nextRule && ev.recurrenceRule) { - ev.recurrenceRule._next = nextRule._start - 1; - } - - if (ev.reminders) { - ev.raw.reminders = ev.reminders; - } - }); - return events; - }; - - - return Rec; -}; - -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory(require('./common-util')); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define(['/common/common-util.js'], factory); -} else { - // unsupported initialization -} -})(); diff --git a/www/checkup/main.js b/www/checkup/main.js index 0f2f8cf6c..ff6fe231e 100644 --- a/www/checkup/main.js +++ b/www/checkup/main.js @@ -15,7 +15,7 @@ define([ '/common/common-hash.js', '/common/common-util.js', '/common/pinpad.js', - '/common/outer/network-config.js', + '/common/network-config.js', '/common/outer/login-block.js', '/customize/pages.js', '/checkup/checkup-tools.js', @@ -82,7 +82,7 @@ define([ var trimmedSafe = trimSlashes(ApiConfig.httpSafeOrigin); var trimmedUnsafe = trimSlashes(ApiConfig.httpUnsafeOrigin); var fileHost = ApiConfig.fileHost; - var accounts_api = ApiConfig.accounts_api || AppConfig.accounts_api || undefined; + var accounts_api = ApiConfig.accounts_api || undefined; var getAPIPlaceholderPath = function (relative) { var absolute; @@ -113,15 +113,6 @@ define([ } catch (e) {} } - var ACCOUNTS_URL; - try { - if (typeof(AppConfig.upgradeURL) === 'string') { - ACCOUNTS_URL = new URL(AppConfig.upgradeURL, trimmedUnsafe).origin; - } - } catch (err) { - console.error(err); - } - var debugOrigins = { httpUnsafeOrigin: trimmedUnsafe, httpSafeOrigin: trimmedSafe, @@ -1026,8 +1017,7 @@ define([ (HTTP_API_URL && HTTP_API_URL !== $outer) ? HTTP_API_URL : undefined, isHTTPS(fileHost)? fileHost: undefined, // support for cryptpad.fr configuration - accounts_api, - ![trimmedUnsafe, trimmedSafe].includes(ACCOUNTS_URL)? ACCOUNTS_URL: undefined, + accounts_api ], 'img-src': ["'self'", 'data:', 'blob:', $outer], @@ -1066,8 +1056,7 @@ define([ API_URL.origin, (HTTP_API_URL && HTTP_API_URL !== $outer) ? HTTP_API_URL : undefined, isHTTPS(fileHost)? fileHost: undefined, - accounts_api, - ![trimmedUnsafe, trimmedSafe].includes(ACCOUNTS_URL)? ACCOUNTS_URL: undefined, + accounts_api ], 'img-src': ["'self'", 'data:', 'blob:', $outer], 'media-src': ['blob:'], diff --git a/www/code/inner.js b/www/code/inner.js index b445aaa20..2248fef1f 100644 --- a/www/code/inner.js +++ b/www/code/inner.js @@ -179,6 +179,9 @@ define([ var isSmallScreen = () => window.innerWidth <= 600; + const showEditor = Util.once(() => { + $('#cp-app-code-editor').css('display', ''); +}); var mkPreviewPane = function (editor, CodeMirror, framework, isPresentMode) { var $previewContainer = $('#cp-app-code-preview'); var $preview = $('#cp-app-code-preview-content'); @@ -345,8 +348,8 @@ define([ $codeMirrorContainer.addClass('cp-app-code-fullpage'); }; - framework.onReady(function () { + showEditor(); handleResize(); window.addEventListener('resize', handleResize); @@ -536,6 +539,7 @@ define([ } framework.onContentUpdate(function (newContent) { + showEditor(); var highlightMode = newContent.highlightMode; if (highlightMode && highlightMode !== CodeMirror.highlightMode) { CodeMirror.setMode(highlightMode, evModeChange.fire); @@ -578,6 +582,13 @@ define([ framework.setCursorGetter(CodeMirror.getCursor); editor.on('cursorActivity', updateCursor); + editor.setOption("extraKeys", { + "Esc": function(cm, event) { + event.preventDefault(); + document.body.focus(); + } + }); + framework.onEditableChange(function () { editor.setOption('readOnly', framework.isLocked() || framework.isReadOnly()); }); @@ -696,7 +707,7 @@ define([ h('div#cp-app-code-preview-content'), h('div#cp-app-code-print') ]) - ]); + ]).hide(); nThen(function (waitFor) { $(waitFor()); diff --git a/www/common/common-constants.js b/www/common/common-constants.js deleted file mode 100644 index 1764ffbd1..000000000 --- a/www/common/common-constants.js +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(() => { -const factory = function (AppConfig = {}) { - return { - setCustomize: data => { - AppConfig = data.AppConfig; - }, - - // localStorage - userHashKey: 'User_hash', - userNameKey: 'User_name', - blockHashKey: 'Block_hash', - fileHashKey: 'FS_hash', - sessionJWT: 'Session_JWT', - ssoSeed: 'SSO_seed', - - // Store - displayNameKey: 'cryptpad.username', - oldStorageKey: 'CryptPad_RECENTPADS', - storageKey: 'filesData', - tokenKey: 'loginToken', - prefersDriveRedirectKey: 'prefersDriveRedirect', - isPremiumKey: 'isPremiumUser', - displayPadCreationScreen: 'displayPadCreationScreen', - deprecatedKey: 'deprecated', - MAX_TEAMS_SLOTS: AppConfig.maxTeamsSlots || 5, - MAX_TEAMS_OWNED: AppConfig.maxOwnedTeams || 5, - MAX_PREMIUM_TEAMS_SLOTS: Math.max(AppConfig.maxTeamsSlots || 0, AppConfig.maxPremiumTeamsSlots || 0) || 5, - MAX_PREMIUM_TEAMS_OWNED: Math.max(AppConfig.maxOwnedTeams || 0, AppConfig.maxPremiumTeamsOwned || 0) || 5, - // Apps - criticalApps: ['profile', 'settings', 'debug', 'admin', 'support', 'notifications', 'calendar', 'moderation', 'oldadmin'], // XXX oldadmin - earlyAccessApps: [] - }; -}; - -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory(undefined); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define(['/customize/application_config.js'], factory); -} else { - // unsupported initialization -} -})(); - diff --git a/www/common/common-credential.js b/www/common/common-credential.js deleted file mode 100644 index 151a1ced4..000000000 --- a/www/common/common-credential.js +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(function () { -var factory = function (AppConfig = {}, Scrypt) { - var Cred = {}; - - Cred.setCustomize = data => { - AppConfig = data.AppConfig; - }; - - Cred.MINIMUM_PASSWORD_LENGTH = typeof(AppConfig.minimumPasswordLength) === 'number'? - AppConfig.minimumPasswordLength: 8; // TODO 14 or higher is a decent default for 2023 - - Cred.MINIMUM_NAME_LENGTH = 1; - Cred.MAXIMUM_NAME_LENGTH = 64; - - // https://stackoverflow.com/questions/46155/how-to-validate-an-email-address-in-javascript - Cred.isEmail = function (email) { - var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - return re.test(String(email).toLowerCase()); - }; - - Cred.isLongEnoughPassword = function (passwd) { - return passwd.length >= Cred.MINIMUM_PASSWORD_LENGTH; - }; - - var isString = Cred.isString = function (x) { - return typeof(x) === 'string'; - }; - - // Maximum username length is enforced at registration time - // rather than in this function - // in order to maintain backwards compatibility with accounts - // that might have already registered with a longer name. - Cred.isValidUsername = function (name) { - return !!(isString(name) && name.length >= Cred.MINIMUM_NAME_LENGTH); - }; - - Cred.isValidPassword = function (passwd) { - return !!(passwd && isString(passwd)); - }; - - Cred.passwordsMatch = function (a, b) { - return isString(a) && isString(b) && a === b; - }; - - Cred.customSalt = function () { - return typeof(AppConfig.loginSalt) === 'string'? - AppConfig.loginSalt: ''; - }; - - Cred.deriveFromPassphrase = function (username, password, len, cb) { - Scrypt(password, - username + Cred.customSalt(), // salt - 8, // memoryCost (n) - 1024, // block size parameter (r) - len || 128, // dkLen - 200, // interruptStep - cb, - undefined); // format, could be 'base64' - }; - - Cred.dispenser = function (bytes) { - var entropy = { - used: 0, - }; - - // crypto hygeine - var consume = function (n) { - // explode if you run out of bytes - if (entropy.used + n > bytes.length) { - throw new Error('exceeded available entropy'); - } - if (typeof(n) !== 'number') { throw new Error('expected a number'); } - if (n <= 0) { - throw new Error('expected to consume a positive number of bytes'); - } - - // grab an unused slice of the entropy - // Note: Internet Explorer doesn't support .slice on Uint8Array - var A; - if (bytes.slice) { - A = bytes.slice(entropy.used, entropy.used + n); - } else { - A = bytes.subarray(entropy.used, entropy.used + n); - } - - // account for the bytes you used so you don't reuse bytes - entropy.used += n; - - //console.info("%s bytes of entropy remaining", bytes.length - entropy.used); - return A; - }; - - return consume; - }; - - return Cred; -}; - - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - undefined, //require("../../customize.dist/application_config.js"), - require("scrypt-async") - ); - } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/customize/application_config.js', - '/components/scrypt-async/scrypt-async.min.js', - ], function (AppConfig) { - return factory(AppConfig, window.scrypt); - }); - } -}()); diff --git a/www/common/common-feedback.js b/www/common/common-feedback.js deleted file mode 100644 index e4ab25a14..000000000 --- a/www/common/common-feedback.js +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(() => { -const factory = (AppConfig = {}, Messages= {}) => { - var Feedback = {}; - - Feedback.setCustomize = data => { - Messages = data.Messages; - AppConfig = data.AppConfig; - }; - - Feedback.init = function (state) { - Feedback.state = state; - }; - - var randomToken = function () { - return Math.random().toString(16).replace(/0./, ''); - }; - var ajax = function (url, cb) { - var http = new XMLHttpRequest(); - http.open('HEAD', url); - http.onreadystatechange = function() { - if (this.readyState === this.DONE) { - if (cb) { cb(); } - } - }; - http.send(); - }; - Feedback.send = function (action, force, cb) { - if (typeof(cb) !== 'function') { cb = function () {}; } - if (AppConfig.disableFeedback) { return void cb(); } - if (!action) { return void cb(); } - if (force !== true) { - if (!Feedback.state) { return void cb(); } - } - - var href = '/common/feedback.html?' + action + '=' + randomToken(); - ajax(href, cb); - }; - - Feedback.reportAppUsage = function () { - var pattern = window.location.pathname.split('/') - .filter(function (x) { return x; }).join('.'); - if (/^#\/1\/view\//.test(window.location.hash)) { - Feedback.send(pattern + '_VIEW'); - } else { - Feedback.send(pattern); - } - }; - - Feedback.reportScreenDimensions = function () { - var h = window.innerHeight; - var w = window.innerWidth; - Feedback.send('DIMENSIONS:' + h + 'x' + w); - }; - Feedback.reportLanguage = function () { - if (!Messages) { return; } - Feedback.send('LANG_' + Messages._languageUsed); - }; - - - return Feedback; -}; - -if (typeof(module) !== 'undefined' && module.exports) { - // Code from customize can't be laoded directly in the build - module.exports = factory(undefined, undefined); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/customize/application_config.js', - '/customize/messages.js' - ], factory); -} else { - // unsupported initialization -} - -})(); diff --git a/www/common/common-hash.js b/www/common/common-hash.js deleted file mode 100644 index 0eb4faa37..000000000 --- a/www/common/common-hash.js +++ /dev/null @@ -1,766 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(function (window) { -var factory = function (Util, Crypto, Keys, Nacl) { - var Hash = window.CryptPad_Hash = {}; - - var uint8ArrayToHex = Util.uint8ArrayToHex; - var hexToBase64 = Util.hexToBase64; - var base64ToHex = Util.base64ToHex; - Hash.encodeBase64 = Util.encodeBase64; - Hash.decodeBase64 = Util.decodeBase64; - - // This implementation must match that on the server - // it's used for a checksum - Hash.hashChannelList = function (list) { - return Util.encodeBase64(Nacl.hash(Util - .decodeUTF8(JSON.stringify(list)))); - }; - - Hash.generateSignPair = function () { - var ed = Nacl.sign.keyPair(); - var makeSafe = function (key) { - return Crypto.b64RemoveSlashes(key).replace(/=+$/g, ''); - }; - return { - validateKey: Hash.encodeBase64(ed.publicKey), - signKey: Hash.encodeBase64(ed.secretKey), - safeValidateKey: makeSafe(Hash.encodeBase64(ed.publicKey)), - safeSignKey: makeSafe(Hash.encodeBase64(ed.secretKey)), - }; - }; - - Hash.getSignPublicFromPrivate = function (edPrivateSafeStr) { - var edPrivateStr = Crypto.b64AddSlashes(edPrivateSafeStr); - var privateKey = Util.decodeBase64(edPrivateStr); - var keyPair = Nacl.sign.keyPair.fromSecretKey(privateKey); - return Util.encodeBase64(keyPair.publicKey); - }; - Hash.getCurvePublicFromPrivate = function (curvePrivateSafeStr) { - var curvePrivateStr = Crypto.b64AddSlashes(curvePrivateSafeStr); - var privateKey = Util.decodeBase64(curvePrivateStr); - var keyPair = Nacl.box.keyPair.fromSecretKey(privateKey); - return Util.encodeBase64(keyPair.publicKey); - }; - - var getEditHashFromKeys = Hash.getEditHashFromKeys = function (secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { - return secret.channel + secret.key; - } - if (version === 1) { - if (!data.editKeyStr) { return; } - return '/1/edit/' + hexToBase64(secret.channel) + - '/' + Crypto.b64RemoveSlashes(data.editKeyStr) + '/'; - } - if (version === 2) { - if (!data.editKeyStr) { return; } - var pass = secret.password ? 'p/' : ''; - return '/2/' + secret.type + '/edit/' + Crypto.b64RemoveSlashes(data.editKeyStr) + '/' + pass; - } - }; - var getViewHashFromKeys = Hash.getViewHashFromKeys = function (secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { return; } - if (version === 1) { - if (!data.viewKeyStr) { return; } - return '/1/view/' + hexToBase64(secret.channel) + - '/'+Crypto.b64RemoveSlashes(data.viewKeyStr)+'/'; - } - if (version === 2) { - if (!data.viewKeyStr) { return; } - var pass = secret.password ? 'p/' : ''; - return '/2/' + secret.type + '/view/' + Crypto.b64RemoveSlashes(data.viewKeyStr) + '/' + pass; - } - }; - - Hash.getHiddenHashFromKeys = function (type, secret, opts) { - opts = opts || {}; - var canEdit = (secret.keys && secret.keys.editKeyStr) || secret.key; - var mode = (!opts.view && canEdit) ? 'edit/' : 'view/'; - var pass = secret.password ? 'p/' : ''; - - if (secret.keys && secret.keys.fileKeyStr) { mode = ''; } - - var hash = '/3/' + type + '/' + mode + secret.channel + '/' + pass; - var hashData = Hash.parseTypeHash(type, hash); - if (hashData && hashData.getHash) { - return hashData.getHash(opts || {}); - } - return hash; - }; - - var getFileHashFromKeys = Hash.getFileHashFromKeys = function (secret) { - var version = secret.version; - var data = secret.keys; - if (version === 0) { return; } - if (version === 1) { - return '/1/' + hexToBase64(secret.channel) + '/' + - Crypto.b64RemoveSlashes(data.fileKeyStr) + '/'; - } - if (version === 2) { - if (!data.fileKeyStr) { return; } - var pass = secret.password ? 'p/' : ''; - return '/2/' + secret.type + '/' + Crypto.b64RemoveSlashes(data.fileKeyStr) + '/' + pass; - } - }; - - Hash.getPublicSigningKeyString = Keys.serialize; - - var fixDuplicateSlashes = function (s) { - return s.replace(/\/+/g, '/'); - }; - - Hash.ephemeralChannelLength = 34; - Hash.createChannelId = function (ephemeral) { - var id = uint8ArrayToHex(Crypto.Nacl.randomBytes(ephemeral? 17: 16)); - if ([32, 34].indexOf(id.length) === -1 || /[^a-f0-9]/.test(id)) { - throw new Error('channel ids must consist of 32 hex characters'); - } - return id; - }; - - /* Given a base64-encoded public key, deterministically derive a channel id - Used for support mailboxes - */ - Hash.getChannelIdFromKey = function (publicKey) { - if (!publicKey) { return; } - return uint8ArrayToHex(Hash.decodeBase64(publicKey).subarray(0,16)); - }; - - /* Given a base64-encoded asymmetric private key - derive the corresponding public key - */ - Hash.getBoxPublicFromSecret = function (priv) { - if (!priv) { return; } - var u8_priv = Hash.decodeBase64(priv); - var pair = Nacl.box.keyPair.fromSecretKey(u8_priv); - return Hash.encodeBase64(pair.publicKey); - }; - - /* Given a base64-encoded private key and public key - check that the keys are part of a valid keypair - */ - Hash.checkBoxKeyPair = function (priv, pub) { - if (!pub || !priv) { return false; } - var u8_priv = Hash.decodeBase64(priv); - var pair = Nacl.box.keyPair.fromSecretKey(u8_priv); - return pub === Hash.encodeBase64(pair.publicKey); - }; - - Hash.createRandomHash = function (type, password) { - var cryptor; - if (type === 'file') { - cryptor = Crypto.createFileCryptor2(void 0, password); - return getFileHashFromKeys({ - password: Boolean(password), - version: 2, - type: type, - keys: cryptor - }); - } - cryptor = Crypto.createEditCryptor2(void 0, void 0, password); - return getEditHashFromKeys({ - password: Boolean(password), - version: 2, - type: type, - keys: cryptor - }); - }; - -/* -Version 0 - /pad/#67b8385b07352be53e40746d2be6ccd7XAYSuJYYqa9NfmInyHci7LNy -Version 1: Add support for read-only access - /code/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI -Version 2: Add support for password-protection - /code/#/2/code/edit/u5ACvxAYmhvG0FtrNn9FJQcf/p/ -Version 3: Safe links - /code/#/3/code/edit/f0d8055aa640a97e7fd25020ca4e93b3/ -Version 4: Data URL when not a realtime link yet (new pad or "static" app) - /login/#/4/login/newpad=eyJocmVmIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvZGUvIy8yL2NvZGUvZWRpdC91NUFDdnhBWW1odkcwRnRyTm45RklRY2YvIn0%3D/ - /drive/#/4/drive/login=e30%3D/ -*/ - - var getLoginOpts = function (hashArr) { - var k; - // Check if we have a ownerKey for this pad - hashArr.some(function (data) { - if (/^login=/.test(data)) { - k = data.slice(6); - return true; - } - }); - return k || ''; - }; - var getNewPadOpts = function (hashArr) { - var k; - // Check if we have a ownerKey for this pad - hashArr.some(function (data) { - if (/^newpad=/.test(data)) { - k = data.slice(7); - return true; - } - }); - return k || ''; - }; - var getVersionHash = function (hashArr) { - var k; - // Check if we have a ownerKey for this pad - hashArr.some(function (data) { - if (/^hash=/.test(data)) { - k = data.slice(5); - return true; - } - }); - return k ? Crypto.b64AddSlashes(k) : ''; - }; - var getAuditorKey = function (hashArr) { - var k; - // Check if we have a ownerKey for this pad - hashArr.some(function (data) { - if (/^auditor=/.test(data)) { - k = data.slice(8); - return true; - } - }); - return k ? Crypto.b64AddSlashes(k) : ''; - }; - var getOwnerKey = function (hashArr) { - var k; - // Check if we have a ownerKey for this pad - hashArr.some(function (data) { - if (data.length === 86) { - k = data; - return true; - } - }); - return k; - }; - var parseTypeHash = Hash.parseTypeHash = function (type, hash) { - if (!hash) { return; } - var options = []; - var parsed = {}; - var hashArr = fixDuplicateSlashes(hash).split('/'); - - var addOptions = function () { - parsed.password = options.indexOf('p') !== -1; - parsed.present = options.indexOf('present') !== -1; - parsed.embed = options.indexOf('embed') !== -1; - parsed.versionHash = getVersionHash(options); - parsed.auditorKey = getAuditorKey(options); - parsed.newPadOpts = getNewPadOpts(options); - parsed.loginOpts = getLoginOpts(options); - parsed.ownerKey = getOwnerKey(options); - }; - - // Version 4: only login or newpad options, same for all the apps - if (hashArr[1] && hashArr[1] === '4') { - parsed.getHash = function (opts) { - if (!opts || !Object.keys(opts).length) { return ''; } - var hash = '/4/' + type + '/'; - if (opts.newPadOpts) { hash += 'newpad=' + opts.newPadOpts + '/'; } - if (opts.loginOpts) { hash += 'login=' + opts.loginOpts + '/'; } - return hash; - }; - parsed.getOptions = function () { - var options = {}; - if (parsed.newPadOpts) { options.newPadOpts = parsed.newPadOpts; } - if (parsed.loginOpts) { options.loginOpts = parsed.loginOpts; } - return options; - }; - - parsed.version = 4; - parsed.app = hashArr[2]; - options = hashArr.slice(3); - addOptions(); - - return parsed; - } - - // The other versions depends on the type - if (['media', 'file', 'user', 'invite'].indexOf(type) === -1) { - parsed.type = 'pad'; - parsed.getHash = function () { - return hash; - }; - parsed.getOptions = function () { - return { - embed: parsed.embed, - present: parsed.present, - ownerKey: parsed.ownerKey, - versionHash: parsed.versionHash, - auditorKey: parsed.auditorKey, - newPadOpts: parsed.newPadOpts, - loginOpts: parsed.loginOpts, - password: parsed.password - }; - }; - - if (hash.slice(0,1) !== '/' && hash.length >= 56) { // Version 0 - // Old hash - parsed.channel = hash.slice(0, 32); - parsed.key = hash.slice(32, 56); - parsed.version = 0; - return parsed; - } - - // Version >= 1: more hash options - parsed.getHash = function (opts) { - var hash = hashArr.slice(0, 5).join('/') + '/'; - var owner = typeof(opts.ownerKey) !== "undefined" ? opts.ownerKey : parsed.ownerKey; - if (owner) { hash += owner + '/'; } - if (parsed.password || opts.password) { hash += 'p/'; } - if (opts.embed) { hash += 'embed/'; } - if (opts.present) { hash += 'present/'; } - var versionHash = typeof(opts.versionHash) !== "undefined" ? opts.versionHash : parsed.versionHash; - if (versionHash) { - hash += 'hash=' + Crypto.b64RemoveSlashes(versionHash) + '/'; - } - var auditorKey = typeof(opts.auditorKey) !== "undefined" ? opts.auditorKey : parsed.auditorKey; - if (auditorKey) { - hash += 'auditor=' + Crypto.b64RemoveSlashes(auditorKey) + '/'; - } - if (opts.newPadOpts) { hash += 'newpad=' + opts.newPadOpts + '/'; } - if (opts.loginOpts) { hash += 'login=' + opts.loginOpts + '/'; } - return hash; - }; - - if (hashArr[1] && hashArr[1] === '1') { // Version 1 - parsed.version = 1; - parsed.mode = hashArr[2]; - parsed.channel = hashArr[3]; - parsed.key = Crypto.b64AddSlashes(hashArr[4]); - - options = hashArr.slice(5); - addOptions(); - - return parsed; - } - if (hashArr[1] && hashArr[1] === '2') { // Version 2 - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.key = hashArr[4]; - - options = hashArr.slice(5); - addOptions(); - - return parsed; - } - if (hashArr[1] && hashArr[1] === '3') { // Version 3: hidden hash - parsed.version = 3; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.channel = hashArr[4]; - - options = hashArr.slice(5); - addOptions(); - - return parsed; - } - return parsed; - } - parsed.getHash = function () { return hashArr.join('/'); }; - if (['media', 'file'].indexOf(type) !== -1) { - parsed.type = 'file'; - - parsed.getOptions = function () { - return { - embed: parsed.embed, - present: parsed.present, - ownerKey: parsed.ownerKey, - newPadOpts: parsed.newPadOpts, - loginOpts: parsed.loginOpts, - password: parsed.password - }; - }; - - parsed.getHash = function (opts) { - var hash = hashArr.slice(0, 4).join('/') + '/'; - var owner = typeof(opts.ownerKey) !== "undefined" ? opts.ownerKey : parsed.ownerKey; - if (owner) { hash += owner + '/'; } - if (parsed.password || opts.password) { hash += 'p/'; } - if (opts.embed) { hash += 'embed/'; } - if (opts.present) { hash += 'present/'; } - if (opts.newPadOpts) { hash += 'newpad=' + opts.newPadOpts + '/'; } - if (opts.loginOpts) { hash += 'login=' + opts.loginOpts + '/'; } - return hash; - }; - - if (hashArr[1] && hashArr[1] === '1') { - parsed.version = 1; - parsed.channel = hashArr[2].replace(/-/g, '/'); - parsed.key = hashArr[3].replace(/-/g, '/'); - options = hashArr.slice(4); - addOptions(); - return parsed; - } - - if (hashArr[1] && hashArr[1] === '2') { // Version 2 - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.key = hashArr[3]; - - options = hashArr.slice(4); - addOptions(); - - return parsed; - } - - if (hashArr[1] && hashArr[1] === '3') { // Version 3: hidden hash - parsed.version = 3; - parsed.app = hashArr[2]; - parsed.channel = hashArr[3]; - - options = hashArr.slice(4); - addOptions(); - - return parsed; - } - return parsed; - } - if (['user'].indexOf(type) !== -1) { - parsed.type = 'user'; - if (hashArr[1] && hashArr[1] === '1') { - parsed.version = 1; - parsed.user = hashArr[2]; - parsed.pubkey = hashArr[3].replace(/-/g, '/'); - return parsed; - } - return parsed; - } - if (['invite'].indexOf(type) !== -1) { - parsed.type = 'invite'; - if (hashArr[1] && hashArr[1] === '2') { - parsed.version = 2; - parsed.app = hashArr[2]; - parsed.mode = hashArr[3]; - parsed.key = hashArr[4]; - - options = hashArr.slice(5); - parsed.password = options.indexOf('p') !== -1; - return parsed; - } - return parsed; - } - return; - }; - var parsePadUrl = Hash.parsePadUrl = function (href) { - var patt = /^https*:\/\/([^\/]*)\/(.*?)\//i; - - var ret = {}; - - if (!href) { return ret; } - if (href.slice(-1) !== '/' && href.slice(-1) !== '#') { href += '/'; } - href = href.replace(/\/\?[^#]+#/, '/#'); - - var idx; - - // When we start without a hash, use version 4 links to add login or newpad options - var getHash = function (opts) { - if (!opts || !Object.keys(opts).length) { return ''; } - var hash = '/4/' + ret.type + '/'; - if (opts.newPadOpts) { hash += 'newpad=' + opts.newPadOpts + '/'; } - if (opts.loginOpts) { hash += 'login=' + opts.loginOpts + '/'; } - return hash; - }; - ret.getUrl = function (options) { - options = options || {}; - var url = '/'; - if (!ret.type) { return url; } - url += ret.type + '/'; - // New pad with options: append the options to the hash - if (!ret.hashData && options && Object.keys(options).length) { - return url + '#' + getHash(options); - } - if (!ret.hashData) { return url; } - //if (ret.hashData.version === 0) { return url + '#' + ret.hash; } - //if (ret.hashData.type !== 'pad') { return url + '#' + ret.hash; } - var hash = ret.hashData.getHash(options); - url += '#' + hash; - return url; - }; - ret.getOptions = function () { - if (!ret.hashData || !ret.hashData.getOptions) { return {}; } - return ret.hashData.getOptions(); - }; - - if (!/^https*:\/\//.test(href)) { - // If it doesn't start with http(s), it should be a relative href - if (!/^\/($|[^\/])/.test(href)) { return ret; } - idx = href.indexOf('/#'); - ret.type = href.slice(1, idx); - if (idx === -1) { return ret; } - ret.hash = href.slice(idx + 2); - ret.hashData = parseTypeHash(ret.type, ret.hash); - return ret; - } - - href.replace(patt, function (a, domain, type) { - ret.domain = domain; - ret.type = type; - return ''; - }); - idx = href.indexOf('/#'); - if (idx === -1) { return ret; } - ret.hash = href.slice(idx + 2); - ret.hashData = parseTypeHash(ret.type, ret.hash); - return ret; - }; - - Hash.hashToHref = function (hash, type) { - return '/' + type + '/#' + hash; - }; - Hash.hrefToHash = function (href) { - var parsed = Hash.parsePadUrl(href); - return parsed.hash; - }; - - Hash.getRelativeHref = function (href) { - if (!href) { return; } - if (href.indexOf('#') === -1) { return; } - var parsed = parsePadUrl(href); - return '/' + parsed.type + '/#' + parsed.hash; - }; - - /* - * Returns all needed keys for a realtime channel - * - no argument: use the URL hash or create one if it doesn't exist - * - secretHash provided: use secretHash to find the keys - */ - Hash.getSecrets = function (type, secretHash, password) { - var secret = {}; - var generate = function () { - secret.keys = Crypto.createEditCryptor2(void 0, void 0, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.version = 2; - secret.type = type; - }; - if (!secretHash) { - generate(); - return secret; - } else { - var parsed; - var hash; - if (secretHash) { - if (!type) { throw new Error("getSecrets with a hash requires a type parameter"); } - parsed = parseTypeHash(type, secretHash); - hash = secretHash; - } - if (hash.length === 0) { - generate(); - return secret; - } - // old hash system : #{hexChanKey}{cryptKey} - // new hash system : #/{hashVersion}/{b64ChanKey}/{cryptKey} - if (parsed.version === 0) { - // Old hash - secret.channel = parsed.channel; - secret.key = parsed.key; - secret.version = 0; - } else if (parsed.version === 1) { - // New hash - secret.version = 1; - if (parsed.type === "pad") { - secret.channel = base64ToHex(parsed.channel); - if (parsed.mode === 'edit') { - secret.keys = Crypto.createEditCryptor(parsed.key); - secret.key = secret.keys.editKeyStr; - if (secret.channel.length !== 32 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } - else if (parsed.mode === 'view') { - secret.keys = Crypto.createViewCryptor(parsed.key); - if (secret.channel.length !== 32) { - throw new Error("The channel key is invalid"); - } - } - } else if (parsed.type === "file") { - secret.channel = base64ToHex(parsed.channel); - secret.keys = { - fileKeyStr: parsed.key, - cryptKey: Util.decodeBase64(parsed.key) - }; - } else if (parsed.type === "user") { - throw new Error("User hashes can't be opened (yet)"); - } - } else if (parsed.version === 2) { - // New hash - secret.version = 2; - secret.type = type; - secret.password = password; - if (parsed.type === "pad") { - if (parsed.mode === 'edit') { - secret.keys = Crypto.createEditCryptor2(parsed.key, void 0, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.key = secret.keys.editKeyStr; - if (secret.channel.length !== 32 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } - else if (parsed.mode === 'view') { - secret.keys = Crypto.createViewCryptor2(parsed.key, password); - secret.channel = base64ToHex(secret.keys.chanId); - if (secret.channel.length !== 32) { - throw new Error("The channel key is invalid"); - } - } - } else if (parsed.type === "file") { - secret.keys = Crypto.createFileCryptor2(parsed.key, password); - secret.channel = base64ToHex(secret.keys.chanId); - secret.key = secret.keys.fileKeyStr; - if (secret.channel.length !== 48 || secret.key.length !== 24) { - throw new Error("The channel key and/or the encryption key is invalid"); - } - } else if (parsed.type === "user") { - throw new Error("User hashes can't be opened (yet)"); - } - } - } - return secret; - }; - - Hash.getHashes = function (secret) { - var hashes = {}; - secret = JSON.parse(JSON.stringify(secret)); - - if (!secret.keys && !secret.key) { - return hashes; - } else if (!secret.keys) { - secret.keys = {}; - } - - if (secret.keys.editKeyStr || (secret.version === 0 && secret.key)) { - hashes.editHash = getEditHashFromKeys(secret); - } - if (secret.keys.viewKeyStr) { - hashes.viewHash = getViewHashFromKeys(secret); - } - if (secret.keys.fileKeyStr) { - hashes.fileHash = getFileHashFromKeys(secret); - } - return hashes; - }; - - Hash.getFormData = function (secret, hash, password) { - secret = secret || Hash.getSecrets('form', hash, password); - var keys = secret && secret.keys; - var secondary = keys && keys.secondaryKey; - if (!secondary) { return; } - var curvePair = Nacl.box.keyPair.fromSecretKey(Util.decodeUTF8(secondary).slice(0,32)); - var ret = {}; - ret.form_public = Util.encodeBase64(curvePair.publicKey); - var privateKey = ret.form_private = Util.encodeBase64(curvePair.secretKey); - - var auditorHash = Hash.getViewHashFromKeys({ - version: 1, - channel: secret.channel, - keys: { viewKeyStr: Util.encodeBase64(keys.cryptKey) } - }); - var _parsed = Hash.parseTypeHash('pad', auditorHash); - ret.form_auditorHash = _parsed.getHash({auditorKey: privateKey}); - - return ret; - }; - - // STORAGE - Hash.hrefToHexChannelId = function (href, password) { - var parsed = Hash.parsePadUrl(href); - if (!parsed || !parsed.hash) { return; } - var secret = Hash.getSecrets(parsed.type, parsed.hash, password); - return secret.channel; - }; - - Hash.getBlobPathFromHex = function (id) { - return '/blob/' + id.slice(0,2) + '/' + id; - }; - - Hash.serializeHash = function (hash) { - if (hash && hash.slice(-1) !== "/") { hash += "/"; } - return hash; - }; - - Hash.createInviteUrl = function (curvePublic, channel) { - channel = channel || Hash.createChannelId(); - return window.location.origin + '/invite/#/1/' + channel + - '/' + curvePublic.replace(/\//g, '-') + '/'; - }; - - Hash.isValidChannel = function (channelId) { - return /^[a-zA-Z0-9]{32,48}$/.test(channelId); - }; - - Hash.isValidHref = function (href) { - // Non-empty href? - if (!href) { return; } - var parsed = Hash.parsePadUrl(href); - // Can be parsed? - if (!parsed) { return; } - // Link to a CryptPad app? - if (!parsed.type) { return; } - // Valid hash? - if (parsed.hash) { - if (!parsed.hashData) { return; } - // Version should be a number - if (typeof(parsed.hashData.version) === "undefined") { return; } - // pads and files should have a base64 (or hex) key - if (parsed.hashData.type === 'pad' || parsed.hashData.type === 'file') { - if (!parsed.hashData.key && !parsed.hashData.channel) { return; } - if (parsed.hashData.key && !/^[a-zA-Z0-9+-/=]+$/.test(parsed.hashData.key)) { return; } - } - } - return parsed; - }; - - Hash.decodeDataOptions = function (opts) { - var b64 = decodeURIComponent(opts); - var str = Util.encodeUTF8(Util.decodeBase64(b64)); - return Util.tryParse(str) || {}; - }; - Hash.encodeDataOptions = function (opts) { - var str = JSON.stringify(opts); - var b64 = Util.encodeBase64(Util.decodeUTF8(str)); - return encodeURIComponent(b64); - }; - Hash.getNewPadURL = function (href, opts) { - var parsed = Hash.parsePadUrl(href); - var options = parsed.getOptions(); - options.newPadOpts = Hash.encodeDataOptions(opts); - return parsed.getUrl(options); - }; - Hash.getLoginURL = function (href, opts) { - var parsed = Hash.parsePadUrl(href); - var options = parsed.getOptions(); - options.loginOpts = Hash.encodeDataOptions(opts); - return parsed.getUrl(options); - }; - - return Hash; -}; - - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory( - require("./common-util"), - require("chainpad-crypto"), - require("./common-signing-keys"), - require("tweetnacl/nacl-fast") - ); - } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([ - '/common/common-util.js', - '/components/chainpad-crypto/crypto.js', - '/common/common-signing-keys.js', - '/components/tweetnacl/nacl-fast.min.js' - ], function (Util, Crypto, Keys) { - return factory(Util, Crypto, Keys, window.nacl); - }); - } else { - // unsupported initialization - } -}(typeof(window) !== 'undefined'? window : {})); diff --git a/www/common/common-interface.js b/www/common/common-interface.js index e95e5dbf9..653c659f2 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -212,6 +212,12 @@ define([ h('div'+cls, content), ]) ]); + + var dialogContent = frame.querySelector('div' + cls); + dialogContent.setAttribute('aria-live', 'assertive'); + dialogContent.setAttribute('role', 'alertdialog'); + dialogContent.setAttribute('aria-modal', 'true'); + var $frame = $(frame); frame.closeModal = function (cb) { frame.closeModal = function () {}; // Prevent further calls @@ -578,6 +584,7 @@ define([ }; let addTabListener = UI.addTabListener = frame => { + $(frame).attr('role', 'dialog').attr('aria-modal', 'true'); // find focusable elements let modalElements = $(frame).find('a, button, input, [tabindex]:not([tabindex="-1"]), textarea').filter(':visible').filter(':not(:disabled)'); @@ -990,7 +997,10 @@ define([ var input = h('input.cp-password-input', attributes); var eye = h('span.fa.fa-eye.cp-password-reveal', { - tabindex: 0 + tabindex: 0, + role: 'button', + 'aria-label': Messages.show_password, + 'aria-pressed': 'false' }); var $eye = $(eye); @@ -1013,12 +1023,12 @@ define([ if ($eye.hasClass('fa-eye')) { $input.prop('type', 'text'); $input.focus(); - $eye.removeClass('fa-eye').addClass('fa-eye-slash'); + $eye.removeClass('fa-eye').addClass('fa-eye-slash').attr('aria-label', Messages.hide_password).attr('aria-pressed', 'true'); return; } $input.prop('type', 'password'); $input.focus(); - $eye.removeClass('fa-eye-slash').addClass('fa-eye'); + $eye.removeClass('fa-eye-slash').addClass('fa-eye').attr('aria-label', Messages.show_password).attr('aria-pressed', 'false'); }); } @@ -1036,7 +1046,7 @@ define([ href: href, target: "_blank", 'data-tippy-placement': "right", - 'aria-label': Messages.help_genericMore //TBC XXX + 'aria-label': text }); return q; }; @@ -1077,6 +1087,7 @@ define([ $loading.css('display', ''); $loading.removeClass('cp-loading-hidden'); $loading.removeClass('cp-loading-transparent'); + $loading.attr('aria-live','polite'); if (config.newProgress) { var progress = h('div.cp-loading-progress', [ h('p.cp-loading-progress-list'), @@ -1124,6 +1135,13 @@ define([ $('head > link[href^="/customize/src/pre-loading.css"]').remove(); $('html').toggleClass('cp-loading-noscroll', false); }; + UI.emptyLoadingScreen = function (content) { + UI.addLoadingScreen(); + var $loading = $('#' + LOADING); + $loading.find('.cp-loading-container').hide(); + $loading.find('.cp-loading-logo').hide(); + $loading.append(content); + }; UI.errorLoadingScreen = function (error, transparent, exitable) { if (error === 'Error: XDR encoding failure') { console.warn(error); @@ -1253,6 +1271,10 @@ define([ arrow: true, maxWidth: '200px', flip: true, + onShow: () => { + // Hide other tooltips + $('body').find('.tippy-popper').hide(); + }, popperOptions: { modifiers: { preventOverflow: { boundariesElement: 'window' } @@ -1353,13 +1375,12 @@ define([ }); $input.change(function () { + $mark.attr('aria-checked', $input.is(':checked')); if (!opts.labelAlt) { return; } if ($input.is(':checked') !== checked) { $(label).text(opts.labelAlt); - $mark.attr('aria-checked', 'true'); } else { $(label).text(labelTxt); - $mark.attr('aria-checked', 'false'); } }); diff --git a/www/common/common-login.js b/www/common/common-login.js index f2c2a4a90..37cd08aa0 100644 --- a/www/common/common-login.js +++ b/www/common/common-login.js @@ -6,7 +6,7 @@ define([ 'chainpad-listmap', '/components/chainpad-crypto/crypto.js', '/common/common-util.js', - '/common/outer/network-config.js', + '/common/network-config.js', '/common/common-credential.js', '/components/chainpad/chainpad.dist.js', '/common/common-realtime.js', diff --git a/www/common/common-realtime.js b/www/common/common-realtime.js deleted file mode 100644 index cdf942609..000000000 --- a/www/common/common-realtime.js +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(() => { -const factory = () => { - var common = {}; - - /* - TODO make this not blow up when disconnected or lagging... - */ - common.whenRealtimeSyncs = function (realtime, cb) { - if (typeof(realtime.getAuthDoc) !== 'function') { - return void console.error('improper use of this function'); - } - setTimeout(function () { - if (realtime.getAuthDoc() === realtime.getUserDoc()) { - return void cb(); - } else { - realtime.onSettle(cb); - } - }, 0); - }; - - return common; -}; - -if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory(); -} else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([], factory); -} else { - // unsupported initialization -} - -})(); diff --git a/www/common/common-signing-keys.js b/www/common/common-signing-keys.js deleted file mode 100644 index 1d1132c34..000000000 --- a/www/common/common-signing-keys.js +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and contributors -// -// SPDX-License-Identifier: AGPL-3.0-or-later - -(function () { -var factory = function () { - var Keys = {}; - - var unescape = function (s) { - return s.replace(/-/g, '/'); - }; - -/* Parse the new format of "Signing Public Keys". - If anything about the input is found to be invalid, return; - this will fall back to the old parsing method - - -*/ - var parseNewUser = function (userString) { - if (!/^\[.*?@.*\]$/.test(userString)) { return; } - var temp = userString.slice(1, -1); - var domain, username, pubkey; - - temp = temp - .replace(/\/([a-zA-Z0-9+-]{43}=)$/, function (all, k) { - pubkey = unescape(k); - return ''; - }); - if (!pubkey) { return; } - - var index = temp.lastIndexOf('@'); - if (index < 1) { return; } - - domain = temp.slice(index + 1); - username = temp.slice(0, index); - - return { - domain: domain, - user: username, - pubkey: pubkey - }; - }; - - var isValidUser = function (parsed) { - if (!parsed) { return; } - if (!(parsed.domain && parsed.user && parsed.pubkey)) { return; } - return true; - }; - - Keys.parseUser = function (user) { - var parsed = parseNewUser(user); - if (isValidUser(parsed)) { return parsed; } - - var domain, username, pubkey; - user.replace(/^https*:\/\/([^\/]+)\/user\/#\/1\/([^\/]+)\/([a-zA-Z0-9+-]{43}=)$/, - function (a, d, u, k) { - domain = d; - username = u; - pubkey = unescape(k); - return ''; - }); - if (!domain) { throw new Error("Could not parse user id [" + user + "]"); } - return { - domain: domain, - user: username, - pubkey: pubkey - }; - }; - -/* - -0. usernames may contain spaces or many other wacky characters, so enclose the whole thing in square braces so we know its boundaries. If the formatted string does not include these we know it is either a _v1 public key string_ or _an incomplete string_. Start parsing by removing them. -1. public keys should have a fixed length, so slice them off of the end of the string. -2. domains cannot include `@`, so find the last occurence of it in the signing key and slice everything thereafter. -3. the username is everything before the `@`. - -*/ - Keys.serialize = function (origin, username, pubkey) { - return '[' + - username + - '@' + - origin.replace(/https*:\/\//, '') + - '/' + - pubkey.replace(/\//g, '-') + - ']'; - // return origin + '/user/#/1/' + username + '/' + pubkey.replace(/\//g, '-'); - }; - - Keys.canonicalize = function (input) { - if (typeof(input) !== 'string') { return; } - // key is already in simple form. ensure that it is an 'unsafeKey' - if (input.length === 44) { - return unescape(input); - } - try { - return Keys.parseUser(input).pubkey; - } catch (err) { - return; - } - }; - - return Keys; -}; - - if (typeof(module) !== 'undefined' && module.exports) { - module.exports = factory(); - } else if ((typeof(define) !== 'undefined' && define !== null) && (define.amd !== null)) { - define([], factory); - } -}()); diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 62db751d6..b5b26b0d9 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -199,7 +199,9 @@ define([ }).filter(function (x) { return x; }); var noOthers = icons.length === 0 ? '.cp-usergrid-empty' : ''; - var classes = noOthers + (config.large?'.large':'') + (config.list?'.list':''); + var classes = noOthers + (config.large?'.large':'') + + (config.list?'.list':'') + + (config.radio?'.radio':''); var inputFilter = h('input', { placeholder: Messages.share_filterFriend @@ -221,20 +223,24 @@ define([ $div.find('.cp-usergrid-user:not(.cp-selected):not([data-name*="'+name+'"])').hide(); } }; - $(inputFilter).on('keydown keyup change', redraw); + $(inputFilter).on('input keydown keyup change', redraw); + if (config.evOnFilter) { + config.evOnFilter.reg(redraw); + } $(div).append(h('div.cp-usergrid-grid', icons)); if (!config.noSelect) { $div.on('click', '.cp-usergrid-user', function () { var sel = $(this).hasClass('cp-selected'); + if (config.radio) { + $div.find('.cp-usergrid-user.cp-selected').removeClass('cp-selected'); + } if (!sel) { $(this).addClass('cp-selected'); - } else { - var order = $(this).attr('data-order'); - order = order ? 'order:'+order : ''; - $(this).removeClass('cp-selected').attr('style', order); + } else if (!config.radio) { + $(this).removeClass('cp-selected'); } - onSelect(); + onSelect(!sel ? this : undefined); }); $div.on('keydown', '.cp-usergrid-user', function (e) { if (e.which === 13) { @@ -251,6 +257,55 @@ define([ }; }; + UIElements.getUserTeamPicker = (common, config, onSelected) => { + const { msg, friendsData, teamsData } = config; + let teams; + const filter = h('input', { + placeholder: Messages.share_filterFriend + }); + const evOnFilter = Util.mkEvent(); + const contacts = UIElements.getUserGrid(Messages.contacts, { + common: common, + data: friendsData, + noFilter: false, + radio: true, + large: true, + evOnFilter + }, el => { + onSelected(el); + $(teams.div).find('.cp-selected').removeClass('cp-selected'); + }); + teams = UIElements.getUserGrid(Messages.teams, { + common: common, + data: teamsData, + noFilter: false, + radio: true, + large: true, + evOnFilter + }, el => { + onSelected(el); + $(contacts.div).find('.cp-selected').removeClass('cp-selected'); + }); + + const $contactFilter = $(contacts.div).find('.cp-usergrid-filter input').hide(); + const $teamFilter = $(teams.div).find('.cp-usergrid-filter input').hide(); + + $(filter).on('input', () => { + const val = filter.value; + $teamFilter.val(val); + $contactFilter.val(val); + evOnFilter.fire(); + }); + + const content = h('div.cp-userteam-picker', [ + h('div', msg), + h('div.cp-userteam-filter', filter), + contacts.div, + teams.div + ]); + + return content; + }; UIElements.noContactsMessage = function (common) { var metadataMgr = common.getMetadataMgr(); @@ -905,7 +960,8 @@ define([ case 'toggle': button = $(h('button.cp-toolbar-tools', { //title: data.title || '', // TODO display if the label text is collapsed - 'aria-label': data.text || Messages.toolbar_tools // Fallback + 'aria-label': data.text || Messages.toolbar_tools, // Fallback + 'aria-pressed': false }, [ h('i.fa.' + (data.icon || 'fa-wrench')), h('span.cp-toolbar-name', data.text || Messages.toolbar_tools) @@ -923,6 +979,7 @@ define([ button.click(function (e) { data.element.toggle(); var isVisible = data.element.is(':visible'); + button.attr('aria-pressed', isVisible ? 'true' : 'false'); if (callback) { callback(isVisible); } if (isVisible) { button.addClass('cp-toolbar-button-active'); @@ -1157,20 +1214,40 @@ define([ }; for (var k in actions) { let $b = $('