From 589793f0c548e1cef21300d5ff0b5d1dc8478c21 Mon Sep 17 00:00:00 2001 From: Ghost CI <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 16:04:53 +0000 Subject: [PATCH 001/282] v5.82.11 --- ghost/admin/package.json | 4 ++-- ghost/core/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ghost/admin/package.json b/ghost/admin/package.json index bc1add0385d..2654e8e580f 100644 --- a/ghost/admin/package.json +++ b/ghost/admin/package.json @@ -1,6 +1,6 @@ { "name": "ghost-admin", - "version": "5.82.10", + "version": "5.82.11", "description": "Ember.js admin client for Ghost", "author": "Ghost Foundation", "homepage": "http://ghost.org", @@ -203,4 +203,4 @@ } } } -} +} \ No newline at end of file diff --git a/ghost/core/package.json b/ghost/core/package.json index 3dfe9d8f3fb..f4780ea66cd 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -1,6 +1,6 @@ { "name": "ghost", - "version": "5.82.10", + "version": "5.82.11", "description": "The professional publishing platform", "author": "Ghost Foundation", "homepage": "https://ghost.org", From 9a60254cd28776f5f7f9e82ac5b5a7c960116a73 Mon Sep 17 00:00:00 2001 From: Ronald Langeveld Date: Mon, 20 May 2024 13:55:45 +0800 Subject: [PATCH 002/282] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20redundant=20memb?= =?UTF-8?q?er=20data=20loading=20for=20static=20assets=20(#20031)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs CFR-21 Reorganised middleware execution so that member data is not redundantly loaded for static assets or the sitemap. --------- Co-authored-by: Michael Barrett --- ghost/core/core/frontend/web/site.js | 18 ++-- .../core/test/e2e-frontend/middleware.test.js | 94 +++++++++++++++++++ 2 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 ghost/core/test/e2e-frontend/middleware.test.js diff --git a/ghost/core/core/frontend/web/site.js b/ghost/core/core/frontend/web/site.js index 4b8188915a2..cba271b24e2 100644 --- a/ghost/core/core/frontend/web/site.js +++ b/ghost/core/core/frontend/web/site.js @@ -121,9 +121,6 @@ module.exports = function setupSiteApp(routerConfig) { // Serve site files using the storage adapter siteApp.use(STATIC_FILES_URL_PREFIX, storage.getStorage('files').serve()); - // Global handling for member session, ensures a member is logged in to the frontend - siteApp.use(membersService.middleware.loadMemberSession); - // /member/.well-known/* serves files (e.g. jwks.json) so it needs to be mounted before the prettyUrl mw to avoid trailing slashes siteApp.use( '/members/.well-known', @@ -148,18 +145,23 @@ module.exports = function setupSiteApp(routerConfig) { // Theme static assets/files siteApp.use(mw.staticTheme()); + + // Serve robots.txt if not found in theme + siteApp.use(mw.servePublicFile('static', 'robots.txt', 'text/plain', config.get('caching:robotstxt:maxAge'))); + debug('Static content done'); + // site map - this should probably be refactored to be an internal app + sitemapHandler(siteApp); + + // Global handling for member session, ensures a member is logged in to the frontend + siteApp.use(membersService.middleware.loadMemberSession); + // Theme middleware // This should happen AFTER any shared assets are served, as it only changes things to do with templates siteApp.use(themeMiddleware); debug('Themes done'); - // Serve robots.txt if not found in theme - siteApp.use(mw.servePublicFile('static', 'robots.txt', 'text/plain', config.get('caching:robotstxt:maxAge'))); - - // site map - this should probably be refactored to be an internal app - sitemapHandler(siteApp); debug('Internal apps done'); // Add in all trailing slashes & remove uppercase diff --git a/ghost/core/test/e2e-frontend/middleware.test.js b/ghost/core/test/e2e-frontend/middleware.test.js new file mode 100644 index 00000000000..e48032c8ae3 --- /dev/null +++ b/ghost/core/test/e2e-frontend/middleware.test.js @@ -0,0 +1,94 @@ +const sinon = require('sinon'); +const supertest = require('supertest'); +const testUtils = require('../utils'); +const configUtils = require('../utils/configUtils'); +const membersService = require('../../core/server/services/members'); + +describe('Middleware Execution', function () { + let loadMemberSessionMiddlewareSpy; + let request; + + before(async function () { + loadMemberSessionMiddlewareSpy = sinon.spy(membersService.middleware, 'loadMemberSession'); + + // Ensure we do a forced start so that spy is in place when the server starts + await testUtils.startGhost({forceStart: true}); + + request = supertest.agent(configUtils.config.get('url')); + }); + + after(async function () { + sinon.restore(); + + await testUtils.stopGhost(); + }); + + afterEach(function () { + loadMemberSessionMiddlewareSpy.resetHistory(); + }); + + describe('Loading a member session', function () { + describe('Page with member content', function () { + it('should load member session on home route', async function () { + await request.get('/'); + sinon.assert.calledOnce(loadMemberSessionMiddlewareSpy); + }); + + it('should load member session on post route', async function () { + await request.get('/welcome/'); + sinon.assert.calledOnce(loadMemberSessionMiddlewareSpy); + }); + }); + + describe('Sitemap', function () { + it('should not load member session on sitemap route', async function () { + await request.get('/sitemap.xml'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on sitemap-pages route', async function () { + await request.get('/sitemap-pages.xml'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on sitemap-posts route', async function () { + await request.get('/sitemap-posts.xml'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on sitemap-tags route', async function () { + await request.get('/sitemap-tags.xml'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on sitemap-authors route', async function () { + await request.get('/sitemap-authors.xml'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + }); + + describe('Recommendations', function () { + it('should not load member session on recommendations route', async function () { + await request.get('/.well-known/recommendations.json'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + }); + + describe('Static assets', function () { + it('should not load member session on fonts route', async function () { + await request.get('/assets/fonts/inter-roman.woff2'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on source.js route', async function () { + await request.get('/assets/built/source.js'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + + it('should not load member session on screen.css route', async function () { + await request.get('/assets/built/screen.css'); + sinon.assert.notCalled(loadMemberSessionMiddlewareSpy); + }); + }); + }); +}); From 7f4da080a2a026b600cbdc49c50610a1364d4053 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 01:47:29 +0000 Subject: [PATCH 003/282] Update dependency html-validate to v8.19.0 --- ghost/email-service/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ghost/email-service/package.json b/ghost/email-service/package.json index b8861b9e8bb..d06e0456b5b 100644 --- a/ghost/email-service/package.json +++ b/ghost/email-service/package.json @@ -19,7 +19,7 @@ ], "devDependencies": { "c8": "8.0.1", - "html-validate": "8.18.2", + "html-validate": "8.19.0", "mocha": "10.2.0", "should": "13.2.3", "sinon": "15.2.0" diff --git a/yarn.lock b/yarn.lock index 80860940f90..4837e219109 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18493,10 +18493,10 @@ html-to-text@8.2.1: minimist "^1.2.6" selderee "^0.6.0" -html-validate@8.18.2: - version "8.18.2" - resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-8.18.2.tgz#6ef239d8cdbeac03b007852e8b9c7cd5901816f0" - integrity sha512-X/ahjDnTZe1VjoPz+w7zGe5I5/os8PLQ+c5C9ak6etV0nNK9gPbwbGaP9BQoSQuQx0mszw5khDjP1ffnXx+1OA== +html-validate@8.19.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-8.19.0.tgz#883ead722f7f846af1111aa0e262bd98bcbacff6" + integrity sha512-VGdoPUPW1OX4xKh0dq3c+npLdOK6EHLgubPfPVYuLOxKEwEOGH/HgRtCSfGXRcdgSHrkQpUXB1kdBSyTJSU6NA== dependencies: "@babel/code-frame" "^7.10.0" "@html-validate/stylish" "^4.1.0" From 54bd9a1ab45dd2cc29b2c4d2cdfd3da2dae06153 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 01:46:53 +0000 Subject: [PATCH 004/282] Update benchmark-action/github-action-benchmark action to v1.20.3 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d074a4e648..ec4707ae620 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -402,7 +402,7 @@ jobs: jq '[{ name: "Boot time", unit: "s", value: .results[0].median, range: ((.results[0].max - .results[0].min) | tostring) }]' < boot-perf.json > boot-perf-formatted.json - name: Run analysis - uses: benchmark-action/github-action-benchmark@v1.20.1 + uses: benchmark-action/github-action-benchmark@v1.20.3 with: tool: 'customSmallerIsBetter' output-file-path: ghost/core/boot-perf-formatted.json From a4dc6c5cf6562c75d7ff3352ecc10a8d4df85068 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 06:20:39 +0000 Subject: [PATCH 005/282] Update dependency i18next-parser to v8.13.0 --- ghost/i18n/package.json | 2 +- yarn.lock | 597 ++++++++++++++++++---------------------- 2 files changed, 264 insertions(+), 335 deletions(-) diff --git a/ghost/i18n/package.json b/ghost/i18n/package.json index 10f1de1b9e5..6f6c18aed4f 100644 --- a/ghost/i18n/package.json +++ b/ghost/i18n/package.json @@ -26,7 +26,7 @@ ], "devDependencies": { "c8": "8.0.1", - "i18next-parser": "8.8.0", + "i18next-parser": "8.13.0", "mocha": "10.2.0" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index 4837e219109..bd021ce9a1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1852,7 +1852,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== @@ -2778,225 +2778,230 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@esbuild/aix-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" + integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== + "@esbuild/android-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz#d86197e6ff965a187b2ea2704915f596a040ed4b" integrity sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg== -"@esbuild/android-arm64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.0.tgz#c5ea635bdbe9b83d1f78a711120814e716439029" - integrity sha512-AzsozJnB+RNaDncBCs3Ys5g3kqhPFUueItfEaCpp89JH2naFNX2mYDIvUgPYMqqjm8hiFoo+jklb3QHZyR3ubw== +"@esbuild/android-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" + integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== "@esbuild/android-arm@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.14.tgz#ed59310c0e6ec6df8b17e363d33a954ecf870f4f" integrity sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg== -"@esbuild/android-arm@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.0.tgz#6eb6e1fbc0dbfafa035aaef8b5ecde25b539fcf9" - integrity sha512-GAkjUyHgWTYuex3evPd5V7uV/XS4LMKr1PWHRPW1xNyy/Jx08x3uTrDFRefBYLKT/KpaWM8/YMQcwbp5a3yIDA== +"@esbuild/android-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" + integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== "@esbuild/android-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.14.tgz#e01b387f1db3dd2596a44e8c577aa2609750bc82" integrity sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg== -"@esbuild/android-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.0.tgz#99f154f71f5b92e778468bcf0f425d166c17bf20" - integrity sha512-SUG8/qiVhljBDpdkHQ9DvOWbp7hFFIP0OzxOTptbmVsgBgzY6JWowmMd6yJuOhapfxmj/DrvwKmjRLvVSIAKZg== +"@esbuild/android-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" + integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== "@esbuild/darwin-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz#e92fbdeb9ff209a762cf107df3026c1b3e04ab85" integrity sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q== -"@esbuild/darwin-arm64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.0.tgz#2fcc11abf95fbabbf9167db6a11d899385bd777b" - integrity sha512-HkxZ8k3Jvcw0FORPNTavA8BMgQjLOB6AajT+iXmil7BwY3gU1hWvJJAyWyEogCmA4LdbGvKF8vEykdmJ4xNJJQ== +"@esbuild/darwin-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" + integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== "@esbuild/darwin-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz#bc1884d9f812647e2078fa4c46e4bffec53c7c09" integrity sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ== -"@esbuild/darwin-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.0.tgz#b5bbde35468db093fdf994880b0eb4b62613b67c" - integrity sha512-9IRWJjqpWFHM9a5Qs3r3bK834NCFuDY5ZaLrmTjqE+10B6w65UMQzeZjh794JcxpHolsAHqwsN/33crUXNCM2Q== +"@esbuild/darwin-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" + integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== "@esbuild/freebsd-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz#1fa876f627536b5037f4aed90545ccc330fd509b" integrity sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw== -"@esbuild/freebsd-arm64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.0.tgz#3f64c76dc590f79cc40acef6b22dd5eb89fc2125" - integrity sha512-s7i2WcXcK0V1PJHVBe7NsGddsL62a9Vhpz2U7zapPrwKoFuxPP9jybwX8SXnropR/AOj3ppt2ern4ItblU6UQQ== +"@esbuild/freebsd-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" + integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== "@esbuild/freebsd-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz#effaa4c5d7bab695b5e6fae459eaf49121fbc7c3" integrity sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ== -"@esbuild/freebsd-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.0.tgz#14d497e9e858fba2bb9b16130602b7f5944bc09c" - integrity sha512-NMdBSSdgwHCqCsucU5k1xflIIRU0qi1QZnM6+vdGy5fvxm1c8rKh50VzsWsIVTFUG3l91AtRxVwoz3Lcvy3I5w== +"@esbuild/freebsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" + integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== "@esbuild/linux-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz#24bb4b1836fe7900e1ffda78aa6875a4eb500e3a" integrity sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w== -"@esbuild/linux-arm64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.0.tgz#0f2f4d8889f7dc89681c306d7312aa76445a5f65" - integrity sha512-I4zvE2srSZxRPapFnNqj+NL3sDJ1wkvEZqt903OZUlBBgigrQMvzUowvP/TTTu2OGYe1oweg5MFilfyrElIFag== +"@esbuild/linux-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" + integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== "@esbuild/linux-arm@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz#7f3490320a4627f4c850a8613385bdf3ffb82285" integrity sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg== -"@esbuild/linux-arm@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.0.tgz#0b0f79dc72884f0ad02c0aabfc969a0bee7f6775" - integrity sha512-2F1+lH7ZBcCcgxiSs8EXQV0PPJJdTNiNcXxDb61vzxTRJJkXX1I/ye9mAhfHyScXzHaEibEXg1Jq9SW586zz7w== +"@esbuild/linux-arm@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" + integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== "@esbuild/linux-ia32@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz#91f1e82f92ffaff8d72f9d90a0f209022529031a" integrity sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ== -"@esbuild/linux-ia32@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.0.tgz#dfcece1f5e74d0e7db090475e48b28d9aa270687" - integrity sha512-dz2Q7+P92r1Evc8kEN+cQnB3qqPjmCrOZ+EdBTn8lEc1yN8WDgaDORQQiX+mxaijbH8npXBT9GxUqE52Gt6Y+g== +"@esbuild/linux-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" + integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== "@esbuild/linux-loong64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz#cd5cb806af6361578800af79919c5cfd53401a17" integrity sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw== -"@esbuild/linux-loong64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.0.tgz#710f5bd55db3f5d9ebac8773ea49795261a35ca7" - integrity sha512-IcVJovJVflih4oFahhUw+N7YgNbuMSVFNr38awb0LNzfaiIfdqIh518nOfYaNQU3aVfiJnOIRVJDSAP4k35WxA== +"@esbuild/linux-loong64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" + integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== "@esbuild/linux-mips64el@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz#c635b6c0b8b4f9b4bff3aaafad59fa8cc07b354a" integrity sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A== -"@esbuild/linux-mips64el@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.0.tgz#a918b310f9bf31fced3853ca52fee6e7acc09824" - integrity sha512-bZGRAGySMquWsKw0gIdsClwfvgbsSq/7oq5KVu1H1r9Il+WzOcfkV1hguntIuBjRVL8agI95i4AukjdAV2YpUw== +"@esbuild/linux-mips64el@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" + integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== "@esbuild/linux-ppc64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz#9b2bb80b7e30667a81ffbcddb74ad8e79330cc94" integrity sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg== -"@esbuild/linux-ppc64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.0.tgz#104771ef6ce2719ac17031f6b9ed8aa98f8e5faf" - integrity sha512-3LC6H5/gCDorxoRBUdpLV/m7UthYSdar0XcCu+ypycQxMS08MabZ06y1D1yZlDzL/BvOYliRNRWVG/YJJvQdbg== +"@esbuild/linux-ppc64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" + integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== "@esbuild/linux-riscv64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz#9520d34a4ecbf404e56f4cebdcc686c83b66babc" integrity sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw== -"@esbuild/linux-riscv64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.0.tgz#83beafa472ad4224adcd4d7469e3a17ba1fbd976" - integrity sha512-jfvdKjWk+Cp2sgLtEEdSHXO7qckrw2B2eFBaoRdmfhThqZs29GMMg7q/LsQpybA7BxCLLEs4di5ucsWzZC5XPA== +"@esbuild/linux-riscv64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" + integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== "@esbuild/linux-s390x@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz#3987e30f807b8faf20815b2b2f0a4919084d4e7c" integrity sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw== -"@esbuild/linux-s390x@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.0.tgz#edc26cb41d8745716bda9c26bac1f0001eaad029" - integrity sha512-ofcucfNLkoXmcnJaw9ugdEOf40AWKGt09WBFCkpor+vFJVvmk/8OPjl/qRtks2Z7BuZbG3ztJuK1zS9z5Cgx9A== +"@esbuild/linux-s390x@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" + integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== "@esbuild/linux-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz#51c727dc7045c47ab8c08fe6c09cda3e170d99f3" integrity sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw== -"@esbuild/linux-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.0.tgz#80a6b5e55ad454e0c0af5bdb267335287e331007" - integrity sha512-Fpf7zNDBti3xrQKQKLdXT0hTyOxgFdRJIMtNy8x1az9ATR9/GJ1brYbB/GLWoXhKiHsoWs+2DLkFVNNMTCLEwA== +"@esbuild/linux-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" + integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== "@esbuild/netbsd-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz#4677bf88b489d5ffe1b5f0abbb85812996455479" integrity sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg== -"@esbuild/netbsd-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.0.tgz#2e6e8d869b58aea34bab9c0c47f15ae1bda29a90" - integrity sha512-AMQAp/5oENgDOvVhvOlbhVe1pWii7oFAMRHlmTjSEMcpjTpIHtFXhv9uAFgUERHm3eYtNvS9Vf+gT55cwuI6Aw== +"@esbuild/netbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" + integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== "@esbuild/openbsd-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz#939902897e533162450f69266f32ef1325ba98fd" integrity sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw== -"@esbuild/openbsd-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.0.tgz#ca0817d3ab332afb0d8d96a2eb42b4d8ebaa8715" - integrity sha512-fDztEve1QUs3h/Dw2AUmBlWGkNQbhDoD05ppm5jKvzQv+HVuV13so7m5RYeiSMIC2XQy7PAjZh+afkxAnCRZxA== +"@esbuild/openbsd-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" + integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== "@esbuild/sunos-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz#a50721d47b93586249bd63250bd4b7496fc9957b" integrity sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ== -"@esbuild/sunos-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.0.tgz#8de27de2563cb3eb6c1af066b6d7fcb1229fe3d4" - integrity sha512-bKZzJ2/rvUjDzA5Ddyva2tMk89WzNJEibZEaq+wY6SiqPlwgFbqyQLimouxLHiHh1itb5P3SNCIF1bc2bw5H9w== +"@esbuild/sunos-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" + integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== "@esbuild/win32-arm64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz#d8531d370e6fd0e0e40f40e016f996bbe4fd5ebf" integrity sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q== -"@esbuild/win32-arm64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.0.tgz#67c2b410ff8862be2cd61145ad21e11be00fb914" - integrity sha512-NQJ+4jmnA79saI+sE+QzcEls19uZkoEmdxo7r//PDOjIpX8pmoWtTnWg6XcbnO7o4fieyAwb5U2LvgWynF4diA== +"@esbuild/win32-arm64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" + integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== "@esbuild/win32-ia32@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz#dcbf75e4e65d2921cd4be14ed67cec7360440e46" integrity sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw== -"@esbuild/win32-ia32@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.0.tgz#cac8992219c6d943bb22226e4afeb3774a29cca1" - integrity sha512-uyxiZAnsfu9diHm9/rIH2soecF/HWLXYUhJKW4q1+/LLmNQ+55lRjvSUDhUmsgJtSUscRJB/3S4RNiTb9o9mCg== +"@esbuild/win32-ia32@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" + integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== "@esbuild/win32-x64@0.18.14": version "0.18.14" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.14.tgz#43f66032e0f189b6f394d4dbc903a188bb0c969f" integrity sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg== -"@esbuild/win32-x64@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.0.tgz#fa5f12c96811cec3233a53bdbf61d1a05ba9018f" - integrity sha512-jl+NXUjK2StMgqnZnqgNjZuerFG8zQqWXMBZdMMv4W/aO1ZKQaYWZBxTrtWKphkCBVEMh0wMVfGgOd2BjOZqUQ== +"@esbuild/win32-x64@0.20.2": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== "@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -3272,6 +3277,13 @@ "@glimmer/interfaces" "^0.42.2" "@glimmer/util" "^0.42.2" +"@gulpjs/to-absolute-glob@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz#1fc2460d3953e1d9b9f2dfdb4bcc99da4710c021" + integrity sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA== + dependencies: + is-negated-glob "^1.0.0" + "@handlebars/parser@~2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@handlebars/parser/-/parser-2.0.0.tgz#5e8b7298f31ff8f7b260e6b7363c7e9ceed7d9c5" @@ -8904,7 +8916,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -8922,13 +8934,6 @@ app-root-path@^2.1.0: resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a" integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA== -append-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" - integrity sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA== - dependencies: - buffer-equal "^1.0.0" - append-field@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" @@ -10209,6 +10214,11 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== +bare-events@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" + integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== + base-64@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a" @@ -10319,6 +10329,15 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +bl@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-5.1.0.tgz#183715f678c7188ecef9fe475d90209400624273" + integrity sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ== + dependencies: + buffer "^6.0.3" + inherits "^2.0.4" + readable-stream "^3.4.0" + bl@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" @@ -11298,11 +11317,6 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" - integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== - buffer-es6@^4.9.2: version "4.9.3" resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" @@ -12140,11 +12154,6 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g== - clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -12171,7 +12180,7 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clone@^2.0.0, clone@^2.1.1, clone@^2.1.2: +clone@^2.0.0, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== @@ -12181,15 +12190,6 @@ clone@~0.1.9: resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" integrity sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw== -cloneable-readable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec" - integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" - clsx@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" @@ -12353,7 +12353,7 @@ commander@0.6.1: resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" integrity sha512-0fLycpl1UMTGX257hRsu/arL/cUbcvQM4zMKwvLvzXtfdezIV4yotPS2dYtknF+NmEfWSoCEF6+hj9XLm/6hEw== -commander@11.1.0: +commander@11.1.0, commander@~11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== @@ -12405,11 +12405,6 @@ commander@^9.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== -commander@~11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" - integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== - common-tags@1.8.2, common-tags@^1.8.0, common-tags@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -15805,33 +15800,34 @@ esbuild@^0.18.0, esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.14" "@esbuild/win32-x64" "0.18.14" -esbuild@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.0.tgz#f187e4ce3bcc7396d13f408a991655efeba65282" - integrity sha512-i7i8TP4vuG55bKeLyqqk5sTPu1ZjPH3wkcLvAj/0X/222iWFo3AJUYRKjbOoY6BWFMH3teizxHEdV9Su5ESl0w== +esbuild@^0.20.1: + version "0.20.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: - "@esbuild/android-arm" "0.19.0" - "@esbuild/android-arm64" "0.19.0" - "@esbuild/android-x64" "0.19.0" - "@esbuild/darwin-arm64" "0.19.0" - "@esbuild/darwin-x64" "0.19.0" - "@esbuild/freebsd-arm64" "0.19.0" - "@esbuild/freebsd-x64" "0.19.0" - "@esbuild/linux-arm" "0.19.0" - "@esbuild/linux-arm64" "0.19.0" - "@esbuild/linux-ia32" "0.19.0" - "@esbuild/linux-loong64" "0.19.0" - "@esbuild/linux-mips64el" "0.19.0" - "@esbuild/linux-ppc64" "0.19.0" - "@esbuild/linux-riscv64" "0.19.0" - "@esbuild/linux-s390x" "0.19.0" - "@esbuild/linux-x64" "0.19.0" - "@esbuild/netbsd-x64" "0.19.0" - "@esbuild/openbsd-x64" "0.19.0" - "@esbuild/sunos-x64" "0.19.0" - "@esbuild/win32-arm64" "0.19.0" - "@esbuild/win32-ia32" "0.19.0" - "@esbuild/win32-x64" "0.19.0" + "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-arm64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" escalade@^3.1.1: version "3.1.1" @@ -16782,7 +16778,7 @@ fastest-levenshtein@^1.0.16: resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -fastq@1.17.1, fastq@^1.6.0: +fastq@1.17.1, fastq@^1.13.0, fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== @@ -17150,7 +17146,7 @@ flow-parser@0.*: resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.205.1.tgz#337464aaf027b00b2514610386cf21a5f7c94137" integrity sha512-+RF/e1Et6ZX2I/UG7SGAz3Z8+ulj9xKYLu5AD7Wi8H2llzncU8ZpdKfLR50pPvj4g2a/FbZWkXYL7qHc+zXJNA== -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: +flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== @@ -17418,13 +17414,13 @@ fs-minipass@^3.0.0: dependencies: minipass "^4.0.0" -fs-mkdirp-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" - integrity sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ== +fs-mkdirp-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz#1e82575c4023929ad35cf69269f84f1a8c973aa7" + integrity sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw== dependencies: - graceful-fs "^4.1.11" - through2 "^2.0.3" + graceful-fs "^4.2.8" + streamx "^2.12.0" fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.9: version "0.5.9" @@ -17760,21 +17756,19 @@ glob-promise@^4.2.0: dependencies: "@types/glob" "^7.1.3" -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - integrity sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw== +glob-stream@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-8.0.2.tgz#09e5818e41c16dd85274d72c7a7158d307426313" + integrity sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw== dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" + "@gulpjs/to-absolute-glob" "^4.0.0" + anymatch "^3.1.3" + fastq "^1.13.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" + normalize-path "^3.0.0" + streamx "^2.12.5" glob-to-regexp@^0.4.1: version "0.4.1" @@ -17869,7 +17863,7 @@ glob@^6.0.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.4, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: +glob@^7.0.4, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -18072,7 +18066,7 @@ got@9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -18756,43 +18750,37 @@ husky@8.0.3: resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== -i18next-parser@8.8.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/i18next-parser/-/i18next-parser-8.8.0.tgz#4aa63729c183927bd09662936d5aa660b651fdb0" - integrity sha512-4Eh213/7+cVg/HNR3q/rIeso/IwbUdKSuxz2iJNc3iIL7FFyRJBtgGF7s2UcJyPp+/EtIujo4wAnuSFkR6oO6Q== +i18next-parser@8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/i18next-parser/-/i18next-parser-8.13.0.tgz#3d0774f1659d691b451c105cc1eaf8c444e11740" + integrity sha512-XU7resoeNcpJazh29OncQQUH6HsgCxk06RqBBDAmLHldafxopfCHY1vElyG/o3EY0Sn7XjelAmPTV0SgddJEww== dependencies: + "@babel/runtime" "^7.23.2" broccoli-plugin "^4.0.7" cheerio "^1.0.0-rc.2" colors "1.4.0" - commander "~11.0.0" + commander "~11.1.0" eol "^0.9.1" - esbuild "^0.19.0" + esbuild "^0.20.1" fs-extra "^11.1.0" gulp-sort "^2.0.0" - i18next "^22.0.4" + i18next "^23.5.1" js-yaml "4.1.0" - lilconfig "^2.0.6" + lilconfig "^3.0.0" rsvp "^4.8.2" sort-keys "^5.0.0" typescript "^5.0.4" vinyl "~3.0.0" - vinyl-fs "^3.0.2" + vinyl-fs "^4.0.0" vue-template-compiler "^2.6.11" -i18next@23.11.4: +i18next@23.11.4, i18next@^23.5.1: version "23.11.4" resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.4.tgz#3f0e620fd2cff3825324191615d0ab0a1eec3baf" integrity sha512-CCUjtd5TfaCl+mLUzAA0uPSN+AVn4fP/kWCYt/hocPUwusTpMVczdrRyOBUwk6N05iH40qiKx6q1DoNJtBIwdg== dependencies: "@babel/runtime" "^7.23.2" -i18next@^22.0.4: - version "22.5.1" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.5.1.tgz#99df0b318741a506000c243429a7352e5f44d424" - integrity sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA== - dependencies: - "@babel/runtime" "^7.20.6" - iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -19687,11 +19675,6 @@ is-url-superb@^4.0.0: resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - is-valid-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" @@ -20767,12 +20750,10 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" - integrity sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow== - dependencies: - flush-write-stream "^1.0.2" +lead@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/lead/-/lead-4.0.0.tgz#5317a49effb0e7ec3a0c8fb9c1b24fb716aab939" + integrity sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg== leaky-bucket@2.2.0: version "2.2.0" @@ -20944,12 +20925,12 @@ lilconfig@3.0.0: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.0.0.tgz#f8067feb033b5b74dab4602a5f5029420be749bc" integrity sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g== -lilconfig@^2.0.5, lilconfig@^2.0.6, lilconfig@^2.1.0: +lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -lilconfig@^3.1.1: +lilconfig@^3.0.0, lilconfig@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== @@ -23247,6 +23228,11 @@ normalize-package-data@^3.0.2: semver "^7.3.4" validate-npm-package-license "^3.0.1" +normalize-path@3.0.0, normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -23254,11 +23240,6 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -23289,12 +23270,12 @@ normalize.css@3.0.3: resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-3.0.3.tgz#acc00262e235a2caa91363a2e5e3bfa4f8ad05c6" integrity sha512-7OavvKXqPta8bgGhWzcUOnZ9KCkANYzbq4ytNKgNeFRTaz3KAm1eGUQ/vyAeVjlDXjolsbYREctuzyQytCDiBA== -now-and-later@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c" - integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ== +now-and-later@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-3.0.0.tgz#cdc045dc5b894b35793cf276cc3206077bb7302d" + integrity sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg== dependencies: - once "^1.3.2" + once "^1.4.0" npm-git-info@^1.0.3: version "1.0.3" @@ -23513,7 +23494,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -23624,7 +23605,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -23712,13 +23693,6 @@ ora@^5.4.0, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - integrity sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw== - dependencies: - readable-stream "^2.0.1" - orderedmap@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" @@ -25415,7 +25389,7 @@ process-es6@^0.11.2: resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" integrity sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA== -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== @@ -25735,7 +25709,7 @@ pump@^2.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3, pumpify@^1.3.5: +pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -26162,7 +26136,7 @@ read-pkg@^6.0.0: parse-json "^5.2.0" type-fest "^1.0.1" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -26524,23 +26498,6 @@ remark@^11.0.2: remark-stringify "^7.0.0" unified "^8.2.0" -remove-bom-buffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" - integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== - dependencies: - is-buffer "^1.1.5" - is-utf8 "^0.2.1" - -remove-bom-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" - integrity sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA== - dependencies: - remove-bom-buffer "^3.0.0" - safe-buffer "^5.1.0" - through2 "^2.0.3" - remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -26568,11 +26525,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" - integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== - replace-ext@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-2.0.0.tgz#9471c213d22e1bcc26717cd6e50881d88f812b06" @@ -26703,12 +26655,12 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-options@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" - integrity sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A== +resolve-options@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-2.0.0.tgz#a1a57a9949db549dd075de3f5550675f02f1e4c5" + integrity sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A== dependencies: - value-or-function "^3.0.0" + value-or-function "^4.0.0" resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6: version "1.2.7" @@ -28103,6 +28055,13 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-composer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-composer/-/stream-composer-1.0.2.tgz#7ee61ca1587bf5f31b2e29aa2093cbf11442d152" + integrity sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w== + dependencies: + streamx "^2.13.2" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -28144,13 +28103,15 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.12.5, streamx@^2.15.0: - version "2.15.2" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.2.tgz#680eacebdc9c43ede7362c2e6695b34dd413c741" - integrity sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg== +streamx@^2.12.0, streamx@^2.12.5, streamx@^2.13.2, streamx@^2.14.0, streamx@^2.15.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" + integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== dependencies: fast-fifo "^1.1.0" queue-tick "^1.0.1" + optionalDependencies: + bare-events "^2.2.0" string-argv@0.3.2: version "0.3.2" @@ -29003,15 +28964,7 @@ throttle-debounce@^3.0.1: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== -through2-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" - integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -29151,14 +29104,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - integrity sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA== - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -29216,12 +29161,12 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-through@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" - integrity sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q== +to-through@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/to-through/-/to-through-3.0.0.tgz#bf4956eaca5a0476474850a53672bed6906ace54" + integrity sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw== dependencies: - through2 "^2.0.3" + streamx "^2.12.5" tocbot@^4.20.1: version "4.21.0" @@ -29744,14 +29689,6 @@ unique-slug@^4.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^2.0.2: - version "2.3.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.3.1.tgz#c65d110e9a4adf9a6c5948b28053d9a8d04cbeac" - integrity sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A== - dependencies: - json-stable-stringify-without-jsonify "^1.0.1" - through2-filter "^3.0.0" - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -30121,10 +30058,10 @@ validator@^13.0.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== -value-or-function@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" - integrity sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg== +value-or-function@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-4.0.0.tgz#70836b6a876a010dc3a2b884e7902e9db064378d" + integrity sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg== vary@^1, vary@~1.1.2: version "1.1.2" @@ -30178,55 +30115,47 @@ video-extensions@~1.2.0: resolved "https://registry.yarnpkg.com/video-extensions/-/video-extensions-1.2.0.tgz#62f449f403b853f02da40964cbf34143f7d96731" integrity sha512-TriMl18BHEsh2KuuSA065tbu4SNAC9fge7k8uKoTTofTq89+Xsg4K1BGbmSVETwUZhqSjd9KwRCNwXAW/buXMg== -vinyl-fs@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" - integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== +vinyl-contents@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-contents/-/vinyl-contents-2.0.0.tgz#cc2ba4db3a36658d069249e9e36d9e2b41935d89" + integrity sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q== dependencies: - fs-mkdirp-stream "^1.0.0" - glob-stream "^6.1.0" - graceful-fs "^4.0.0" - is-valid-glob "^1.0.0" - lazystream "^1.0.0" - lead "^1.0.0" - object.assign "^4.0.4" - pumpify "^1.3.5" - readable-stream "^2.3.3" - remove-bom-buffer "^3.0.0" - remove-bom-stream "^1.2.0" - resolve-options "^1.1.0" - through2 "^2.0.0" - to-through "^2.0.0" - value-or-function "^3.0.0" - vinyl "^2.0.0" - vinyl-sourcemap "^1.1.0" + bl "^5.0.0" + vinyl "^3.0.0" -vinyl-sourcemap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" - integrity sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA== +vinyl-fs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-4.0.0.tgz#06cb36efc911c6e128452f230b96584a9133c3a1" + integrity sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw== dependencies: - append-buffer "^1.0.2" - convert-source-map "^1.5.0" - graceful-fs "^4.1.6" - normalize-path "^2.1.1" - now-and-later "^2.0.0" - remove-bom-buffer "^3.0.0" - vinyl "^2.0.0" - -vinyl@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974" - integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw== + fs-mkdirp-stream "^2.0.1" + glob-stream "^8.0.0" + graceful-fs "^4.2.11" + iconv-lite "^0.6.3" + is-valid-glob "^1.0.0" + lead "^4.0.0" + normalize-path "3.0.0" + resolve-options "^2.0.0" + stream-composer "^1.0.2" + streamx "^2.14.0" + to-through "^3.0.0" + value-or-function "^4.0.0" + vinyl "^3.0.0" + vinyl-sourcemap "^2.0.0" + +vinyl-sourcemap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz#422f410a0ea97cb54cebd698d56a06d7a22e0277" + integrity sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q== dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" + convert-source-map "^2.0.0" + graceful-fs "^4.2.10" + now-and-later "^3.0.0" + streamx "^2.12.5" + vinyl "^3.0.0" + vinyl-contents "^2.0.0" -vinyl@~3.0.0: +vinyl@^3.0.0, vinyl@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-3.0.0.tgz#11e14732bf56e2faa98ffde5157fe6c13259ff30" integrity sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g== @@ -30927,7 +30856,7 @@ xtend@^2.2.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" integrity sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== From e5056d8d9d8f80c0f4a888bd5cc5ac329d1d4541 Mon Sep 17 00:00:00 2001 From: Ronald Langeveld Date: Mon, 20 May 2024 18:06:03 +0800 Subject: [PATCH 006/282] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20External=20Image?= =?UTF-8?q?=20URLs=20being=20incorrectly=20prefixed=20(#20226)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ref ENG-824 - the bug is causing resize prefixes being added to images served from outside of Ghost. - this now would only append the prefex to images served by Ghost and other images urls' would get served as is. - we can determine that by checking whether imageName doesn't exist, meaning the source is a third party. - this mostly affect edge case users, eg where a feature image url was passed in via the API and doesn't get served by Ghost. --- ghost/core/core/frontend/utils/images.js | 4 ++ .../frontend/meta/image-dimensions.test.js | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/ghost/core/core/frontend/utils/images.js b/ghost/core/core/frontend/utils/images.js index 366d6b0d233..d5e14acd905 100644 --- a/ghost/core/core/frontend/utils/images.js +++ b/ghost/core/core/frontend/utils/images.js @@ -92,6 +92,10 @@ module.exports.getImageWithSize = function getImageWithSize(imagePath, sizeOptio const sizeDirectoryName = prefixIfPresent('w', width) + prefixIfPresent('h', height); const formatPrefix = requestedFormat && imageTransform.canTransformToFormat(requestedFormat) ? `/format/${requestedFormat}` : ''; + if (!imageName) { + return imgBlogUrl; + } + return [imgBlogUrl, urlUtils.STATIC_IMAGE_URL_PREFIX, `/size/${sizeDirectoryName}`, formatPrefix, imageName].join(''); }; diff --git a/ghost/core/test/unit/frontend/meta/image-dimensions.test.js b/ghost/core/test/unit/frontend/meta/image-dimensions.test.js index 83053f4543f..c8cc38c338a 100644 --- a/ghost/core/test/unit/frontend/meta/image-dimensions.test.js +++ b/ghost/core/test/unit/frontend/meta/image-dimensions.test.js @@ -282,4 +282,49 @@ describe('getImageDimensions', function () { done(); }).catch(done); }); + + it('does not append image size prefix to external images', function (done) { + const originalMetaData = { + coverImage: { + url: 'http://anothersite.com/some/storage/mypostcoverimage.jpg' + }, + authorImage: { + url: 'http://anothersite.com/some/storage/me.jpg' + }, + ogImage: { + url: 'http://anothersite.com/some/storage/super-facebook-image.jpg' + }, + twitterImage: 'http://anothersite.com/some/storage/super-twitter-image.jpg', + site: { + logo: { + url: 'http://anothersite.com/some/storage/logo.jpg' + } + } + }; + + const metaData = _.cloneDeep(originalMetaData); + + sizeOfStub.callsFake(() => ({ + width: 2000, + height: 1200, + type: 'jpg' + })); + + getImageDimensions.__set__('imageSizeCache', { + getCachedImageSizeFromUrl: sizeOfStub + }); + + getImageDimensions(metaData).then(function (result) { + should.exist(result); + result.coverImage.should.have.property('url'); + result.coverImage.url.should.eql('http://anothersite.com/some/storage/mypostcoverimage.jpg'); + result.authorImage.should.have.property('url'); + result.authorImage.url.should.eql('http://anothersite.com/some/storage/me.jpg'); + result.ogImage.should.have.property('url'); + result.ogImage.url.should.eql('http://anothersite.com/some/storage/super-facebook-image.jpg'); + result.site.logo.should.have.property('url'); + result.site.logo.url.should.eql('http://anothersite.com/some/storage/logo.jpg'); + done(); + }).catch(done); + }); }); From 9d9a421b544310511f978a9cbe5240aae464d418 Mon Sep 17 00:00:00 2001 From: Steve Larson <9larsons@gmail.com> Date: Mon, 20 May 2024 08:25:20 -0500 Subject: [PATCH 007/282] Added a column disallow list in the content API posts serializer (#20207) ref https://linear.app/tryghost/issue/CFR-29 - Removed the mobiledoc and lexical columns from the posts input serializer, meaning they will no longer be queried for. Get helpers are essentially a gateway to the Content API. We already strip out the mobiledoc and lexical fields in the output serializer/returned response, but this means we're passing the mobiledoc and lexical fields back from the db. This is pointless and these fields are substantial in size - by far the largest fields in the whole ghost db - leading to slowed performance. I've updated the posts input serializer to strip out the lexical and mobiledoc columns so we stop doing a `select *` with every query. --- .../utils/serializers/input/posts.js | 41 ++++++++++++- .../utils/serializers/input/posts.test.js | 60 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js b/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js index 66767b9514e..5e9a0822799 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js @@ -7,6 +7,7 @@ const slugFilterOrder = require('./utils/slug-filter-order'); const localUtils = require('../../index'); const mobiledoc = require('../../../../../lib/mobiledoc'); const postsMetaSchema = require('../../../../../data/schema').tables.posts_meta; +const postsSchema = require('../../../../../data/schema').tables.posts; const clean = require('./utils/clean'); const lexical = require('../../../../../lib/lexical'); const sentry = require('../../../../../../shared/sentry'); @@ -16,6 +17,16 @@ const messages = { failedHtmlToLexical: 'Failed to convert HTML to Lexical' }; +/** + * Selects all allowed columns for the given frame. + * + * NOTE: This doesn't stop them from being FETCHED, just returned in the response. This causes + * the output serializer to remove them from the data object before returning. + * + * NOTE: This is only intended for the Content API. We need these fields within Admin API responses. + * + * @param {Object} frame - The frame object. + */ function removeSourceFormats(frame) { if (frame.options.formats?.includes('mobiledoc') || frame.options.formats?.includes('lexical')) { frame.options.formats = frame.options.formats.filter((format) => { @@ -24,6 +35,33 @@ function removeSourceFormats(frame) { } } +/** + * Selects all allowed columns for the given frame. + * + * This removes the lexical and mobiledoc columns from the query. This is a performance improvement as we never intend + * to expose those columns in the content API and they are very large datasets to be passing around and de/serializing. + * + * NOTE: This is only intended for the Content API. We need these fields within Admin API responses. + * + * @param {Object} frame - The frame object. + */ +function selectAllAllowedColumns(frame) { + if (!frame.options.columns && !frame.options.selectRaw) { + // Because we're returning columns directly from the table we need to remove info columns like @@UNIQUE_CONSTRAINTS@@ + frame.options.selectRaw = _.keys(_.omit(postsSchema, ['lexical','mobiledoc','@@UNIQUE_CONSTRAINTS@@'])).join(','); + } else if (frame.options.columns) { + frame.options.columns = frame.options.columns.filter((column) => { + return !['mobiledoc', 'lexical'].includes(column); + }); + } else if (frame.options.selectRaw) { + frame.options.selectRaw = frame.options.selectRaw.split(',').map((column) => { + return column.trim(); + }).filter((column) => { + return !['mobiledoc', 'lexical'].includes(column); + }).join(','); + } +} + /** * Map names of relations to the internal names */ @@ -128,7 +166,8 @@ module.exports = { */ if (localUtils.isContentAPI(frame)) { // CASE: the content api endpoint for posts should not return mobiledoc or lexical - removeSourceFormats(frame); + removeSourceFormats(frame); // remove from the format field + selectAllAllowedColumns(frame); // remove from any specified column or selectRaw options setDefaultOrder(frame); forceVisibilityColumn(frame); diff --git a/ghost/core/test/unit/api/canary/utils/serializers/input/posts.test.js b/ghost/core/test/unit/api/canary/utils/serializers/input/posts.test.js index 5d89afbf7f0..dbd2cbcda8b 100644 --- a/ghost/core/test/unit/api/canary/utils/serializers/input/posts.test.js +++ b/ghost/core/test/unit/api/canary/utils/serializers/input/posts.test.js @@ -1,6 +1,7 @@ const should = require('should'); const sinon = require('sinon'); const serializers = require('../../../../../../../core/server/api/endpoints/utils/serializers'); +const postsSchema = require('../../../../../../../core/server/data/schema').tables.posts; const mobiledocLib = require('@tryghost/html-to-mobiledoc'); @@ -100,6 +101,65 @@ describe('Unit: endpoints/utils/serializers/input/posts', function () { frame.options.formats.should.containEql('html'); frame.options.formats.should.containEql('plaintext'); }); + + describe('Content API', function () { + it('selects all columns from the posts schema but mobiledoc and lexical when no columns are specified', function () { + const apiConfig = {}; + const frame = { + apiType: 'content', + options: { + context: {} + } + }; + + serializers.input.posts.browse(apiConfig, frame); + const columns = Object.keys(postsSchema); + const parsedSelectRaw = frame.options.selectRaw.split(',').map(column => column.trim()); + parsedSelectRaw.should.eql(columns.filter(column => !['mobiledoc', 'lexical','@@UNIQUE_CONSTRAINTS@@'].includes(column))); + }); + + it('strips mobiledoc and lexical columns from a specified columns option', function () { + const apiConfig = {}; + const frame = { + apiType: 'content', + options: { + context: {}, + columns: ['id', 'mobiledoc', 'lexical', 'visibility'] + } + }; + + serializers.input.posts.browse(apiConfig, frame); + frame.options.columns.should.eql(['id', 'visibility']); + }); + + it('forces visibility column if columns are specified', function () { + const apiConfig = {}; + const frame = { + apiType: 'content', + options: { + context: {}, + columns: ['id'] + } + }; + + serializers.input.posts.browse(apiConfig, frame); + frame.options.columns.should.eql(['id', 'visibility']); + }); + + it('strips mobiledoc and lexical columns from a specified selectRaw option', function () { + const apiConfig = {}; + const frame = { + apiType: 'content', + options: { + context: {}, + selectRaw: 'id, mobiledoc, lexical' + } + }; + + serializers.input.posts.browse(apiConfig, frame); + frame.options.selectRaw.should.eql('id'); + }); + }); }); describe('read', function () { From f01e06153f1d4e90f2543e9e8ee5f39f32087304 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 21:31:09 +0000 Subject: [PATCH 008/282] Update dependency i18next to v23.11.5 --- ghost/i18n/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ghost/i18n/package.json b/ghost/i18n/package.json index 6f6c18aed4f..1fdfa2b473b 100644 --- a/ghost/i18n/package.json +++ b/ghost/i18n/package.json @@ -30,6 +30,6 @@ "mocha": "10.2.0" }, "dependencies": { - "i18next": "23.11.4" + "i18next": "23.11.5" } } diff --git a/yarn.lock b/yarn.lock index bd021ce9a1f..a51da56001b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18774,10 +18774,10 @@ i18next-parser@8.13.0: vinyl-fs "^4.0.0" vue-template-compiler "^2.6.11" -i18next@23.11.4, i18next@^23.5.1: - version "23.11.4" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.4.tgz#3f0e620fd2cff3825324191615d0ab0a1eec3baf" - integrity sha512-CCUjtd5TfaCl+mLUzAA0uPSN+AVn4fP/kWCYt/hocPUwusTpMVczdrRyOBUwk6N05iH40qiKx6q1DoNJtBIwdg== +i18next@23.11.5, i18next@^23.5.1: + version "23.11.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.11.5.tgz#d71eb717a7e65498d87d0594f2664237f9e361ef" + integrity sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA== dependencies: "@babel/runtime" "^7.23.2" From 5bb945e89bb43130a13860c8899000e61aaf3912 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 21 May 2024 12:36:28 +0200 Subject: [PATCH 009/282] What's new popup (#20112) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DES-192 We often hear that people are not aware of the new features we ship. Ways in which people can find out are social media/changelog/dashboard – all of these are easy to miss. We'd like to introduce a template for a simple notification in the sidebar that can be used any time a new and noteworthy feature has shipped. The purpose of this is simply to notify and will disappear forever after it's been dismissed. --- ghost/admin/.lint-todo | 1 + .../dashboard/resources/whats-new.hbs | 8 +- .../components/gh-nav-menu/footer-banner.hbs | 28 ++++ .../components/gh-nav-menu/footer-banner.js | 89 +++++++++++ .../app/components/gh-nav-menu/footer.hbs | 23 ++- .../app/components/gh-nav-menu/footer.js | 8 +- .../admin/app/components/gh-nav-menu/main.hbs | 2 +- .../admin/app/components/gh-nav-menu/main.js | 2 +- .../admin/app/components/modals/whats-new.hbs | 24 +++ .../admin/app/components/modals/whats-new.js | 15 ++ ghost/admin/app/services/whats-new.js | 51 ++++-- ghost/admin/app/styles/app-dark.css | 5 + ghost/admin/app/styles/app.css | 1 + ghost/admin/app/styles/layouts/main.css | 131 +++++++++++++-- .../app/styles/layouts/whatsnew-modal.css | 150 ++++++++++++++++++ ghost/admin/app/styles/layouts/whatsnew.css | 2 +- .../public/assets/icons/sparkle-fill.svg | 1 + .../public/assets/icons/warning-fill.svg | 1 + 18 files changed, 492 insertions(+), 50 deletions(-) create mode 100644 ghost/admin/app/components/gh-nav-menu/footer-banner.hbs create mode 100644 ghost/admin/app/components/gh-nav-menu/footer-banner.js create mode 100644 ghost/admin/app/components/modals/whats-new.hbs create mode 100644 ghost/admin/app/components/modals/whats-new.js create mode 100644 ghost/admin/app/styles/layouts/whatsnew-modal.css create mode 100644 ghost/admin/public/assets/icons/sparkle-fill.svg create mode 100644 ghost/admin/public/assets/icons/warning-fill.svg diff --git a/ghost/admin/.lint-todo b/ghost/admin/.lint-todo index 52765452f2e..81cae4ab869 100644 --- a/ghost/admin/.lint-todo +++ b/ghost/admin/.lint-todo @@ -189,3 +189,4 @@ add|ember-template-lint|require-iframe-title|27|20|27|20|94e58d11848d5613900c218 add|ember-template-lint|require-iframe-title|42|16|42|16|a3292b469dc37f2f4791e7f224b0b65c8ecf5d18|1712707200000|1723075200000|1728259200000|app/components/modals/email-preview.hbs add|ember-template-lint|no-autofocus-attribute|21|20|21|20|942419d05c04ded6716f09faecd6b1ab55418121|1712707200000|1723075200000|1728259200000|app/components/modals/new-custom-integration.hbs add|ember-template-lint|no-invalid-interactive|2|37|2|37|e21ba31f54b631a428c28a1c9f88d0dc66f2f5fc|1712707200000|1723075200000|1728259200000|app/components/modals/search.hbs +remove|ember-template-lint|no-unknown-arguments-for-builtin-components|93|93|93|93|156670ca427c49c51f0a94f862b286ccc9466d92|1712707200000|1723075200000|1728259200000|app/components/gh-nav-menu/footer.hbs diff --git a/ghost/admin/app/components/dashboard/resources/whats-new.hbs b/ghost/admin/app/components/dashboard/resources/whats-new.hbs index 67db066f8c8..8dc23a459c3 100644 --- a/ghost/admin/app/components/dashboard/resources/whats-new.hbs +++ b/ghost/admin/app/components/dashboard/resources/whats-new.hbs @@ -4,17 +4,17 @@

{{svg-jar "gift" alt="Gift" class="v-mid"}}What's new

-
+
{{#if (not (or this.loading this.error))}}
{{#each this.entries as |entry|}} {{else}}
@@ -26,7 +26,7 @@
diff --git a/ghost/admin/app/components/gh-nav-menu/footer-banner.hbs b/ghost/admin/app/components/gh-nav-menu/footer-banner.hbs new file mode 100644 index 00000000000..7ebaa07e970 --- /dev/null +++ b/ghost/admin/app/components/gh-nav-menu/footer-banner.hbs @@ -0,0 +1,28 @@ +{{#if this.showReferralInvite}} + +{{/if}} + +{{#if (and this.showWhatsNew this.whatsNew.hasNew)}} + {{#let (get this.whatsNew.entries "0") as |entry|}} + + {{/let}} +{{/if}} \ No newline at end of file diff --git a/ghost/admin/app/components/gh-nav-menu/footer-banner.js b/ghost/admin/app/components/gh-nav-menu/footer-banner.js new file mode 100644 index 00000000000..fab716af821 --- /dev/null +++ b/ghost/admin/app/components/gh-nav-menu/footer-banner.js @@ -0,0 +1,89 @@ +import Component from '@glimmer/component'; +import envConfig from 'ghost-admin/config/environment'; +import moment from 'moment-timezone'; +import {action} from '@ember/object'; +import {inject as service} from '@ember/service'; +import {task} from 'ember-concurrency'; + +export default class FooterBanner extends Component { + @service session; + @service dashboardStats; + @service feature; + @service membersUtils; + @service modals; + @service settings; + @service whatsNew; + + constructor() { + super(...arguments); + this.loadCurrentMRR.perform(); + } + + get isAdminOrOwner() { + return this.session.user.isAdmin; + } + + get isReferralNotificationNotDismissed() { + return !this.feature.accessibility.referralInviteDismissed; + } + + get stripeLiveModeEnabled() { + // allow testing mode when not in a production environment + const isDevModeStripeEnabled = envConfig.environment !== 'production' && this.membersUtils.isStripeEnabled; + const isLiveEnabled = this.settings.stripeConnectLivemode; + return isDevModeStripeEnabled || isLiveEnabled; + } + + get hasReachedMRR() { + return this.dashboardStats.currentMRR / 100 >= 100; + } + + get showReferralInvite() { + // Conditions to see the referral invite + // 1. Needs to be Owner or Admin + // 2. Stripe is setup and enabled in live mode + // 3. MRR is > $100 + // 4. Notification has not yet been dismissed by the user + return !this.args.hasThemeErrors && this.isAdminOrOwner && this.isReferralNotificationNotDismissed && this.stripeLiveModeEnabled && this.hasReachedMRR; + } + + get showWhatsNew() { + return !this.showReferralInvite && this.whatsNew.hasNewFeatured; + } + + @task + *loadCurrentMRR() { + if (this.isAdminOrOwnern) { + try { + yield this.dashboardStats.loadMrrStats(); + } catch (error) { + // noop + } + } + } + + @action + dismissReferralInvite(event) { + event.preventDefault(); + event.stopPropagation(); + + if (!this.feature.referralInviteDismissed) { + this.feature.referralInviteDismissed = moment().tz(this.settings.timezone); + } + } + + @action + dismissWhatsNewToast(event) { + event.preventDefault(); + event.stopPropagation(); + + // Dismiss + this.whatsNew.seen(); + } + + @action + openFeaturedWhatsNew(href) { + window.open(href, '_blank'); + this.whatsNew.seen(); + } +} diff --git a/ghost/admin/app/components/gh-nav-menu/footer.hbs b/ghost/admin/app/components/gh-nav-menu/footer.hbs index da96e851024..e40db083631 100644 --- a/ghost/admin/app/components/gh-nav-menu/footer.hbs +++ b/ghost/admin/app/components/gh-nav-menu/footer.hbs @@ -1,12 +1,19 @@
{{#if this.hasThemeErrors}} - +
+ +
{{/if}} - +
@@ -14,7 +21,7 @@
- {{#if this.whatsNew.hasNew}}{{/if}} + {{#if (and this.whatsNew.hasNew (not this.whatsNew.hasNewFeatured))}}{{/if}}
{{svg-jar "arrow-down" class="w3 mr1 fill-darkgrey"}}
@@ -45,12 +52,12 @@ {{else}}
  • - +
  • {{/if}} diff --git a/ghost/admin/app/components/gh-nav-menu/footer.js b/ghost/admin/app/components/gh-nav-menu/footer.js index eb9e9eba1fc..b51777f2359 100644 --- a/ghost/admin/app/components/gh-nav-menu/footer.js +++ b/ghost/admin/app/components/gh-nav-menu/footer.js @@ -1,5 +1,6 @@ import Component from '@ember/component'; import ThemeErrorsModal from '../modals/design/theme-errors'; +import WhatsNew from '../modals/whats-new'; import calculatePosition from 'ember-basic-dropdown/utils/calculate-position'; import classic from 'ember-classic-decorator'; import {action} from '@ember/object'; @@ -43,7 +44,7 @@ export default class Footer extends Component { // filter errors that have other UI to display to users that the functionality is not working const filteredErrors = errors?.filter((error) => { if (error.code === 'GS110-NO-MISSING-PAGE-BUILDER-USAGE' && error?.failures?.[0].message.includes(`show_title_and_feature_image`)) { - return false; + return false; } return true; }); @@ -60,4 +61,9 @@ export default class Footer extends Component { return {horizontalPosition, verticalPosition, style}; } + + @action + openWhatsNew() { + return this.modals.open(WhatsNew); + } } diff --git a/ghost/admin/app/components/gh-nav-menu/main.hbs b/ghost/admin/app/components/gh-nav-menu/main.hbs index 58f9ecc8f74..47ea632ce7d 100644 --- a/ghost/admin/app/components/gh-nav-menu/main.hbs +++ b/ghost/admin/app/components/gh-nav-menu/main.hbs @@ -18,7 +18,7 @@
      {{#if (gh-user-can-admin this.session.user)}} -
    • +
    • {{svg-jar "house"}} Dashboard
    • {{/if}} diff --git a/ghost/admin/app/components/gh-nav-menu/main.js b/ghost/admin/app/components/gh-nav-menu/main.js index 51bce6256a8..d47997f0a33 100644 --- a/ghost/admin/app/components/gh-nav-menu/main.js +++ b/ghost/admin/app/components/gh-nav-menu/main.js @@ -23,10 +23,10 @@ export default class Main extends Component.extend(ShortcutsMixin) { @service router; @service session; @service ui; - @service whatsNew; @service membersStats; @service settings; @service explore; + @service notifications; @inject config; diff --git a/ghost/admin/app/components/modals/whats-new.hbs b/ghost/admin/app/components/modals/whats-new.hbs new file mode 100644 index 00000000000..7a027d0f65e --- /dev/null +++ b/ghost/admin/app/components/modals/whats-new.hbs @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/ghost/admin/app/components/modals/whats-new.js b/ghost/admin/app/components/modals/whats-new.js new file mode 100644 index 00000000000..c82ae6d62ac --- /dev/null +++ b/ghost/admin/app/components/modals/whats-new.js @@ -0,0 +1,15 @@ +import Component from '@glimmer/component'; +import {inject as service} from '@ember/service'; + +export default class WhatsNewFeatured extends Component { + @service whatsNew; + + static modalOptions = { + className: 'fullscreen-modal-action fullscreen-modal-wide fullscreen-modal-whatsnew' + }; + + willDestroy() { + super.willDestroy(...arguments); + this.whatsNew.seen(); + } +} diff --git a/ghost/admin/app/services/whats-new.js b/ghost/admin/app/services/whats-new.js index 777c64258ec..6b2ffb6831b 100644 --- a/ghost/admin/app/services/whats-new.js +++ b/ghost/admin/app/services/whats-new.js @@ -7,6 +7,8 @@ import {task} from 'ember-concurrency'; export default Service.extend({ session: service(), + store: service(), + response: null, entries: null, changelogUrl: 'https://ghost.org/blog/', @@ -39,32 +41,47 @@ export default Service.extend({ return latestMoment.isAfter(lastSeenMoment); }), - showModal: action(function () { + hasNewFeatured: computed('entries.[]', function () { + if (!this.hasNew) { + return false; + } + + let [latestEntry] = this.entries; + return latestEntry.featured; + }), + + seen: action(function () { + this.updateLastSeen.perform(); + }), + + openFeaturedModal: action(function () { this.set('isShowingModal', true); }), - closeModal: action(function () { + closeFeaturedModal: action(function () { this.set('isShowingModal', false); - this.updateLastSeen.perform(); + this.seen(); }), fetchLatest: task(function* () { try { - // we should already be logged in at this point so lets grab the user - // record and store it locally so that we don't have to deal with - // session.user being a promise and causing issues with CPs - let user = yield this.session.user; - this.set('_user', user); - - let response = yield fetch('https://ghost.org/changelog.json'); - if (!response.ok) { - // eslint-disable-next-line - return console.error('Failed to fetch changelog', {response}); + if (!this.response) { + // we should already be logged in at this point so lets grab the user + // record and store it locally so that we don't have to deal with + // session.user being a promise and causing issues with CPs + let user = yield this.session.user; + this.set('_user', user); + + this.response = yield fetch('https://ghost.org/changelog.json'); + if (!this.response.ok) { + // eslint-disable-next-line + return console.error('Failed to fetch changelog', {response}); + } + + let result = yield this.response.json(); + this.set('entries', result.posts || []); + this.set('changelogUrl', result.changelogUrl); } - - let result = yield response.json(); - this.set('entries', result.posts || []); - this.set('changelogUrl', result.changelogUrl); } catch (e) { console.error(e); // eslint-disable-line } diff --git a/ghost/admin/app/styles/app-dark.css b/ghost/admin/app/styles/app-dark.css index 49d75f20947..2d1f21d0516 100644 --- a/ghost/admin/app/styles/app-dark.css +++ b/ghost/admin/app/styles/app-dark.css @@ -54,6 +54,7 @@ @import "layouts/content.css"; @import "layouts/editor.css"; @import "layouts/whatsnew.css"; +@import "layouts/whatsnew-modal.css"; @import "layouts/tags.css"; @import "layouts/members.css"; @import "layouts/member-activity.css"; @@ -1426,3 +1427,7 @@ Onboarding checklist: Share publication modal */ .gh-share-links li a:hover { background: #394047; } + +.gh-sidebar-banner.gh-error-banner { + background: var(--lightgrey-d1); +} \ No newline at end of file diff --git a/ghost/admin/app/styles/app.css b/ghost/admin/app/styles/app.css index e4baaa03aee..356fa42f08e 100644 --- a/ghost/admin/app/styles/app.css +++ b/ghost/admin/app/styles/app.css @@ -56,6 +56,7 @@ @import "layouts/content.css"; @import "layouts/editor.css"; @import "layouts/whatsnew.css"; +@import "layouts/whatsnew-modal.css"; @import "layouts/tags.css"; @import "layouts/members.css"; @import "layouts/posts.css"; diff --git a/ghost/admin/app/styles/layouts/main.css b/ghost/admin/app/styles/layouts/main.css index 31659dcf581..816b08c568a 100644 --- a/ghost/admin/app/styles/layouts/main.css +++ b/ghost/admin/app/styles/layouts/main.css @@ -445,6 +445,10 @@ z-index: 999; } +.gh-nav-list-home svg { + margin-top: -2px; +} + .gh-nav-list svg.force-fill path { fill: var(--midgrey); } @@ -2137,12 +2141,12 @@ section.gh-ds h2 { background: var(--red); } -/* Ghost Referrals invite toast */ -.gh-referral-toast { +/* Sidebar banners like ghost Referrals invite toast */ +.gh-sidebar-banner { position: relative; display: block; - padding: 25px; - margin-bottom: 50px; + padding: 12px 16px 16px; + margin: 0 -7px 32px; color: var(--black); text-decoration: none; background: var(--white); @@ -2152,38 +2156,38 @@ section.gh-ds h2 { cursor: pointer; } -.gh-referral-toast a { +.gh-sidebar-banner a { color: var(--black); } -.gh-referral-toast:hover { +.gh-sidebar-banner:hover { transform: translateY(-2px) scale(1.01); box-shadow: rgb(75 225 226 / 38%) -7px -4px 42px 10px, rgb(202 103 255 / 42%) 7px 8px 42px 10px; transition: all 0.3s ease; } -.gh-referral-toast-close { +.gh-sidebar-banner-close { position: absolute; - top: 7px; - right: 10px; + top: 4px; + right: 8px; padding: 5px; color: #ddd; font-size: 2.2rem; line-height: 1; } -.gh-referral-toast-close:hover { +.gh-sidebar-banner-close:hover { color: #15171A; } -.gh-referral-toast a > strong { +.gh-sidebar-banner a > strong { display: block; margin-bottom: 10px; font-size: 1.7rem; line-height: 1.2em; } -.gh-referral-toast a > p { +.gh-sidebar-banner a > p { margin: 0; font-size: 1.5rem; line-height: 1.35em; @@ -2192,22 +2196,115 @@ section.gh-ds h2 { color: #666; } -.gh-referral-toast a > p strong { +.gh-sidebar-banner a > p strong { color: #ff247d; } -.gh-referral-toast-button { +.gh-sidebar-banner-button { margin-top: 20px; border-radius: 5px; width: 100%; } -.gh-referral-toast-button span { +.gh-sidebar-banner-button span { padding: 0 12px; font-size: 1.4rem; text-align-last: center; - height: 40px; - line-height: 40px; + height: 38px; + line-height: 38px; +} + +.gh-sidebar-banner-container { + display: flex; + flex-direction: column; + text-align: left; +} + +.gh-sidebar-banner-icon { + width: 16px; + height: 16px; +} + +.gh-sidebar-banner-head { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; + margin-top: 2px; +} + +.gh-sidebar-banner-subhead { + font-size: 13px; + color: var(--midgrey); + font-weight: 400; +} + +.gh-sidebar-banner a .gh-sidebar-banner-msg { + line-height: 1.4em; + font-weight: 600; + margin-top: -2px; + margin-bottom: 0; + font-size: 1.4rem; +} + +.gh-sidebar-banner-details { + line-height: 1.4em; + font-size: 1.35rem; + margin: 5px 0 0; + color: var(--darkgrey); + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.gh-sidebar-banner-msg + .gh-sidebar-banner-button { + margin-top: 14px; +} + +.gh-referral-toast { + padding: 25px; + margin: 0 0 50px; +} + +.gh-referral-toast .gh-sidebar-banner-close { + top: 7px; + right: 10px; +} + +.gh-sidebar-banner.gh-error-banner { + box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.1), 0px 3px 8px 0px rgba(0, 0, 0, 0.06); + margin-bottom: 32px; + padding: 16px; +} + +.gh-sidebar-banner.gh-error-banner .gh-sidebar-banner-container { + flex-direction: row; + gap: 10px; +} + +.gh-sidebar-banner.gh-error-banner .gh-sidebar-banner-icon { + color: var(--red); +} + +.gh-sidebar-banner.gh-error-banner .gh-sidebar-banner-subhead { + color: var(--red); + font-size: 1.4rem; + font-weight: 600; + display: block; + margin-top: -2px; +} + +.gh-sidebar-banner.gh-error-banner .gh-sidebar-banner-msg { + font-weight: 400; + font-size: 1.3rem; + margin-top: 4px; + color: var(--darkgrey); +} + +.gh-sidebar-banner.gh-error-banner .gh-sidebar-banner-button { + color: var(--white); + background-color: var(--red); } .admin-x-container-error { diff --git a/ghost/admin/app/styles/layouts/whatsnew-modal.css b/ghost/admin/app/styles/layouts/whatsnew-modal.css new file mode 100644 index 00000000000..31a32a67337 --- /dev/null +++ b/ghost/admin/app/styles/layouts/whatsnew-modal.css @@ -0,0 +1,150 @@ +/* What's new modal */ +/* ---------------------------------------------------------- */ +.fullscreen-modal-whatsnew, +.fullscreen-modal-whatsnew-featured { + max-height: calc(100vh - 12vw); + overflow-y: auto; + border-radius: 8px !important; +} + +@media (max-height: 960px) { + .fullscreen-modal-whatsnew, + .fullscreen-modal-whatsnew-featured { + max-height: calc(100vh - 80px); + } +} + +.fullscreen-modal-whatsnew { + max-width: 640px !important; +} + +.fullscreen-modal-whatsnew a:focus { + outline: none; +} + +.gh-whatsnew-modal-entries { + display: flex; + flex-direction: column; + gap: 24px; + margin-bottom: 32px; +} + +.fullscreen-modal-whatsnew .modal-content, +.fullscreen-modal-whatsnew-featured .modal-content { + padding: 0; +} + +.gh-whatsnew-featured-container, +.gh-whatsnew-modal-entries { + padding: 0 32px; +} + +.gh-whatsnew-featured-subhead { + margin-bottom: 12px; + font-size: 1.3rem; + font-weight: 600; +} + +.gh-whatsnew-featured-date { + font-weight: 500; + color: var(--midgrey); +} + +.gh-whasnew-featured-title { + font-size: 2.8rem; +} + +.gh-whatsnew-featured-excerpt { + margin: 0 0 24px; + font-size: 1.6rem; + line-height: 1.35em; +} + +.gh-whatsnew-modal-footer { + z-index: 999; + display: flex; + justify-content: space-between; + align-items: center; + position: sticky; + bottom: 0px; + background: #fff; + padding: 32px; + margin-bottom: -32px; + box-shadow: 0px -7px 15px -10px rgba(0, 0, 0, 0.15); +} + +@media (max-width: 900px) { + .gh-whatsnew-modal-footer { + bottom: -10px; + } +} + +.gh-whatsnew-modal { + display: flex; + flex-direction: column; + gap: 24px; +} + +.gh-whasnew-modal-title { + font-size: 2.5rem; + padding: 32px 32px 28px; + margin: 0; +} + +.gh-whatsnew-modal-entry { + display: flex; + align-items: flex-start; + gap: 24px; + color: var(--black); + margin: -8px; + padding: 8px; +} + +.gh-whatsnew-modal-entry:hover { + background: var(--whitegrey-l2); + border-radius: 6px; +} + +.gh-whatsnew-modal-entry-featureimage { + max-width: 160px; + height: 110px; + object-fit: cover; + border-radius: 4px; +} + +.gh-whatsnew-modal-entrycontent { + display: flex; + flex-direction: column; + gap: 8px; + font-size: 1.4rem; +} + +.gh-whatsnew-modal-entrycontent h2 { + font-size: 1.7rem; + margin: 6px 0 0; +} + +.gh-whatsnew-modal-entrycontent p { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + line-height: 1.45em; + margin: 0; +} + +.gh-whatsnew-modal-entrycontent span { + color: var(--midgrey); +} + +.gh-whatsnew-modal-entrycontent img { + height: auto; +} + +.gh-whatsnew-banner-icon { + color: var(--yellow); +} + +.dropdown-item .gh-whatsnew-banner-icon { + margin-right: 0 !important; +} \ No newline at end of file diff --git a/ghost/admin/app/styles/layouts/whatsnew.css b/ghost/admin/app/styles/layouts/whatsnew.css index c584a95ac59..015d6d6e581 100644 --- a/ghost/admin/app/styles/layouts/whatsnew.css +++ b/ghost/admin/app/styles/layouts/whatsnew.css @@ -1925,4 +1925,4 @@ .gh-whats-new .kg-header-card.kg-style-accent a.kg-header-card-button { background: #fff; color: #151515; -} +} \ No newline at end of file diff --git a/ghost/admin/public/assets/icons/sparkle-fill.svg b/ghost/admin/public/assets/icons/sparkle-fill.svg new file mode 100644 index 00000000000..fea5bb260b0 --- /dev/null +++ b/ghost/admin/public/assets/icons/sparkle-fill.svg @@ -0,0 +1 @@ +Reward Stars 3 Streamline Icon: https://streamlinehq.com \ No newline at end of file diff --git a/ghost/admin/public/assets/icons/warning-fill.svg b/ghost/admin/public/assets/icons/warning-fill.svg new file mode 100644 index 00000000000..2561d9987c7 --- /dev/null +++ b/ghost/admin/public/assets/icons/warning-fill.svg @@ -0,0 +1 @@ +Road Sign Warning Streamline Icon: https://streamlinehq.com \ No newline at end of file From 0c2f59e0a8d6920b57a8049f0dcf05079bb75a53 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Tue, 21 May 2024 15:08:55 +0200 Subject: [PATCH 010/282] Update post/page status change copy (#20233) DES-354 Minor copy improvements when a post or page changes status. E.g. instead of "Updated" show "Post updated" --- ghost/admin/app/controllers/lexical-editor.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/ghost/admin/app/controllers/lexical-editor.js b/ghost/admin/app/controllers/lexical-editor.js index a01ec62cb61..f98e8762845 100644 --- a/ghost/admin/app/controllers/lexical-editor.js +++ b/ghost/admin/app/controllers/lexical-editor.js @@ -15,6 +15,7 @@ import moment from 'moment-timezone'; import {GENERIC_ERROR_MESSAGE} from '../services/notifications'; import {action, computed} from '@ember/object'; import {alias, mapBy} from '@ember/object/computed'; +import {capitalizeFirstLetter} from '../helpers/capitalize-first-letter'; import {captureMessage} from '@sentry/ember'; import {dropTask, enqueueTask, restartableTask, task, taskGroup, timeout} from 'ember-concurrency'; import {htmlSafe} from '@ember/template'; @@ -1263,13 +1264,15 @@ export default class LexicalEditorController extends Controller { let notifications = this.notifications; let message = messageMap.success.post[prevStatus][status]; let actions, type, path; + type = this.get('post.displayName'); if (status === 'published' || status === 'scheduled') { - type = this.get('post.displayName'); path = this.get('post.url'); - actions = `View ${type}`; + actions = `View on site`; } + message = capitalizeFirstLetter(type) + ' ' + message.toLowerCase(); + notifications.showNotification(message, {type: 'success', actions: (actions && htmlSafe(actions)), delayed}); } @@ -1278,11 +1281,12 @@ export default class LexicalEditorController extends Controller { publishedAtUTC, previewUrl, emailOnly, - newsletter + newsletter, + displayName } = this.post; let publishedAtBlogTZ = moment.tz(publishedAtUTC, this.settings.timezone); - let title = 'Scheduled'; + let title = capitalizeFirstLetter(displayName) + ' scheduled'; let description = emailOnly ? ['Will be sent'] : ['Will be published']; if (newsletter) { @@ -1300,7 +1304,7 @@ export default class LexicalEditorController extends Controller { description = htmlSafe(description.join(' ')); - let actions = htmlSafe(`View Preview`); + let actions = htmlSafe(`Show preview`); return this.notifications.showNotification(title, {description, actions, type: 'success', delayed}); } From ad48d8eb25829b587463ccc1036a5860e9a3bf70 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 09:45:28 +0000 Subject: [PATCH 011/282] Update sentry-javascript monorepo to v7.116.0 --- apps/admin-x-design-system/package.json | 2 +- apps/admin-x-framework/package.json | 2 +- apps/portal/package.json | 2 +- ghost/admin/package.json | 2 +- ghost/core/package.json | 4 +- yarn.lock | 169 +++++++++++++++--------- 6 files changed, 110 insertions(+), 71 deletions(-) diff --git a/apps/admin-x-design-system/package.json b/apps/admin-x-design-system/package.json index e4e3cad1a0d..95bfa15a4ff 100644 --- a/apps/admin-x-design-system/package.json +++ b/apps/admin-x-design-system/package.json @@ -56,7 +56,7 @@ "@dnd-kit/core": "6.1.0", "@dnd-kit/sortable": "7.0.2", "@ebay/nice-modal-react": "1.2.13", - "@sentry/react": "7.114.0", + "@sentry/react": "7.116.0", "@tailwindcss/forms": "0.5.7", "@tailwindcss/line-clamp": "0.4.4", "@uiw/react-codemirror": "^4.21.9", diff --git a/apps/admin-x-framework/package.json b/apps/admin-x-framework/package.json index ce52902a2ca..e338deb641d 100644 --- a/apps/admin-x-framework/package.json +++ b/apps/admin-x-framework/package.json @@ -81,7 +81,7 @@ "typescript": "5.4.5" }, "dependencies": { - "@sentry/react": "7.114.0", + "@sentry/react": "7.116.0", "@tanstack/react-query": "4.36.1", "@tryghost/admin-x-design-system": "0.0.0", "@types/react": "18.3.2", diff --git a/apps/portal/package.json b/apps/portal/package.json index d3fad726079..aa8ea66c3e1 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -80,7 +80,7 @@ "devDependencies": { "@babel/eslint-parser": "7.23.3", "@doist/react-interpolate": "1.0.0", - "@sentry/react": "7.114.0", + "@sentry/react": "7.116.0", "@sentry/tracing": "7.114.0", "@testing-library/jest-dom": "5.17.0", "@testing-library/react": "12.1.5", diff --git a/ghost/admin/package.json b/ghost/admin/package.json index 2654e8e580f..eff360c9d2e 100644 --- a/ghost/admin/package.json +++ b/ghost/admin/package.json @@ -39,7 +39,7 @@ "@embroider/macros": "1.13.4", "@glimmer/component": "1.1.2", "@html-next/vertical-collection": "3.0.0", - "@sentry/ember": "7.114.0", + "@sentry/ember": "7.116.0", "@sentry/integrations": "7.114.0", "@tryghost/color-utils": "0.2.2", "@tryghost/ember-promise-modals": "2.0.1", diff --git a/ghost/core/package.json b/ghost/core/package.json index f4780ea66cd..5e182f5c2af 100644 --- a/ghost/core/package.json +++ b/ghost/core/package.json @@ -58,7 +58,7 @@ }, "dependencies": { "@extractus/oembed-extractor": "3.2.1", - "@sentry/node": "7.114.0", + "@sentry/node": "7.116.0", "@tryghost/adapter-base-cache": "0.1.12", "@tryghost/adapter-cache-redis": "0.0.0", "@tryghost/adapter-manager": "0.0.0", @@ -225,7 +225,7 @@ "yjs": "13.6.15" }, "optionalDependencies": { - "@sentry/profiling-node": "7.114.0", + "@sentry/profiling-node": "7.116.0", "@tryghost/html-to-mobiledoc": "3.0.7", "sqlite3": "5.1.7" }, diff --git a/yarn.lock b/yarn.lock index a51da56001b..11609b91b91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4310,24 +4310,24 @@ domhandler "^4.2.0" selderee "^0.6.0" -"@sentry-internal/feedback@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.114.0.tgz#8a1c3d8bbd014c1823d30b9b1128eb244d357c3e" - integrity sha512-kUiLRUDZuh10QE9JbSVVLgqxFoD9eDPOzT0MmzlPuas8JlTmJuV4FtSANNcqctd5mBuLt2ebNXH0MhRMwyae4A== +"@sentry-internal/feedback@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-7.116.0.tgz#f1352b1a0d5fd7b7167775330ccf03bcc1b7892b" + integrity sha512-tmfO+RTCrhIWMs3yg8X0axhbjWRZLsldSfoXBgfjNCk/XwkYiVGp7WnYVbb+IO+01mHCsis9uaYOBggLgFRB5Q== dependencies: - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" -"@sentry-internal/replay-canvas@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.114.0.tgz#b81e2c2ebec01c436ad6e687e563ba456e33b615" - integrity sha512-6rTiqmKi/FYtesdM2TM2U+rh6BytdPjLP65KTUodtxohJ+r/3m+termj2o4BhIYPE1YYOZNmbZfwebkuQPmWeg== +"@sentry-internal/replay-canvas@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-7.116.0.tgz#1cd4a85f99dd3cd61120e087232f5cbea21d5eb2" + integrity sha512-Sy0ydY7A97JY/IFTIj8U25kHqR5rL9oBk3HFE5EK9Phw56irVhHzEwLWae0jlFeCQEWoBYqpPgO5vXsaYzrWvw== dependencies: - "@sentry/core" "7.114.0" - "@sentry/replay" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/core" "7.116.0" + "@sentry/replay" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" "@sentry-internal/tracing@7.114.0": version "7.114.0" @@ -4338,19 +4338,28 @@ "@sentry/types" "7.114.0" "@sentry/utils" "7.114.0" -"@sentry/browser@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.114.0.tgz#b0741bff89189d16c8b19f0775fe6e078147ec33" - integrity sha512-ijJ0vOEY6U9JJADVYGkUbLrAbpGSQgA4zV+KW3tcsBLX9M1jaWq4BV1PWHdzDPPDhy4OgfOjIfaMb5BSPn1U+g== - dependencies: - "@sentry-internal/feedback" "7.114.0" - "@sentry-internal/replay-canvas" "7.114.0" - "@sentry-internal/tracing" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/integrations" "7.114.0" - "@sentry/replay" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" +"@sentry-internal/tracing@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.116.0.tgz#af3e4e264c440aa5525b5877a10b9a0f870b40e3" + integrity sha512-y5ppEmoOlfr77c/HqsEXR72092qmGYS4QE5gSz5UZFn9CiinEwGfEorcg2xIrrCuU7Ry/ZU2VLz9q3xd04drRA== + dependencies: + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" + +"@sentry/browser@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.116.0.tgz#950c1a9672bf886c556c2c7b9198b90189e3f0c2" + integrity sha512-2aosATT5qE+QLKgTmyF9t5Emsluy1MBczYNuPmLhDxGNfB+MA86S8u7Hb0CpxdwjS0nt14gmbiOtJHoeAF3uTw== + dependencies: + "@sentry-internal/feedback" "7.116.0" + "@sentry-internal/replay-canvas" "7.116.0" + "@sentry-internal/tracing" "7.116.0" + "@sentry/core" "7.116.0" + "@sentry/integrations" "7.116.0" + "@sentry/replay" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" "@sentry/core@7.114.0": version "7.114.0" @@ -4360,16 +4369,24 @@ "@sentry/types" "7.114.0" "@sentry/utils" "7.114.0" -"@sentry/ember@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-7.114.0.tgz#330943f9920c1d9cdaea8af8ce8edc0e2188f41a" - integrity sha512-i7HQGJas912rUsCJg+heWEmR9QLS4vgcKhxgbsFLA5y+jPiTHVUPDwqqiTcDRNmkUpMUFEVfCCnyIXWzso6gNw== +"@sentry/core@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.116.0.tgz#7cff43134878a696b2b3b981ae384ec3db9ac8c3" + integrity sha512-J6Wmjjx+o7RwST0weTU1KaKUAlzbc8MGkJV1rcHM9xjNTWTva+nrcCM3vFBagnk2Gm/zhwv3h0PvWEqVyp3U1Q== + dependencies: + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" + +"@sentry/ember@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/ember/-/ember-7.116.0.tgz#edc169a442e541e526d974cb7d71e772e0708be0" + integrity sha512-tz9Ee21a+CsLC6jj8UZo8oqabSg2nL3sf39dnxCgR+j23UVLU/MbIAHouZJOWXs3OHThY/Ocw2TkVkEnm0eWGg== dependencies: "@embroider/macros" "^1.9.0" - "@sentry/browser" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/browser" "7.116.0" + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" ember-auto-import "^1.12.1 || ^2.4.3" ember-cli-babel "^7.26.11" ember-cli-htmlbars "^6.1.1" @@ -4385,45 +4402,55 @@ "@sentry/utils" "7.114.0" localforage "^1.8.1" -"@sentry/node@7.114.0", "@sentry/node@^7.73.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.114.0.tgz#51a64139c5d5369ec64c169b4c2f73b8870fc759" - integrity sha512-cqvi+OHV1Hj64mIGHoZtLgwrh1BG6ntcRjDLlVNMqml5rdTRD3TvG21579FtlqHlwZpbpF7K5xkwl8e5KL2hGw== +"@sentry/integrations@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.116.0.tgz#b641342249da76cd2feb2fb5511424b66f967449" + integrity sha512-UZb60gaF+7veh1Yv79RiGvgGYOnU6xA97H+hI6tKgc1uT20YpItO4X56Vhp0lvyEyUGFZzBRRH1jpMDPNGPkqw== dependencies: - "@sentry-internal/tracing" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/integrations" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" + localforage "^1.8.1" -"@sentry/profiling-node@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/profiling-node/-/profiling-node-7.114.0.tgz#260df3ea828615e85acd0d794f07a1f1b755cb14" - integrity sha512-JgTOythJKfhxDrO5jm3QxBHf8MQvpZpGHpoXe4mXRXwFKU3dP0GNjHKNp4VAOqWQh0+wDjkydSGffejJYsWppw== +"@sentry/node@7.116.0", "@sentry/node@^7.73.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.116.0.tgz#199c304e203f35ca0e814fb7fc8a9b3f30b2c612" + integrity sha512-HB/4TrJWbnu6swNzkid+MlwzLwY/D/klGt3R0aatgrgWPo2jJm6bSl4LUT39Cr2eg5I1gsREQtXE2mAlC6gm8w== + dependencies: + "@sentry-internal/tracing" "7.116.0" + "@sentry/core" "7.116.0" + "@sentry/integrations" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" + +"@sentry/profiling-node@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/profiling-node/-/profiling-node-7.116.0.tgz#e568505628541082e97e8fc5efe2f9d346392596" + integrity sha512-mfuwFUVPPg3H99ipdUy/sKotVrhyB/siM3k6pzJp82dlPgydEFE/3VSm7obHxZJmGSYBwhcIQgqSuPWbms7E7w== dependencies: detect-libc "^2.0.2" node-abi "^3.61.0" -"@sentry/react@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.114.0.tgz#aca57bbf943abe069c95f584184b5690bcb34733" - integrity sha512-zVPtvSy00Al25Z21f5GNzo3rd/TKS+iOX9wQwLrUZAxyf9RwBxKATLVJNJPkf8dQml6Qx+lfr0BHIlVcr1a1SQ== +"@sentry/react@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.116.0.tgz#7157200c66675949b126feaa5de155fe83510dd8" + integrity sha512-b7sYSIewK/h3dGzm7Rx6tBUzA6w7zw6m5rVIO3fWCy7T3xEUDggUaqklrFVHXUYx2yjzEgTFPg/Dd2NrSzua4w== dependencies: - "@sentry/browser" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry/browser" "7.116.0" + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" hoist-non-react-statics "^3.3.2" -"@sentry/replay@7.114.0": - version "7.114.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.114.0.tgz#f552e4803cacb233a2f5f2a4afbf5bed9052a744" - integrity sha512-UvEajoLIX9n2poeW3R4Ybz7D0FgCGXoFr/x/33rdUEMIdTypknxjJWxg6fJngIduzwrlrvWpvP8QiZXczYQy2Q== +"@sentry/replay@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.116.0.tgz#cde921133c8927be92d60baf03c2b0aea73380f1" + integrity sha512-OrpDtV54pmwZuKp3g7PDiJg6ruRMJKOCzK08TF7IPsKrr4x4UQn56rzMOiABVuTjuS8lNfAWDar6c6vxXFz5KA== dependencies: - "@sentry-internal/tracing" "7.114.0" - "@sentry/core" "7.114.0" - "@sentry/types" "7.114.0" - "@sentry/utils" "7.114.0" + "@sentry-internal/tracing" "7.116.0" + "@sentry/core" "7.116.0" + "@sentry/types" "7.116.0" + "@sentry/utils" "7.116.0" "@sentry/tracing@7.114.0": version "7.114.0" @@ -4437,6 +4464,11 @@ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.114.0.tgz#ab8009d5f6df23b7342121083bed34ee2452e856" integrity sha512-tsqkkyL3eJtptmPtT0m9W/bPLkU7ILY7nvwpi1hahA5jrM7ppoU0IMaQWAgTD+U3rzFH40IdXNBFb8Gnqcva4w== +"@sentry/types@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.116.0.tgz#0be3434e7e53c86db4993e668af1c3a65bfb7519" + integrity sha512-QCCvG5QuQrwgKzV11lolNQPP2k67Q6HHD9vllZ/C4dkxkjoIym8Gy+1OgAN3wjsR0f/kG9o5iZyglgNpUVRapQ== + "@sentry/utils@7.114.0": version "7.114.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.114.0.tgz#59d30a79f4acff3c9268de0b345f0bcbc6335112" @@ -4444,6 +4476,13 @@ dependencies: "@sentry/types" "7.114.0" +"@sentry/utils@7.116.0": + version "7.116.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.116.0.tgz#f32463ab10f76f464274233a9df202e5357d17ff" + integrity sha512-Vn9fcvwTq91wJvCd7WTMWozimqMi+dEZ3ie3EICELC2diONcN16ADFdzn65CQQbYwmUzRjN9EjDN2k41pKZWhQ== + dependencies: + "@sentry/types" "7.116.0" + "@sidvind/better-ajv-errors@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz#3975ad1648479e81b8419b4a7f1043f13576dbb1" From 8bc035ccb73e29c09e36b7093edc0a41989c455d Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 22 May 2024 10:00:13 +0200 Subject: [PATCH 012/282] Update twitter.com to x.com (#20234) DES-351 There's a frontend validation in Settings that rewrites the Twitter (X) URL in social accounts to match the format: twitter.com. As of May 17, X officially changed their domain to x.com so this validation is outdated. --------- Co-authored-by: Ronald Langeveld --- .../settings/general/SocialAccounts.tsx | 2 +- apps/admin-x-settings/src/utils/socialUrls.ts | 16 ++++++++-------- .../acceptance/general/socialAccounts.test.ts | 14 +++++++------- .../acceptance/general/users/profile.test.ts | 10 +++++----- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/apps/admin-x-settings/src/components/settings/general/SocialAccounts.tsx b/apps/admin-x-settings/src/components/settings/general/SocialAccounts.tsx index 37a0a057804..2516b3c7bba 100644 --- a/apps/admin-x-settings/src/components/settings/general/SocialAccounts.tsx +++ b/apps/admin-x-settings/src/components/settings/general/SocialAccounts.tsx @@ -76,7 +76,7 @@ const SocialAccounts: React.FC<{ keywords: string[] }> = ({keywords}) => { { diff --git a/apps/admin-x-settings/src/utils/socialUrls.ts b/apps/admin-x-settings/src/utils/socialUrls.ts index ed68729cd4e..bb76cbd4069 100644 --- a/apps/admin-x-settings/src/utils/socialUrls.ts +++ b/apps/admin-x-settings/src/utils/socialUrls.ts @@ -30,11 +30,11 @@ export function validateTwitterUrl(newUrl: string) { if (!newUrl) { return ''; } - if (newUrl.match(/(?:twitter\.com\/)(\S+)/) || newUrl.match(/([a-z\d.]+)/i)) { + if (newUrl.match(/(?:x\.com\/)(\S+)/) || newUrl.match(/([a-z\d.]+)/i)) { let username = []; - if (newUrl.match(/(?:twitter\.com\/)(\S+)/)) { - [, username] = newUrl.match(/(?:twitter\.com\/)(\S+)/); + if (newUrl.match(/(?:x\.com\/)(\S+)/)) { + [, username] = newUrl.match(/(?:x\.com\/)(\S+)/); } else { [username] = newUrl.match(/([^/]+)\/?$/mi); } @@ -47,21 +47,21 @@ export function validateTwitterUrl(newUrl: string) { if (username.match(/^(http|www)|(\/)/) || !username.match(/^[a-z\d._]{1,15}$/mi)) { const message = !username.match(/^[a-z\d._]{1,15}$/mi) ? 'Your Username is not a valid Twitter Username' - : 'The URL must be in a format like https://twitter.com/yourUsername'; + : 'The URL must be in a format like https://x.com/yourUsername'; throw new Error(message); } - return `https://twitter.com/${username}`; + return `https://x.com/${username}`; } else { - const message = 'The URL must be in a format like https://twitter.com/yourUsername'; + const message = 'The URL must be in a format like https://x.com/yourUsername'; throw new Error(message); } } export const facebookHandleToUrl = (handle: string) => `https://www.facebook.com/${handle}`; -export const twitterHandleToUrl = (handle: string) => `https://twitter.com/${handle.replace('@', '')}`; +export const twitterHandleToUrl = (handle: string) => `https://x.com/${handle.replace('@', '')}`; export const facebookUrlToHandle = (url: string) => url.match(/(?:https:\/\/)(?:www\.)(?:facebook\.com)\/(?:#!\/)?(\w+\/?\S+)/mi)?.[1] || null; export const twitterUrlToHandle = (url: string) => { - const handle = url.match(/(?:https:\/\/)(?:twitter\.com)\/(?:#!\/)?@?([^/]*)/)?.[1]; + const handle = url.match(/(?:https:\/\/)(?:x\.com)\/(?:#!\/)?@?([^/]*)/)?.[1]; return handle ? `@${handle}` : null; }; diff --git a/apps/admin-x-settings/test/acceptance/general/socialAccounts.test.ts b/apps/admin-x-settings/test/acceptance/general/socialAccounts.test.ts index f5041c7e937..a211dcad8c5 100644 --- a/apps/admin-x-settings/test/acceptance/general/socialAccounts.test.ts +++ b/apps/admin-x-settings/test/acceptance/general/socialAccounts.test.ts @@ -17,19 +17,19 @@ test.describe('Social account settings', async () => { const section = page.getByTestId('social-accounts'); await expect(section.getByText('https://www.facebook.com/ghost')).toHaveCount(1); - await expect(section.getByText('https://twitter.com/ghost')).toHaveCount(1); + await expect(section.getByText('https://x.com/ghost')).toHaveCount(1); await section.getByRole('button', {name: 'Edit'}).click(); await section.getByLabel(`URL of your publication's Facebook Page`).fill('https://www.facebook.com/fb'); - await section.getByLabel('URL of your X (formerly Twitter) profile').fill('https://twitter.com/tw'); + await section.getByLabel('URL of your X (formerly Twitter) profile').fill('https://x.com/tw'); await section.getByRole('button', {name: 'Save'}).click(); await expect(section.getByLabel('URL of your X (formerly Twitter) profile')).toHaveCount(0); await expect(section.getByText('https://www.facebook.com/fb')).toHaveCount(1); - await expect(section.getByText('https://twitter.com/tw')).toHaveCount(1); + await expect(section.getByText('https://x.com/tw')).toHaveCount(1); expect(lastApiRequests.editSettings?.body).toEqual({ settings: [ @@ -112,26 +112,26 @@ test.describe('Social account settings', async () => { await testUrlValidation( twitterInput, 'twitter.com/username', - 'https://twitter.com/username' + 'https://x.com/username' ); await testUrlValidation( twitterInput, 'testuser', - 'https://twitter.com/testuser' + 'https://x.com/testuser' ); await testUrlValidation( twitterInput, 'http://github.com/username', - 'https://twitter.com/username' + 'https://x.com/username' ); await testUrlValidation( twitterInput, '*(&*(%%))', '*(&*(%%))', - 'The URL must be in a format like https://twitter.com/yourUsername' + 'The URL must be in a format like https://x.com/yourUsername' ); await testUrlValidation( diff --git a/apps/admin-x-settings/test/acceptance/general/users/profile.test.ts b/apps/admin-x-settings/test/acceptance/general/users/profile.test.ts index 12e0b7f85e9..8b72aa20998 100644 --- a/apps/admin-x-settings/test/acceptance/general/users/profile.test.ts +++ b/apps/admin-x-settings/test/acceptance/general/users/profile.test.ts @@ -116,27 +116,27 @@ test.describe('User profile', async () => { await testUrlValidation( twitterInput, - 'twitter.com/username', - 'https://twitter.com/username' + 'x.com/username', + 'https://x.com/username' ); await testUrlValidation( twitterInput, 'testuser', - 'https://twitter.com/testuser' + 'https://x.com/testuser' ); await testUrlValidation( twitterInput, 'http://github.com/username', - 'https://twitter.com/username' + 'https://x.com/username' ); await testUrlValidation( twitterInput, '*(&*(%%))', '*(&*(%%))', - 'The URL must be in a format like https://twitter.com/yourUsername' + 'The URL must be in a format like https://x.com/yourUsername' ); await testUrlValidation( From fb44c2393c92d306d970939a2f61cf8a608eda93 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 22 May 2024 10:29:03 +0200 Subject: [PATCH 013/282] Fixed schedule date formatting (#20236) DES-355 There's been an orphan in the schedule toast notification and the date format was non-standard. --- ghost/admin/app/controllers/lexical-editor.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ghost/admin/app/controllers/lexical-editor.js b/ghost/admin/app/controllers/lexical-editor.js index f98e8762845..48416986f06 100644 --- a/ghost/admin/app/controllers/lexical-editor.js +++ b/ghost/admin/app/controllers/lexical-editor.js @@ -1294,13 +1294,14 @@ export default class LexicalEditorController extends Controller { description.push(`${!emailOnly ? 'and delivered ' : ''}to ${recipientCount}`); } - description.push(`on ${publishedAtBlogTZ.format('MMM Do')}`); - description.push(`at ${publishedAtBlogTZ.format('HH:mm')}`); + description.push(`on ${publishedAtBlogTZ.format('D MMM YYYY')}`); + let timeZoneLabel = ''; if (publishedAtBlogTZ.utcOffset() === 0) { - description.push('(UTC)'); + timeZoneLabel = '(UTC)'; } else { - description.push(`(UTC${publishedAtBlogTZ.format('Z').replace(/([+-])0/, '$1').replace(/:00/, '')})`); + timeZoneLabel = `(UTC${publishedAtBlogTZ.format('Z').replace(/([+-])0/, '$1').replace(/:00/, '')})`; } + description.push(`at ${publishedAtBlogTZ.format('HH:mm')} ${timeZoneLabel}`); description = htmlSafe(description.join(' ')); From 184457b33f367e08778620f59e7c78d7cb5a5a11 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 22 May 2024 11:02:53 +0200 Subject: [PATCH 014/282] Fixed tooltip for scheduled posts in postlist (#20237) DES-194 The tooltip of scheduled posts always showed subscribers even if it was not sent as a newsletter. --- ghost/admin/app/components/posts-list/list-item.hbs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ghost/admin/app/components/posts-list/list-item.hbs b/ghost/admin/app/components/posts-list/list-item.hbs index e588189a583..6b201b9b30b 100644 --- a/ghost/admin/app/components/posts-list/list-item.hbs +++ b/ghost/admin/app/components/posts-list/list-item.hbs @@ -95,10 +95,14 @@ {{#if @post.emailOnly}} to be sent + {{this.scheduledText}} to {{humanize-recipient-filter @post.emailSegment}} {{else}} to be published {{if @post.newsletter "and sent "}} + {{this.scheduledText}} + {{#if @post.newsletter}} + to {{humanize-recipient-filter @post.emailSegment}} + {{/if}} {{/if}} - {{this.scheduledText}} to {{humanize-recipient-filter @post.emailSegment}} {{/if}} From 277e169f7b8c00f004fe837dedadd5d3bf3919ad Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Wed, 22 May 2024 13:14:28 +0200 Subject: [PATCH 015/282] Fixed static copy in newsletter preview (#20238) DES-342 A static site title ("The Local Host") was displayed in the newsletter preview instead of the actual site title. Also, moved over the "Support independent publishing" button to design tab in newsletter settings. --- .../newsletters/NewsletterDetailModal.tsx | 41 +++++++++---------- .../newsletters/NewsletterPreviewContent.tsx | 2 +- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx index af794313605..fa6b1a38c37 100644 --- a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx +++ b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx @@ -251,27 +251,6 @@ const Sidebar: React.FC<{ onChange={e => updateNewsletter({subscribe_on_signup: e.target.checked})} /> - -
      - - - -
      - - Promote independent publishing - Show you’re a part of the indie publishing movement with a small badge in the footer -
      - } - labelStyle='value' - onChange={e => updateNewsletter({show_badge: e.target.checked})} - /> - -
    -
    {newsletter.status === 'active' ? (!onlyOne &&
    @@ -488,6 +467,26 @@ const Sidebar: React.FC<{ onChange={html => updateNewsletter({footer_content: html})} /> + +
    + + + +
    + + Promote independent publishing + Show you’re a part of the indie publishing movement with a small badge in the footer +
    + } + labelStyle='value' + onChange={e => updateNewsletter({show_badge: e.target.checked})} + /> + +
    } ]; diff --git a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterPreviewContent.tsx b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterPreviewContent.tsx index 0bffd1434ac..a7c36862e0e 100644 --- a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterPreviewContent.tsx +++ b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterPreviewContent.tsx @@ -230,7 +230,7 @@ const NewsletterPreviewContent: React.FC<{ {showSubscriptionDetails && (

    Subscription details

    -

    You are receiving this because you are a paid subscriber to The Local Host. Your subscription will renew on 17 Jul 2024.

    +

    You are receiving this because you are a paid subscriber to {siteTitle}. Your subscription will renew on 17 Jul 2024.

    Name: Jamie Larson

    From d9390d2262835bf998278707643643f6db0cc0f9 Mon Sep 17 00:00:00 2001 From: Peter Zimon Date: Thu, 23 May 2024 10:20:27 +0200 Subject: [PATCH 016/282] Improve discoverability of unsaved settings (#20153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DES-195 The purpose of this change is to (1) reduce the overwhelming use of green on the settings UI in general and (2) to make unsaved sections more focused and discoverable and focused when trying to quit Settings without saving so that it's easier to find. --------- Co-authored-by: Daniël van der Winden --- .../src/global/Button.tsx | 11 +++- .../src/global/ButtonGroup.stories.tsx | 25 +++------- .../src/global/ButtonGroup.tsx | 4 +- .../src/settings/SettingGroup.tsx | 50 +++++++++++++------ .../src/settings/SettingGroupHeader.tsx | 4 +- .../settings/advanced/CodeInjection.tsx | 2 +- .../components/settings/advanced/History.tsx | 2 +- .../settings/advanced/Integrations.tsx | 2 +- .../src/components/settings/advanced/Labs.tsx | 4 +- .../components/settings/email/Newsletters.tsx | 2 +- .../src/components/settings/general/Users.tsx | 2 +- .../src/components/settings/growth/Offers.tsx | 2 +- .../settings/growth/Recommendations.tsx | 4 +- .../growth/embedSignup/EmbedSignupForm.tsx | 2 +- .../components/settings/membership/Portal.tsx | 2 +- .../settings/site/AnnouncementBar.tsx | 2 +- .../settings/site/DesignSetting.tsx | 2 +- .../components/settings/site/Navigation.tsx | 2 +- 18 files changed, 71 insertions(+), 53 deletions(-) diff --git a/apps/admin-x-design-system/src/global/Button.tsx b/apps/admin-x-design-system/src/global/Button.tsx index 5c91bfeb26b..2464e98f15a 100644 --- a/apps/admin-x-design-system/src/global/Button.tsx +++ b/apps/admin-x-design-system/src/global/Button.tsx @@ -3,7 +3,7 @@ import React, {HTMLProps} from 'react'; import clsx from 'clsx'; import {LoadingIndicator, LoadingIndicatorColor, LoadingIndicatorSize} from './LoadingIndicator'; -export type ButtonColor = 'clear' | 'grey' | 'black' | 'green' | 'red' | 'white' | 'outline'; +export type ButtonColor = 'clear' | 'light-grey' | 'grey' | 'black' | 'green' | 'red' | 'white' | 'outline'; export type ButtonSize = 'sm' | 'md'; export interface ButtonProps extends Omit, 'label' | 'size' | 'children'> { @@ -75,6 +75,13 @@ const Button: React.FC = ({ loadingIndicatorColor = 'light'; iconColorClass = iconColorClass || 'text-white'; break; + case 'light-grey': + className = clsx( + link ? 'text-grey-800 hover:text-green-400 dark:text-white' : `bg-grey-200 text-black dark:bg-grey-900 dark:text-white ${!disabled && 'hover:!bg-grey-300 dark:hover:!bg-grey-800'}`, + className + ); + loadingIndicatorColor = 'dark'; + break; case 'grey': className = clsx( link ? 'text-black hover:text-grey-800 dark:text-white' : `bg-grey-100 text-black dark:bg-grey-900 dark:text-white ${!disabled && 'hover:!bg-grey-300 dark:hover:!bg-grey-800'}`, @@ -114,7 +121,7 @@ const Button: React.FC = ({ break; default: className = clsx( - link ? ' text-black hover:text-grey-800 dark:text-white' : `text-black dark:text-white dark:hover:bg-grey-900 ${!disabled && 'hover:bg-grey-200'}`, + link ? ' text-black hover:text-grey-800 dark:text-white' : `text-grey-900 dark:text-white dark:hover:bg-grey-900 ${!disabled && 'hover:bg-grey-200 hover:text-black'}`, (outlineOnMobile && !link) && 'border border-grey-300 hover:border-transparent md:border-transparent', className ); diff --git a/apps/admin-x-design-system/src/global/ButtonGroup.stories.tsx b/apps/admin-x-design-system/src/global/ButtonGroup.stories.tsx index eb007ad9ca1..850c8d7baba 100644 --- a/apps/admin-x-design-system/src/global/ButtonGroup.stories.tsx +++ b/apps/admin-x-design-system/src/global/ButtonGroup.stories.tsx @@ -33,6 +33,14 @@ export const Default: Story = { } }; +export const Small: Story = { + args: { + buttons: defaultButtons, + link: false, + size: 'sm' + } +}; + const linkButtons: ButtonProps[] = [ { label: 'Cancel', @@ -50,21 +58,4 @@ export const LinkButtons: Story = { buttons: linkButtons, link: true } -}; - -export const WithBackground: Story = { - args: { - buttons: linkButtons, - link: true, - clearBg: false - } -}; - -export const SmallWithBackground: Story = { - args: { - buttons: linkButtons, - link: true, - clearBg: false, - size: 'sm' - } }; \ No newline at end of file diff --git a/apps/admin-x-design-system/src/global/ButtonGroup.tsx b/apps/admin-x-design-system/src/global/ButtonGroup.tsx index f41d9b0fa4f..26697d49776 100644 --- a/apps/admin-x-design-system/src/global/ButtonGroup.tsx +++ b/apps/admin-x-design-system/src/global/ButtonGroup.tsx @@ -17,7 +17,7 @@ export interface ButtonGroupProps { const ButtonGroup: React.FC = ({size = 'md', buttons, link, linkWithPadding, clearBg = true, outlineOnMobile, className}) => { let groupColorClasses = clsx( 'flex items-center justify-start rounded', - link ? 'gap-4' : 'gap-3', + link ? 'gap-4' : 'gap-2', className ); @@ -33,7 +33,7 @@ const ButtonGroup: React.FC = ({size = 'md', buttons, link, li return (
    {buttons.map(({key, ...props}) => ( -
    ); diff --git a/apps/admin-x-design-system/src/settings/SettingGroup.tsx b/apps/admin-x-design-system/src/settings/SettingGroup.tsx index 7c3ab39191c..2a620534fc2 100644 --- a/apps/admin-x-design-system/src/settings/SettingGroup.tsx +++ b/apps/admin-x-design-system/src/settings/SettingGroup.tsx @@ -78,6 +78,7 @@ const SettingGroup = forwardRef(function Sett styles += ' border-grey-250 dark:border-grey-925'; + // The links visible before editing const viewButtons: ButtonProps[] = []; if (!hideEditButton) { @@ -89,7 +90,7 @@ const SettingGroup = forwardRef(function Sett { label, key: 'edit', - color: 'green', + color: 'clear', onClick: handleEdit } ); @@ -104,6 +105,7 @@ const SettingGroup = forwardRef(function Sett ); } + // The buttons that show when you are editing const editButtons: ButtonProps[] = [ { label: 'Cancel', @@ -119,9 +121,10 @@ const SettingGroup = forwardRef(function Sett } editButtons.push( { - label, + label: label, key: 'save', - color: 'green', + color: saveState === 'unsaved' ? 'green' : 'light-grey', + disabled: saveState !== 'unsaved', onClick: handleSave } ); @@ -151,18 +154,35 @@ const SettingGroup = forwardRef(function Sett styles ); - return ( -
    -
    - {customHeader ? customHeader : - - {customButtons ? customButtons : - (onEditingChange && )} - - } - {children} -
    - ); + if (!isEditing) { + return ( +
    +
    + {customHeader ? customHeader : + + {customButtons ? customButtons : + (onEditingChange && ) + } + + } + {children} +
    + ); + } else { + return ( +
    +
    + {customHeader ? customHeader : + + {customButtons ? customButtons : + (onEditingChange && ) + } + + } + {children} +
    + ); + } }); export default SettingGroup; diff --git a/apps/admin-x-design-system/src/settings/SettingGroupHeader.tsx b/apps/admin-x-design-system/src/settings/SettingGroupHeader.tsx index 181196bcf37..89278245438 100644 --- a/apps/admin-x-design-system/src/settings/SettingGroupHeader.tsx +++ b/apps/admin-x-design-system/src/settings/SettingGroupHeader.tsx @@ -14,10 +14,10 @@ const SettingGroupHeader: React.FC = ({title, descripti {(title || description) &&
    {title}{beta && Beta} - {description &&

    {description}

    } + {description &&

    {description}

    }
    } -
    +
    {children}
    diff --git a/apps/admin-x-settings/src/components/settings/advanced/CodeInjection.tsx b/apps/admin-x-settings/src/components/settings/advanced/CodeInjection.tsx index aba04ba3c08..484d52319dd 100644 --- a/apps/admin-x-settings/src/components/settings/advanced/CodeInjection.tsx +++ b/apps/admin-x-settings/src/components/settings/advanced/CodeInjection.tsx @@ -10,7 +10,7 @@ const CodeInjection: React.FC<{ keywords: string[] }> = ({keywords}) => { customHeader={
    -
    diff --git a/apps/admin-x-settings/src/components/settings/advanced/History.tsx b/apps/admin-x-settings/src/components/settings/advanced/History.tsx index 7f33ae13546..8b05a073cc2 100644 --- a/apps/admin-x-settings/src/components/settings/advanced/History.tsx +++ b/apps/admin-x-settings/src/components/settings/advanced/History.tsx @@ -11,7 +11,7 @@ const History: React.FC<{ keywords: string[] }> = ({keywords}) => { return ( } + customButtons={
    diff --git a/apps/admin-x-settings/src/components/settings/growth/embedSignup/EmbedSignupForm.tsx b/apps/admin-x-settings/src/components/settings/growth/embedSignup/EmbedSignupForm.tsx index 8dffc09960f..703a52c622c 100644 --- a/apps/admin-x-settings/src/components/settings/growth/embedSignup/EmbedSignupForm.tsx +++ b/apps/admin-x-settings/src/components/settings/growth/embedSignup/EmbedSignupForm.tsx @@ -11,7 +11,7 @@ const EmbedSignupForm: React.FC<{ keywords: string[] }> = ({keywords}) => { return ( } + customButtons={