From cdf22ad65e89625e20ae1412842835fd34f2a49d Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sat, 18 Mar 2023 22:05:15 +0100 Subject: [PATCH 01/50] fix(admin): fix error with strapi v4.8 strapi v4.8 seems to throw error if Td element is not direct child of Tr element fix #142 --- plugin/admin/src/components/Usage/index.js | 56 +++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/plugin/admin/src/components/Usage/index.js b/plugin/admin/src/components/Usage/index.js index a793c020..b04dd178 100644 --- a/plugin/admin/src/components/Usage/index.js +++ b/plugin/admin/src/components/Usage/index.js @@ -23,39 +23,39 @@ const UsageOverview = () => { return null } - const content = error ? ( - - - {formatMessage({ - id: getTrad('usage.failed-to-load'), - defaultMessage: 'Failed to load Usage data', - })} - - - ) : ( - <> - - - {usage.count}/{usage.limit}{' '} - {formatMessage({ - id: getTrad('usage.characters-used'), - defaultMessage: 'characters used', - })} - - - - - + const content = error + ? [ + + + {formatMessage({ + id: getTrad('usage.failed-to-load'), + defaultMessage: 'Failed to load Usage data', + })} + + , + ] + : [ + + {usage.count}/{usage.limit}{' '} {formatMessage({ id: getTrad('usage.characters-used'), defaultMessage: 'characters used', })} - - - - - ) + + , + + + + {usage.count}/{usage.limit}{' '} + {formatMessage({ + id: getTrad('usage.characters-used'), + defaultMessage: 'characters used', + })} + + + , + ] return ( From 62e8a25ff4e16ef5c40077917a79fa2c6b0b5b2b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 19 Mar 2023 06:46:27 +0000 Subject: [PATCH 02/50] chore(release): 1.0.1 [skip ci] ## strapi-provider-translate-libretranslate [1.0.1](https://github.com/fekide/strapi-plugin-translate/compare/strapi-provider-translate-libretranslate@1.0.0...strapi-provider-translate-libretranslate@1.0.1) (2023-03-19) ### Dependencies * **strapi-plugin-translate:** upgraded to 1.1.2 --- providers/libretranslate/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/libretranslate/package.json b/providers/libretranslate/package.json index d59493ce..0d7f0af7 100644 --- a/providers/libretranslate/package.json +++ b/providers/libretranslate/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-translate-libretranslate", - "version": "1.0.0", + "version": "1.0.1", "description": "Libretranslate provider for translate plugin in Strapi 4", "keywords": [ "strapi", @@ -55,6 +55,6 @@ }, "peerDependencies": { "lodash": "*", - "strapi-plugin-translate": "1.1.1" + "strapi-plugin-translate": "1.1.2" } } From c313e272e4cd15e8f205774dd0fba29bacfe8de0 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 19 Mar 2023 06:46:30 +0000 Subject: [PATCH 03/50] chore(release): 1.1.2 [skip ci] ## [1.1.2](https://github.com/Fekide/strapi-plugin-translate/compare/strapi-plugin-translate@1.1.1...strapi-plugin-translate@1.1.2) (2023-03-19) ### Bug Fixes * **admin:** fix error with strapi v4.8 ([cdf22ad](https://github.com/Fekide/strapi-plugin-translate/commit/cdf22ad65e89625e20ae1412842835fd34f2a49d)), closes [#142](https://github.com/Fekide/strapi-plugin-translate/issues/142) * **provider-libretranslate:** throw error if no API URL is provided ([ad35472](https://github.com/Fekide/strapi-plugin-translate/commit/ad354724be2795ad6cd7066ee1c422f56caecc62)) ### Features * **provider:** add libretranslate provider ([dafff33](https://github.com/Fekide/strapi-plugin-translate/commit/dafff33ca550320dfc8958aae3c33705f18b5b7d)), closes [#87](https://github.com/Fekide/strapi-plugin-translate/issues/87) --- plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/package.json b/plugin/package.json index d880dd22..ab36f512 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-translate", - "version": "1.1.1", + "version": "1.1.2", "description": "Strapi plugin for managing and automating translation of content", "strapi": { "name": "translate", From c556d3c8c2cab6d6bc18bcd55ed9e69477c24cb3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 19 Mar 2023 06:46:33 +0000 Subject: [PATCH 04/50] chore(release): 1.1.2 [skip ci] ## [1.1.2](https://github.com/fekide/strapi-plugin-translate/compare/strapi-provider-translate-deepl@1.1.1...strapi-provider-translate-deepl@1.1.2) (2023-03-19) ### Bug Fixes * **admin:** fix error with strapi v4.8 ([cdf22ad](https://github.com/fekide/strapi-plugin-translate/commit/cdf22ad65e89625e20ae1412842835fd34f2a49d)), closes [#142](https://github.com/fekide/strapi-plugin-translate/issues/142) * **provider-libretranslate:** throw error if no API URL is provided ([ad35472](https://github.com/fekide/strapi-plugin-translate/commit/ad354724be2795ad6cd7066ee1c422f56caecc62)) ### Features * **provider:** add libretranslate provider ([dafff33](https://github.com/fekide/strapi-plugin-translate/commit/dafff33ca550320dfc8958aae3c33705f18b5b7d)), closes [#87](https://github.com/fekide/strapi-plugin-translate/issues/87) --- providers/deepl/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/deepl/package.json b/providers/deepl/package.json index 8dcf1dde..bdeaf5aa 100644 --- a/providers/deepl/package.json +++ b/providers/deepl/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-translate-deepl", - "version": "1.1.1", + "version": "1.1.2", "description": "DeepL provider for translate plugin in Strapi 4", "keywords": [ "strapi", @@ -55,6 +55,6 @@ }, "peerDependencies": { "lodash": "*", - "strapi-plugin-translate": "1.1.1" + "strapi-plugin-translate": "1.1.2" } } From 32ca0271c9c8f893b9aada508c440cca224c59ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 15:07:36 +0000 Subject: [PATCH 05/50] build(deps-dev): bump multi-semantic-release from 3.0.1 to 3.0.2 Bumps [multi-semantic-release](https://github.com/dhoulb/multi-semantic-release) from 3.0.1 to 3.0.2. - [Release notes](https://github.com/dhoulb/multi-semantic-release/releases) - [Commits](https://github.com/dhoulb/multi-semantic-release/compare/v3.0.1...v3.0.2) --- updated-dependencies: - dependency-name: multi-semantic-release dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6610eaf5..07d63593 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "husky": "^8.0.1", "jest": "^29.4.1", "lint-staged": "^13.2.0", - "multi-semantic-release": "^3.0.1", + "multi-semantic-release": "^3.0.2", "semantic-release": "^19.0.5" }, "config": { diff --git a/yarn.lock b/yarn.lock index c8425d29..6e0500c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11680,10 +11680,10 @@ msw@^1.0.0: type-fest "^2.19.0" yargs "^17.3.1" -multi-semantic-release@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/multi-semantic-release/-/multi-semantic-release-3.0.1.tgz#e9d888c3f7aa4bdd06027ba162ac8150f95e8d94" - integrity sha512-EFA9ttP95Q9T8lR0BVsOZN70QBqBs25bQkeFef3xCQhB/P7Mm5DwHsNg++KkduMHfLevOpbr28MnMzR4jMbmFw== +multi-semantic-release@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/multi-semantic-release/-/multi-semantic-release-3.0.2.tgz#a714bb66a30a669d64386f566f728416ff59cae8" + integrity sha512-2q4aKAlfrgm9XRt0hGRSH7Hle1oZoQlotmvK4ur+VFsZTEX33TmFYVfO7An/ywFrq9Ufa1/dFJFTfSEGeDB2KQ== dependencies: "@manypkg/get-packages" "^1.1.3" blork "^9.3.0" From f12262eed2d93c48af9c827209a3491161671bcc Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Wed, 15 Mar 2023 15:44:13 +0100 Subject: [PATCH 06/50] test(e2e): setup e2e tests using cypress One example test included for now with direct translation. Not yet suitable for ci run since the setup is not fully automated yet --- .gitignore | 3 + playground/.env.example | 6 + playground/cypress.config.js | 10 + playground/cypress/e2e/translate-direct.cy.js | 44 + playground/cypress/fixtures/example.json | 5 + playground/cypress/support/commands.js | 29 + playground/cypress/support/e2e.js | 20 + playground/data/data.json | 7 + playground/package.json | 18 +- playground/scripts/reset.js | 48 + playground/src/bootstrap.js | 28 + yarn.lock | 828 +++++++++++++++--- 12 files changed, 929 insertions(+), 117 deletions(-) create mode 100644 playground/cypress.config.js create mode 100644 playground/cypress/e2e/translate-direct.cy.js create mode 100644 playground/cypress/fixtures/example.json create mode 100644 playground/cypress/support/commands.js create mode 100644 playground/cypress/support/e2e.js create mode 100644 playground/scripts/reset.js diff --git a/.gitignore b/.gitignore index c75e533e..64b4e662 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,6 @@ dist .vscode build/ + + +**/cypress/videos diff --git a/playground/.env.example b/playground/.env.example index fc4d1dec..0be08152 100644 --- a/playground/.env.example +++ b/playground/.env.example @@ -5,4 +5,10 @@ API_TOKEN_SALT=tobemodified ADMIN_JWT_SECRET=tobemodified JWT_SECRET=tobemodified DEEPL_API_KEY=tobemodified +INIT_ADMIN=true +INIT_ADMIN_USERNAME=admin +INIT_ADMIN_PASSWORD=admin +INIT_ADMIN_FIRSTNAME=Admin +INIT_ADMIN_LASTNAME=Admin +INIT_ADMIN_EMAIL=admin@localhost #DEEPL_API_URL=optional diff --git a/playground/cypress.config.js b/playground/cypress.config.js new file mode 100644 index 00000000..0ba08c13 --- /dev/null +++ b/playground/cypress.config.js @@ -0,0 +1,10 @@ +const { defineConfig } = require('cypress') + +module.exports = defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + baseUrl: 'http://localhost:1337', + }, +}) diff --git a/playground/cypress/e2e/translate-direct.cy.js b/playground/cypress/e2e/translate-direct.cy.js new file mode 100644 index 00000000..1b1cc31f --- /dev/null +++ b/playground/cypress/e2e/translate-direct.cy.js @@ -0,0 +1,44 @@ +// const { resetStrapi } = require('../utils/strapi') + +describe('translate directly', () => { + beforeEach(() => { + cy.exec('yarn reset') + }) + + it('single article', () => { + cy.intercept('/translate/translate').as('translateExecution') + cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + + // Login and Navigate to article + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Content Manager').click() + cy.contains('A bug is becoming a meme on the internet').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Regenerate UID + cy.get('button[aria-label=regenerate]').click() + cy.wait('@regenerateUID') + + // Save and Publish + cy.contains('button', 'Save').click() + cy.contains('button', 'Publish').click() + + // Verify + cy.contains('button', 'Unpublish').should('be.visible') + cy.contains('span', 'Sarah Baker').should('be.visible') + cy.contains('span', 'tech').should('not.exist') + }) +}) diff --git a/playground/cypress/fixtures/example.json b/playground/cypress/fixtures/example.json new file mode 100644 index 00000000..02e42543 --- /dev/null +++ b/playground/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/playground/cypress/support/commands.js b/playground/cypress/support/commands.js new file mode 100644 index 00000000..85d121cb --- /dev/null +++ b/playground/cypress/support/commands.js @@ -0,0 +1,29 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +Cypress.Commands.add('login', (email, password) => { + cy.visit('/admin/auth/login') + cy.get('input[name=email]').type(email) + cy.get('input[name=password]').type(`${password}{enter}`) +}) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) diff --git a/playground/cypress/support/e2e.js b/playground/cypress/support/e2e.js new file mode 100644 index 00000000..0e7290a1 --- /dev/null +++ b/playground/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/playground/data/data.json b/playground/data/data.json index 58197221..57b60d4b 100644 --- a/playground/data/data.json +++ b/playground/data/data.json @@ -1,22 +1,27 @@ { "categories": [ { + "id": 1, "name": "news", "slug": "news" }, { + "id": 2, "name": "tech", "slug": "tech" }, { + "id": 3, "name": "food", "slug": "food" }, { + "id": 4, "name": "nature", "slug": "nature" }, { + "id": 5, "name": "story", "slug": "story" } @@ -33,11 +38,13 @@ }, "writers": [ { + "id": 1, "name": "David Doe", "email": "daviddoe@strapi.io", "picture": null }, { + "id": 2, "name": "Sarah Baker", "email": "sarahbaker@strapi.io", "picture": null diff --git a/playground/package.json b/playground/package.json index 713904e0..36b8c681 100644 --- a/playground/package.json +++ b/playground/package.json @@ -1,12 +1,13 @@ { "dependencies": { "@strapi/plugin-graphql": "^4.7.1", - "lodash.set": "^4.3.2", - "mime-types": "^2.1.27", - "@strapi/strapi": "4.7.1", "@strapi/plugin-i18n": "4.7.1", "@strapi/plugin-users-permissions": "4.7.1", - "better-sqlite3": "8.2.0" + "@strapi/strapi": "4.7.1", + "better-sqlite3": "8.2.0", + "lodash.set": "^4.3.2", + "mime-types": "^2.1.27", + "strapi-plugin-init-admin-user": "^0.2.1" }, "name": "playground", "private": true, @@ -17,9 +18,14 @@ "start": "strapi start", "build": "strapi build", "strapi": "strapi", - "test": "echo no tests" + "reset": "node scripts/reset.js", + "cy:run": "cypress run", + "test": "start-server-and-test start http://localhost:1337 cy:run" + }, + "devDependencies": { + "cypress": "^12.7.0", + "start-server-and-test": "^2.0.0" }, - "devDependencies": {}, "author": { "name": "A Strapi developer" }, diff --git a/playground/scripts/reset.js b/playground/scripts/reset.js new file mode 100644 index 00000000..851a881a --- /dev/null +++ b/playground/scripts/reset.js @@ -0,0 +1,48 @@ +const Strapi = require('@strapi/strapi') +const bootstrap = require('../src/bootstrap') +let instance + +const waitForServer = () => + new Promise((resolve) => { + const { host, port } = strapi.config.get('server') + resolve(strapi.server.listen(port, host)) + }) + +async function setupStrapi() { + if (!instance) { + /** the following code is copied from `./node_modules/strapi/lib/Strapi.js` */ + await Strapi({ serveAdminPanel: false }).load() + await waitForServer() + + instance = strapi // strapi is global now + } + return instance +} + +async function stopStrapi() { + if (instance) { + await instance.destroy() + } + return instance +} + +async function resetStrapi() { + if (!instance) { + await setupStrapi() + } + console.log('Strapi initialized') + + const pluginStore = strapi.store({ + environment: strapi.config.environment, + type: 'type', + name: 'setup', + }) + await pluginStore.set({ key: 'initHasRun', value: false }) + await bootstrap() + console.log('Strapi rebootstrapped') + await stopStrapi() +} + +process.env.PORT = 1234 + +resetStrapi() diff --git a/playground/src/bootstrap.js b/playground/src/bootstrap.js index ccf9239c..bd577e69 100644 --- a/playground/src/bootstrap.js +++ b/playground/src/bootstrap.js @@ -169,6 +169,19 @@ async function importGlobal() { return createEntry({ model: 'global', entry: global, files }) } +async function addLocales(locales) { + return Promise.all( + locales.map((locale) => + strapi + .service('plugin::i18n.locales') + .create(locale) + .catch(() => + console.log(`Failed to create locale ${locale.code}. Already exists`) + ) + ) + ) +} + async function importSeedData() { // Allow read of application content types await setPublicPermissions({ @@ -185,6 +198,19 @@ async function importSeedData() { await importWriters() await importArticles() await importGlobal() + await addLocales([{ name: 'German (de)', code: 'de' }]) +} + +async function cleanCollectionType(uid) { + return strapi.db.query(uid).deleteMany({ where: { id: { $notNull: true } } }) +} + +async function cleanData() { + await cleanCollectionType('api::global.global') + await cleanCollectionType('api::article.article') + await cleanCollectionType('api::category.category') + await cleanCollectionType('api::homepage.homepage') + await cleanCollectionType('api::writer.writer') } module.exports = async () => { @@ -192,6 +218,8 @@ module.exports = async () => { if (shouldImportSeedData) { try { + console.log('Cleaning database') + await cleanData() console.log('Setting up the template...') await importSeedData() console.log('Ready to go') diff --git a/yarn.lock b/yarn.lock index 6e0500c2..2ce4f37d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1555,15 +1555,15 @@ integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@commitlint/cli@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.4.2.tgz#8600c83abb7e84191fd59528fc14f436496fb00b" - integrity sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA== - dependencies: - "@commitlint/format" "^17.4.0" - "@commitlint/lint" "^17.4.2" - "@commitlint/load" "^17.4.2" - "@commitlint/read" "^17.4.2" - "@commitlint/types" "^17.4.0" + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.4.4.tgz#36df08bfa31dbb9a2b6b1d7187a31e578f001a06" + integrity sha512-HwKlD7CPVMVGTAeFZylVNy14Vm5POVY0WxPkZr7EXLC/os0LH/obs6z4HRvJtH/nHCMYBvUBQhGwnufKfTjd5g== + dependencies: + "@commitlint/format" "^17.4.4" + "@commitlint/lint" "^17.4.4" + "@commitlint/load" "^17.4.4" + "@commitlint/read" "^17.4.4" + "@commitlint/types" "^17.4.4" execa "^5.0.0" lodash.isfunction "^3.0.9" resolve-from "5.0.0" @@ -1577,20 +1577,20 @@ dependencies: conventional-changelog-conventionalcommits "^5.0.0" -"@commitlint/config-validator@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.0.tgz#2cb229672a22476cf1f21bedbfcd788e5da5b54f" - integrity sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA== +"@commitlint/config-validator@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.4.4.tgz#d0742705719559a101d2ee49c0c514044af6d64d" + integrity sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" ajv "^8.11.0" -"@commitlint/ensure@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.4.0.tgz#3de65768bfccb9956ec3a0ecd8a415421bf315e5" - integrity sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw== +"@commitlint/ensure@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.4.4.tgz#a36e7719bdb9c2b86c8b8c2e852b463a7bfda5fa" + integrity sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" @@ -1602,41 +1602,41 @@ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== -"@commitlint/format@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.0.tgz#1c80cf3a6274ff9b3d3c0dd150a97882d557aa0f" - integrity sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA== +"@commitlint/format@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.4.4.tgz#0f6e1b4d7a301c7b1dfd4b6334edd97fc050b9f5" + integrity sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" chalk "^4.1.0" -"@commitlint/is-ignored@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.4.2.tgz#2d40a34e071c3e595e485fafe8460457a7b7af9d" - integrity sha512-1b2Y2qJ6n7bHG9K6h8S4lBGUl6kc7mMhJN9gy1SQfUZqe92ToDjUTtgNWb6LbzR1X8Cq4SEus4VU8Z/riEa94Q== +"@commitlint/is-ignored@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.4.4.tgz#82e03f1abe2de2c0c8c162a250b8d466225e922b" + integrity sha512-Y3eo1SFJ2JQDik4rWkBC4tlRIxlXEFrRWxcyrzb1PUT2k3kZ/XGNuCDfk/u0bU2/yS0tOA/mTjFsV+C4qyACHw== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" semver "7.3.8" -"@commitlint/lint@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.4.2.tgz#1277cb4d5395e9d6c39cbc351984bac9dcc6b7cd" - integrity sha512-HcymabrdBhsDMNzIv146+ZPNBPBK5gMNsVH+el2lCagnYgCi/4ixrHooeVyS64Fgce2K26+MC7OQ4vVH8wQWVw== +"@commitlint/lint@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.4.4.tgz#0ecd70b44ec5f4823c2e00e0c4b04ebd41d42856" + integrity sha512-qgkCRRFjyhbMDWsti/5jRYVJkgYZj4r+ZmweZObnbYqPUl5UKLWMf9a/ZZisOI4JfiPmRktYRZ2JmqlSvg+ccw== dependencies: - "@commitlint/is-ignored" "^17.4.2" - "@commitlint/parse" "^17.4.2" - "@commitlint/rules" "^17.4.2" - "@commitlint/types" "^17.4.0" + "@commitlint/is-ignored" "^17.4.4" + "@commitlint/parse" "^17.4.4" + "@commitlint/rules" "^17.4.4" + "@commitlint/types" "^17.4.4" -"@commitlint/load@>6.1.1", "@commitlint/load@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.4.2.tgz#551875c3e1dce6dc0375dc9c8ad551de8ba35de4" - integrity sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw== +"@commitlint/load@>6.1.1", "@commitlint/load@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.4.4.tgz#13fcb553572f265339801cde6dd10ee5eea07f5e" + integrity sha512-z6uFIQ7wfKX5FGBe1AkOF4l/ShOQsaa1ml/nLMkbW7R/xF8galGS7Zh0yHvzVp/srtfS0brC+0bUfQfmpMPFVQ== dependencies: - "@commitlint/config-validator" "^17.4.0" + "@commitlint/config-validator" "^17.4.4" "@commitlint/execute-rule" "^17.4.0" - "@commitlint/resolve-extends" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/resolve-extends" "^17.4.4" + "@commitlint/types" "^17.4.4" "@types/node" "*" chalk "^4.1.0" cosmiconfig "^8.0.0" @@ -1653,47 +1653,47 @@ resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.4.2.tgz#f4753a79701ad6db6db21f69076e34de6580e22c" integrity sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q== -"@commitlint/parse@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.2.tgz#b0f8a257a1f93387a497408b0b4cadba60ee3359" - integrity sha512-DK4EwqhxfXpyCA+UH8TBRIAXAfmmX4q9QRBz/2h9F9sI91yt6mltTrL6TKURMcjUVmgaB80wgS9QybNIyVBIJA== +"@commitlint/parse@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.4.4.tgz#8311b12f2b730de6ea0679ae2a37b386bcc5b04b" + integrity sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg== dependencies: - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" conventional-changelog-angular "^5.0.11" conventional-commits-parser "^3.2.2" -"@commitlint/read@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.4.2.tgz#4880a05271fb44cefa54d365a17d5753496a6de0" - integrity sha512-hasYOdbhEg+W4hi0InmXHxtD/1favB4WdwyFxs1eOy/DvMw6+2IZBmATgGOlqhahsypk4kChhxjAFJAZ2F+JBg== +"@commitlint/read@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.4.4.tgz#de6ec00aad827764153009aa54517e3df2154555" + integrity sha512-B2TvUMJKK+Svzs6eji23WXsRJ8PAD+orI44lVuVNsm5zmI7O8RSGJMvdEZEikiA4Vohfb+HevaPoWZ7PiFZ3zA== dependencies: "@commitlint/top-level" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" fs-extra "^11.0.0" git-raw-commits "^2.0.0" minimist "^1.2.6" -"@commitlint/resolve-extends@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz#9023da6c70c4ebd173b4b0995fe29f27051da2d3" - integrity sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ== +"@commitlint/resolve-extends@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz#8f931467dea8c43b9fe38373e303f7c220de6fdc" + integrity sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A== dependencies: - "@commitlint/config-validator" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/config-validator" "^17.4.4" + "@commitlint/types" "^17.4.4" import-fresh "^3.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^17.4.2": - version "17.4.2" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.4.2.tgz#cdf203bc82af979cb319210ef9215cb1de216a9b" - integrity sha512-OGrPsMb9Fx3/bZ64/EzJehY9YDSGWzp81Pj+zJiY+r/NSgJI3nUYdlS37jykNIugzazdEXfMtQ10kmA+Kx2pZQ== +"@commitlint/rules@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.4.4.tgz#9b33f41e5eb529f916396bac7c62e61f0edd6791" + integrity sha512-0tgvXnHi/mVcyR8Y8mjTFZIa/FEQXA4uEutXS/imH2v1UNkYDSEMsK/68wiXRpfW1euSgEdwRkvE1z23+yhNrQ== dependencies: - "@commitlint/ensure" "^17.4.0" + "@commitlint/ensure" "^17.4.4" "@commitlint/message" "^17.4.2" "@commitlint/to-lines" "^17.4.0" - "@commitlint/types" "^17.4.0" + "@commitlint/types" "^17.4.4" execa "^5.0.0" "@commitlint/to-lines@^17.4.0": @@ -1708,10 +1708,10 @@ dependencies: find-up "^5.0.0" -"@commitlint/types@^17.4.0": - version "17.4.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.0.tgz#c7c2b97b959f6175c164632bf26208ce417b3f31" - integrity sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA== +"@commitlint/types@^17.4.4": + version "17.4.4" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.4.4.tgz#1416df936e9aad0d6a7bbc979ecc31e55dade662" + integrity sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ== dependencies: chalk "^4.1.0" @@ -1722,6 +1722,38 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@cypress/request@^2.88.10": + version "2.88.11" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" + integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.10.3" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -2173,6 +2205,18 @@ dependencies: tslib "^2.4.0" +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + "@humanwhocodes/config-array@^0.11.8": version "0.11.8" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" @@ -3145,6 +3189,23 @@ "@sentry/types" "6.19.7" tslib "^1.9.3" +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + "@simov/deep-extend@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@simov/deep-extend/-/deep-extend-1.0.0.tgz#dff17d38305614e296eb80bf4898b9d10b061325" @@ -4067,6 +4128,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^14.14.31": + version "14.18.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.38.tgz#2169ca4b70aa59aa5a8923509e50619dde48b0cf" + integrity sha512-zMRIidN2Huikv/+/U7gRPFYsXDR/7IGqFZzTLnCEj5+gkrQjsowfamaxEnyvArct5hxGA3bTxMXlYhH78V6Cew== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -4152,6 +4218,16 @@ dependencies: "@types/node" "*" +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -4195,6 +4271,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + "@ucast/core@^1.0.0", "@ucast/core@^1.4.1", "@ucast/core@^1.6.1": version "1.10.1" resolved "https://registry.yarnpkg.com/@ucast/core/-/core-1.10.1.tgz#03a77a7804bcb5002a5cad3681e86cd1897e2e1f" @@ -4522,6 +4605,11 @@ ansi-align@^3.0.0: dependencies: string-width "^4.1.0" +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -4713,6 +4801,11 @@ apollo-server-types@^3.7.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -4731,6 +4824,11 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -4867,6 +4965,18 @@ asn1.js@^5.3.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -4889,7 +4999,7 @@ async-retry@^1.2.1: dependencies: retry "0.13.1" -async@^3.1.0: +async@^3.1.0, async@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== @@ -4914,6 +5024,16 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + axe-core@^4.6.2: version "4.6.3" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" @@ -4945,6 +5065,14 @@ axios@1.2.2: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axobject-query@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" @@ -5112,6 +5240,13 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bcryptjs@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" @@ -5173,11 +5308,21 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + blork@^9.3.0: version "9.3.0" resolved "https://registry.yarnpkg.com/blork/-/blork-9.3.0.tgz#6c0b4fbb6b754998ae5460c26463d95c635e4a35" integrity sha512-9naBrHS2bwCQeGqGR9ptcoll6utsox9jtk1E0SwOAFa4RCV/IQHoBJARdi8AhHQTPPoWkjixMrzHvQKAV5Fx2A== +bluebird@3.7.2, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" @@ -5337,6 +5482,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -5347,7 +5497,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.1.0, buffer@^5.5.0: +buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -5461,7 +5611,7 @@ cacheable-request@^7.0.2: normalize-url "^6.0.1" responselike "^2.0.0" -cachedir@2.3.0: +cachedir@2.3.0, cachedir@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== @@ -5542,6 +5692,11 @@ cardinal@^2.1.1: ansicolors "~0.3.2" redeyed "~2.1.0" +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + chalk@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" @@ -5617,6 +5772,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-more-types@2.24.0, check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + chokidar@3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" @@ -5749,7 +5909,7 @@ cli-table3@0.6.2: optionalDependencies: "@colors/colors" "1.5.0" -cli-table3@^0.6.1, cli-table3@^0.6.2: +cli-table3@^0.6.1, cli-table3@^0.6.2, cli-table3@~0.6.1: version "0.6.3" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== @@ -5934,7 +6094,7 @@ color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" -colorette@2.0.19, colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.19: +colorette@2.0.19, colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16, colorette@^2.0.19: version "2.0.19" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== @@ -5960,7 +6120,7 @@ columnify@^1.6.0: strip-ansi "^6.0.1" wcwidth "^1.0.0" -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -5982,6 +6142,11 @@ commander@^2.20.0, commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^9.0.0, commander@^9.1.0, commander@^9.4.1: version "9.5.0" resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" @@ -6017,6 +6182,11 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -6248,6 +6418,11 @@ core-js-pure@^3.25.1: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.0.tgz#7ad8a5dd7d910756f3124374b50026e23265ca9a" integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + core-util-is@^1.0.2, core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -6417,6 +6592,54 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== +cypress@^12.7.0: + version "12.7.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.7.0.tgz#69900f82af76cf3ba0ddb9b59ec3b0d38222ab22" + integrity sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + cz-conventional-changelog@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" @@ -6441,6 +6664,13 @@ dargs@^7.0.0: resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -6460,6 +6690,11 @@ dateformat@^3.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +dayjs@^1.10.4: + version "1.11.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" + integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -6902,11 +7137,24 @@ duplexer2@~0.1.0: dependencies: readable-stream "^2.0.2" +duplexer@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ecdsa-sig-formatter@1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" @@ -6999,6 +7247,13 @@ enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -7523,6 +7778,24 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" @@ -7538,6 +7811,21 @@ events@^3.2.0, events@^3.3.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +execa@4.1.0, execa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -7566,21 +7854,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.0.tgz#50c6f39438b7ce407e8c7a6829c72b074778238d" @@ -7596,6 +7869,13 @@ execa@^7.0.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -7689,7 +7969,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -7717,6 +7997,27 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -7769,6 +8070,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + fecha@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" @@ -7781,7 +8089,7 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0: +figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -7936,7 +8244,7 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -7960,6 +8268,11 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + fork-ts-checker-webpack-plugin@7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.1.tgz#c37a538e12730fe11fd725bcf0fce29487950833" @@ -7995,6 +8308,15 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + formidable@^1.1.1: version "1.2.6" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" @@ -8043,6 +8365,11 @@ from2@^2.3.0: inherits "^2.0.1" readable-stream "^2.0.0" +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + fromentries@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" @@ -8076,7 +8403,7 @@ fs-extra@10.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@9.1.0: +fs-extra@9.1.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -8247,6 +8574,20 @@ getopts@2.3.0: resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + git-log-parser@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/git-log-parser/-/git-log-parser-1.2.0.tgz#2e6a4c1b13fc00028207ba795a7ac31667b9fd4a" @@ -8336,6 +8677,13 @@ global-dirs@^0.1.1: dependencies: ini "^1.3.4" +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -8905,6 +9253,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -9066,6 +9423,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -9319,6 +9681,13 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + is-cidr@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814" @@ -9435,6 +9804,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -9635,7 +10012,7 @@ is-typed-array@^1.1.3, is-typed-array@^1.1.9: for-each "^0.3.3" has-tostringtag "^1.0.0" -is-typedarray@^1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -10177,6 +10554,17 @@ jest@^29.4.1: import-local "^3.0.2" jest-cli "^29.4.1" +joi@^17.7.0: + version "17.8.4" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.8.4.tgz#f2d91ab8acd3cca4079ba70669c65891739234aa" + integrity sha512-jjdRHb5WtL+KgSHvOULQEPPv4kcl+ixd1ybOFQq3rWLgEEqc03QMmilodL0GVJE14U/SQDXkUhQUSZANGDH/AA== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + joycon@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" @@ -10222,6 +10610,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsdom@^21.0.0: version "21.1.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.0.tgz#d56ba4a84ed478260d83bd53dc181775f2d8e6ef" @@ -10289,6 +10682,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" @@ -10299,7 +10697,7 @@ json-stringify-nice@^1.1.4: resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== -json-stringify-safe@^5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -10359,6 +10757,16 @@ jsonwebtoken@9.0.0: ms "^2.1.1" semver "^7.3.8" +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" @@ -10644,6 +11052,11 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +lazy-ass@1.6.0, lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -10856,6 +11269,20 @@ lint-staged@^13.2.0: string-argv "^0.3.1" yaml "^2.2.1" +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + listr2@^5.0.7: version "5.0.8" resolved "https://registry.yarnpkg.com/listr2/-/listr2-5.0.8.tgz#a9379ffeb4bd83a68931a65fb223a11510d6ba23" @@ -11000,6 +11427,11 @@ lodash.mergewith@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -11047,7 +11479,7 @@ log-symbols@^2.2.0: dependencies: chalk "^2.0.1" -log-symbols@^4.1.0: +log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -11227,6 +11659,11 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -11429,7 +11866,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@2.1.35, mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@2.1.35, mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -11539,6 +11976,11 @@ minimist@^1.2.3, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -12465,6 +12907,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + outvariant@^1.2.1, outvariant@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.3.0.tgz#c39723b1d2cba729c930b74bf962317a81b9b1c9" @@ -12823,11 +13270,28 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pause@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + pg-connection-string@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" @@ -12848,6 +13312,11 @@ pidtree@^0.6.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" @@ -12999,6 +13468,11 @@ prettier@2.8.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3" integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -13096,12 +13570,24 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -psl@^1.1.33: +ps-tree@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + +psl@^1.1.28, psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== @@ -13147,6 +13633,13 @@ qs@6.11.0, qs@^6.10.2, qs@^6.10.3, qs@^6.4.0, qs@^6.5.2, qs@^6.9.6: dependencies: side-channel "^1.0.4" +qs@~6.10.3: + version "6.10.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + dependencies: + side-channel "^1.0.4" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -13718,6 +14211,13 @@ request-oauth@^1.0.1: qs "^6.9.6" uuid "^8.3.2" +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -13910,6 +14410,13 @@ rxjs@^6.4.0, rxjs@^6.6.0: dependencies: tslib "^1.9.0" +rxjs@^7.5.1, rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + dependencies: + tslib "^2.1.0" + rxjs@^7.5.5: version "7.5.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.7.tgz#2ec0d57fdc89ece220d2e702730ae8f1e49def39" @@ -13917,19 +14424,12 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -rxjs@^7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== - dependencies: - tslib "^2.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -13955,7 +14455,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61" integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -14531,6 +15031,13 @@ split2@~1.0.0: dependencies: through2 "~2.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + dependencies: + through "2" + split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -14543,6 +15050,21 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sshpk@^1.14.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + ssri@^9.0.0, ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" @@ -14567,6 +15089,20 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +start-server-and-test@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-2.0.0.tgz#0644809d63036a8a001efb70582f3e37ebfdd33d" + integrity sha512-UqKLw0mJbfrsG1jcRLTUlvuRi9sjNuUiDOLI42r7R5fA9dsFoywAy9DoLXNYys9B886E4RCKb+qM1Gzu96h7DQ== + dependencies: + arg "^5.0.2" + bluebird "3.7.2" + check-more-types "2.24.0" + debug "4.3.4" + execa "5.1.1" + lazy-ass "1.6.0" + ps-tree "1.2.0" + wait-on "7.0.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -14597,6 +15133,11 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +strapi-plugin-init-admin-user@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/strapi-plugin-init-admin-user/-/strapi-plugin-init-admin-user-0.2.1.tgz#dbc2064a4066defd35a87590b62a7138149f519d" + integrity sha512-j24QF4FS0BaElcXEIv1opJ+8JEO9LFhU0Oe8b7T88qMv0zPAP+kmeOJT7hsaqasNWQwrUoZyG1AMBxIClr57/Q== + stream-buffers@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.2.tgz#5249005a8d5c2d00b3a32e6e0a6ea209dc4f3521" @@ -14615,6 +15156,13 @@ stream-combiner2@~1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + stream-json@1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.7.4.tgz#e41637f93c5aca7267009ca8a3f6751e62331e69" @@ -14886,7 +15434,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -15064,6 +15612,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -15079,7 +15632,7 @@ through2@~2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -15124,6 +15677,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -15191,6 +15751,14 @@ tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -15279,6 +15847,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -15526,6 +16099,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -15678,6 +16256,15 @@ vary@^1.1.2, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + w3c-keyname@^2.2.4: version "2.2.6" resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" @@ -15690,6 +16277,17 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" +wait-on@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" + integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== + dependencies: + axios "^0.27.2" + joi "^17.7.0" + lodash "^4.17.21" + minimist "^1.2.7" + rxjs "^7.8.0" + walk-up-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" @@ -16181,6 +16779,14 @@ yargs@^17.0.0, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + ylru@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.3.2.tgz#0de48017473275a4cbdfc83a1eaf67c01af8a785" From 7c5ee48ba1f044cff705a75c24b6ccc7ea2973df Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 19 Mar 2023 23:05:36 +0100 Subject: [PATCH 07/50] ci(test): create default test environment variables --- .github/workflows/build.yml | 3 ++- playground/.env.example | 2 +- playground/.env.test | 14 ++++++++++++++ playground/config/plugins.js | 4 ++-- playground/package.json | 3 ++- 5 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 playground/.env.test diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd59a718..07c0d87f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,12 +33,13 @@ jobs: with: node-version: ${{ matrix.version }} cache: 'yarn' + - run: cp ./playground/.env.test ./playground/.env - run: yarn - run: yarn test - uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml + files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml,./providers/libretranslate/coverage/clover.xml flags: unittests name: codecov-umbrella diff --git a/playground/.env.example b/playground/.env.example index 0be08152..a9ef3552 100644 --- a/playground/.env.example +++ b/playground/.env.example @@ -10,5 +10,5 @@ INIT_ADMIN_USERNAME=admin INIT_ADMIN_PASSWORD=admin INIT_ADMIN_FIRSTNAME=Admin INIT_ADMIN_LASTNAME=Admin -INIT_ADMIN_EMAIL=admin@localhost +INIT_ADMIN_EMAIL=admin@example.com #DEEPL_API_URL=optional diff --git a/playground/.env.test b/playground/.env.test new file mode 100644 index 00000000..3a8e9f0e --- /dev/null +++ b/playground/.env.test @@ -0,0 +1,14 @@ +HOST=0.0.0.0 +PORT=1337 +APP_KEYS="toBeModified1,toBeModified2" +API_TOKEN_SALT=tobemodified +ADMIN_JWT_SECRET=tobemodified +JWT_SECRET=tobemodified +TRANSLATE_PROVIDER=dummy +INIT_ADMIN=true +INIT_ADMIN_USERNAME=admin +INIT_ADMIN_PASSWORD=admin +INIT_ADMIN_FIRSTNAME=Admin +INIT_ADMIN_LASTNAME=Admin +INIT_ADMIN_EMAIL=admin@example.com +#DEEPL_API_URL=optional diff --git a/playground/config/plugins.js b/playground/config/plugins.js index b2d47440..584d0ebe 100644 --- a/playground/config/plugins.js +++ b/playground/config/plugins.js @@ -1,10 +1,10 @@ module.exports = ({ env }) => ({ // ... translate: { - resolve: "../plugin", + resolve: '../plugin', enabled: true, config: { - provider: 'deepl', + provider: env('TRANSLATE_PROVIDER', 'deepl'), providerOptions: {}, }, }, diff --git a/playground/package.json b/playground/package.json index 36b8c681..648eb3a9 100644 --- a/playground/package.json +++ b/playground/package.json @@ -32,7 +32,8 @@ "strapi": { "uuid": "e52249f8-dcf2-4e7b-8612-7713abc46c04", "template": "@strapi/template-blog@^1.0.0", - "starter": "@strapi/starter-next-blog" + "starter": "@strapi/starter-next-blog", + "telemetryDisabled": true }, "engines": { "node": ">=14.19.1 <=18.x.x", From cf96db529124e04d735e4bad0d6141ada8043de1 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 19 Mar 2023 23:08:50 +0100 Subject: [PATCH 08/50] test(cypress): add additional tests for direct and batch translation Adds two tests for direct translation and a single one for batch translation. fix #135 --- .gitignore | 1 + .../cypress/e2e/batch-translation.cy.js | 53 ++++++ .../cypress/e2e/direct-translation.cy.js | 154 ++++++++++++++++++ playground/cypress/e2e/translate-direct.cy.js | 44 ----- playground/cypress/support/e2e.js | 4 +- .../content-types/homepage/schema.json | 31 +++- playground/src/bootstrap.js | 17 +- 7 files changed, 247 insertions(+), 57 deletions(-) create mode 100644 playground/cypress/e2e/batch-translation.cy.js create mode 100644 playground/cypress/e2e/direct-translation.cy.js delete mode 100644 playground/cypress/e2e/translate-direct.cy.js diff --git a/.gitignore b/.gitignore index 64b4e662..100a6821 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,4 @@ build/ **/cypress/videos +**/cypress/screenshots diff --git a/playground/cypress/e2e/batch-translation.cy.js b/playground/cypress/e2e/batch-translation.cy.js new file mode 100644 index 00000000..eb73f5eb --- /dev/null +++ b/playground/cypress/e2e/batch-translation.cy.js @@ -0,0 +1,53 @@ +describe('batch translation', () => { + beforeEach(() => { + cy.exec('yarn reset') + }) + + it('should translate all articles', () => { + cy.intercept('/translate/batch-translate').as('batchTranslateExecution') + cy.intercept('/translate/batch-translate/content-types/').as( + 'batchTranslateContentTypes' + ) + + // Login and Navigate to Translate Page + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Translate').click() + + cy.wait('@batchTranslateContentTypes') + + // Start batch translation + + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .find('button') + .first() + .click() + + // Complete dialog + cy.get('div[role=dialog]') + .contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.get('li[data-strapi-value=en]').click() + cy.get('div[role=dialog] button').filter(':contains("Translate")').click() + + // Verify translation finished + + cy.wait('@batchTranslateContentTypes') + + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .contains('Job finished') + .should('exist') + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .contains('complete') + .should('exist') + }) +}) diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js new file mode 100644 index 00000000..b16b1281 --- /dev/null +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -0,0 +1,154 @@ +describe('direct translation', () => { + beforeEach(() => { + cy.exec('yarn reset') + }) + + it('single article', () => { + cy.intercept('/translate/translate').as('translateExecution') + cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + + // Login and Navigate to article + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Content Manager').click() + cy.contains('A bug is becoming a meme on the internet').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Regenerate UID + cy.get('button[aria-label=regenerate]').click() + cy.wait('@regenerateUID') + cy.wait(100) + + // Save and Publish + cy.contains('button', 'Save').click() + cy.contains('button', 'Publish').click() + + // Verify + cy.contains('button', 'Unpublish').should('be.visible') + cy.contains('span', 'Sarah Baker').should('be.visible') + cy.contains('span', 'tech').should('not.exist') + }) + + it('category and article', () => { + cy.intercept('/translate/translate').as('translateExecution') + cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + + // Login and Navigate to article + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Content Manager').click() + + cy.get('nav[aria-label=Content]').contains('Category').click() + + cy.contains('tech').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Regenerate UID + cy.get('button[aria-label=regenerate]').click() + cy.wait('@regenerateUID') + cy.wait(50) + + // Save + cy.contains('button', 'Save').click() + + cy.get('nav[aria-label=Content]').contains('Article').click() + + cy.contains('A bug is becoming a meme on the internet').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Regenerate UID + cy.get('button[aria-label=regenerate]').click() + cy.wait('@regenerateUID') + cy.wait(100) + + // Save and Publish + cy.contains('button', 'Save').click() + cy.contains('button', 'Publish').click() + + // Verify + cy.contains('button', 'Unpublish').should('be.visible') + cy.contains('span', 'Sarah Baker').should('be.visible') + cy.contains('span', 'tech').should('be.visible') + }) + + it('single type with components', () => { + cy.intercept('/translate/translate').as('translateExecution') + cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + + // Login and Navigate to article + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Content Manager').click() + + cy.get('nav[aria-label=Content]').contains('Homepage').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Save + cy.contains('button', 'Save').click() + + // Verify + cy.contains('label', 'metaTitle') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id.replace('.', '\\.')) + }) + .should('have.value', 'My personal Strapi blog') + cy.contains('label', 'shareImage') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .get('img') + .should('be.visible') + cy.contains('button', 'Save').should('be.disabled') + }) +}) diff --git a/playground/cypress/e2e/translate-direct.cy.js b/playground/cypress/e2e/translate-direct.cy.js deleted file mode 100644 index 1b1cc31f..00000000 --- a/playground/cypress/e2e/translate-direct.cy.js +++ /dev/null @@ -1,44 +0,0 @@ -// const { resetStrapi } = require('../utils/strapi') - -describe('translate directly', () => { - beforeEach(() => { - cy.exec('yarn reset') - }) - - it('single article', () => { - cy.intercept('/translate/translate').as('translateExecution') - cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') - - // Login and Navigate to article - cy.login('admin@example.com', 'admin') - cy.get('nav').contains('Content Manager').click() - cy.contains('A bug is becoming a meme on the internet').click() - - // Go to page for creating German locale - cy.contains('label', 'Locales') - .invoke('attr', 'for') - .then((id) => { - cy.get('#' + id) - }) - .click() - cy.contains('German (de)').click() - - // Translate from English - cy.contains('Translate from another locale').click() - cy.contains('button', 'Yes, fill in').click() - cy.wait('@translateExecution') - - // Regenerate UID - cy.get('button[aria-label=regenerate]').click() - cy.wait('@regenerateUID') - - // Save and Publish - cy.contains('button', 'Save').click() - cy.contains('button', 'Publish').click() - - // Verify - cy.contains('button', 'Unpublish').should('be.visible') - cy.contains('span', 'Sarah Baker').should('be.visible') - cy.contains('span', 'tech').should('not.exist') - }) -}) diff --git a/playground/cypress/support/e2e.js b/playground/cypress/support/e2e.js index 0e7290a1..9ea5e916 100644 --- a/playground/cypress/support/e2e.js +++ b/playground/cypress/support/e2e.js @@ -14,7 +14,7 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +// import './commands' // Alternatively you can use CommonJS syntax: -// require('./commands') \ No newline at end of file +require('./commands') diff --git a/playground/src/api/homepage/content-types/homepage/schema.json b/playground/src/api/homepage/content-types/homepage/schema.json index 4a30fda5..e7ec7c94 100644 --- a/playground/src/api/homepage/content-types/homepage/schema.json +++ b/playground/src/api/homepage/content-types/homepage/schema.json @@ -5,23 +5,46 @@ "singularName": "homepage", "pluralName": "homepages", "displayName": "Homepage", - "name": "homepage" + "name": "homepage", + "description": "" }, "options": { "increments": true, - "timestamps": true + "timestamps": true, + "draftAndPublish": false + }, + "pluginOptions": { + "i18n": { + "localized": true + } }, "attributes": { "seo": { "type": "component", "repeatable": false, - "component": "shared.seo" + "component": "shared.seo", + "pluginOptions": { + "translate": { + "translate": "translate" + }, + "i18n": { + "localized": true + } + } }, "hero": { "type": "component", "repeatable": false, "component": "sections.hero", - "required": true + "required": true, + "pluginOptions": { + "translate": { + "translate": "translate" + }, + "i18n": { + "localized": true + } + } } } } diff --git a/playground/src/bootstrap.js b/playground/src/bootstrap.js index bd577e69..083426e2 100644 --- a/playground/src/bootstrap.js +++ b/playground/src/bootstrap.js @@ -171,14 +171,17 @@ async function importGlobal() { async function addLocales(locales) { return Promise.all( - locales.map((locale) => - strapi + locales.map(async (locale) => { + const existing = await strapi .service('plugin::i18n.locales') - .create(locale) - .catch(() => - console.log(`Failed to create locale ${locale.code}. Already exists`) - ) - ) + .findByCode(locale.code) + if (!existing) { + strapi + .service('plugin::i18n.locales') + .create(locale) + .catch(() => console.log(`Failed to create locale ${locale.code}.`)) + } + }) ) } From bd915e3a95ec671de08144051409ccbdf62ad28f Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 19 Mar 2023 23:10:54 +0100 Subject: [PATCH 09/50] ci(pr): add copy of env file to pr pipeline --- .github/workflows/pr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 211381a7..4b1c5816 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -29,6 +29,7 @@ jobs: with: node-version: ${{ matrix.version }} cache: 'yarn' + - run: cp ./playground/.env.test ./playground/.env - run: yarn - run: yarn test - uses: codecov/codecov-action@v3 From dfe4c1bc464fcd68879543c0bb2faa680f737fdd Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 19 Mar 2023 23:24:39 +0100 Subject: [PATCH 10/50] ci(test): add playground strapi build before test --- .github/workflows/build.yml | 1 + .github/workflows/pr.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07c0d87f..c25e77a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,6 +35,7 @@ jobs: cache: 'yarn' - run: cp ./playground/.env.test ./playground/.env - run: yarn + - run: yarn workspace playground build - run: yarn test - uses: codecov/codecov-action@v3 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4b1c5816..026a8ab7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -31,6 +31,7 @@ jobs: cache: 'yarn' - run: cp ./playground/.env.test ./playground/.env - run: yarn + - run: yarn workspace playground build - run: yarn test - uses: codecov/codecov-action@v3 with: From e45aeb7934861cdb25838ae0c02ef9e30088f4ac Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 14:19:32 +0100 Subject: [PATCH 11/50] ci(e2e): move cypress tests to own e2e job --- .github/workflows/build.yml | 18 ++++++++++++++++-- .github/workflows/pr.yml | 20 +++++++++++++++++--- playground/package.json | 3 ++- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c25e77a6..6242baec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,9 +33,7 @@ jobs: with: node-version: ${{ matrix.version }} cache: 'yarn' - - run: cp ./playground/.env.test ./playground/.env - run: yarn - - run: yarn workspace playground build - run: yarn test - uses: codecov/codecov-action@v3 with: @@ -44,6 +42,22 @@ jobs: flags: unittests name: codecov-umbrella + e2e: + strategy: + matrix: + version: [14, 16, 18] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.version }} + cache: 'yarn' + - run: cp ./playground/.env.test ./playground/.env + - run: yarn + - run: yarn workspace playground build + - run: yarn workspace playground e2e + release: needs: - eslint diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 026a8ab7..f9d0082a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -29,13 +29,27 @@ jobs: with: node-version: ${{ matrix.version }} cache: 'yarn' - - run: cp ./playground/.env.test ./playground/.env - run: yarn - - run: yarn workspace playground build - run: yarn test - uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml + files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml,./providers/libretranslate/coverage/clover.xml flags: unittests name: codecov-umbrella + + e2e: + strategy: + matrix: + version: [14, 16, 18] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.version }} + cache: 'yarn' + - run: cp ./playground/.env.test ./playground/.env + - run: yarn + - run: yarn workspace playground build + - run: yarn workspace playground e2e diff --git a/playground/package.json b/playground/package.json index 648eb3a9..cd6e7f0d 100644 --- a/playground/package.json +++ b/playground/package.json @@ -20,7 +20,8 @@ "strapi": "strapi", "reset": "node scripts/reset.js", "cy:run": "cypress run", - "test": "start-server-and-test start http://localhost:1337 cy:run" + "test": "echo no unittests", + "e2e": "start-server-and-test start http://localhost:1337 cy:run" }, "devDependencies": { "cypress": "^12.7.0", From 1095148c4b3f4213569511b06ac5268a7fb68c1a Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 22:48:23 +0100 Subject: [PATCH 12/50] test(e2e): fix failing test with node 14 waited on wrong url after uid regeneration --- playground/cypress/e2e/direct-translation.cy.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js index b16b1281..37a7501b 100644 --- a/playground/cypress/e2e/direct-translation.cy.js +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -5,7 +5,7 @@ describe('direct translation', () => { it('single article', () => { cy.intercept('/translate/translate').as('translateExecution') - cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + cy.intercept('/content-manager/uid/generate').as('regenerateUID') // Login and Navigate to article cy.login('admin@example.com', 'admin') @@ -29,7 +29,6 @@ describe('direct translation', () => { // Regenerate UID cy.get('button[aria-label=regenerate]').click() cy.wait('@regenerateUID') - cy.wait(100) // Save and Publish cy.contains('button', 'Save').click() @@ -43,7 +42,7 @@ describe('direct translation', () => { it('category and article', () => { cy.intercept('/translate/translate').as('translateExecution') - cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') + cy.intercept('/content-manager/uid/generate').as('regenerateUID') // Login and Navigate to article cy.login('admin@example.com', 'admin') @@ -70,7 +69,6 @@ describe('direct translation', () => { // Regenerate UID cy.get('button[aria-label=regenerate]').click() cy.wait('@regenerateUID') - cy.wait(50) // Save cy.contains('button', 'Save').click() @@ -96,7 +94,6 @@ describe('direct translation', () => { // Regenerate UID cy.get('button[aria-label=regenerate]').click() cy.wait('@regenerateUID') - cy.wait(100) // Save and Publish cy.contains('button', 'Save').click() From b24f692aa56fbddadcef68cb1142f4a25e2a3016 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 22:48:54 +0100 Subject: [PATCH 13/50] test(e2e): add test for auto publish --- .../cypress/e2e/batch-translation.cy.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/playground/cypress/e2e/batch-translation.cy.js b/playground/cypress/e2e/batch-translation.cy.js index eb73f5eb..6e340f73 100644 --- a/playground/cypress/e2e/batch-translation.cy.js +++ b/playground/cypress/e2e/batch-translation.cy.js @@ -50,4 +50,60 @@ describe('batch translation', () => { .contains('complete') .should('exist') }) + + it('should translate and publish all articles', () => { + cy.intercept('/translate/batch-translate').as('batchTranslateExecution') + cy.intercept('/translate/batch-translate/content-types/').as( + 'batchTranslateContentTypes' + ) + + // Login and Navigate to Translate Page + cy.login('admin@example.com', 'admin') + cy.get('nav').contains('Translate').click() + + cy.wait('@batchTranslateContentTypes') + + // Start batch translation + + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .find('button') + .first() + .click() + + // Complete dialog + cy.get('div[role=dialog]') + .contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.get('li[data-strapi-value=en]').click() + cy.get('div[role=dialog]') + .contains('label', 'Auto-Publish') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .parent() + .click() + cy.get('div[role=dialog] button').filter(':contains("Translate")').click() + + // Verify translation finished + + cy.wait('@batchTranslateContentTypes') + + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .contains('Job finished') + .should('exist') + cy.get('tbody tr ') + .first() + .find('td[aria-colindex=3]') + .contains('complete') + .should('exist') + }) }) From 4f107c1874619c48dd09a1c1cb483f6cbe31fc72 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 22:51:04 +0100 Subject: [PATCH 14/50] test(e2e): disable ratelimit as tests are sometimes too fast --- playground/config/admin.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/playground/config/admin.js b/playground/config/admin.js index acb703ba..9bc8accf 100644 --- a/playground/config/admin.js +++ b/playground/config/admin.js @@ -5,4 +5,8 @@ module.exports = ({ env }) => ({ apiToken: { salt: env('API_TOKEN_SALT'), }, + rateLimit: { + enabled: false, + }, + watchIgnoreFiles: ['./cypress/**/*'], }) From d3c9c9b530cffb93914a1afc56fa94fbb9531f21 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 22:51:59 +0100 Subject: [PATCH 15/50] test(e2e): wait for server on 0.0.0.0 instead of localhost fixes an issue with node 18 --- playground/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playground/package.json b/playground/package.json index cd6e7f0d..d5737260 100644 --- a/playground/package.json +++ b/playground/package.json @@ -21,7 +21,7 @@ "reset": "node scripts/reset.js", "cy:run": "cypress run", "test": "echo no unittests", - "e2e": "start-server-and-test start http://localhost:1337 cy:run" + "e2e": "start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" }, "devDependencies": { "cypress": "^12.7.0", From ba44a1237be568d33f024d9660e5c706665dc051 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 23:06:03 +0100 Subject: [PATCH 16/50] test(e2e): wait for first uid generate command --- playground/cypress/e2e/direct-translation.cy.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js index 37a7501b..dd5c4d89 100644 --- a/playground/cypress/e2e/direct-translation.cy.js +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -20,6 +20,7 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() + cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() @@ -60,6 +61,7 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() + cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() @@ -85,6 +87,7 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() + cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() From d576d7edc01dec5624a03e960beacd28adde7ade Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 23:18:09 +0100 Subject: [PATCH 17/50] ci(e2e): add upload action for cypress artifacts --- .github/workflows/build.yml | 6 ++++++ .github/workflows/pr.yml | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6242baec..055be384 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,6 +57,12 @@ jobs: - run: yarn - run: yarn workspace playground build - run: yarn workspace playground e2e + - uses: actions/upload-artifact@v3 + with: + name: cypress results + path: | + playground/cypress/videos/* + playground/cypress/screenshots/* release: needs: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index f9d0082a..f4a2acb9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -53,3 +53,9 @@ jobs: - run: yarn - run: yarn workspace playground build - run: yarn workspace playground e2e + - uses: actions/upload-artifact@v3 + with: + name: cypress results + path: | + playground/cypress/videos/* + playground/cypress/screenshots/* From d6527bb6e71b4fc786b8a3b4465f8c5caf5539b6 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 23:18:46 +0100 Subject: [PATCH 18/50] test(e2e): fill slug field manually --- .../cypress/e2e/direct-translation.cy.js | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js index dd5c4d89..800b5315 100644 --- a/playground/cypress/e2e/direct-translation.cy.js +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -5,7 +5,6 @@ describe('direct translation', () => { it('single article', () => { cy.intercept('/translate/translate').as('translateExecution') - cy.intercept('/content-manager/uid/generate').as('regenerateUID') // Login and Navigate to article cy.login('admin@example.com', 'admin') @@ -20,16 +19,20 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() - cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() cy.contains('button', 'Yes, fill in').click() cy.wait('@translateExecution') - // Regenerate UID - cy.get('button[aria-label=regenerate]').click() - cy.wait('@regenerateUID') + // Update UID + cy.contains('label', 'slug') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .clear() + .type('a-bug-is-becoming-a-meme-on-the-internet-1') // Save and Publish cy.contains('button', 'Save').click() @@ -43,7 +46,6 @@ describe('direct translation', () => { it('category and article', () => { cy.intercept('/translate/translate').as('translateExecution') - cy.intercept('/content-manager/uid/generate').as('regenerateUID') // Login and Navigate to article cy.login('admin@example.com', 'admin') @@ -61,16 +63,20 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() - cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() cy.contains('button', 'Yes, fill in').click() cy.wait('@translateExecution') - // Regenerate UID - cy.get('button[aria-label=regenerate]').click() - cy.wait('@regenerateUID') + // Update UID + cy.contains('label', 'slug') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .clear() + .type('tech-1') // Save cy.contains('button', 'Save').click() @@ -87,7 +93,6 @@ describe('direct translation', () => { }) .click() cy.contains('German (de)').click() - cy.wait('@regenerateUID') // Translate from English cy.contains('Translate from another locale').click() @@ -95,8 +100,13 @@ describe('direct translation', () => { cy.wait('@translateExecution') // Regenerate UID - cy.get('button[aria-label=regenerate]').click() - cy.wait('@regenerateUID') + cy.contains('label', 'slug') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .clear() + .type('a-bug-is-becoming-a-meme-on-the-internet-1') // Save and Publish cy.contains('button', 'Save').click() From 9f9598260b7bef2bf69e897f4358f1f0f49b4f17 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 20 Mar 2023 23:31:27 +0100 Subject: [PATCH 19/50] ci(e2e): add node version to cypress results --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 055be384..cb52f35b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -59,7 +59,7 @@ jobs: - run: yarn workspace playground e2e - uses: actions/upload-artifact@v3 with: - name: cypress results + name: cypress results (node ${{ matrix.version }}) path: | playground/cypress/videos/* playground/cypress/screenshots/* diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index f4a2acb9..81041dea 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -55,7 +55,7 @@ jobs: - run: yarn workspace playground e2e - uses: actions/upload-artifact@v3 with: - name: cypress results + name: cypress results (node ${{ matrix.version }}) path: | playground/cypress/videos/* playground/cypress/screenshots/* From 9e5246b72358d2fa50c41de1b0d21cfd558ca35b Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Tue, 21 Mar 2023 00:02:12 +0100 Subject: [PATCH 20/50] ci(e2e): add matrix for strapi versions Allow testing codebase for multiple supported strapi versions --- .github/workflows/build.yml | 10 +++-- .github/workflows/pr.yml | 10 +++-- playground/templates/template.package.json | 44 ++++++++++++++++++++++ 3 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 playground/templates/template.package.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb52f35b..25f357be 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,21 +45,23 @@ jobs: e2e: strategy: matrix: - version: [14, 16, 18] + node: [14, 16, 18] + strapi: [4.6.2, 4.7.1, 4.8.2] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: ${{ matrix.version }} + node-version: ${{ matrix.node }} cache: 'yarn' - - run: cp ./playground/.env.test ./playground/.env + - run: cp playground/.env.test playground/.env + - run: VERSION=${{ matrix.strapi }} envsubst < playground/templates/template.package.json > playground/package.json - run: yarn - run: yarn workspace playground build - run: yarn workspace playground e2e - uses: actions/upload-artifact@v3 with: - name: cypress results (node ${{ matrix.version }}) + name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) path: | playground/cypress/videos/* playground/cypress/screenshots/* diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 81041dea..eecc79f6 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -41,21 +41,23 @@ jobs: e2e: strategy: matrix: - version: [14, 16, 18] + node: [14, 16, 18] + strapi: [4.6.2, 4.7.1, 4.8.2] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: ${{ matrix.version }} + node-version: ${{ matrix.node }} cache: 'yarn' - - run: cp ./playground/.env.test ./playground/.env + - run: cp playground/.env.test playground/.env + - run: VERSION=${{ matrix.strapi }} envsubst < playground/templates/template.package.json > playground/package.json - run: yarn - run: yarn workspace playground build - run: yarn workspace playground e2e - uses: actions/upload-artifact@v3 with: - name: cypress results (node ${{ matrix.version }}) + name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) path: | playground/cypress/videos/* playground/cypress/screenshots/* diff --git a/playground/templates/template.package.json b/playground/templates/template.package.json new file mode 100644 index 00000000..a7d14d3c --- /dev/null +++ b/playground/templates/template.package.json @@ -0,0 +1,44 @@ +{ + "dependencies": { + "@strapi/plugin-graphql": "${VERSION}", + "@strapi/plugin-i18n": "${VERSION}", + "@strapi/plugin-users-permissions": "${VERSION}", + "@strapi/strapi": "${VERSION}", + "better-sqlite3": "8.2.0", + "lodash.set": "^4.3.2", + "mime-types": "^2.1.27", + "strapi-plugin-init-admin-user": "^0.2.1" + }, + "name": "playground", + "private": true, + "version": "0.1.0", + "description": "A Strapi application", + "scripts": { + "develop": "strapi develop", + "start": "strapi start", + "build": "strapi build", + "strapi": "strapi", + "reset": "node scripts/reset.js", + "cy:run": "cypress run", + "test": "echo no unittests", + "e2e": "start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" + }, + "devDependencies": { + "cypress": "^12.7.0", + "start-server-and-test": "^2.0.0" + }, + "author": { + "name": "A Strapi developer" + }, + "strapi": { + "uuid": "e52249f8-dcf2-4e7b-8612-7713abc46c04", + "template": "@strapi/template-blog@^1.0.0", + "starter": "@strapi/starter-next-blog", + "telemetryDisabled": true + }, + "engines": { + "node": ">=14.19.1 <=18.x.x", + "npm": ">=6.0.0" + }, + "license": "MIT" +} From bf88e1087aab66d697cc470d698b551dcf1089ec Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Fri, 24 Mar 2023 13:42:14 +0100 Subject: [PATCH 21/50] feat(admin): add batch updating listens for changes to localized entities and offers batch translation for updated entities fix #109 --- playground/config/plugins.js | 2 +- plugin/admin/src/Hooks/useUpdateCollection.js | 98 ++++++++ .../src/components/BatchUpdateTable/Table.js | 230 ++++++++++++++++++ .../src/components/BatchUpdateTable/index.js | 1 + .../admin/src/components/PluginPage/index.js | 8 +- plugin/admin/src/components/Usage/index.js | 2 +- plugin/admin/src/translations/de.json | 6 +- plugin/admin/src/translations/en.json | 6 +- plugin/admin/src/translations/fr.json | 6 +- plugin/server/bootstrap.js | 29 +++ plugin/server/content-types/index.js | 2 + .../content-types/updated-entry/index.js | 7 + .../content-types/updated-entry/schema.json | 33 +++ plugin/server/controllers/index.js | 2 + plugin/server/controllers/translate.js | 18 ++ plugin/server/controllers/updated-entry.js | 5 + plugin/server/routes/translate.js | 42 ++++ plugin/server/routes/updated-entry.js | 31 +++ plugin/server/services/index.js | 2 + plugin/server/services/translate.js | 81 +++++- plugin/server/services/updated-entry.js | 32 +++ 21 files changed, 633 insertions(+), 10 deletions(-) create mode 100644 plugin/admin/src/Hooks/useUpdateCollection.js create mode 100644 plugin/admin/src/components/BatchUpdateTable/Table.js create mode 100644 plugin/admin/src/components/BatchUpdateTable/index.js create mode 100644 plugin/server/content-types/updated-entry/index.js create mode 100644 plugin/server/content-types/updated-entry/schema.json create mode 100644 plugin/server/controllers/updated-entry.js create mode 100644 plugin/server/routes/updated-entry.js create mode 100644 plugin/server/services/updated-entry.js diff --git a/playground/config/plugins.js b/playground/config/plugins.js index b2d47440..763fc8e0 100644 --- a/playground/config/plugins.js +++ b/playground/config/plugins.js @@ -1,7 +1,7 @@ module.exports = ({ env }) => ({ // ... translate: { - resolve: "../plugin", + resolve: '../plugin', enabled: true, config: { provider: 'deepl', diff --git a/plugin/admin/src/Hooks/useUpdateCollection.js b/plugin/admin/src/Hooks/useUpdateCollection.js new file mode 100644 index 00000000..5d6be4fa --- /dev/null +++ b/plugin/admin/src/Hooks/useUpdateCollection.js @@ -0,0 +1,98 @@ +import { useState, useEffect } from 'react' +import { request } from '@strapi/helper-plugin' +import pluginId from '../pluginId' +import getTrad from '../utils/getTrad' +import useAlert from './useAlert' + +export function useUpdateCollection() { + const [updates, setUpdates] = useState([]) + const [refetchIndex, setRefetchIndex] = useState(true) + + const { handleNotification } = useAlert() + + const refetch = () => setRefetchIndex((prevRefetchIndex) => !prevRefetchIndex) + + const fetchUpdates = async () => { + const { data, error } = await request( + `/${pluginId}/batch-update/updates/`, + { + method: 'GET', + } + ) + + if (error) { + handleNotification({ + type: 'warning', + id: error.message, + defaultMessage: 'Failed to fetch Updates', + link: error.link, + }) + } else if (Array.isArray(data)) { + setUpdates(data) + } + } + + const dismissUpdates = async (ids) => { + for (const id of ids) { + const { error } = await request( + `/${pluginId}/batch-update/dismiss/${id}`, + { + method: 'DELETE', + } + ) + + if (error) { + handleNotification({ + type: 'warning', + id: error.message, + defaultMessage: 'Failed to dismiss Update', + link: error.link, + }) + } + } + + refetch() + } + + const startUpdate = async (ids, sourceLocale) => { + const { error } = await request(`/${pluginId}/batch-update`, { + method: 'POST', + body: { + updatedEntryIDs: ids, + sourceLocale, + }, + }) + + if (error) { + handleNotification({ + type: 'warning', + id: error.message, + defaultMessage: 'Failed to translate collection', + link: error.link, + }) + } else { + refetch() + handleNotification({ + type: 'success', + id: getTrad('batch-translate.start-success'), + defaultMessage: 'Request to translate content-type was successful', + blockTransition: false, + }) + } + } + + useEffect(() => { + fetchUpdates() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [refetchIndex]) + + return { + updates, + dismissUpdates, + startUpdate, + refetch, + handleNotification, + } +} + +export default useUpdateCollection diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js new file mode 100644 index 00000000..7254723f --- /dev/null +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -0,0 +1,230 @@ +import React, { memo, useState, useEffect } from 'react' +import { Table, Tbody, Thead, Th, Tr, Td } from '@strapi/design-system/Table' +import { ExclamationMarkCircle } from '@strapi/icons' +import { + Box, + Flex, + Stack, + Button, + Checkbox, + Select, + Option, + Dialog, + DialogBody, + DialogFooter, + Typography, +} from '@strapi/design-system' +import { useIntl } from 'react-intl' +import useCollection from '../../Hooks/useCollection' +import useUpdateCollection from '../../Hooks/useUpdateCollection' +import { getTrad } from '../../utils' + +const CollectionTable = () => { + const { formatMessage } = useIntl() + + const [selectedIDs, setSelectedIDs] = useState([]) + const [dialogOpen, setDialogOpen] = useState(false) + const [isLoading, setIsLoading] = useState(false) + const [sourceLocale, setSourceLocale] = useState(null) + + const { locales } = useCollection() + + useEffect(() => { + if (Array.isArray(locales) && locales.length > 0) + setSourceLocale(locales[0].code) + }, [locales]) + + const { updates, startUpdate, dismissUpdates, refetch } = + useUpdateCollection() + + useEffect(() => { + const localeUses = updates + .filter(({ id }) => selectedIDs.includes(id)) + .reduce((acc, current) => { + for (const locale of current.attributes.localesWithUpdates) { + acc[locale] = (acc[locale] ?? 0) + 1 + } + + return acc + }, {}) + + const { code: mostUpdatedLocale } = Object.entries(localeUses).reduce( + (acc, [code, uses]) => (acc.uses < uses ? { code, uses } : acc), + { code: '', uses: 0 } + ) + + setSourceLocale(mostUpdatedLocale) + }, [selectedIDs, updates]) + + const onAction = () => { + setIsLoading(true) + startUpdate(selectedIDs, sourceLocale).then(() => { + setIsLoading(false) + setDialogOpen(false) + refetch() + }) + } + + const dismissSelected = () => { + dismissUpdates(selectedIDs).then(() => { + setSelectedIDs([]) + refetch() + }) + } + + return ( + + + + + + + + + + + + {locales.map((locale) => ( + + ))} + + + + {updates.map(({ id, attributes }, index) => ( + + + + + {locales.map(({ code }) => ( + + ))} + + ))} + +
+ 0} + disabled={updates.length === 0} + indeterminate={ + selectedIDs.length > 0 && selectedIDs.length < updates.length + } + onClick={() => { + if (selectedIDs.length === updates.length) { + setSelectedIDs([]) + } else { + setSelectedIDs(updates.map(({ id }) => id)) + } + }} + /> + + Type + + IDs + + {locale.name} +
+ { + if (selectedIDs.includes(id)) { + setSelectedIDs((selectedIDs) => + selectedIDs.filter((param) => param !== id) + ) + } else { + setSelectedIDs((selectedIDs) => [id, ...selectedIDs]) + } + }} + /> + + {attributes.contentType} + + + {attributes.groupID.split('-').join(',')} + + + + {attributes.localesWithUpdates.includes(code) + ? 'was updated' + : ''} + +
+ {dialogOpen && ( + setDialogOpen(false)} + title={formatMessage({ + id: getTrad(`batch-update.dialog.title`), + defaultMessage: 'Confirmation', + })} + isOpen={dialogOpen} + > + }> + + + + {formatMessage({ + id: getTrad(`batch-update.dialog.content`), + defaultMessage: 'Confirmation body', + })} + + + + + + + + + + setDialogOpen(false)} variant="tertiary"> + {formatMessage({ + id: 'popUpWarning.button.cancel', + defaultMessage: 'No, cancel', + })} + + } + endAction={ + + } + /> + + )} +
+ ) +} + +export default memo(CollectionTable) diff --git a/plugin/admin/src/components/BatchUpdateTable/index.js b/plugin/admin/src/components/BatchUpdateTable/index.js new file mode 100644 index 00000000..ae29386b --- /dev/null +++ b/plugin/admin/src/components/BatchUpdateTable/index.js @@ -0,0 +1 @@ +export { default as BatchUpdateTable } from './Table' diff --git a/plugin/admin/src/components/PluginPage/index.js b/plugin/admin/src/components/PluginPage/index.js index 26df3263..0d592fce 100644 --- a/plugin/admin/src/components/PluginPage/index.js +++ b/plugin/admin/src/components/PluginPage/index.js @@ -1,14 +1,16 @@ import React, { memo } from 'react' -import { Box } from '@strapi/design-system/Box' +import { Stack } from '@strapi/design-system/Stack' import { CollectionTable } from '../Collection' +import { BatchUpdateTable } from '../BatchUpdateTable' import UsageOverview from '../Usage' const PluginPage = () => { return ( - + + - + ) } diff --git a/plugin/admin/src/components/Usage/index.js b/plugin/admin/src/components/Usage/index.js index a793c020..dbd7deca 100644 --- a/plugin/admin/src/components/Usage/index.js +++ b/plugin/admin/src/components/Usage/index.js @@ -58,7 +58,7 @@ const UsageOverview = () => { ) return ( - + diff --git a/plugin/admin/src/translations/de.json b/plugin/admin/src/translations/de.json index b1efa51f..bc4cd5e8 100644 --- a/plugin/admin/src/translations/de.json +++ b/plugin/admin/src/translations/de.json @@ -48,5 +48,9 @@ "usage.failed-to-load": "Daten konnten nicht geladen werden", "usage.characters-used": "Zeichen verbraucht", "usage.estimatedUsage": "Diese Aktion wird Ihre API-Nutzung ungefähr um diesen Betrag erhöht: ", - "usage.estimatedUsageExceedsQuota": "Diese Aktion wird voraussichtlich Ihr API-Kontingent überschreiten." + "usage.estimatedUsageExceedsQuota": "Diese Aktion wird voraussichtlich Ihr API-Kontingent überschreiten.", + "batch-update.dialog.title": "Massenanpassung starten", + "batch-update.dialog.content": "Für alle ausgewählten Elemente werden alle Lokalisierungen mit Übersetzungen der ausgewählten Ausgangssprache ersetzt.", + "batch-update.sourceLocale": "Ausgangssprache", + "batch-update.dialog.submit-text": "starten" } diff --git a/plugin/admin/src/translations/en.json b/plugin/admin/src/translations/en.json index 2c67dce7..2a114b0d 100644 --- a/plugin/admin/src/translations/en.json +++ b/plugin/admin/src/translations/en.json @@ -48,5 +48,9 @@ "usage.failed-to-load": "failed to load usage data", "usage.characters-used": "characters used", "usage.estimatedUsage": "This action is expected to increase your API usage by: ", - "usage.estimatedUsageExceedsQuota": "This action is expected to exceed your API Quota" + "usage.estimatedUsageExceedsQuota": "This action is expected to exceed your API Quota", + "batch-update.dialog.title": "start batch updating", + "batch-update.dialog.content": "All localizations of selected elements will be replaced by translations from the selected source locale.", + "batch-update.sourceLocale": "source locale", + "batch-update.dialog.submit-text": "start" } diff --git a/plugin/admin/src/translations/fr.json b/plugin/admin/src/translations/fr.json index 06a885ef..af099468 100644 --- a/plugin/admin/src/translations/fr.json +++ b/plugin/admin/src/translations/fr.json @@ -48,5 +48,9 @@ "usage.failed-to-load": "échec de la récupération des données", "usage.characters-used": "caractères consommés", "usage.estimatedUsage": "Cette action devrait augmenter l'utilisation de votre API de: ", - "usage.estimatedUsageExceedsQuota": "Cette action devrait dépasser votre quota d'API." + "usage.estimatedUsageExceedsQuota": "Cette action devrait dépasser votre quota d'API.", + "batch-update.dialog.title": "mise à jour par lots", + "batch-update.dialog.content": "Toutes les localisations des éléments sélectionnés seront remplacées par des traductions de la langue source sélectionnée.", + "batch-update.sourceLocale": "source locale", + "batch-update.dialog.submit-text": "commencer" } diff --git a/plugin/server/bootstrap.js b/plugin/server/bootstrap.js index af770a64..8bf90b80 100644 --- a/plugin/server/bootstrap.js +++ b/plugin/server/bootstrap.js @@ -39,6 +39,35 @@ const createProvider = (translateConfig) => { module.exports = async ({ strapi }) => { const translateConfig = strapi.config.get('plugin.translate') strapi.plugin('translate').provider = createProvider(translateConfig) + + // Listen for updates to entries, mark them as updated + strapi.db.lifecycles.subscribe({ + afterUpdate(event) { + if ( + event?.result?.locale && + Array.isArray(event.result.localizations) && + event.result.localizations.length > 0 && + Object.keys(event.params.data).some( + (key) => !['localizations', 'updatedAt', 'updatedBy'].includes(key) + ) + ) { + const groupID = [ + event.result.id, + ...event.result.localizations.map(({ id }) => id), + ] + .sort() + .join('-') + getService('updated-entry').create({ + data: { + contentType: event.model.uid, + groupID, + localesWithUpdates: [event.result.locale], + }, + }) + } + }, + }) + await strapi.admin.services.permission.actionProvider.registerMany(actions) await getService('translate').batchTranslateManager.bootstrap() } diff --git a/plugin/server/content-types/index.js b/plugin/server/content-types/index.js index 0f8b7e9e..bfca038d 100644 --- a/plugin/server/content-types/index.js +++ b/plugin/server/content-types/index.js @@ -1,7 +1,9 @@ 'use strict' const batchTranslateJob = require('./batch-translate-job') +const updatedEntry = require('./updated-entry') module.exports = { 'batch-translate-job': batchTranslateJob, + 'updated-entry': updatedEntry, } diff --git a/plugin/server/content-types/updated-entry/index.js b/plugin/server/content-types/updated-entry/index.js new file mode 100644 index 00000000..abdcdd4e --- /dev/null +++ b/plugin/server/content-types/updated-entry/index.js @@ -0,0 +1,7 @@ +'use strict' + +const schema = require('./schema.json') + +module.exports = { + schema, +} diff --git a/plugin/server/content-types/updated-entry/schema.json b/plugin/server/content-types/updated-entry/schema.json new file mode 100644 index 00000000..69e4b32e --- /dev/null +++ b/plugin/server/content-types/updated-entry/schema.json @@ -0,0 +1,33 @@ +{ + "kind": "collectionType", + "collectionName": "translate_updated_entries", + "info": { + "singularName": "updated-entry", + "pluralName": "updated-entries", + "displayName": "Translate updated Entry" + }, + "options": { + "draftAndPublish": false, + "comment": "" + }, + "pluginOptions": { + "content-manager": { + "visible": true, + "comment": "// FIXME: debug only" + }, + "content-type-builder": { + "visible": false + } + }, + "attributes": { + "contentType": { + "type": "string" + }, + "groupID": { + "type": "string" + }, + "localesWithUpdates": { + "type": "json" + } + } +} diff --git a/plugin/server/controllers/index.js b/plugin/server/controllers/index.js index 4eac7d8e..2c299767 100644 --- a/plugin/server/controllers/index.js +++ b/plugin/server/controllers/index.js @@ -3,9 +3,11 @@ const batchTranslateJob = require('./batch-translate-job') const provider = require('./provider') const translate = require('./translate') +const updatedEntry = require('./updated-entry') module.exports = { 'batch-translate-job': batchTranslateJob, provider, translate, + 'updated-entry': updatedEntry, } diff --git a/plugin/server/controllers/translate.js b/plugin/server/controllers/translate.js index 748a12c1..6d10531c 100644 --- a/plugin/server/controllers/translate.js +++ b/plugin/server/controllers/translate.js @@ -223,6 +223,24 @@ module.exports = ({ strapi }) => ({ }, } }, + async batchUpdate(ctx) { + const { sourceLocale, updatedEntryIDs } = ctx.request.body + + if (!sourceLocale) { + return ctx.badRequest('source locale is required') + } + + if (!Array.isArray(updatedEntryIDs)) { + return ctx.badRequest('updatedEntryIDs must be an array') + } + + ctx.body = { + data: await getService('translate').batchUpdate({ + updatedEntryIDs, + sourceLocale, + }), + } + }, async batchTranslateContentTypes(ctx) { ctx.body = { data: await getService('translate').contentTypes(), diff --git a/plugin/server/controllers/updated-entry.js b/plugin/server/controllers/updated-entry.js new file mode 100644 index 00000000..1b5ffcab --- /dev/null +++ b/plugin/server/controllers/updated-entry.js @@ -0,0 +1,5 @@ +'use strict' + +const { createCoreController } = require('@strapi/strapi').factories + +module.exports = createCoreController('plugin::translate.updated-entry') diff --git a/plugin/server/routes/translate.js b/plugin/server/routes/translate.js index 71dc3371..ce3b9c64 100644 --- a/plugin/server/routes/translate.js +++ b/plugin/server/routes/translate.js @@ -99,6 +99,48 @@ module.exports = [ ], }, }, + { + method: 'POST', + path: '/batch-update', + handler: 'translate.batchUpdate', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + { + name: 'plugin::content-manager.hasPermissions', + config: { actions: ['plugin::translate.batch-translate'] }, + }, + ], + }, + }, + { + method: 'GET', + path: '/batch-update/updates', + handler: 'updated-entry.find', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + { + name: 'plugin::content-manager.hasPermissions', + config: { actions: ['plugin::translate.batch-translate'] }, + }, + ], + }, + }, + { + method: 'DELETE', + path: '/batch-update/dismiss/:id', + handler: 'updated-entry.delete', + config: { + policies: [ + 'admin::isAuthenticatedAdmin', + { + name: 'plugin::content-manager.hasPermissions', + config: { actions: ['plugin::translate.batch-translate'] }, + }, + ], + }, + }, { method: 'POST', path: '/usage/estimate', diff --git a/plugin/server/routes/updated-entry.js b/plugin/server/routes/updated-entry.js new file mode 100644 index 00000000..b5c728b1 --- /dev/null +++ b/plugin/server/routes/updated-entry.js @@ -0,0 +1,31 @@ +'use strict' + +/** + * router. + */ + +const { factories } = require('@strapi/strapi') + +module.exports = factories.createCoreRouter('plugin::translate.updated-entry', { + config: { + find: { + policies: [ + 'admin::isAuthenticatedAdmin', + { + name: 'plugin::content-manager.hasPermissions', + config: { actions: ['plugin::translate.translate'] }, + }, + ], + }, + delete: { + policies: [ + 'admin::isAuthenticatedAdmin', + { + name: 'plugin::content-manager.hasPermissions', + config: { actions: ['plugin::translate.translate'] }, + }, + ], + }, + }, + only: ['find', 'delete'], +}) diff --git a/plugin/server/services/index.js b/plugin/server/services/index.js index 7f237b01..9040a459 100644 --- a/plugin/server/services/index.js +++ b/plugin/server/services/index.js @@ -6,6 +6,7 @@ const provider = require('./provider') const translate = require('./translate') const untranslated = require('./untranslated') const format = require('./format') +const updatedEntry = require('./updated-entry') module.exports = { 'batch-translate-job': batchTranslateJob, @@ -14,4 +15,5 @@ module.exports = { untranslated, chunks, format, + 'updated-entry': updatedEntry, } diff --git a/plugin/server/services/translate.js b/plugin/server/services/translate.js index 52aa90e4..5af9f87c 100644 --- a/plugin/server/services/translate.js +++ b/plugin/server/services/translate.js @@ -5,6 +5,11 @@ const set = require('lodash/set') const groupBy = require('lodash/groupBy') const { getService } = require('../utils/get-service') +const { getAllTranslatableFields } = require('../utils/translatable-fields') +const { filterAllDeletedFields } = require('../utils/delete-fields') +const { cleanData } = require('../utils/clean-data') +const { TRANSLATE_PRIORITY_BATCH_TRANSLATION } = require('../utils/constants') +const { updateUids } = require('../utils/update-uids') const { BatchTranslateManager } = require('./batch-translate') module.exports = ({ strapi }) => ({ @@ -69,6 +74,75 @@ module.exports = ({ strapi }) => ({ async batchTranslateCancelJob(id) { return this.batchTranslateManager.cancelJob(id) }, + async batchUpdate(params) { + const { updatedEntryIDs, sourceLocale } = params + for (const updateID of updatedEntryIDs) { + const update = await strapi + .service('plugin::translate.updated-entry') + .findOne(updateID) + + if (!update) continue + const mainID = Number(update.groupID.split('-')[0]) + + const entity = await strapi.db.query(update.contentType).findOne({ + where: { id: mainID }, + populate: { localizations: true }, + }) + + const normalizedEntities = [entity, ...entity.localizations] + + normalizedEntities.forEach((normalizedEntity) => { + delete normalizedEntity.localizations + }) + + const sourceEntity = normalizedEntities.find( + ({ locale }) => locale === sourceLocale + ) + + if (!sourceEntity) + throw new Error('No entity found with locale ' + sourceLocale) + + const targets = normalizedEntities + .map(({ locale, id }) => ({ id, locale })) + .filter(({ locale }) => locale !== sourceLocale) + + const contentTypeSchema = strapi.contentTypes[update.contentType] + const fieldsToTranslate = await getAllTranslatableFields( + sourceEntity, + contentTypeSchema + ) + + for (const { locale, id } of targets) { + const translated = await this.translate({ + sourceLocale, + targetLocale: locale, + priority: TRANSLATE_PRIORITY_BATCH_TRANSLATION, + fieldsToTranslate, + data: sourceEntity, + }) + + const uidsUpdated = await updateUids(translated, update.contentType) + + const withFieldsDeleted = filterAllDeletedFields( + uidsUpdated, + update.contentType + ) + + const fullyTranslatedData = cleanData( + withFieldsDeleted, + contentTypeSchema + ) + + delete fullyTranslatedData.locale + + strapi.db.query(update.contentType).update({ + where: { id }, + data: fullyTranslatedData, + }) + } + await strapi.service('plugin::translate.updated-entry').delete(updateID) + } + }, async contentTypes() { const localizedContentTypes = Object.keys(strapi.contentTypes).filter( (ct) => strapi.contentTypes[ct].pluginOptions?.i18n?.localized @@ -79,7 +153,7 @@ module.exports = ({ strapi }) => ({ const reports = await Promise.all( localizedContentTypes.map(async (contentType) => { // get jobs - const jobs = await strapi.db + const translateJobs = await strapi.db .query('plugin::translate.batch-translate-job') .findMany({ where: { contentType: { $eq: contentType } }, @@ -92,10 +166,12 @@ module.exports = ({ strapi }) => ({ const countPromise = strapi.db .query(contentType) .count({ where: { locale: code } }) + const complete = await getService('untranslated').isFullyTranslated( contentType, code ) + return { count: await countPromise, complete, @@ -108,7 +184,7 @@ module.exports = ({ strapi }) => ({ locales.forEach(({ code }, index) => { localeReports[code] = { ...info[index], - job: jobs.find((job) => job.targetLocale === code), + job: translateJobs.find((job) => job.targetLocale === code), } }) return { @@ -118,6 +194,7 @@ module.exports = ({ strapi }) => ({ } }) ) + return { contentTypes: reports, locales } }, }) diff --git a/plugin/server/services/updated-entry.js b/plugin/server/services/updated-entry.js new file mode 100644 index 00000000..7dc52ac5 --- /dev/null +++ b/plugin/server/services/updated-entry.js @@ -0,0 +1,32 @@ +'use strict' + +const { createCoreService } = require('@strapi/strapi').factories + +module.exports = createCoreService('plugin::translate.updated-entry', () => ({ + async create(params) { + try { + const { + results: [firstResult], + } = await super.find({ + fields: ['id'], + filters: { + contentType: params.data.contentType, + groupID: params.data.groupID, + }, + }) + super.update(firstResult.id, { + localesWithUpdates: Array.from( + new Set([ + ...(firstResult.localesWithUpdates ?? []), + ...(params.data.localesWithUpdates ?? []), + ]) + ), + }) + if (firstResult) return firstResult + } catch (e) { + console.error(e) + } + + return super.create(params) + }, +})) From 2bd372f8c54a7a4203d0990c9533017acf0768df Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Mon, 27 Mar 2023 13:50:59 +0200 Subject: [PATCH 22/50] feat(batch-update): add customization options add option to ignore contentTypes and wether to regenerate uids or not --- plugin/server/bootstrap.js | 7 +++++- plugin/server/config/index.js | 10 ++++++++ .../content-types/updated-entry/schema.json | 3 +-- plugin/server/services/translate.js | 13 +++++++++- plugin/server/services/updated-entry.js | 23 +++++++++--------- plugin/server/utils/remove-uids.js | 24 +++++++++++++++++++ 6 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 plugin/server/utils/remove-uids.js diff --git a/plugin/server/bootstrap.js b/plugin/server/bootstrap.js index 8bf90b80..e64f67c9 100644 --- a/plugin/server/bootstrap.js +++ b/plugin/server/bootstrap.js @@ -44,12 +44,17 @@ module.exports = async ({ strapi }) => { strapi.db.lifecycles.subscribe({ afterUpdate(event) { if ( - event?.result?.locale && + event?.model?.uid && + !translateConfig.ignoreUpdatedContentTypes.includes(event.model.uid) && + // content type must not be on ignore list + event.result?.locale && Array.isArray(event.result.localizations) && event.result.localizations.length > 0 && + // entity must have localizations Object.keys(event.params.data).some( (key) => !['localizations', 'updatedAt', 'updatedBy'].includes(key) ) + // update must include relevant fields ) { const groupID = [ event.result.id, diff --git a/plugin/server/config/index.js b/plugin/server/config/index.js index 9b75ecd0..9b9b2a2f 100644 --- a/plugin/server/config/index.js +++ b/plugin/server/config/index.js @@ -13,6 +13,8 @@ module.exports = { 'dynamiczone', ], translateRelations: true, + regenerateUids: false, + ignoreUpdatedContentTypes: [], } }, validator({ @@ -20,6 +22,8 @@ module.exports = { providerOptions, translatedFieldTypes, translateRelations, + regenerateUids, + ignoreUpdatedContentTypes, }) { if (provider === 'dummy' && process.env.NODE_ENV !== 'test') { console.warn( @@ -55,5 +59,11 @@ module.exports = { if (providerOptions && typeof providerOptions !== 'object') { throw new Error('providerOptions has to be an object if it is defined') } + if (typeof regenerateUids !== 'boolean') { + throw new Error('regenerateUids has to be a boolean') + } + if (!Array.isArray(ignoreUpdatedContentTypes)) { + throw new Error('regenerateUids has to be an Array') + } }, } diff --git a/plugin/server/content-types/updated-entry/schema.json b/plugin/server/content-types/updated-entry/schema.json index 69e4b32e..04a4efa5 100644 --- a/plugin/server/content-types/updated-entry/schema.json +++ b/plugin/server/content-types/updated-entry/schema.json @@ -12,8 +12,7 @@ }, "pluginOptions": { "content-manager": { - "visible": true, - "comment": "// FIXME: debug only" + "visible": false }, "content-type-builder": { "visible": false diff --git a/plugin/server/services/translate.js b/plugin/server/services/translate.js index 5af9f87c..4376c648 100644 --- a/plugin/server/services/translate.js +++ b/plugin/server/services/translate.js @@ -10,6 +10,7 @@ const { filterAllDeletedFields } = require('../utils/delete-fields') const { cleanData } = require('../utils/clean-data') const { TRANSLATE_PRIORITY_BATCH_TRANSLATION } = require('../utils/constants') const { updateUids } = require('../utils/update-uids') +const { removeUids } = require('../utils/remove-uids') const { BatchTranslateManager } = require('./batch-translate') module.exports = ({ strapi }) => ({ @@ -121,7 +122,9 @@ module.exports = ({ strapi }) => ({ data: sourceEntity, }) - const uidsUpdated = await updateUids(translated, update.contentType) + const uidsUpdated = strapi.config.get('plugin.translate').regenerateUids + ? await updateUids(translated, update.contentType) + : removeUids(translated, update.contentType) const withFieldsDeleted = filterAllDeletedFields( uidsUpdated, @@ -133,6 +136,14 @@ module.exports = ({ strapi }) => ({ contentTypeSchema ) + console.log({ + translated, + uidsUpdated, + withFieldsDeleted, + fullyTranslatedData, + val: strapi.config.get('plugin.translate').regenerateUids, + }) + delete fullyTranslatedData.locale strapi.db.query(update.contentType).update({ diff --git a/plugin/server/services/updated-entry.js b/plugin/server/services/updated-entry.js index 7dc52ac5..eaaef895 100644 --- a/plugin/server/services/updated-entry.js +++ b/plugin/server/services/updated-entry.js @@ -14,19 +14,20 @@ module.exports = createCoreService('plugin::translate.updated-entry', () => ({ groupID: params.data.groupID, }, }) - super.update(firstResult.id, { - localesWithUpdates: Array.from( - new Set([ - ...(firstResult.localesWithUpdates ?? []), - ...(params.data.localesWithUpdates ?? []), - ]) - ), - }) - if (firstResult) return firstResult + if (firstResult) { + return super.update(firstResult.id, { + localesWithUpdates: Array.from( + new Set([ + ...(firstResult.localesWithUpdates ?? []), + ...(params.data.localesWithUpdates ?? []), + ]) + ), + }) + } else { + return super.create(params) + } } catch (e) { console.error(e) } - - return super.create(params) }, })) diff --git a/plugin/server/utils/remove-uids.js b/plugin/server/utils/remove-uids.js new file mode 100644 index 00000000..0dc4206d --- /dev/null +++ b/plugin/server/utils/remove-uids.js @@ -0,0 +1,24 @@ +'use strict' + +const _ = require('lodash') + +/** + * Remove all uids from a content type + * @param {object} data The data in with uids + * @param {object} contentTypeUid The uid of the content type + * @returns The input data without uids + */ +function removeUids(data, contentTypeUid) { + const schema = strapi.contentTypes[contentTypeUid] + const attributesSchema = _.get(schema, 'attributes', []) + const resultData = _.cloneDeep(data) + Object.keys(attributesSchema).forEach(async (attr) => { + if (attributesSchema[attr].type === 'uid') delete resultData[attr] + }) + + return resultData +} + +module.exports = { + removeUids, +} From c7d3267fe87f531210e96a33fe85f9f785b5a562 Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Mon, 27 Mar 2023 14:02:43 +0200 Subject: [PATCH 23/50] docs(batch-update): add configuration options to README --- plugin/README.md | 12 ++++++++++++ plugin/server/config/index.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/plugin/README.md b/plugin/README.md index ce371b51..bec361f0 100644 --- a/plugin/README.md +++ b/plugin/README.md @@ -83,6 +83,10 @@ module.exports = { ], // If relations should be translated (default true) translateRelations: true, + // ignore updates for certain content types (default [], i.e. no content types are ignored) + ignoreUpdatedContentTypes: ['api::category.category'], + // wether to regenerate uids when batch updating (default false) + regenerateUids: true }, }, // ... @@ -175,6 +179,14 @@ Additional remarks: - UIDs are automatically translated in batch translation mode, since otherwise the entities could not be created/published - If an error occurs, this will be shown in the logs or the message can be accessed by hovering over the `Job failed` badge +### Retranslating updated entities + +If a localized entity is updated, an entry is added to the batch update section of the admin page. This allows easy retranslation of updated entities. +By default, uids will be ignored. You can opt to regenerate them by setting the `translate.config.regenerateUids` key of the plugin options to `true`. +The `translate.config.ignoreUpdatedContentTypes` key of the plugin options can be used to define an array of content types for which such updates should not be recorded. + +Note that updates are only considered if they trigger the `afterUpdate` lifecycle hook provided by strapi. + ### Schema for translating relations _The related objects are not translated directly, only the relation itself is translated_ diff --git a/plugin/server/config/index.js b/plugin/server/config/index.js index 9b9b2a2f..4d7907a1 100644 --- a/plugin/server/config/index.js +++ b/plugin/server/config/index.js @@ -63,7 +63,7 @@ module.exports = { throw new Error('regenerateUids has to be a boolean') } if (!Array.isArray(ignoreUpdatedContentTypes)) { - throw new Error('regenerateUids has to be an Array') + throw new Error('ignoreUpdatedContentTypes has to be an Array') } }, } From 2506054e179c231d31cdd9fc10a212a951ea67c5 Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Mon, 27 Mar 2023 14:41:48 +0200 Subject: [PATCH 24/50] feat(plugin): optionally regenerate uids after single translation use the feature flag introduced for batch updating to toggle regeneration of uids for single entity translation #156 --- playground/config/plugins.js | 1 + plugin/server/controllers/translate.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/playground/config/plugins.js b/playground/config/plugins.js index 763fc8e0..cc1e0f99 100644 --- a/playground/config/plugins.js +++ b/playground/config/plugins.js @@ -6,6 +6,7 @@ module.exports = ({ env }) => ({ config: { provider: 'deepl', providerOptions: {}, + regenerateUids: true, }, }, // ... diff --git a/plugin/server/controllers/translate.js b/plugin/server/controllers/translate.js index 6d10531c..d400f101 100644 --- a/plugin/server/controllers/translate.js +++ b/plugin/server/controllers/translate.js @@ -7,6 +7,7 @@ const { TRANSLATE_PRIORITY_DIRECT_TRANSLATION } = require('../utils/constants') const { filterAllDeletedFields } = require('../utils/delete-fields') const { populateAll } = require('../utils/populate-all') const { cleanData } = require('../utils/clean-data') +const { updateUids } = require('../utils/update-uids') module.exports = ({ strapi }) => ({ async translate(ctx) { @@ -46,8 +47,11 @@ module.exports = ({ strapi }) => ({ fieldsToTranslate, priority: TRANSLATE_PRIORITY_DIRECT_TRANSLATION, }) + const translatedRelations = await translateRelations( - translatedData, + strapi.config.get('plugin.translate').regenerateUids + ? await updateUids(translatedData, contentTypeUid) + : translatedData, contentSchema, targetLocale ) From f44b8a4614dc20f2c67b6ba88df005c02125fb85 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 2 Apr 2023 23:29:33 +0200 Subject: [PATCH 25/50] ci(workflows): restructure workflows to be reusable and remove code duplication Additional changes: adjust strapi versions to be major.minor and remove env file copying --- .github/workflows/build.yml | 62 +++------------------------------- .github/workflows/e2e.yml | 25 ++++++++++++++ .github/workflows/lint.yml | 19 +++++++++++ .github/workflows/pr.yml | 62 +++------------------------------- .github/workflows/unittest.yml | 22 ++++++++++++ 5 files changed, 74 insertions(+), 116 deletions(-) create mode 100644 .github/workflows/e2e.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .github/workflows/unittest.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25f357be..6388f4f9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,66 +5,12 @@ on: - main - next jobs: - eslint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install modules - run: yarn - - name: Run ESLint - run: yarn lint - - commitlint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: wagoid/commitlint-github-action@v5 - + lint: + uses: ./.github/workflows/lint.yml unittest: - strategy: - matrix: - version: [14, 16, 18] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.version }} - cache: 'yarn' - - run: yarn - - run: yarn test - - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml,./providers/libretranslate/coverage/clover.xml - flags: unittests - name: codecov-umbrella - + uses: ./.github/workflows/unittest.yml e2e: - strategy: - matrix: - node: [14, 16, 18] - strapi: [4.6.2, 4.7.1, 4.8.2] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - cache: 'yarn' - - run: cp playground/.env.test playground/.env - - run: VERSION=${{ matrix.strapi }} envsubst < playground/templates/template.package.json > playground/package.json - - run: yarn - - run: yarn workspace playground build - - run: yarn workspace playground e2e - - uses: actions/upload-artifact@v3 - with: - name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) - path: | - playground/cypress/videos/* - playground/cypress/screenshots/* + uses: ./.github/workflows/e2e.yml release: needs: diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 00000000..766e2666 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,25 @@ +on: + workflow_call: +jobs: + e2e: + strategy: + matrix: + node: [14, 16, 18] + strapi: [4.6, 4.7, 4.8, 4.9] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node }} + cache: 'yarn' + - run: VERSION=${{ matrix.strapi }} envsubst < playground/templates/template.package.json > playground/package.json + - run: yarn + - run: yarn workspace playground build + - run: yarn workspace playground e2e + - uses: actions/upload-artifact@v3 + with: + name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) + path: | + playground/cypress/videos/* + playground/cypress/screenshots/* diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..6486878a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,19 @@ +on: + workflow_call: +jobs: + eslint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install modules + run: yarn + - name: Run ESLint + run: yarn lint + + commitlint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: wagoid/commitlint-github-action@v5 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index eecc79f6..a4479c66 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,63 +1,9 @@ name: Pull Request on: pull_request jobs: - eslint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install modules - run: yarn - - name: Run ESLint - run: yarn lint - - commitlint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: wagoid/commitlint-github-action@v5 - + lint: + uses: ./.github/workflows/lint.yml unittest: - strategy: - matrix: - version: [14, 16, 18] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.version }} - cache: 'yarn' - - run: yarn - - run: yarn test - - uses: codecov/codecov-action@v3 - with: - token: ${{ secrets.CODECOV_TOKEN }} - files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml,./providers/libretranslate/coverage/clover.xml - flags: unittests - name: codecov-umbrella - + uses: ./.github/workflows/unittest.yml e2e: - strategy: - matrix: - node: [14, 16, 18] - strapi: [4.6.2, 4.7.1, 4.8.2] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} - cache: 'yarn' - - run: cp playground/.env.test playground/.env - - run: VERSION=${{ matrix.strapi }} envsubst < playground/templates/template.package.json > playground/package.json - - run: yarn - - run: yarn workspace playground build - - run: yarn workspace playground e2e - - uses: actions/upload-artifact@v3 - with: - name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) - path: | - playground/cypress/videos/* - playground/cypress/screenshots/* + uses: ./.github/workflows/e2e.yml diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml new file mode 100644 index 00000000..e3caf0a6 --- /dev/null +++ b/.github/workflows/unittest.yml @@ -0,0 +1,22 @@ +on: + workflow_call: +jobs: + unittest: + strategy: + matrix: + version: [14, 16, 18] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.version }} + cache: 'yarn' + - run: yarn + - run: yarn test + - uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./plugin/coverage/clover.xml,./providers/deepl/coverage/clover.xml,./providers/libretranslate/coverage/clover.xml + flags: unittests + name: codecov-umbrella From 1c3b9c6a858418eee0d4a2cfe0b2967205280074 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 2 Apr 2023 23:31:24 +0200 Subject: [PATCH 26/50] chore(e2e): load environment variables with dotenv --- playground/cypress.config.js | 10 +- .../cypress/e2e/batch-translation.cy.js | 4 +- .../cypress/e2e/direct-translation.cy.js | 6 +- playground/cypress/support/commands.js | 6 +- playground/package.json | 3 +- playground/templates/template.package.json | 2 +- yarn.lock | 296 ++++++++++++++---- 7 files changed, 252 insertions(+), 75 deletions(-) diff --git a/playground/cypress.config.js b/playground/cypress.config.js index 0ba08c13..483a41ea 100644 --- a/playground/cypress.config.js +++ b/playground/cypress.config.js @@ -1,10 +1,18 @@ const { defineConfig } = require('cypress') +const dotenv = require('dotenv') + +dotenv.config({ path: process.env.ENV_PATH }) + module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { // implement node event listeners here }, - baseUrl: 'http://localhost:1337', + baseUrl: `http://${process.env.HOST}:${process.env.PORT}`, + }, + env: { + ADMIN_MAIL: process.env.INIT_ADMIN_EMAIL, + ADMIN_PASSWORD: process.env.INIT_ADMIN_PASSWORD, }, }) diff --git a/playground/cypress/e2e/batch-translation.cy.js b/playground/cypress/e2e/batch-translation.cy.js index 6e340f73..73ea0d13 100644 --- a/playground/cypress/e2e/batch-translation.cy.js +++ b/playground/cypress/e2e/batch-translation.cy.js @@ -10,7 +10,7 @@ describe('batch translation', () => { ) // Login and Navigate to Translate Page - cy.login('admin@example.com', 'admin') + cy.login() cy.get('nav').contains('Translate').click() cy.wait('@batchTranslateContentTypes') @@ -58,7 +58,7 @@ describe('batch translation', () => { ) // Login and Navigate to Translate Page - cy.login('admin@example.com', 'admin') + cy.login() cy.get('nav').contains('Translate').click() cy.wait('@batchTranslateContentTypes') diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js index 800b5315..bd1b0aa0 100644 --- a/playground/cypress/e2e/direct-translation.cy.js +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -7,7 +7,7 @@ describe('direct translation', () => { cy.intercept('/translate/translate').as('translateExecution') // Login and Navigate to article - cy.login('admin@example.com', 'admin') + cy.login() cy.get('nav').contains('Content Manager').click() cy.contains('A bug is becoming a meme on the internet').click() @@ -48,7 +48,7 @@ describe('direct translation', () => { cy.intercept('/translate/translate').as('translateExecution') // Login and Navigate to article - cy.login('admin@example.com', 'admin') + cy.login() cy.get('nav').contains('Content Manager').click() cy.get('nav[aria-label=Content]').contains('Category').click() @@ -123,7 +123,7 @@ describe('direct translation', () => { cy.intercept('/content-manager/uid/check-availability').as('regenerateUID') // Login and Navigate to article - cy.login('admin@example.com', 'admin') + cy.login() cy.get('nav').contains('Content Manager').click() cy.get('nav[aria-label=Content]').contains('Homepage').click() diff --git a/playground/cypress/support/commands.js b/playground/cypress/support/commands.js index 85d121cb..5930227f 100644 --- a/playground/cypress/support/commands.js +++ b/playground/cypress/support/commands.js @@ -10,10 +10,10 @@ // // // -- This is a parent command -- -Cypress.Commands.add('login', (email, password) => { +Cypress.Commands.add('login', () => { cy.visit('/admin/auth/login') - cy.get('input[name=email]').type(email) - cy.get('input[name=password]').type(`${password}{enter}`) + cy.get('input[name=email]').type(Cypress.env('ADMIN_MAIL')) + cy.get('input[name=password]').type(`${Cypress.env('ADMIN_PASSWORD')}{enter}`) }) // // diff --git a/playground/package.json b/playground/package.json index d5737260..d5c246a9 100644 --- a/playground/package.json +++ b/playground/package.json @@ -5,6 +5,7 @@ "@strapi/plugin-users-permissions": "4.7.1", "@strapi/strapi": "4.7.1", "better-sqlite3": "8.2.0", + "dotenv": "^16.0.3", "lodash.set": "^4.3.2", "mime-types": "^2.1.27", "strapi-plugin-init-admin-user": "^0.2.1" @@ -21,7 +22,7 @@ "reset": "node scripts/reset.js", "cy:run": "cypress run", "test": "echo no unittests", - "e2e": "start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" + "e2e": "ENV_PATH='./.env.test' start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" }, "devDependencies": { "cypress": "^12.7.0", diff --git a/playground/templates/template.package.json b/playground/templates/template.package.json index a7d14d3c..73b016dd 100644 --- a/playground/templates/template.package.json +++ b/playground/templates/template.package.json @@ -21,7 +21,7 @@ "reset": "node scripts/reset.js", "cy:run": "cypress run", "test": "echo no unittests", - "e2e": "start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" + "e2e": "ENV_PATH='./.env.test' start-server-and-test 'yarn start' http://0.0.0.0:1337 'yarn cy:run'" }, "devDependencies": { "cypress": "^12.7.0", diff --git a/yarn.lock b/yarn.lock index 2ce4f37d..0180bec6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1333,7 +1333,7 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.10" -"@babel/runtime@>=7.11.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@>=7.11.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== @@ -1487,6 +1487,16 @@ "@codemirror/view" "^6.0.0" "@lezer/common" "^1.0.0" +"@codemirror/commands@^6.1.0": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.2.tgz#437d9ba275107dbc629f0bfa3b150e0e43f2a218" + integrity sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.2.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@codemirror/lang-json@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" @@ -1525,7 +1535,7 @@ "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": +"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2" integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA== @@ -2085,6 +2095,13 @@ dependencies: tslib "^2.4.0" +"@formatjs/fast-memoize@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" + integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== + dependencies: + tslib "^2.4.0" + "@formatjs/icu-messageformat-parser@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.2.0.tgz#9221f7f4dbaf634a84e459a49017a872e708dcfa" @@ -2094,6 +2111,15 @@ "@formatjs/icu-skeleton-parser" "1.3.18" tslib "^2.4.0" +"@formatjs/icu-messageformat-parser@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.0.tgz#8e8fd577c3e39454ef14bba4963f2e1d5f2cc46c" + integrity sha512-xqtlqYAbfJDF4b6e4O828LBNOWXrFcuYadqAbYORlDRwhyJ2bH+xpUBPldZbzRGUN2mxlZ4Ykhm7jvERtmI8NQ== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/icu-skeleton-parser" "1.3.18" + tslib "^2.4.0" + "@formatjs/icu-skeleton-parser@1.3.18": version "1.3.18" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz#7aed3d60e718c8ad6b0e64820be44daa1e29eeeb" @@ -2111,6 +2137,15 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" +"@formatjs/intl-displaynames@6.2.6": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.2.6.tgz#6bc02fe0bf6571391aac0e01e74ecbf38542ff32" + integrity sha512-scf5AQTk9EjpvPhboo5sizVOvidTdMOnajv9z+0cejvl7JNl9bl/aMrNBgC72UH+bP3l45usPUKAGskV6sNIrA== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + "@formatjs/intl-listformat@7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.7.tgz#b46fec1038ef9ca062d1e7b9b3412c2a14dca18f" @@ -2120,6 +2155,15 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" +"@formatjs/intl-listformat@7.1.9": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.9.tgz#0c2ce67b610054f215dd2635a6da7da308cfbe3d" + integrity sha512-5YikxwRqRXTVWVujhswDOTCq6gs+m9IcNbNZLa6FLtyBStAjEsuE2vAU+lPsbz9ZTST57D5fodjIh2JXT6sMWQ== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/intl-localematcher" "0.2.32" + tslib "^2.4.0" + "@formatjs/intl-localematcher@0.2.32": version "0.2.32" resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" @@ -2140,6 +2184,19 @@ intl-messageformat "10.3.0" tslib "^2.4.0" +"@formatjs/intl@2.6.9": + version "2.6.9" + resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.6.9.tgz#d4bdd8c21888f579a95341580141d0aafe761610" + integrity sha512-EtcMZ9O24YSASu/jGOaTQtArx7XROjlKiO4KmkxJ/3EyAQLCr5hrS+KKvNud0a7GIwBucOb3IFrZ7WiSm2A/Cw== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.3.0" + "@formatjs/intl-displaynames" "6.2.6" + "@formatjs/intl-listformat" "7.1.9" + intl-messageformat "10.3.3" + tslib "^2.4.0" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -3409,6 +3466,19 @@ compute-scroll-into-view "^1.0.17" prop-types "^15.7.2" +"@strapi/design-system@1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@strapi/design-system/-/design-system-1.6.6.tgz#42eef982bcd0499e4dbce4a8feadedbed2491e1f" + integrity sha512-CIOCQDJukv2VFEAF5N4wZ2sddRWuJIjN663yuE0nVTAO7dbxZepDkgA4QLk/tgWQmt9vWt4VUFK2REW7tfHUcg== + dependencies: + "@codemirror/lang-json" "^6.0.1" + "@floating-ui/react-dom" "^1.0.0" + "@internationalized/number" "^3.1.1" + "@radix-ui/react-use-callback-ref" "^1.0.0" + "@uiw/react-codemirror" "^4.19.7" + compute-scroll-into-view "^1.0.17" + prop-types "^15.7.2" + "@strapi/generate-new@4.7.1": version "4.7.1" resolved "https://registry.yarnpkg.com/@strapi/generate-new/-/generate-new-4.7.1.tgz#2b6b4b146eee4c12a7693dd403a515f5255385fc" @@ -3456,11 +3526,32 @@ react-intl "6.2.8" react-select "5.6.0" +"@strapi/helper-plugin@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@strapi/helper-plugin/-/helper-plugin-4.9.0.tgz#efb28c07dc516e0160724ec734c296b8c0d4f74a" + integrity sha512-O8vzIjHOQd5c2iXWY4fi5dm7w4XYceLuUqQZXKLb+lKtJMfh3lxd31vpQazzRhbZvZ9296hYhg3B+lphA9X1gg== + dependencies: + axios "1.3.4" + date-fns "2.29.3" + formik "^2.2.6" + immer "9.0.19" + lodash "4.17.21" + prop-types "^15.7.2" + qs "6.11.1" + react-helmet "^6.1.0" + react-intl "6.3.2" + react-select "5.7.0" + "@strapi/icons@1.6.3": version "1.6.3" resolved "https://registry.yarnpkg.com/@strapi/icons/-/icons-1.6.3.tgz#ef9987dcdd26a51702777bc94d1b98cea551f532" integrity sha512-Tuwo/NOw8jO+9UPIRnRHdI/y0YR6MhWsbLFJL6Q+haKwl1WhXQigXaZQJfOy0H89wRZcSesSv9gLAWqiGAhOjw== +"@strapi/icons@1.6.6": + version "1.6.6" + resolved "https://registry.yarnpkg.com/@strapi/icons/-/icons-1.6.6.tgz#e5259cdb6fc2425e926dfb0afc6e7c72748f1bab" + integrity sha512-DxPX2WycDzoDmfi4KU7jQ7aDGTC//Sb67LxTjX2WsNeRgZrl0KxA9h2p8ZeGDD/UEw1GjPAq/x1jYAPn7/j3mQ== + "@strapi/logger@4.7.1": version "4.7.1" resolved "https://registry.yarnpkg.com/@strapi/logger/-/logger-4.7.1.tgz#049dbb4d2ceb797bc5bb0da947209f06624d6dd2" @@ -3520,13 +3611,16 @@ lodash "4.17.21" "@strapi/plugin-graphql@^4.7.1": - version "4.7.1" - resolved "https://registry.yarnpkg.com/@strapi/plugin-graphql/-/plugin-graphql-4.7.1.tgz#587c8b358c1b38de330c527bf861bfc793f5c4e2" - integrity sha512-CQ886AY5tlOqxfQVAscB1I3xxvJQwAfU7nZYXKoWX0ikmfBI9GzTS9ldtcxcy4Tb6L8bsTPrgNm/H2+plwnsvw== + version "4.9.0" + resolved "https://registry.yarnpkg.com/@strapi/plugin-graphql/-/plugin-graphql-4.9.0.tgz#b152e6d9e267ad468232b44720bcfda9a2e0995b" + integrity sha512-0HN2nTSZKnHtaYnlZxrIMEFarpbXPDo2+ki8uIe3HOs7V6rEp7QKTiVn5qRZdc/X+Zyv5AOUOZ27onsH0hazxg== dependencies: "@graphql-tools/schema" "8.5.1" "@graphql-tools/utils" "^8.12.0" - "@strapi/utils" "4.7.1" + "@strapi/design-system" "1.6.6" + "@strapi/helper-plugin" "4.9.0" + "@strapi/icons" "1.6.6" + "@strapi/utils" "4.9.0" apollo-server-core "3.11.1" apollo-server-koa "3.10.0" glob "^7.1.7" @@ -3539,7 +3633,6 @@ lodash "4.17.21" nexus "1.3.0" pluralize "^8.0.0" - subscriptions-transport-ws "0.9.19" "@strapi/plugin-i18n@4.7.1": version "4.7.1" @@ -3722,6 +3815,18 @@ p-map "4.0.0" yup "0.32.9" +"@strapi/utils@4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@strapi/utils/-/utils-4.9.0.tgz#35731524d4c237f046b4fb4df1c32730dc85ad7d" + integrity sha512-Tyr2Qk4pixl1uVVLdF0hehwaEKBiYqaB7/JMSzjsaN8/8XwLPEi5Y3cymYkzZy2Dcyl58FW+V+3fHmAUN39y9A== + dependencies: + "@sindresorhus/slugify" "1.1.0" + date-fns "2.29.3" + http-errors "1.8.1" + lodash "4.17.21" + p-map "4.0.0" + yup "0.32.9" + "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -4306,6 +4411,19 @@ dependencies: "@ucast/core" "^1.4.1" +"@uiw/codemirror-extensions-basic-setup@4.19.11": + version "4.19.11" + resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.19.11.tgz#377559371b8e92bef14282309155613128cdbc24" + integrity sha512-yT7DtFUZESyqyMm0kcMbT6dQ8TIK8tcA6XzMtkgLtsiB883rlc9kYVJScyDz8M9mCckycVbuFlhEdqN54PoiGw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/commands" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/search" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@uiw/react-codemirror@4.8.1": version "4.8.1" resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.8.1.tgz#7edb13e42256dfc0b20986b7a677452d3655e717" @@ -4315,6 +4433,18 @@ "@codemirror/theme-one-dark" "^6.0.0" codemirror "^6.0.0" +"@uiw/react-codemirror@^4.19.7": + version "4.19.11" + resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.19.11.tgz#b8302fbcbbbd31c54234a9d84d5d25e8a01197eb" + integrity sha512-KoTMg0krVi8EgIPotMYAfTTB+9U4CrJe1ZeSLVR92Wif0pPjYLN5TQF0kqiiH97gJNGHVte/mUftmDjK7Sv2ZA== + dependencies: + "@babel/runtime" "^7.18.6" + "@codemirror/commands" "^6.1.0" + "@codemirror/state" "^6.1.1" + "@codemirror/theme-one-dark" "^6.0.0" + "@uiw/codemirror-extensions-basic-setup" "4.19.11" + codemirror "^6.0.0" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -5056,6 +5186,15 @@ axios@1.2.2: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + "axios@>=0.21.2 <1.2.0 || >=1.2.1", axios@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.2.tgz#7ac517f0fa3ec46e0e636223fd973713a09c72b3" @@ -5207,11 +5346,6 @@ babel-preset-jest@^29.4.0: babel-plugin-jest-hoist "^29.4.0" babel-preset-current-node-syntax "^1.0.0" -backo2@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -6011,9 +6145,9 @@ co@^4.6.0: integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= codemirror@^5.65.11: - version "5.65.11" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.11.tgz#c818edc3274788c008f636520c5490a1f7009b4f" - integrity sha512-Gp62g2eKSCHYt10axmGhKq3WoJSvVpvhXmowNq7pZdRVowwtvBR/hi2LSP5srtctKkRT33T6/n8Kv1UGp7JW4A== + version "5.65.12" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.12.tgz#294fdf097d10ac5b56a9e011a91eff252afc73ae" + integrity sha512-z2jlHBocElRnPYysN2HAuhXbO3DNB0bcSKmNz3hcWR2Js2Dkhc1bEOxG93Z3DeUrnm+qx56XOY5wQmbP5KY0sw== codemirror@^6.0.0: version "6.0.1" @@ -7130,6 +7264,11 @@ dotenv@8.5.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.5.1.tgz#e3a4c7862daba51b92bce0da5c349f11faa28663" integrity sha512-qC1FbhCH7UH7B+BcRNUDhAk04d/n+tnGGB1ctwndZkVFeehYJOn39pRWWzmdzpFqImyX1KB8tO0DCHLf8yRaYQ== +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + duplexer2@~0.1.0: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -7796,11 +7935,6 @@ eventemitter2@6.4.7: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -9555,6 +9689,16 @@ intl-messageformat@10.3.0: "@formatjs/icu-messageformat-parser" "2.2.0" tslib "^2.4.0" +intl-messageformat@10.3.3: + version "10.3.3" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.3.tgz#576798d31c9f8d90f9beadaa5a3878b8d30177a2" + integrity sha512-un/f07/g2e/3Q8e1ghDKET+el22Bi49M7O/rHxd597R+oLpPOMykSv5s51cABVfu3FZW+fea4hrzf2MHu1W4hw== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/fast-memoize" "2.0.1" + "@formatjs/icu-messageformat-parser" "2.3.0" + tslib "^2.4.0" + into-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" @@ -10173,7 +10317,7 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.2.1, iterall@^1.3.0: +iterall@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== @@ -11052,6 +11196,14 @@ language-tags@=1.0.5: dependencies: language-subtag-registry "~0.3.2" +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + lazy-ass@1.6.0, lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" @@ -13633,6 +13785,13 @@ qs@6.11.0, qs@^6.10.2, qs@^6.10.3, qs@^6.4.0, qs@^6.5.2, qs@^6.9.6: dependencies: side-channel "^1.0.4" +qs@6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" + qs@~6.10.3: version "6.10.5" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" @@ -13770,6 +13929,22 @@ react-intl@6.2.8: intl-messageformat "10.3.0" tslib "^2.4.0" +react-intl@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.3.2.tgz#0816f0943690dbc6186ab1a2968eb378ba9c99f7" + integrity sha512-NT03zOHRAFGcZdTx4cXcVKZtnWBOM6RfLPK8Q67eA+Ba+pHdYb+cmrahncqAnevZKgO1r/nEauiVFKwQeudLIw== + dependencies: + "@formatjs/ecma402-abstract" "1.14.3" + "@formatjs/icu-messageformat-parser" "2.3.0" + "@formatjs/intl" "2.6.9" + "@formatjs/intl-displaynames" "6.2.6" + "@formatjs/intl-listformat" "7.1.9" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/react" "16 || 17 || 18" + hoist-non-react-statics "^3.3.2" + intl-messageformat "10.3.3" + tslib "^2.4.0" + react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -13870,6 +14045,21 @@ react-select@5.6.0: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.1.2" +react-select@5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" + integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== + dependencies: + "@babel/runtime" "^7.12.0" + "@emotion/cache" "^11.4.0" + "@emotion/react" "^11.8.1" + "@floating-ui/dom" "^1.0.1" + "@types/react-transition-group" "^4.4.0" + memoize-one "^6.0.0" + prop-types "^15.6.0" + react-transition-group "^4.3.0" + use-isomorphic-layout-effect "^1.1.2" + react-side-effect@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" @@ -14028,14 +14218,7 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -redux@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" - integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== - dependencies: - "@babel/runtime" "^7.9.2" - -redux@^4.1.2, redux@^4.2.1: +redux@^4.1.1, redux@^4.1.2, redux@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -14239,9 +14422,9 @@ reselect@4.0.0: integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== reselect@^4.0.0: - version "4.1.6" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.6.tgz#19ca2d3d0b35373a74dc1c98692cdaffb6602656" - integrity sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ== + version "4.1.7" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.7.tgz#56480d9ff3d3188970ee2b76527bd94a95567a42" + integrity sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A== resolve-alpn@^1.0.0: version "1.2.1" @@ -14734,6 +14917,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" + integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + showdown@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/showdown/-/showdown-2.1.0.tgz#1251f5ed8f773f0c0c7bfc8e6fd23581f9e545c5" @@ -15404,17 +15592,6 @@ stylis@4.1.3: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== -subscriptions-transport-ws@0.9.19: - version "0.9.19" - resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf" - integrity sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw== - dependencies: - backo2 "^1.0.2" - eventemitter3 "^3.1.0" - iterall "^1.2.1" - symbol-observable "^1.0.4" - ws "^5.2.0 || ^6.0.0 || ^7.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -15462,11 +15639,6 @@ swap-case@^1.1.0: lower-case "^1.1.1" upper-case "^1.1.1" -symbol-observable@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -16372,9 +16544,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.11.1: - version "4.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" - integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + version "4.13.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" + integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -16395,6 +16567,7 @@ webpack-dev-server@^4.11.1: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" @@ -16404,7 +16577,7 @@ webpack-dev-server@^4.11.1: sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + ws "^8.13.0" webpack-merge@^5.7.3: version "5.8.0" @@ -16428,9 +16601,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.75.0: - version "5.76.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" - integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== + version "5.77.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" + integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" @@ -16675,20 +16848,15 @@ ws@8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== -"ws@^5.2.0 || ^6.0.0 || ^7.0.0": - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - ws@^8.11.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== -ws@^8.4.2: - version "8.10.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.10.0.tgz#00a28c09dfb76eae4eb45c3b565f771d6951aa51" - integrity sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== xdg-basedir@^4.0.0: version "4.0.0" From e5776b27957523017a435e8df880d69f61763860 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 2 Apr 2023 23:31:55 +0200 Subject: [PATCH 27/50] chore(e2e): remove unnecessary fixture file --- playground/cypress/fixtures/example.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 playground/cypress/fixtures/example.json diff --git a/playground/cypress/fixtures/example.json b/playground/cypress/fixtures/example.json deleted file mode 100644 index 02e42543..00000000 --- a/playground/cypress/fixtures/example.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "Using fixtures to represent data", - "email": "hello@cypress.io", - "body": "Fixtures are a great way to mock data for responses to routes" -} From edc2d0ce02bc69c71265bd5fe4c2bab97b306cb7 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 2 Apr 2023 23:42:50 +0200 Subject: [PATCH 28/50] ci(e2e): always upload videos --- .github/workflows/e2e.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 766e2666..13e6bdf9 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -18,6 +18,7 @@ jobs: - run: yarn workspace playground build - run: yarn workspace playground e2e - uses: actions/upload-artifact@v3 + if: always() with: name: cypress results (node=${{ matrix.node }},strapi=${{ matrix.strapi }}) path: | From 4f1f697ce323fdbaafc8d456847481ca6ce3d943 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Mon, 3 Apr 2023 00:48:11 +0200 Subject: [PATCH 29/50] ci(build): fix release job dependencies --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6388f4f9..37dbec96 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,9 +14,9 @@ jobs: release: needs: - - eslint - - commitlint + - lint - unittest + - e2e name: Release runs-on: ubuntu-latest steps: From 867d47bd221ae371a06c9dfc40a078ada860a980 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 14:41:57 +0200 Subject: [PATCH 30/50] build(deps): playground: remove graphql plugin It is not necessary for the playground as there is no frontend interaction required --- playground/package.json | 1 - yarn.lock | 794 +--------------------------------------- 2 files changed, 17 insertions(+), 778 deletions(-) diff --git a/playground/package.json b/playground/package.json index d5c246a9..fd45e549 100644 --- a/playground/package.json +++ b/playground/package.json @@ -1,6 +1,5 @@ { "dependencies": { - "@strapi/plugin-graphql": "^4.7.1", "@strapi/plugin-i18n": "4.7.1", "@strapi/plugin-users-permissions": "4.7.1", "@strapi/strapi": "4.7.1", diff --git a/yarn.lock b/yarn.lock index 0180bec6..a801ef13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,89 +17,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@apollo/protobufjs@1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" - integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - -"@apollo/utils.dropunuseddefinitions@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" - integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== - -"@apollo/utils.keyvaluecache@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.1.tgz#46f310f859067efe9fa126156c6954f8381080d2" - integrity sha512-nLgYLomqjVimEzQ4cdvVQkcryi970NDvcRVPfd0OPeXhBfda38WjBq+WhQFk+czSHrmrSp34YHBxpat0EtiowA== - dependencies: - "@apollo/utils.logger" "^1.0.0" - lru-cache "^7.10.1" - -"@apollo/utils.logger@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.1.tgz#aea0d1bb7ceb237f506c6bbf38f10a555b99a695" - integrity sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA== - -"@apollo/utils.printwithreducedwhitespace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" - integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== - -"@apollo/utils.removealiases@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" - integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== - -"@apollo/utils.sortast@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" - integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== - dependencies: - lodash.sortby "^4.7.0" - -"@apollo/utils.stripsensitiveliterals@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" - integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== - -"@apollo/utils.usagereporting@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.0.tgz#b81df180f4ca78b91a22cb49105174a7f070db1e" - integrity sha512-5PL7hJMkTPmdo3oxPtigRrIyPxDk/ddrUryHPDaezL1lSFExpNzsDd2f1j0XJoHOg350GRd3LyD64caLA2PU1w== - dependencies: - "@apollo/utils.dropunuseddefinitions" "^1.1.0" - "@apollo/utils.printwithreducedwhitespace" "^1.1.0" - "@apollo/utils.removealiases" "1.0.0" - "@apollo/utils.sortast" "^1.1.0" - "@apollo/utils.stripsensitiveliterals" "^1.2.0" - apollo-reporting-protobuf "^3.3.1" - -"@apollographql/apollo-tools@^0.5.3": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" - integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== - -"@apollographql/graphql-playground-html@1.6.29": - version "1.6.29" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" - integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== - dependencies: - xss "^1.0.8" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" @@ -1333,7 +1250,7 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.10" -"@babel/runtime@>=7.11.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@>=7.11.0", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.15.4", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== @@ -1487,16 +1404,6 @@ "@codemirror/view" "^6.0.0" "@lezer/common" "^1.0.0" -"@codemirror/commands@^6.1.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.2.tgz#437d9ba275107dbc629f0bfa3b150e0e43f2a218" - integrity sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw== - dependencies: - "@codemirror/language" "^6.0.0" - "@codemirror/state" "^6.2.0" - "@codemirror/view" "^6.0.0" - "@lezer/common" "^1.0.0" - "@codemirror/lang-json@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@codemirror/lang-json/-/lang-json-6.0.1.tgz#0a0be701a5619c4b0f8991f9b5e95fe33f462330" @@ -1535,7 +1442,7 @@ "@codemirror/view" "^6.0.0" crelt "^1.0.5" -"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": +"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": version "6.2.0" resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2" integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA== @@ -2095,13 +2002,6 @@ dependencies: tslib "^2.4.0" -"@formatjs/fast-memoize@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.0.1.tgz#f15aaa73caad5562899c69bdcad8db82adcd3b0b" - integrity sha512-M2GgV+qJn5WJQAYewz7q2Cdl6fobQa69S1AzSM2y0P68ZDbK5cWrJIcPCO395Of1ksftGZoOt4LYCO/j9BKBSA== - dependencies: - tslib "^2.4.0" - "@formatjs/icu-messageformat-parser@2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.2.0.tgz#9221f7f4dbaf634a84e459a49017a872e708dcfa" @@ -2111,15 +2011,6 @@ "@formatjs/icu-skeleton-parser" "1.3.18" tslib "^2.4.0" -"@formatjs/icu-messageformat-parser@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.3.0.tgz#8e8fd577c3e39454ef14bba4963f2e1d5f2cc46c" - integrity sha512-xqtlqYAbfJDF4b6e4O828LBNOWXrFcuYadqAbYORlDRwhyJ2bH+xpUBPldZbzRGUN2mxlZ4Ykhm7jvERtmI8NQ== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-skeleton-parser" "1.3.18" - tslib "^2.4.0" - "@formatjs/icu-skeleton-parser@1.3.18": version "1.3.18" resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz#7aed3d60e718c8ad6b0e64820be44daa1e29eeeb" @@ -2137,15 +2028,6 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" -"@formatjs/intl-displaynames@6.2.6": - version "6.2.6" - resolved "https://registry.yarnpkg.com/@formatjs/intl-displaynames/-/intl-displaynames-6.2.6.tgz#6bc02fe0bf6571391aac0e01e74ecbf38542ff32" - integrity sha512-scf5AQTk9EjpvPhboo5sizVOvidTdMOnajv9z+0cejvl7JNl9bl/aMrNBgC72UH+bP3l45usPUKAGskV6sNIrA== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - "@formatjs/intl-listformat@7.1.7": version "7.1.7" resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.7.tgz#b46fec1038ef9ca062d1e7b9b3412c2a14dca18f" @@ -2155,15 +2037,6 @@ "@formatjs/intl-localematcher" "0.2.32" tslib "^2.4.0" -"@formatjs/intl-listformat@7.1.9": - version "7.1.9" - resolved "https://registry.yarnpkg.com/@formatjs/intl-listformat/-/intl-listformat-7.1.9.tgz#0c2ce67b610054f215dd2635a6da7da308cfbe3d" - integrity sha512-5YikxwRqRXTVWVujhswDOTCq6gs+m9IcNbNZLa6FLtyBStAjEsuE2vAU+lPsbz9ZTST57D5fodjIh2JXT6sMWQ== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/intl-localematcher" "0.2.32" - tslib "^2.4.0" - "@formatjs/intl-localematcher@0.2.32": version "0.2.32" resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz#00d4d307cd7d514b298e15a11a369b86c8933ec1" @@ -2184,84 +2057,11 @@ intl-messageformat "10.3.0" tslib "^2.4.0" -"@formatjs/intl@2.6.9": - version "2.6.9" - resolved "https://registry.yarnpkg.com/@formatjs/intl/-/intl-2.6.9.tgz#d4bdd8c21888f579a95341580141d0aafe761610" - integrity sha512-EtcMZ9O24YSASu/jGOaTQtArx7XROjlKiO4KmkxJ/3EyAQLCr5hrS+KKvNud0a7GIwBucOb3IFrZ7WiSm2A/Cw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.0" - "@formatjs/intl-displaynames" "6.2.6" - "@formatjs/intl-listformat" "7.1.9" - intl-messageformat "10.3.3" - tslib "^2.4.0" - "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== -"@graphql-tools/merge@8.3.1": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" - integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== - dependencies: - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - -"@graphql-tools/merge@8.3.7": - version "8.3.7" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.7.tgz#05bdb8135012c6d0f298fd0d04ee950daa926078" - integrity sha512-su9cUb0gtbvKTmD3LJ3EoUkdqmJ3KBk1efJGvUoN8tFzVVBdxgfOVxwLGI2GgIHcKRVvfhumkjHsa2aneHSY+Q== - dependencies: - "@graphql-tools/utils" "8.13.0" - tslib "^2.4.0" - -"@graphql-tools/mock@^8.1.2": - version "8.7.7" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.7.tgz#d271bb3c32543ee2e53a19b63affce40ba41d180" - integrity sha512-0KVikQjJJYmm9AEjM1OoXRd0KZOrQoPIXhFWm6wrNB4vqz1iMrySiIHoIaPoLjV/QWZz+aKYRYdnjlQ6btrBFA== - dependencies: - "@graphql-tools/schema" "9.0.5" - "@graphql-tools/utils" "8.13.0" - fast-json-stable-stringify "^2.1.0" - tslib "^2.4.0" - -"@graphql-tools/schema@8.5.1", "@graphql-tools/schema@^8.0.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" - integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== - dependencies: - "@graphql-tools/merge" "8.3.1" - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - value-or-promise "1.0.11" - -"@graphql-tools/schema@9.0.5": - version "9.0.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.5.tgz#5efc3c866a0344e5750372a72551a8bf945b247f" - integrity sha512-JPxFumaPQp6pRnrofy7rWVNW57r/1RISNxBCGOudFmjfRE2PlO6b766pxhDnggm/yMR3yzR+mA/JHpOK+ij+EA== - dependencies: - "@graphql-tools/merge" "8.3.7" - "@graphql-tools/utils" "8.13.0" - tslib "^2.4.0" - value-or-promise "1.0.11" - -"@graphql-tools/utils@8.13.0", "@graphql-tools/utils@^8.12.0": - version "8.13.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.13.0.tgz#24aae25d5e684d9d8bcf99a56ba31ac46b4d0275" - integrity sha512-cI4LdXElgVK2jFoq0DpANlvk4Di6kIapHsJI63RCepQ6xZe+mLI1mDrGdesG37s2BaABqV3RdTzeO/sPnTtyxQ== - dependencies: - tslib "^2.4.0" - -"@graphql-tools/utils@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" - integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== - dependencies: - tslib "^2.4.0" - "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -2513,11 +2313,6 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@josephg/resolvable@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" - integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== - "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -2592,7 +2387,7 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@koa/cors@3.4.3", "@koa/cors@^3.1.0": +"@koa/cors@3.4.3": version "3.4.3" resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-3.4.3.tgz#d669ee6e8d6e4f0ec4a7a7b0a17e7a3ed3752ebb" integrity sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw== @@ -3006,59 +2801,6 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - "@radix-ui/react-use-callback-ref@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz#9e7b8b6b4946fe3cbe8f748c82a2cce54e7b6a90" @@ -3466,19 +3208,6 @@ compute-scroll-into-view "^1.0.17" prop-types "^15.7.2" -"@strapi/design-system@1.6.6": - version "1.6.6" - resolved "https://registry.yarnpkg.com/@strapi/design-system/-/design-system-1.6.6.tgz#42eef982bcd0499e4dbce4a8feadedbed2491e1f" - integrity sha512-CIOCQDJukv2VFEAF5N4wZ2sddRWuJIjN663yuE0nVTAO7dbxZepDkgA4QLk/tgWQmt9vWt4VUFK2REW7tfHUcg== - dependencies: - "@codemirror/lang-json" "^6.0.1" - "@floating-ui/react-dom" "^1.0.0" - "@internationalized/number" "^3.1.1" - "@radix-ui/react-use-callback-ref" "^1.0.0" - "@uiw/react-codemirror" "^4.19.7" - compute-scroll-into-view "^1.0.17" - prop-types "^15.7.2" - "@strapi/generate-new@4.7.1": version "4.7.1" resolved "https://registry.yarnpkg.com/@strapi/generate-new/-/generate-new-4.7.1.tgz#2b6b4b146eee4c12a7693dd403a515f5255385fc" @@ -3526,32 +3255,11 @@ react-intl "6.2.8" react-select "5.6.0" -"@strapi/helper-plugin@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@strapi/helper-plugin/-/helper-plugin-4.9.0.tgz#efb28c07dc516e0160724ec734c296b8c0d4f74a" - integrity sha512-O8vzIjHOQd5c2iXWY4fi5dm7w4XYceLuUqQZXKLb+lKtJMfh3lxd31vpQazzRhbZvZ9296hYhg3B+lphA9X1gg== - dependencies: - axios "1.3.4" - date-fns "2.29.3" - formik "^2.2.6" - immer "9.0.19" - lodash "4.17.21" - prop-types "^15.7.2" - qs "6.11.1" - react-helmet "^6.1.0" - react-intl "6.3.2" - react-select "5.7.0" - "@strapi/icons@1.6.3": version "1.6.3" resolved "https://registry.yarnpkg.com/@strapi/icons/-/icons-1.6.3.tgz#ef9987dcdd26a51702777bc94d1b98cea551f532" integrity sha512-Tuwo/NOw8jO+9UPIRnRHdI/y0YR6MhWsbLFJL6Q+haKwl1WhXQigXaZQJfOy0H89wRZcSesSv9gLAWqiGAhOjw== -"@strapi/icons@1.6.6": - version "1.6.6" - resolved "https://registry.yarnpkg.com/@strapi/icons/-/icons-1.6.6.tgz#e5259cdb6fc2425e926dfb0afc6e7c72748f1bab" - integrity sha512-DxPX2WycDzoDmfi4KU7jQ7aDGTC//Sb67LxTjX2WsNeRgZrl0KxA9h2p8ZeGDD/UEw1GjPAq/x1jYAPn7/j3mQ== - "@strapi/logger@4.7.1": version "4.7.1" resolved "https://registry.yarnpkg.com/@strapi/logger/-/logger-4.7.1.tgz#049dbb4d2ceb797bc5bb0da947209f06624d6dd2" @@ -3610,30 +3318,6 @@ "@strapi/utils" "4.7.1" lodash "4.17.21" -"@strapi/plugin-graphql@^4.7.1": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@strapi/plugin-graphql/-/plugin-graphql-4.9.0.tgz#b152e6d9e267ad468232b44720bcfda9a2e0995b" - integrity sha512-0HN2nTSZKnHtaYnlZxrIMEFarpbXPDo2+ki8uIe3HOs7V6rEp7QKTiVn5qRZdc/X+Zyv5AOUOZ27onsH0hazxg== - dependencies: - "@graphql-tools/schema" "8.5.1" - "@graphql-tools/utils" "^8.12.0" - "@strapi/design-system" "1.6.6" - "@strapi/helper-plugin" "4.9.0" - "@strapi/icons" "1.6.6" - "@strapi/utils" "4.9.0" - apollo-server-core "3.11.1" - apollo-server-koa "3.10.0" - glob "^7.1.7" - graphql "^15.5.1" - graphql-depth-limit "^1.1.0" - graphql-playground-middleware-koa "^1.6.21" - graphql-scalars "1.20.1" - graphql-upload "^13.0.0" - koa-compose "^4.1.0" - lodash "4.17.21" - nexus "1.3.0" - pluralize "^8.0.0" - "@strapi/plugin-i18n@4.7.1": version "4.7.1" resolved "https://registry.yarnpkg.com/@strapi/plugin-i18n/-/plugin-i18n-4.7.1.tgz#5b3cdfd400609c62e0b06a586b954819b18d36f4" @@ -3815,18 +3499,6 @@ p-map "4.0.0" yup "0.32.9" -"@strapi/utils@4.9.0": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@strapi/utils/-/utils-4.9.0.tgz#35731524d4c237f046b4fb4df1c32730dc85ad7d" - integrity sha512-Tyr2Qk4pixl1uVVLdF0hehwaEKBiYqaB7/JMSzjsaN8/8XwLPEi5Y3cymYkzZy2Dcyl58FW+V+3fHmAUN39y9A== - dependencies: - "@sindresorhus/slugify" "1.1.0" - date-fns "2.29.3" - http-errors "1.8.1" - lodash "4.17.21" - p-map "4.0.0" - yup "0.32.9" - "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -3859,13 +3531,6 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@types/accepts@*", "@types/accepts@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - "@types/argparse@1.0.38": version "1.0.38" resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" @@ -3944,26 +3609,11 @@ dependencies: "@types/node" "*" -"@types/content-disposition@*": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.5.tgz#650820e95de346e1f84e30667d168c8fd25aa6e3" - integrity sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA== - "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== -"@types/cookies@*": - version "0.7.7" - resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" - integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== - dependencies: - "@types/connect" "*" - "@types/express" "*" - "@types/keygrip" "*" - "@types/node" "*" - "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -4056,21 +3706,11 @@ resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/http-assert@*": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" - integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== - "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== -"@types/http-errors@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.0.tgz#c1f34eee7f9fd5ddee366d15e2fc39b93c31532a" - integrity sha512-6mkB8Gx7Of1yjqqh1nLH22ATNol5+mIXVFaQCOQY+R3JxB6/soiqKAxBgdSE6R/1IWu69rR4cJ/027TxLEs/Vg== - "@types/http-proxy@^1.17.8": version "1.17.9" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" @@ -4127,11 +3767,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/keygrip@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" - integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== - "@types/keyv@*": version "4.2.0" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-4.2.0.tgz#65b97868ab757906f2dbb653590d7167ad023fa0" @@ -4139,41 +3774,6 @@ dependencies: keyv "*" -"@types/koa-bodyparser@^4.3.0": - version "4.3.9" - resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.9.tgz#7456736dfdc2fe8e7fdec402341c0fa1089a74e8" - integrity sha512-nHgnvM5wZhbxwVyMjAhW9SNcAighAMAmQCK56mrE1vOrFSfVJexf3CQ8pmBTx90P+qBSsLsDEVDX3EeP/WWQMg== - dependencies: - "@types/koa" "*" - -"@types/koa-compose@*", "@types/koa-compose@^3.2.5": - version "3.2.5" - resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" - integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== - dependencies: - "@types/koa" "*" - -"@types/koa@*", "@types/koa@^2.11.6": - version "2.13.5" - resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61" - integrity sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA== - dependencies: - "@types/accepts" "*" - "@types/content-disposition" "*" - "@types/cookies" "*" - "@types/http-assert" "*" - "@types/http-errors" "*" - "@types/keygrip" "*" - "@types/koa-compose" "*" - "@types/node" "*" - -"@types/koa__cors@^3.0.1": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@types/koa__cors/-/koa__cors-3.3.0.tgz#2986b320d3d7ddf05c4e2e472b25a321cb16bd3b" - integrity sha512-FUN8YxcBakIs+walVe3+HcNP+Bxd0SB8BJHBWkglZ5C1XQWljlKcEFDG/dPiCIqwVCUbc5X0nYDlH62uEhdHMA== - dependencies: - "@types/koa" "*" - "@types/liftoff@^2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@types/liftoff/-/liftoff-2.5.1.tgz#2eb4c1f86e9d5ee85571e56db0084b26af129ced" @@ -4193,11 +3793,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.186.tgz#862e5514dd7bd66ada6c70ee5fce844b06c8ee97" integrity sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw== -"@types/long@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -4223,11 +3818,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.7.tgz#8ccef136f240770c1379d50100796a6952f01f94" integrity sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ== -"@types/node@^10.1.0": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - "@types/node@^12.7.1": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" @@ -4411,19 +4001,6 @@ dependencies: "@ucast/core" "^1.4.1" -"@uiw/codemirror-extensions-basic-setup@4.19.11": - version "4.19.11" - resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.19.11.tgz#377559371b8e92bef14282309155613128cdbc24" - integrity sha512-yT7DtFUZESyqyMm0kcMbT6dQ8TIK8tcA6XzMtkgLtsiB883rlc9kYVJScyDz8M9mCckycVbuFlhEdqN54PoiGw== - dependencies: - "@codemirror/autocomplete" "^6.0.0" - "@codemirror/commands" "^6.0.0" - "@codemirror/language" "^6.0.0" - "@codemirror/lint" "^6.0.0" - "@codemirror/search" "^6.0.0" - "@codemirror/state" "^6.0.0" - "@codemirror/view" "^6.0.0" - "@uiw/react-codemirror@4.8.1": version "4.8.1" resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.8.1.tgz#7edb13e42256dfc0b20986b7a677452d3655e717" @@ -4433,18 +4010,6 @@ "@codemirror/theme-one-dark" "^6.0.0" codemirror "^6.0.0" -"@uiw/react-codemirror@^4.19.7": - version "4.19.11" - resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.19.11.tgz#b8302fbcbbbd31c54234a9d84d5d25e8a01197eb" - integrity sha512-KoTMg0krVi8EgIPotMYAfTTB+9U4CrJe1ZeSLVR92Wif0pPjYLN5TQF0kqiiH97gJNGHVte/mUftmDjK7Sv2ZA== - dependencies: - "@babel/runtime" "^7.18.6" - "@codemirror/commands" "^6.1.0" - "@codemirror/state" "^6.1.1" - "@codemirror/theme-one-dark" "^6.0.0" - "@uiw/codemirror-extensions-basic-setup" "4.19.11" - codemirror "^6.0.0" - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -4619,7 +4184,7 @@ abbrev@^1.0.0, abbrev@~1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@^1.3.5, accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -4826,106 +4391,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apollo-datasource@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" - integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - apollo-server-env "^4.2.1" - -apollo-reporting-protobuf@^3.3.1, apollo-reporting-protobuf@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.3.3.tgz#df2b7ff73422cd682af3f1805d32301aefdd9e89" - integrity sha512-L3+DdClhLMaRZWVmMbBcwl4Ic77CnEBPXLW53F7hkYhkaZD88ivbCVB1w/x5gunO6ZHrdzhjq0FHmTsBvPo7aQ== - dependencies: - "@apollo/protobufjs" "1.2.6" - -apollo-server-core@3.11.1, apollo-server-core@^3.10.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.11.1.tgz#89d83aeaa71a59f760ebfa35bb0cbd31e15474ca" - integrity sha512-t/eCKrRFK1lYZlc5pHD99iG7Np7CEm3SmbDiONA7fckR3EaB/pdsEdIkIwQ5QBBpT5JLp/nwvrZRVwhaWmaRvw== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - "@apollo/utils.usagereporting" "^1.0.0" - "@apollographql/apollo-tools" "^0.5.3" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.2" - apollo-reporting-protobuf "^3.3.3" - apollo-server-env "^4.2.1" - apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.7.1" - apollo-server-types "^3.7.1" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - node-abort-controller "^3.0.1" - sha.js "^2.4.11" - uuid "^9.0.0" - whatwg-mimetype "^3.0.0" - -apollo-server-env@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" - integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== - dependencies: - node-fetch "^2.6.7" - -apollo-server-errors@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" - integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== - -apollo-server-koa@3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-3.10.0.tgz#6f5cf0d23ca9dc6d6c020322ded5ea213747889d" - integrity sha512-OHaQRz0vvsALT2q+j4uWnCLRrUl1sM0H6JZvB2PfQwANsjTdwm2Eo6FO5etVByvrU4K1iXD6wBWid0Fjk0/OMQ== - dependencies: - "@koa/cors" "^3.1.0" - "@types/accepts" "^1.3.5" - "@types/koa" "^2.11.6" - "@types/koa-bodyparser" "^4.3.0" - "@types/koa-compose" "^3.2.5" - "@types/koa__cors" "^3.0.1" - accepts "^1.3.7" - apollo-server-core "^3.10.0" - apollo-server-types "^3.6.2" - koa-bodyparser "^4.3.0" - koa-compose "^4.1.0" - -apollo-server-plugin-base@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.1.tgz#aa78ef49bd114e35906ca9cf7493fed2664cbde8" - integrity sha512-g3vJStmQtQvjGI289UkLMfThmOEOddpVgHLHT2bNj0sCD/bbisj4xKbBHETqaURokteqSWyyd4RDTUe0wAUDNQ== - dependencies: - apollo-server-types "^3.7.1" - -apollo-server-types@^3.6.2: - version "3.6.3" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.6.3.tgz#7818cab914c865dafa53ea263ca6cb1854b4f05a" - integrity sha512-+7caNTLdevpWI2dGKSa7CWdyudO3NBuJ3HzcrYxjBei6Bth9YdRUNzPSFmBjlm2baHF0GsrMwLpjO+HStJzm3A== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - apollo-reporting-protobuf "^3.3.3" - apollo-server-env "^4.2.1" - -apollo-server-types@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.7.1.tgz#87adfcb52ec0893999a9cfafd5474bfda7ab0798" - integrity sha512-aE9RDVplmkaOj/OduNmGa+0a1B5RIWI0o3zC1zLvBTVWMKTpo0ifVf11TyMkLCY+T7cnZqVqwyShziOyC3FyUw== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - apollo-reporting-protobuf "^3.3.3" - apollo-server-env "^4.2.1" - "aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -5122,13 +4587,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-retry@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" - integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== - dependencies: - retry "0.13.1" - async@^3.1.0, async@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" @@ -5186,15 +4644,6 @@ axios@1.2.2: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - "axios@>=0.21.2 <1.2.0 || >=1.2.1", axios@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.2.tgz#7ac517f0fa3ec46e0e636223fd973713a09c72b3" @@ -5658,13 +5107,6 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" -busboy@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" - integrity sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw== - dependencies: - dicer "0.3.0" - byte-size@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" @@ -6129,16 +5571,6 @@ co-body@^5.1.1: raw-body "^2.2.0" type-is "^1.6.14" -co-body@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547" - integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ== - dependencies: - inflation "^2.0.0" - qs "^6.5.2" - raw-body "^2.3.3" - type-is "^1.6.16" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -6271,7 +5703,7 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== -commander@^2.20.0, commander@^2.20.3: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -6530,11 +5962,6 @@ copy-to-clipboard@^3.3.1: dependencies: toggle-selection "^1.0.6" -copy-to@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5" - integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w== - core-js-compat@^3.25.1: version "3.29.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" @@ -6699,11 +6126,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssfilter@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" - integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== - cssom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" @@ -7100,13 +6522,6 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -dicer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.3.0.tgz#eacd98b3bfbf92e8ab5c2fdb71aaac44bb06b872" - integrity sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA== - dependencies: - streamsearch "0.1.2" - diff-sequences@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" @@ -8509,11 +7924,6 @@ fromentries@^1.3.2: resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== -fs-capacitor@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/fs-capacitor/-/fs-capacitor-6.2.0.tgz#fa79ac6576629163cb84561995602d8999afb7f5" - integrity sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw== - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -8781,7 +8191,7 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: +glob@7.2.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -8955,61 +8365,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== -graphql-depth-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/graphql-depth-limit/-/graphql-depth-limit-1.1.0.tgz#59fe6b2acea0ab30ee7344f4c75df39cc18244e8" - integrity sha512-+3B2BaG8qQ8E18kzk9yiSdAa75i/hnnOwgSeAxVJctGQPvmeiLtqKOYF6HETCyRjiF7Xfsyal0HbLlxCQkgkrw== - dependencies: - arrify "^1.0.1" - -graphql-playground-html@^1.6.30: - version "1.6.30" - resolved "https://registry.yarnpkg.com/graphql-playground-html/-/graphql-playground-html-1.6.30.tgz#14c2a8eb7fc17bfeb1a746bbb28a11e34bf0b391" - integrity sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw== - dependencies: - xss "^1.0.6" - -graphql-playground-middleware-koa@^1.6.21: - version "1.6.22" - resolved "https://registry.yarnpkg.com/graphql-playground-middleware-koa/-/graphql-playground-middleware-koa-1.6.22.tgz#23937dd4dd73ae4c4cb8599b904b5ba59b4a2c3d" - integrity sha512-soVUM76ecq5GHk12H69Ce7afzbYuWWc73oKMOcEkmtAn/G9NUdsNvLjLdCnHQX1V0cOUeSbmcYcrebyBOIYGMQ== - dependencies: - graphql-playground-html "^1.6.30" - -graphql-scalars@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.20.1.tgz#295817deff224ac0562545858e370447b97e7457" - integrity sha512-HCSosMh8l/DVYL3/wCesnZOb+gbiaO/XlZQEIKOkWDJUGBrc15xWAs5TCQVmrycT0tbEInii+J8eoOyMwxx8zg== - dependencies: - tslib "~2.4.0" - -graphql-tag@^2.11.0: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql-upload@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/graphql-upload/-/graphql-upload-13.0.0.tgz#1a255b64d3cbf3c9f9171fa62a8fb0b9b59bb1d9" - integrity sha512-YKhx8m/uOtKu4Y1UzBFJhbBGJTlk7k4CydlUUiNrtxnwZv0WigbRHP+DVhRNKt7u7DXOtcKZeYJlGtnMXvreXA== - dependencies: - busboy "^0.3.1" - fs-capacitor "^6.2.0" - http-errors "^1.8.1" - object-path "^0.11.8" - "graphql@^15.0.0 || ^16.0.0": version "16.6.0" resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== -graphql@^15.5.1: - version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -9321,7 +8681,7 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@1.8.1, http-errors@^1.6.3, http-errors@^1.7.3, http-errors@^1.8.0, http-errors@^1.8.1, http-errors@~1.8.0: +http-errors@1.8.1, http-errors@^1.6.3, http-errors@^1.7.3, http-errors@^1.8.0, http-errors@~1.8.0: version "1.8.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== @@ -9689,16 +9049,6 @@ intl-messageformat@10.3.0: "@formatjs/icu-messageformat-parser" "2.2.0" tslib "^2.4.0" -intl-messageformat@10.3.3: - version "10.3.3" - resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.3.3.tgz#576798d31c9f8d90f9beadaa5a3878b8d30177a2" - integrity sha512-un/f07/g2e/3Q8e1ghDKET+el22Bi49M7O/rHxd597R+oLpPOMykSv5s51cABVfu3FZW+fea4hrzf2MHu1W4hw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/fast-memoize" "2.0.1" - "@formatjs/icu-messageformat-parser" "2.3.0" - tslib "^2.4.0" - into-stream@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702" @@ -10317,11 +9667,6 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - java-properties@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" @@ -11044,14 +10389,6 @@ koa-body@4.2.0: co-body "^5.1.1" formidable "^1.1.1" -koa-bodyparser@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a" - integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw== - dependencies: - co-body "^6.0.0" - copy-to "^2.0.1" - koa-compose@4.1.0, koa-compose@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" @@ -11594,11 +10931,6 @@ lodash.snakecase@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - lodash.startcase@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" @@ -11660,7 +10992,7 @@ logform@^2.2.0, logform@^2.3.2: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -loglevel@>=1.6.2, loglevel@^1.6.8: +loglevel@>=1.6.2: version "1.8.0" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== @@ -11670,11 +11002,6 @@ long-timeout@0.1.1: resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514" integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - longest@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" @@ -11725,7 +11052,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.10.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.14.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.0.tgz#21be64954a4680e303a09e9468f880b98a0b3c7f" integrity sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ== @@ -12387,14 +11714,6 @@ nerf-dart@^1.0.0: resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" integrity sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g== -nexus@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/nexus/-/nexus-1.3.0.tgz#d7e2671d48bf887e30e2815f509bbf4b0ee2a02b" - integrity sha512-w/s19OiNOs0LrtP7pBmD9/FqJHvZLmCipVRt6v1PM8cRUYIbhEswyNKGHVoC4eHZGPSnD+bOf5A3+gnbt0A5/A== - dependencies: - iterall "^1.3.0" - tslib "^2.0.3" - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -12422,11 +11741,6 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" -node-abort-controller@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== - node-addon-api@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.0.0.tgz#7d7e6f9ef89043befdb20c1989c905ebde18c501" @@ -12835,11 +12149,6 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.8: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -13778,20 +13087,13 @@ qrcode-terminal@^0.12.0: resolved "https://registry.yarnpkg.com/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz#bb5b699ef7f9f0505092a3748be4464fe71b5819" integrity sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ== -qs@6.11.0, qs@^6.10.2, qs@^6.10.3, qs@^6.4.0, qs@^6.5.2, qs@^6.9.6: +qs@6.11.0, qs@^6.10.2, qs@^6.10.3, qs@^6.4.0, qs@^6.9.6: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -qs@6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== - dependencies: - side-channel "^1.0.4" - qs@~6.10.3: version "6.10.5" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" @@ -13831,7 +13133,7 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.1, raw-body@^2.2.0, raw-body@^2.3.3: +raw-body@2.5.1, raw-body@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -13929,22 +13231,6 @@ react-intl@6.2.8: intl-messageformat "10.3.0" tslib "^2.4.0" -react-intl@6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/react-intl/-/react-intl-6.3.2.tgz#0816f0943690dbc6186ab1a2968eb378ba9c99f7" - integrity sha512-NT03zOHRAFGcZdTx4cXcVKZtnWBOM6RfLPK8Q67eA+Ba+pHdYb+cmrahncqAnevZKgO1r/nEauiVFKwQeudLIw== - dependencies: - "@formatjs/ecma402-abstract" "1.14.3" - "@formatjs/icu-messageformat-parser" "2.3.0" - "@formatjs/intl" "2.6.9" - "@formatjs/intl-displaynames" "6.2.6" - "@formatjs/intl-listformat" "7.1.9" - "@types/hoist-non-react-statics" "^3.3.1" - "@types/react" "16 || 17 || 18" - hoist-non-react-statics "^3.3.2" - intl-messageformat "10.3.3" - tslib "^2.4.0" - react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -14045,21 +13331,6 @@ react-select@5.6.0: react-transition-group "^4.3.0" use-isomorphic-layout-effect "^1.1.2" -react-select@5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" - integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== - dependencies: - "@babel/runtime" "^7.12.0" - "@emotion/cache" "^11.4.0" - "@emotion/react" "^11.8.1" - "@floating-ui/dom" "^1.0.1" - "@types/react-transition-group" "^4.4.0" - memoize-one "^6.0.0" - prop-types "^15.6.0" - react-transition-group "^4.3.0" - use-isomorphic-layout-effect "^1.1.2" - react-side-effect@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" @@ -14540,16 +13811,16 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@0.13.1, retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -14859,14 +14130,6 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.11: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -15363,11 +14626,6 @@ stream-slice@^0.1.2: resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" integrity sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA== -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA== - strict-event-emitter@^0.2.4: version "0.2.8" resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" @@ -16002,11 +15260,6 @@ tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@~2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - tsscmp@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" @@ -16367,7 +15620,7 @@ utils-merge@1.0.1, utils-merge@^1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@9.0.0, uuid@^9.0.0: +uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== @@ -16418,11 +15671,6 @@ value-equal@^1.0.1: resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== -value-or-promise@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" - integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== - vary@^1.1.2, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -16873,14 +16121,6 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xss@^1.0.6, xss@^1.0.8: - version "1.0.14" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.14.tgz#4f3efbde75ad0d82e9921cc3c95e6590dd336694" - integrity sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw== - dependencies: - commander "^2.20.3" - cssfilter "0.0.10" - xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From 99a7762a5485457ed399dc86d84090ea7b1ee078 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 14:48:01 +0200 Subject: [PATCH 31/50] test(e2e): update login command to not use login page Requests after login could not use the jwtToken as the page was not fully loaded yet --- playground/cypress/support/commands.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/playground/cypress/support/commands.js b/playground/cypress/support/commands.js index 5930227f..3e91adea 100644 --- a/playground/cypress/support/commands.js +++ b/playground/cypress/support/commands.js @@ -11,9 +11,23 @@ // // -- This is a parent command -- Cypress.Commands.add('login', () => { - cy.visit('/admin/auth/login') - cy.get('input[name=email]').type(Cypress.env('ADMIN_MAIL')) - cy.get('input[name=password]').type(`${Cypress.env('ADMIN_PASSWORD')}{enter}`) + cy.request('POST', '/admin/login', { + email: Cypress.env('ADMIN_MAIL'), + password: Cypress.env('ADMIN_PASSWORD'), + }).then((result) => { + cy.visit('/admin', { + onBeforeLoad: (contentWindow) => { + contentWindow.sessionStorage.setItem( + 'jwtToken', + JSON.stringify(result.body.data.token) + ) + contentWindow.sessionStorage.setItem( + 'userInfo', + JSON.stringify(result.body.data.user) + ) + }, + }) + }) }) // // From dba0ec17aad173fb825d706fac14b7a0584d41c5 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 14:49:42 +0200 Subject: [PATCH 32/50] chore(playground): add single type categories-page This is used to verify relations in components --- playground/data/data.json | 24 ++++++++++++++ .../article/content-types/article/schema.json | 7 +++- .../content-types/categories-page/schema.json | 33 +++++++++++++++++++ .../controllers/categories-page.js | 9 +++++ .../categories-page/routes/categories-page.js | 9 +++++ .../services/categories-page.js | 9 +++++ .../content-types/category/schema.json | 4 +-- playground/src/bootstrap.js | 7 ++++ .../src/components/shared/category.json | 18 ++++++++++ 9 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 playground/src/api/categories-page/content-types/categories-page/schema.json create mode 100644 playground/src/api/categories-page/controllers/categories-page.js create mode 100644 playground/src/api/categories-page/routes/categories-page.js create mode 100644 playground/src/api/categories-page/services/categories-page.js create mode 100644 playground/src/components/shared/category.json diff --git a/playground/data/data.json b/playground/data/data.json index 57b60d4b..5963b8e5 100644 --- a/playground/data/data.json +++ b/playground/data/data.json @@ -36,6 +36,30 @@ "title": "My blog" } }, + "categories-page": { + "categories": [ + { + "category": 1, + "display": "News" + }, + { + "category": 2, + "display": "Tech" + }, + { + "category": 3, + "display": "Nature" + }, + { + "category": 4, + "display": "News" + }, + { + "category": 5, + "display": "Story" + } + ] + }, "writers": [ { "id": 1, diff --git a/playground/src/api/article/content-types/article/schema.json b/playground/src/api/article/content-types/article/schema.json index ab55dc94..8f6748a0 100644 --- a/playground/src/api/article/content-types/article/schema.json +++ b/playground/src/api/article/content-types/article/schema.json @@ -64,7 +64,12 @@ "type": "relation", "relation": "manyToOne", "target": "api::category.category", - "inversedBy": "articles" + "inversedBy": "articles", + "pluginOptions": { + "translate": { + "translate": "translate" + } + } }, "image": { "type": "media", diff --git a/playground/src/api/categories-page/content-types/categories-page/schema.json b/playground/src/api/categories-page/content-types/categories-page/schema.json new file mode 100644 index 00000000..2afbf69b --- /dev/null +++ b/playground/src/api/categories-page/content-types/categories-page/schema.json @@ -0,0 +1,33 @@ +{ + "kind": "singleType", + "collectionName": "categories_pages", + "info": { + "singularName": "categories-page", + "pluralName": "categories-pages", + "displayName": "Categories Page", + "description": "" + }, + "options": { + "draftAndPublish": false + }, + "pluginOptions": { + "i18n": { + "localized": true + } + }, + "attributes": { + "categories": { + "type": "component", + "repeatable": true, + "pluginOptions": { + "i18n": { + "localized": true + }, + "translate": { + "translate": "translate" + } + }, + "component": "shared.category" + } + } +} diff --git a/playground/src/api/categories-page/controllers/categories-page.js b/playground/src/api/categories-page/controllers/categories-page.js new file mode 100644 index 00000000..73fe1299 --- /dev/null +++ b/playground/src/api/categories-page/controllers/categories-page.js @@ -0,0 +1,9 @@ +'use strict' + +/** + * categories-page controller + */ + +const { createCoreController } = require('@strapi/strapi').factories + +module.exports = createCoreController('api::categories-page.categories-page') diff --git a/playground/src/api/categories-page/routes/categories-page.js b/playground/src/api/categories-page/routes/categories-page.js new file mode 100644 index 00000000..58a6e35f --- /dev/null +++ b/playground/src/api/categories-page/routes/categories-page.js @@ -0,0 +1,9 @@ +'use strict' + +/** + * categories-page router + */ + +const { createCoreRouter } = require('@strapi/strapi').factories + +module.exports = createCoreRouter('api::categories-page.categories-page') diff --git a/playground/src/api/categories-page/services/categories-page.js b/playground/src/api/categories-page/services/categories-page.js new file mode 100644 index 00000000..c252f30c --- /dev/null +++ b/playground/src/api/categories-page/services/categories-page.js @@ -0,0 +1,9 @@ +'use strict' + +/** + * categories-page service + */ + +const { createCoreService } = require('@strapi/strapi').factories + +module.exports = createCoreService('api::categories-page.categories-page') diff --git a/playground/src/api/category/content-types/category/schema.json b/playground/src/api/category/content-types/category/schema.json index 596599a2..caae90ab 100644 --- a/playground/src/api/category/content-types/category/schema.json +++ b/playground/src/api/category/content-types/category/schema.json @@ -40,12 +40,12 @@ "type": "relation", "relation": "oneToMany", "target": "api::article.article", - "mappedBy": "category", "pluginOptions": { "translate": { "translate": "translate" } - } + }, + "mappedBy": "category" } } } diff --git a/playground/src/bootstrap.js b/playground/src/bootstrap.js index 083426e2..8a36f6ee 100644 --- a/playground/src/bootstrap.js +++ b/playground/src/bootstrap.js @@ -9,6 +9,7 @@ const { homepage, writers, articles, + 'categories-page': categoriesPage, global, } = require('../data/data.json') @@ -126,6 +127,10 @@ async function importHomepage() { await createEntry({ model: 'homepage', entry: homepage, files }) } +async function importCategoriesPage() { + await createEntry({ model: 'categories-page', entry: categoriesPage }) +} + async function importWriters() { return Promise.all( writers.map(async (writer) => { @@ -198,6 +203,7 @@ async function importSeedData() { // Create all entries await importCategories() await importHomepage() + await importCategoriesPage() await importWriters() await importArticles() await importGlobal() @@ -213,6 +219,7 @@ async function cleanData() { await cleanCollectionType('api::article.article') await cleanCollectionType('api::category.category') await cleanCollectionType('api::homepage.homepage') + await cleanCollectionType('api::categories-page.categories-page') await cleanCollectionType('api::writer.writer') } diff --git a/playground/src/components/shared/category.json b/playground/src/components/shared/category.json new file mode 100644 index 00000000..ace61510 --- /dev/null +++ b/playground/src/components/shared/category.json @@ -0,0 +1,18 @@ +{ + "collectionName": "components_shared_categories", + "info": { + "displayName": "Category", + "description": "" + }, + "options": {}, + "attributes": { + "category": { + "type": "relation", + "relation": "oneToOne", + "target": "api::category.category" + }, + "display": { + "type": "string" + } + } +} From 00396444e51410c3bec3d42b08b2952ff5e3fc48 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 14:52:00 +0200 Subject: [PATCH 33/50] test(e2e): add failing test for translating relations in components --- .../cypress/e2e/direct-translation.cy.js | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/playground/cypress/e2e/direct-translation.cy.js b/playground/cypress/e2e/direct-translation.cy.js index bd1b0aa0..3989e526 100644 --- a/playground/cypress/e2e/direct-translation.cy.js +++ b/playground/cypress/e2e/direct-translation.cy.js @@ -161,4 +161,55 @@ describe('direct translation', () => { .should('be.visible') cy.contains('button', 'Save').should('be.disabled') }) + + it('single type with relation in component', () => { + cy.intercept('/translate/translate').as('translateExecution') + + // Login + cy.login() + + // Translate all categories + cy.getAllSessionStorage().then((result) => { + cy.request({ + method: 'POST', + url: '/translate/batch-translate', + body: { + contentType: 'api::category.category', + sourceLocale: 'en', + targetLocale: 'de', + autoPublish: true, + }, + auth: { + bearer: JSON.parse(result[Cypress.config().baseUrl].jwtToken), + }, + }) + }) + + //Navigate to Categories page + cy.get('nav').contains('Content Manager').click() + + cy.get('nav[aria-label=Content]').contains('Categories Page').click() + + // Go to page for creating German locale + cy.contains('label', 'Locales') + .invoke('attr', 'for') + .then((id) => { + cy.get('#' + id) + }) + .click() + cy.contains('German (de)').click() + + // Translate from English + cy.contains('Translate from another locale').click() + cy.contains('button', 'Yes, fill in').click() + cy.wait('@translateExecution') + + // Save + cy.contains('button', 'Save').click() + + // Verify + cy.contains('button', 'News').click() + cy.contains('span', 'news') + cy.contains('button', 'Save').should('be.disabled') + }) }) From 9599782e748ba8cfb41242ecd55503f9b35e0f21 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 14:59:24 +0200 Subject: [PATCH 34/50] fix(direct-translation): issue with translating relations in components When translating relations in a component, the relation is not translated and when clicking on the relation field an error is thrown. The bug was that the relation parsing did not handle repeated components correctly. Another connected issue was that after translating, all fields in the repeated components were opening simultaneously, which was caused by a missing __temp_key__. fix #152 --- .../utils/parse-relations.js | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/plugin/admin/src/components/CMEditViewTranslateLocale/utils/parse-relations.js b/plugin/admin/src/components/CMEditViewTranslateLocale/utils/parse-relations.js index 7fa696aa..828928d5 100644 --- a/plugin/admin/src/components/CMEditViewTranslateLocale/utils/parse-relations.js +++ b/plugin/admin/src/components/CMEditViewTranslateLocale/utils/parse-relations.js @@ -91,26 +91,44 @@ export default function parseRelations(data, allLayoutData, component = null) { _.set( result, attribute, - value.map((r) => parseRelation(r, metadata, relationEditLayout)) + value.map((r, index) => ({ + __temp_key__: `a${index}`, + ...parseRelation(r, metadata, relationEditLayout), + })) ) } else { _.set( result, attribute, - value ? [parseRelation(value, metadata, relationEditLayout)] : [] + value + ? [ + { + __temp_key__: 'a0', + ...parseRelation(value, metadata, relationEditLayout), + }, + ] + : [] ) } } else if (attributeData.type === 'component') { _.set( result, attribute, - parseRelations(value, allLayoutData, attributeData.component) + attributeData.repeatable + ? value.map((c, index) => ({ + __temp_key__: index, + ...parseRelations(c, allLayoutData, attributeData.component), + })) + : parseRelations(value, allLayoutData, attributeData.component) ) } else if (attributeData.type === 'dynamiczone' && Array.isArray(value)) { _.set( result, attribute, - value.map((c) => parseRelations(c, allLayoutData, c.__component)) + value.map((c, index) => ({ + __temp_key__: index, + ...parseRelations(c, allLayoutData, c.__component), + })) ) } } From 4aea53867ad7749560043dc78c27b2db6068a0be Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Thu, 6 Apr 2023 18:48:58 +0000 Subject: [PATCH 35/50] chore(playground): remove graphql plugin from template --- playground/templates/template.package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/playground/templates/template.package.json b/playground/templates/template.package.json index 73b016dd..b21df9dc 100644 --- a/playground/templates/template.package.json +++ b/playground/templates/template.package.json @@ -1,6 +1,5 @@ { "dependencies": { - "@strapi/plugin-graphql": "${VERSION}", "@strapi/plugin-i18n": "${VERSION}", "@strapi/plugin-users-permissions": "${VERSION}", "@strapi/strapi": "${VERSION}", From e54b7514351398a44965aada1dad713239cbd946 Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Fri, 7 Apr 2023 21:53:37 +0200 Subject: [PATCH 36/50] test(e2e): fix flaky batch translation Add data-cy attributes for easier selection. The real fix is though to first focus and then click the translate button. For some reason (probably connected to the label?) only clicking sometimes fails --- .../cypress/e2e/batch-translation.cy.js | 32 +++++-------------- .../components/Collection/CollectionRow.js | 6 +++- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/playground/cypress/e2e/batch-translation.cy.js b/playground/cypress/e2e/batch-translation.cy.js index 73ea0d13..52568fea 100644 --- a/playground/cypress/e2e/batch-translation.cy.js +++ b/playground/cypress/e2e/batch-translation.cy.js @@ -17,12 +17,8 @@ describe('batch translation', () => { // Start batch translation - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') - .find('button') - .first() - .click() + cy.get('button[data-cy="api::article.article.de.translate"]').focus() + cy.get('button[data-cy="api::article.article.de.translate"]').click() // Complete dialog cy.get('div[role=dialog]') @@ -39,14 +35,10 @@ describe('batch translation', () => { cy.wait('@batchTranslateContentTypes') - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') + cy.get('[data-cy="api::article.article.de"]') .contains('Job finished') .should('exist') - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') + cy.get('[data-cy="api::article.article.de"]') .contains('complete') .should('exist') }) @@ -65,12 +57,8 @@ describe('batch translation', () => { // Start batch translation - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') - .find('button') - .first() - .click() + cy.get('button[data-cy="api::article.article.de.translate"]').focus() + cy.get('button[data-cy="api::article.article.de.translate"]').click() // Complete dialog cy.get('div[role=dialog]') @@ -95,14 +83,10 @@ describe('batch translation', () => { cy.wait('@batchTranslateContentTypes') - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') + cy.get('[data-cy="api::article.article.de"]') .contains('Job finished') .should('exist') - cy.get('tbody tr ') - .first() - .find('td[aria-colindex=3]') + cy.get('[data-cy="api::article.article.de"]') .contains('complete') .should('exist') }) diff --git a/plugin/admin/src/components/Collection/CollectionRow.js b/plugin/admin/src/components/Collection/CollectionRow.js index 0e432eef..a65d717f 100644 --- a/plugin/admin/src/components/Collection/CollectionRow.js +++ b/plugin/admin/src/components/Collection/CollectionRow.js @@ -28,7 +28,7 @@ const CollectionRow = ({ entry, locales, onAction }) => { const { count, complete, job } = entry.localeReports[locale.code] return ( - + + + + + {locales.map(({ code }) => ( + + ))} + + ) +} + +BatchUpdateRow.propTypes = { + locales: PropTypes.arrayOf( + PropTypes.shape({ + code: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + }) + ), + selectedIDs: PropTypes.arrayOf(PropTypes.number), + setSelectedIDs: PropTypes.func, + entry: PropTypes.shape({ + id: PropTypes.number, + attributes: PropTypes.shape({ + groupID: PropTypes.string, + localesWithUpdates: PropTypes.arrayOf(PropTypes.string), + }), + }), + index: PropTypes.number, +} + +export default BatchUpdateRow diff --git a/plugin/admin/src/components/BatchUpdateTable/Rows.js b/plugin/admin/src/components/BatchUpdateTable/Rows.js deleted file mode 100644 index 176a9d86..00000000 --- a/plugin/admin/src/components/BatchUpdateTable/Rows.js +++ /dev/null @@ -1,92 +0,0 @@ -import React, { useState } from 'react' -import { Td, Tr } from '@strapi/design-system/Table' -import { Checkbox, Typography } from '@strapi/design-system' - -const BatchUpdateRows = ({ entries, selectedIDs, setSelectedIDs, locales }) => { - const allIDs = entries.map(({ id }) => id) - const isAllSelected = allIDs.every((id) => selectedIDs.includes(id)) - const isSomeSelected = allIDs.some((id) => selectedIDs.includes(id)) - - const [isExpanded, setIsExpanded] = useState(entries.length === 1) - - let displayEntries = isExpanded ? entries : [entries[0]] - - return displayEntries.map(({ id, attributes }, index) => ( - - - - - {locales.map(({ code }) => ( - - ))} - - - - )) -} - -export default BatchUpdateRows diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js index 74f36ee0..7af6c826 100644 --- a/plugin/admin/src/components/BatchUpdateTable/Table.js +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -1,211 +1,113 @@ -import React, { memo, useState, useEffect } from 'react' +import React, { memo } from 'react' import { Table, Tbody, Thead, Th, Tr } from '@strapi/design-system/Table' -import { ExclamationMarkCircle } from '@strapi/icons' -import { - Box, - Flex, - Stack, - Button, - Checkbox, - Select, - Option, - Dialog, - DialogBody, - DialogFooter, - Typography, -} from '@strapi/design-system' +import { Button, Flex, Typography } from '@strapi/design-system' +import PropTypes from 'prop-types' import { useIntl } from 'react-intl' -import _ from 'lodash' import useCollection from '../../Hooks/useCollection' -import useUpdateCollection from '../../Hooks/useUpdateCollection' import { getTrad } from '../../utils' -import BatchUpdateRows from './Rows' +import BatchUpdateRow from './BatchUpdateRows' -const BatchUpdateTable = () => { +const BatchUpdateTable = ({ + updates, + dismissUpdates, + refetch, + selectedUpdateIDs, + setSelectedUpdateIDs, +}) => { const { formatMessage } = useIntl() - - const [selectedIDs, setSelectedIDs] = useState([]) - const [dialogOpen, setDialogOpen] = useState(false) - const [isLoading, setIsLoading] = useState(false) - const [sourceLocale, setSourceLocale] = useState(null) - const { locales } = useCollection() - useEffect(() => { - if (Array.isArray(locales) && locales.length > 0) - setSourceLocale(locales[0].code) - }, [locales]) - - const { updates, startUpdate, dismissUpdates, refetch } = - useUpdateCollection() - - useEffect(() => { - const localeUses = updates - .filter(({ id }) => selectedIDs.includes(id)) - .reduce((acc, current) => { - for (const locale of current.attributes.localesWithUpdates) { - acc[locale] = (acc[locale] ?? 0) + 1 - } - - return acc - }, {}) - - const { code: mostUpdatedLocale } = Object.entries(localeUses).reduce( - (acc, [code, uses]) => (acc.uses < uses ? { code, uses } : acc), - { code: '', uses: 0 } - ) - - setSourceLocale(mostUpdatedLocale) - }, [selectedIDs, updates]) - - const onAction = () => { - setIsLoading(true) - startUpdate(selectedIDs, sourceLocale).then(() => { - setIsLoading(false) - setDialogOpen(false) - refetch() - }) - } - const dismissSelected = () => { - dismissUpdates(selectedIDs).then(() => { - setSelectedIDs([]) + dismissUpdates(selectedUpdateIDs).then(() => { + setSelectedUpdateIDs([]) refetch() }) } - const groupedUpdates = _.groupBy(updates, 'attributes.contentType') - return ( - - - - - -
+ {count}{' '} @@ -94,6 +94,7 @@ const CollectionRow = ({ entry, locales, onAction }) => { onAction('translate', locale.code)} label={formatMessage({ id: getTrad( @@ -111,6 +112,7 @@ const CollectionRow = ({ entry, locales, onAction }) => { } /> onAction('cancel', locale.code)} label={formatMessage({ id: getTrad('batch-translate.table.actions.labels.cancel'), @@ -123,6 +125,7 @@ const CollectionRow = ({ entry, locales, onAction }) => { } /> onAction('pause', locale.code)} label={formatMessage({ id: getTrad('batch-translate.table.actions.labels.pause'), @@ -135,6 +138,7 @@ const CollectionRow = ({ entry, locales, onAction }) => { } /> onAction('resume', locale.code)} label={formatMessage({ id: getTrad('batch-translate.table.actions.labels.resume'), From bf03402fd3de67a9c24276ff96cf1d83c240a4be Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Fri, 7 Apr 2023 22:33:15 +0200 Subject: [PATCH 37/50] fix(relations): make default behavior translations When the pluginOptions for translating relations are not set or set empty, the relation was not translated correctly. This should fix the default behavior to be translation. fix #161 --- .../__tests__/translate-relations.test.js | 58 +++++++++ plugin/server/utils/translate-relations.js | 115 +++++++++--------- 2 files changed, 117 insertions(+), 56 deletions(-) diff --git a/plugin/server/utils/__tests__/translate-relations.test.js b/plugin/server/utils/__tests__/translate-relations.test.js index 99dc9f8d..c3aea373 100644 --- a/plugin/server/utils/__tests__/translate-relations.test.js +++ b/plugin/server/utils/__tests__/translate-relations.test.js @@ -1492,6 +1492,64 @@ describe('relation', () => { }) } ) + + describe('default behavior is translate', () => { + beforeEach(() => { + const firstEnglish = { id: 1, title: 'test', locale: 'en' } + const firstGerman = { id: 2, title: 'test', locale: 'de' } + setup({ + contentTypes: { + 'api::first.first': createRelationContentType( + 'oneToOne', + { inversedBy: 'related' }, + true, + 'api::second.second', + 'api::first.first', + // forcing an empty value + '' + ), + 'api::second.second': createRelationContentType( + 'oneToOne', + { mappedBy: 'related' }, + true, + 'api::first.first', + 'api::second.second' + ), + }, + database: { + 'api::second.second': [ + { + ...firstEnglish, + localizations: [firstGerman], + }, + { + ...firstGerman, + localizations: [firstEnglish], + }, + ], + }, + }) + }) + it('is translated', async () => { + // given + const data = { + related: { id: 1, title: 'test', locale: 'en' }, + } + const schema = strapi.contentTypes['api::first.first'] + const targetLocale = 'de' + // when + const relationsTranslated = await translateRelations( + data, + schema, + targetLocale + ) + const result = { + related: { id: 2, title: 'test', locale: 'de' }, + } + // then + expect(relationsTranslated).toEqual(result) + }) + }) }) describe('localizations', () => { diff --git a/plugin/server/utils/translate-relations.js b/plugin/server/utils/translate-relations.js index 618162eb..3976109c 100644 --- a/plugin/server/utils/translate-relations.js +++ b/plugin/server/utils/translate-relations.js @@ -48,7 +48,24 @@ async function translateRelations(data, schema, targetLocale) { ['relation', 'component', 'dynamiczone'].includes(attributeSchema.type) ) { switch (onTranslate) { + case 'copy': + if (attributeSchema.type === 'relation') { + resultData[attr] = shouldTranslateRelations + ? await translateRelation( + attributeData, + attributeSchema, + targetLocale + ) + : undefined + } else { + resultData[attr] = attributeData + } + break + case 'delete': + resultData[attr] = undefined + break case 'translate': + default: if (attributeSchema.type === 'relation') { resultData[attr] = shouldTranslateRelations ? await translateRelation( @@ -71,24 +88,6 @@ async function translateRelations(data, schema, targetLocale) { ) } break - case 'copy': - if (attributeSchema.type === 'relation') { - resultData[attr] = shouldTranslateRelations - ? await translateRelation( - attributeData, - attributeSchema, - targetLocale - ) - : undefined - } else { - resultData[attr] = attributeData - } - break - case 'delete': - resultData[attr] = undefined - break - default: - break } } }) @@ -133,44 +132,11 @@ async function translateRelation(attributeData, attributeSchema, targetLocale) { _.has(attributeSchema, 'inversedBy', false) || _.has(attributeSchema, 'mappedBy', false) - // If the relation is localized, the relevant localizations from the relation should be selected - if (onTranslate === 'translate') { - if (relationIsLocalized) { - // for oneToMany and manyToMany relations there are multiple relations possible, so all of them need to be considered - if ( - ['oneToMany', 'manyToMany'].includes(attributeSchema.relation) && - attributeData?.length > 0 - ) { - return _.compact( - await Promise.all( - attributeData.map(async (prevRelation) => - getRelevantLocalization( - attributeSchema.target, - prevRelation.id, - targetLocale - ) - ) - ) - ) - } else if ( - ['oneToOne', 'manyToOne'].includes(attributeSchema.relation) && - attributeData - ) { - return getRelevantLocalization( - attributeSchema.target, - attributeData.id, - targetLocale - ) - } - } else if ( - relationIsBothWays && - ['oneToOne', 'oneToMany'].includes(attributeSchema.relation) - ) { - // In this case the relations in other locales or in the referenced relations would be deleted - // so there is not really a different option than to not include these relations - return attributeSchema.relation == 'oneToMany' ? [] : undefined - } - } else if (onTranslate === 'copy') { + if (onTranslate === 'delete') { + return undefined + } + + if (onTranslate === 'copy') { if (relationIsLocalized || relationIsBothWays) { return ['oneToMany', 'manyToMany'].includes(attributeSchema.relation) ? [] @@ -179,6 +145,43 @@ async function translateRelation(attributeData, attributeSchema, targetLocale) { return attributeData } } + + // If the relation is localized, the relevant localizations from the relation should be selected + if (relationIsLocalized) { + // for oneToMany and manyToMany relations there are multiple relations possible, so all of them need to be considered + if ( + ['oneToMany', 'manyToMany'].includes(attributeSchema.relation) && + attributeData?.length > 0 + ) { + return _.compact( + await Promise.all( + attributeData.map(async (prevRelation) => + getRelevantLocalization( + attributeSchema.target, + prevRelation.id, + targetLocale + ) + ) + ) + ) + } else if ( + ['oneToOne', 'manyToOne'].includes(attributeSchema.relation) && + attributeData + ) { + return getRelevantLocalization( + attributeSchema.target, + attributeData.id, + targetLocale + ) + } + } else if ( + relationIsBothWays && + ['oneToOne', 'oneToMany'].includes(attributeSchema.relation) + ) { + // In this case the relations in other locales or in the referenced relations would be deleted + // so there is not really a different option than to not include these relations + return attributeSchema.relation == 'oneToMany' ? [] : undefined + } return attributeData } From fc25bc2ebb4aadcdd7178e6ca52b05a93145e1ec Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sun, 9 Apr 2023 00:09:04 +0200 Subject: [PATCH 38/50] ci(github-actions): add action to check files that should be identical adds a script that checks whether the main README and the plugin's README are identical and whether the playgrounds package.json template matches the package.json fix #170 --- .github/workflows/diff.yml | 9 +++++++++ .github/workflows/pr.yml | 2 ++ scripts/diff.sh | 2 ++ 3 files changed, 13 insertions(+) create mode 100644 .github/workflows/diff.yml create mode 100644 scripts/diff.sh diff --git a/.github/workflows/diff.yml b/.github/workflows/diff.yml new file mode 100644 index 00000000..8eb47612 --- /dev/null +++ b/.github/workflows/diff.yml @@ -0,0 +1,9 @@ +on: + workflow_call: +jobs: + diff: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run diff script + run: sh ./scripts/diff.sh diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index a4479c66..76167e9e 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -3,6 +3,8 @@ on: pull_request jobs: lint: uses: ./.github/workflows/lint.yml + diff: + uses: ./.github/workflows/diff.yml unittest: uses: ./.github/workflows/unittest.yml e2e: diff --git a/scripts/diff.sh b/scripts/diff.sh new file mode 100644 index 00000000..a3643e8b --- /dev/null +++ b/scripts/diff.sh @@ -0,0 +1,2 @@ +diff ./README.md plugin/README.md && echo READMEs match +diff ./playground/package.json ./playground/templates/template.package.json -I '@strapi/.*' && echo playgorund/package.json match \ No newline at end of file From 7f390470251c2ce9b24f8d3b7852216833ec8ad6 Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sun, 9 Apr 2023 00:15:38 +0200 Subject: [PATCH 39/50] chore(playground): fix mismatch between package.json and template --- playground/templates/template.package.json | 1 + scripts/diff.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/playground/templates/template.package.json b/playground/templates/template.package.json index 73b016dd..2ca947d0 100644 --- a/playground/templates/template.package.json +++ b/playground/templates/template.package.json @@ -5,6 +5,7 @@ "@strapi/plugin-users-permissions": "${VERSION}", "@strapi/strapi": "${VERSION}", "better-sqlite3": "8.2.0", + "dotenv": "^16.0.3", "lodash.set": "^4.3.2", "mime-types": "^2.1.27", "strapi-plugin-init-admin-user": "^0.2.1" diff --git a/scripts/diff.sh b/scripts/diff.sh index a3643e8b..7acfe7ec 100644 --- a/scripts/diff.sh +++ b/scripts/diff.sh @@ -1,2 +1,2 @@ diff ./README.md plugin/README.md && echo READMEs match -diff ./playground/package.json ./playground/templates/template.package.json -I '@strapi/.*' && echo playgorund/package.json match \ No newline at end of file +diff ./playground/package.json ./playground/templates/template.package.json -I '@strapi/.*' && echo playground/package.json match \ No newline at end of file From ce88000808ba3251ff7de3237d1aeb5b0b4b636a Mon Sep 17 00:00:00 2001 From: Felix Haase Date: Sun, 9 Apr 2023 17:30:27 +0000 Subject: [PATCH 40/50] docs(readme): update content Update READMEs to include new provider, info on the tested strapi versions and the RBAC functionality --- README.md | 9 ++++++++- assets/permissions.png | Bin 0 -> 13086 bytes plugin/README.md | 9 ++++++++- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 assets/permissions.png diff --git a/README.md b/README.md index ce371b51..bea17e29 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ This plugin requires the following, in order to work correctly: - Strapi v4 (this plugin is not compatible with v3) + - Plugin tested for `v4.6` to `v4.9` - The plugin **i18n** installed and enabled (`@strapi/plugin-i18n` [[npm](https://www.npmjs.com/package/@strapi/plugin-i18n)]) - The content type to have internationalization enabled (advanced settings in the content type builder) - In the internationalization settings at least **two** locales @@ -92,6 +93,7 @@ module.exports = { #### Available providers - [strapi-provider-translate-deepl](https://www.npmjs.com/package/strapi-provider-translate-deepl) +- [strapi-provider-translate-libretranslate](https://www.npmjs.com/package/strapi-provider-translate-libretranslate) ### Configure translation of individual fields/attributes @@ -189,6 +191,12 @@ _The related objects are not translated directly, only the relation itself is tr - the relation goes both ways and would be removed from another object or localization if it was used (the case with oneToOne or oneToMany) -> it is removed - otherwise the relation is kept +## 🔐 Permissions + +Since RBAC was moved to the community edition in Strapi v4.8.0, permissions for endpoints of direct translation, batch translation and api usage can now be granted to other roles than super admins: + +![Permissions for Translate plugin](https://github.com/Fekide/strapi-plugin-deepl/blob/main/assets/permissions.png) + ## 🧑‍💻 Creating your own translation provider A translation provider should have the following: @@ -270,5 +278,4 @@ return providerClient.translateTexts(texts) ## ⚠ Limitations: - The translation of Markdown and HTML may vary between different providers -- **Only super admins can translate**. This is currently the case, since permissions were added to the `translate` endpoint. Probably you can change the permissions with an enterprise subscription but I am not sure. If you know how to do that also in the community edition please tell me or open a merge request! - Relations that do not have a translation of the desired locale will not be translated. To keep the relation you will need to translate both in succession (Behaviour for multi-relations has not yet been analyzed) diff --git a/assets/permissions.png b/assets/permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee9f18250df65b8460732ee0a957d154645fb3 GIT binary patch literal 13086 zcmd6OS5#A7*DmUdC@8#&fP#PusB{GZLkTLqh88+RL_k`A&}*=Pbm=O+m(W{)&=l#t zmk^L%LMWjogyh8UoH72pbMDUgZg#TDUTeuRcsdNeeb zYN`JTS1wYY-fEvWs6Ut7U#S^fxpD=)2>L@qbB{(%@uh)JDh^}!`qsok$fBKwpUe30 z)qBk!?`iRe(+b_wdSRe*OOduRlYAlXvC^$Pe%60(=@<-8UA#iCPDiWj$B^~#ezVi} zlS_X-CHo4r9#sRH~leTziTLEHQK zg4VJmx>#goowN)3pvV~~fao=9xw)W|Bmx6ykS^R9q zXF>rG7&0i0U9xxK$KTF>jaI}?mWy+*rN&(UXvIR!s)qv7)-7zh5}f~*hXwrA;#+su ze^p|ec4qpQ-C;+ThOCQlS@MFx1PRemG!rA36_f6eLu`uqYXafd@T6KLatQB?@zaLwku}%Aph2dG!WyQxY;#R!+pt`T0 zCJKPR;?{qcaxaYjlsO8JVL7Fvj%qL^JeM~wf5mID=2>1|&lKpw1%in_t5O!4mD&U4 zs&>Im<`q}-{qQ1w*js@oh4-Z6B6NV3GP(=NMtzFs_1cv-&m8Kt0}zxm@R@aj1Nf~l zW&u>Iz{|fQ(_Hb=J87bG!Sk{9;>7ssO9>$nwNCp$86!c;aM)Yl&_YYLBNxv_r7tQ{ z8;IS*sh1rE{JGgsY#t-n#?9e)nfO%uM-i7ei*I?SXS`N8CYumZyPP@qvlwlOanb*G z>KS#vnFB%<3YLc$#mL@>t}g!Pid4kF_xF*58EAaK+yUcxr=fiTe~q(xnyVh5g7DTsbt{hQBr z!_}_X_>#m<_P?7$F3;fE59SRnL5>0}IuF8Iz#wGofQBT$XG&*N9(&;7D+xgKyPuj` zUYo0^Z%3D?v)%hV&4?v>$Q9)&ZFxV7fQ~S)!B?tWx(-(bu5(T9zHKphXyIt*(28{e z)+HI9hzPjE=W@x_1T}f38ovFSZGCIjpjMzqL%{3%&w;!YY`VLAa?EhjPvThxyFp@d zYZDH?7Yh#-in~^NZdzvOmsu;zn>hT@+hLlW6Qz)MrJFj7Mh~7YI<)WKfg*1*-(pXq zOKD8aPK-H!l~CI{r#d>jI!i)Er|H46#mr&n2R}NRJ`HkZ-{Tk8uPRz~Ha(9`Cn{Xu zLReZ)@IOL#3_P!Otetck$y!#A9Mdi6wZvm!n|n9Xrt`^tLvqVWs2coI8Z8aYDU+Hy zQOY`6v};jEPY-BWW>kaU_Z^j3=W|Bn?pPQU`U30!+M0`wG`)zd#=~md?Zh2 zd$;Or`X2_c`Px}b4-@VEM3pg(*l0Yxmm_{TnZNCUi%VjIk#(cFz+39*-eVioTunmi z>8~uuLvn<|cV1jrf9VV?Vr({Ojr$N_b0pz2WGbKsgTpSU^}kBvlv;q&zQ$^sFf*`_Il6Uh?L2&@ zoO^zZTiayNX{z{UhsV2*#~p$|%MgPz5wL7gPkap_I4+K**&>CJwXKY*lKG=+%cD{k z8vN|-#b9Heeyia-r}P@1xcoG$ffES9TLy;0E_xk2fbzr}<%xaIPCkjrf~&&0{9omj z#*Gu9&P1J$QX3s^jmvIn0g&AmUjJ`f^Cc{u;q4=>qX}o561~DhKi-a{xlszThk1 zWg40nL2eB&OXblyz-)zOoMcJshcBspQ4oIoUyFs;fbLwygPsFo8bYHQiR$F0n)V4ZUawQEN0F+nmN|ASOVF(y%foo~?4D2?oZV}!F((AUw zU`C!>`u5jK1e4w%`(kmWU+Cm~!5l+Ok>#hmu#C}EUB8-)bT}x?$ouRLk6{k?uqeUZ zI~6{Z_gO*0U84o5ujtK96a1j9{a_aD^K;Ew0nu6L&*r(CZQ1;61rS(eddC;@dn=6n zv@Xt_^VHn`&`Dlcq*y9?upED_G$W@Ku`%%7@7R*oRio_{?9l9pJC~Cn9>_yO^LY?` zMs4!`A-53@0m!gF_K@?7sM8+XzTVqsW@lzlmSs8>?_G8&Lqby+YB=##R%ogB_C7o1 zYmge?WV%!o^2A^603nNHysOv2j;|BsUFqHZ78n#u`C;A66=>3hw}T})W(Q}gJ7Cm1 z2oLCJT+^zI@vE%EaRC8udombXUfqT}Rd(AZVjvTw8%(2>d)w#t#YzpY{N72RtIz`T^_yno#B~^C0-RwI(G*_V9V;*H4-uq2H3Y{Le>R~GK4D;L zmmc~wP$^~L(dU4`^q3eY`zlo!w!B=zr6D@MNR#IXR|*4)y*ZkFEb*@Vy8L5lgB-}P zsHi}Gk{)F^oteI<%<=^LXNu^XqK%&TV|nB#C~AKu6u5!dm$PwycYaaWvUIrze{D=o zVFIY9CL`gJ9wcA*EJD3@G$L??xxgs2@JO?EFLsW2ASi5}*IvM4s>bPGrS2 z$Yk|q&3W*xGRAWcBTtjukAf1rf;bsIWDL7p<^|y@kKdNXM;hDt7UJn68Jk4MV4z6Z zdZ(amT+8!&TBCkUo_BK4P5pQgqmbB=UHQ?I6wlfG9}=E>g(0o^qmzBf>!TkQiLE)K zx6hrx?OjJc`f1adpqAl59=uT2!?cOo@3MKg>O;>=0j}|_Rs)LK5kgQ+tY#~UAtE6w zDq|y5-h)?ZHDz-VD6o28?am1C@KWi*BOXm>zpZpX;<~#2`hs6j@u=956E{I>DnX_8 zfV8#)v)@Uc^;O-pEDp#a9vkq3?o|36(XzPYDzpkd)G*t59(WXMxTEu?@q>WFpDW;= zIC9i8;fx#`Gf!DvvdwrF659H*EP{Toe%$vRl-IDlIh#J}=;U%oF5->2+_Zk)AjQc$ zAk1{h$M#G8|C-J%8 zc($Y!nOMet=Ka{K6VTR;V*UY8k!s0Zv`K{N^~|qF>D4P@lV=7lFtf-QOKIr~!qvjr z^QYH6NI`OwFXAGn4+NU(BTc=|pPTgkdiJ*J!RQe>;M__zPKJnIof-FRx(gDlZsjVu zul5~|jWThNG`^JM;ZZvO{h>yopJ9A1XCIhwL2kg6SV?7)8ZiOV8;N*VFHK`5mb(05;=Q3WH| zCuo_WJxZ5%_=-+VuPTm5A~%$zo#O0FRCFXA;$`T)u+wUvXYzzFXjTwQd43BgSW=O$ zWh?;+b_*|t7_{*%WR_f*{xY>lBllE0$j$VL67!mUz=HWXYo5zg{mJ;7ujya(wk5UF zJc?WZBDIjnYjiZ`bQdqKboX05h?qOr(|Pe?-f1h2-fDVzfxA$}=xC?F?Ep-;aa1fE zp^pgC`{;j*<#9@eDTW`-$O$|sMQVA=6%rE-w)=0JL}arg%)iK9oG6QuZJ#L2zbMP1 z3zABjBrB{-ta$aN6@Sa=tq~B?yPr-4vHXkQwDY^gRc$m~PQ#V`xLI+svalvHu%z!zn{+f5BA#Ms2 zXdt4~(lK83eee)q3z?^_6OLbH#entaEsKZMF)8l`9MT$Wg>s8_?6bPx(02#@8wu8O z(S0gUNYFcbDBT3o=6B1HOdM{GTD1Yc6Rs^US)lY<(N#;XLrey?ij0Fl^cGuKcic_D znwv$L^3R<#)tQUrb@4ycW_3vvaUY@aNO7n&s8uBpi~LlS_%?NZDLJpNU9T!8lnU%T zqKIvcSZrczWW19nogw#Q%*Kn70-9K6UTF1M5N}&HL8v%^`{GCZnirQL;$pRygi-mw z#2Cc!#2572YTKTCXjH0Pn4v%1*TJd1%EyJh?QHBAsY*YQ_61|!(40_oLj@^w?(L+BF0j!s?KK@7_1s_Gb2rLO>67nKnLpXsC5)*hEJeLxFMcA;} zJVlM09TGmNy*BRIcamqKvmmzboR#EcOoI$LO*2QjsvJjdW=CHd z-@lPIn`NT^tUUMfxFp1LXM6?ZF+_Rx6~ct z+qYYa0bEWJ;->Js1|eoGH^Q$aUF#{8GxHEK2`NxdPTr-xI#jkcP-|5-c{h$n9}X{N zfnvPpya;lC!j{PRN;)+=U?NM#%TL*obdV5#v#L zhaLX2?xxX-&a(kt>YLkrs22lrmZdI(i|zW*@N3W#=`iB!_u97V zdc9!`>v?tmbU!i-jq4w_7fXoE>c0lSz&jZGMlYa)3I$31V5v+yA4}q^EZH1q z*v=RHeYCD%)aDIj3m4)<99&$?6<|0aBEK=2mRXzO*!eQ=4!uB5I#Zfd1dh+NwI6EQ zJkfxf|DLUa+dBGT`l*m`J}agL3MlA|+04QNa0Oc4*W#B0n*oaUK@P@?+ira=O$?_} z!^4(8WQ;&fd4H-Lo~n8$4b9haqq3Q8BMEuzb9YLko%HG#zst6H}KH3!E)Jnh@={g_2w&*EVcCOu0kb}R- z@hf%_4-|XlE@w~_`(W^>7NXOZw~%>&2v;4M?n>A}u;UIjAI!poMU{vg^dc zR(%`bsq5ubPGDfjzrFH)9PCGWq!nP2rL>HCj}5z#Vk6LoSR8G#OCVPeC;C%+E3UcNrPXqi^%McDfti$fff9b81(!pT{VQ1PMufR2Vn z>E?0_m0#^al08XJmj$VanueKhoBDhb`#1l;Co$t*t)rt8l>AqyTUQUcsg#xG;eUwQ z>j(cW34bd#s#L*El>y&vhx7sh1~o!H6)x~J<~ft6Jg)yoOmn6r(XroC?kLv)(#+?u zZZ_)xs@J0J==E{Q2jkV&;J>`lRjzxWA{+tvKgnRk@~l*;S;k1K^g;FYbz@{~J)vNNm(RhrFce_1rrt0J!g+YA2>c{T6;Vj<@+Y_3xN z(j~f3Z%$BL#E%mF`^^R4yU}SWj~Lmh2BPUD*vS{Qh*0>;nA<*!)scuPkUo11HlbP# z&kwGJ76rWPa0T2IY3~jdhD2Q)>e@-b$e-f}w&c!0`F-ftx3v$Oxk`+Phap!*MHdc+ zZr_Y43}Ti(6Af6$NlYrApB*7~9b;4B0pd=!_-1RA%n4gq%?g9$rWVKF+x8VSV+}<<+}^KduJjV z=RW^InD_ag-;*|G(qPBi9xrXx(XFs8jtD~%OZm--UB5RkC~J#sLa%vogaG{6!Q@@d zy~h(ZXoYsa`G1{a=dPNq1wO$cgi&wgddHoP|1bm!ke|Hi&W^YDs~lLj)CvK?m!qpO zW6HhhqWJ+;8&h&41yPydp1bg3c)8z8T0lw8>x0VJM(6oQV^c+)!UO)`D-{K4(b|mk zvi@P2UDwlgaKC(JCs`K?5>-iJX<9p42zM0oo@Xn~$aS!K*939qC%=XXe z`qZNvQEI_T_H>eD`%j5V@R$F?I~tb&3P8f z(tORrac)H9(~oSv@)AoClUZRLYm9+z>eDJYjY-{A`DeeE*t&$G*kuFNN`sdjA6>g6 zRd$NDMiaPA_lWKbi5$Qnhw7#14GXs*tGc*mNZ`SAPPs3m*^^v{NmYmaVTx5c<9WK}i0!}Dmf;$Frw_fKuQ5-}0io2R8 zhvpY*`KWl}!W|kK65UFE=ySTsuN)aZM}1`|xJjLDM+`R*=Yz_SMg39DyTmGr3o1>DF6f*PYYS@e za946sOT>P*ovJB)8z0R#M4HY-3)jk%tU#$F6^dStE2SU$yOc>~3SGjnIF5fzBKuFj z)hib8M!5J?x~lb>pX_j82geQ0Co4ZXs#X1C*iewRj?NG|%i6z$OhXniu$E!@d%C~K z!Imn#x5_+KQh(~|-eA3BkCxh*y3Xlnh=d-@w|Mpyp?M-K0@q1B@df369Mshf`10k7 z$o5Sk%Z}n2oNk_T3|+Kv$}A;sCIiW_KzipyJf^+0V+Iq^S9-Q5=fXL)&)gL+2?}`q zr>0uNI2?Ig^E{dp$a)tnmYmkMd6pEo|8uD{RPQZ#^rfASg7-X5U*y(1ikq@&zSYq| zg~pEc0w|55pL%}=d&ogDwz1(9v)X4kknw);kz--bzCDxyh&Di4OlG0kM7F=KgcH2* zbPMW9ZR!@6k&*bXu{Czf3xi(_Clx}4UUt+3VavXuBNAJ-njc?$L^UffUREW)o39U< ziXIE254&>w#YqyXeIj6@pW8}CR_Vrs0EoptgSRZYdX+InNqK1( zj_Y^jJS885F|!4>4y{JdP#559`9SJan5T$QEP;;XEiM1(u7`OKe{U0aa7vB}DK%wV zH|86itEcmp^If8Qp70ti#WG(FdAq-dcje{H=ZLF)6M=$GOZoRNl~!siza*)Na~B$O&EvxO?)l{NI=-%elhV&0rG~`X++^Sp=aCcV5gx;NJ=}$ycahx} z(PLxjKfbOE`wpyzUgV6yS|HTWRo^*)mV5graPs~XxzzE5OI+Uhwwg-JHio0w+vRXR zuu{zgR#I!+eCEO+b7<$0WbNAUS=eg8td^g(6*iKeQ?{}o#bp>3?V<^Xc1Et}gX){> zx{6B8Kn;97sB`|SsW7durT}rBxuE>osIhT7mp21qRw@BT;(v*|d@K)=>%G&yao=zFDK0_QRyyM?HKlc0_0dcnA4y?*+Rf>xx^_h*WKavb2>z0EkCqr9FnMo%x znjz^`6CJEh^!gNa43^7 zVHTAupf0nikK$_H$0g=R4?_O}hfm8IJb$r``6H;k#>&8@InlqU=f4e^{l9=>d~*c@ zRctDv5WDN<7FJZW`PoAC#wr%e$?UR-?1rxC*9C9Gud z>J`l6Fs!@#4dF)Y9S9Zq>D2u0;0p<*qopOVdEHks()kMa@zF6ie-q@C`WHFr)a2&p zGe^7My0wx4S_aYk1$5wTe#mL;?*l~d+{_M&*+{A*K$y#H)YOXTn7AUM1_;a6#>TH3 zV0;%Z1~6m_n2$X#qWL3V_Tpfl`r@e{lr1_&9`)qLo#gn0ghtRq6r_Xz0NHleMgC(AH$$+EJrm=qiMKv_k=0JYh2J>B@eI=Bt?!l)RkIw9(h0t~O{7m@4BxkvrSJe?klLANSojIFU|# zc)Yye%1zpvDRbGyUS^7 zvMfhFNQ%48vAhnK5SM*t3|8CN;ZWKAz@(JbM2Iz|_TQTwfRMgL*T$$z%ulf<^$~3#c&HJgHRE!>%kRay1MiKxEl$bXhZ;UXs2^?ZvD*8I3kNp0LHp62WcE<)9YSX)XEs zyR6k^af^=lM;l$-yhRrNauNpo{Omx3vtvt4zQtL-+#YmGF6vFI$+4No>LSBsMWJ)o zwK#dN4qo&x!P>2Z?y)pMqDd;Y3nrE5Ssj*m|={nX|;Rz(q(s6EIrsbS3&ji^>X6;d(KJ1}mOI5Oj z2TU&~Li9)BxXG>Rw&V7eprWjT)UGL^RMLF0)|o!3&j^L9{2B8sAu^%0B^7vzDMd5d ze41>q>5gbNOXw!-hMb*BUE)Tg@xW5^8Y@s`8F%X#{->6C5 zpcNZ-;XEZ2GQzFC!W%dh7gNwraPAtpg@lAjDp>jvCij+G`%~~gw}kycdA=-&nHKck zPvKr)buqnT@-xq+b-}s}4;I9H$zc!9h8wb{>52O7|Ia7W8g}aBl|u@%5MeB5#hN#fl#S;BksNLf0LC=f~*4TY) zu4-K2qDg3MR`w{;efq?{?^m+2CLy;o_X3y~z<9SpmN>h?rp|#{)AHF`^_`H1mxKj& zl_awk0P$PN$mE(-px<+e;f3syb9>3wiXWW*3xFm)e(cEZ{OvRR3O=Gsveog|>2kBO zqP(R4TLvaIScWla>06%e#{$tJ7S{mWr~AvDEO37()Qg*ViTeiySB2R%pC439lxS1L zPnwaZ|3Cs*CpKkVR(ibL1qQwcf=m#+He|w#evWrdz$%<)i;kD``PW-(E+cAco4^S= z&49wHlS;lEm8et$x5d+>`wh=I=2YMWnBDHn@_D05V^{tZxt!M^>*Yfi>&v3}Acx;< zr3%ba{hY+5go+qtPvHTRRJ%FxnQ@!>~@ghN1s z{nnm$XCmTQJNb&n+>a@)jN}=Yjk&9aqnq!wSP zd4nVXAc56LUYlg(u;UD2JEEOH;^jy1>b{Da~#%n|O4>2CAhtUv?PIcfFSp_w=#yk>vE?{2+|3U?+rdoK<_g6H;~#1E6T zATG0qN5l*}E!>-c<3sELQ)6CVnv#hPl(f_p86C*gQu(Ph8PZcMQT)k_w`a+yT%nJ> zBe3a%fJYhdl3M}Du~5lJ444LEG8^eIr$*~G8DDvjeS?2O|40T$t0VKZ$Y1Umm>+y*Yi z-9S3bY*nR&&Kn8OO%+UEAJ~1zZX4?pLt}oApWkMpxHgV-9%wgsR~)wTHI^r|KNZlq zuwXP=40eo<6Oj*%6@E~aAnZKhuh1DpSl;c@A0+EP(eo1JrcAdT3!`dxrMJ=~3g*6J zDJR2CX@mV>o*kFbuD!=Fpy; z$+oM_w*9Fmr=0Oli5#9g3+q2Q+K2jBqnRCnCKa!b-v5J~P<On7+@C)_qtTn3=e>g)QYCq=?oF&s$nT zy?5Ye!fSNX7lBcjg6PhC7s!)8Eqv>Sk?-0#m&mk;i8YVLsum-WWDUs_tvUhk*5eP> z#HPxVrmaXP*ulq-jkUt-o6(q-Kh5PvB$nL@fyEb*)lp`!3~5%ZN!6+Rf`{o~3ty88 z&EQxm`j2&&wtC~ipjok@9NNsh)}dpvG)2Us@y%+lC)FM|cx?J7Th16RzSoWEj7&X% zXAI3B66ji1f5-v-_Rei6sn2}28fTfJewYHGJ&_|kwuU597+nUm!R_!z+`00#mIkNq zs_WGliVtzDUpt3u*BsF_P$}NWDt_V=Wj~4PQ-D(z4)dyQ>+0P!BhJS{TdK!rw?`I_ zN*!67n>)TF%!QI&NGlRsl83mIOJmx$N#Q~Q%SjBrk=@_FG5cq?TCaB=@Galj{C4+C3F_Y%g(+>k>RQ zP35rj;3|(Ox2^j8ImFj!i?oBV(D)i&?v~Uxd@n*MX?yU&@*Lpx{_zR&ZUk`A;EPJS zk=}4Yr3CMTX`ZT?dH@Dt&UC4VKC1R@*pixHko=01`R2Bp$F_`XH*y7&#oB{<6FOh+ zy@8Vrd_6OMl}F{W;r9s#?8d&l0h}-}qx;_QWam5RNPgwX+v|)>nh^ifLX>X90oiSj z>q5O)NGyhB8mNn-oT#O|ltGF>@Dp?qL20tZPPoM)4($eOcp7C%IU;p)&?CnBDw)$k z@v>Rz%T<>`{RtJZ;zWiTQ}Mp3GRx+Kj=+1^VA*{gj<{fTd{3K=kg~v%jL;FefFV?nvwI>qLRDwCm(=O!i%M7 z$p{N+C~@uEH3b+S7a+FHBw)3K&vb4Dro!WL=jz#{ zv+Ugr`{|GBiiy{&?u1-3Qued;Gi_|g4L;wWIzi+(TXM0QJTR>(hHoII1u5A;HXu6S{T^x?!-V2yk|u;Y{` z8mbYo+^s}XAXxT9BxCPXTr`LoqDYQBr)%USu`~JDj&)!CI2(kUutJwB5qzbEy>o03DL z<&$JqXFf>M6?2D85Dz+ab-W)EjS4MwECWO1Nw znfdj88U1X`hSb>nw?jkZjN1GvcA~~Vo$$i?`nuf3*YsER95IcX#b9h)ygu;+Ua6Im z9~VTlcZR{jbE(IntyF6Y_D`ynI7Pq$rQGm3=2V`oyzdZUb`YYjE2Scw`qXh-a%&nQjB@6G$gG)bVU>0zTNdwFsyl>shsS1Qx!Dpe4nSk4&TS_oOj*CT)2_QQS0y2 zjk(?~6wTAB<-c6bO?iG3dl=<3?b*+PG^%^(5(NLX(IE5Y5;`)CV(gA?p%n$CH>}k+ z6Rh32q5|{Lq|9}BA8a&F{I2g}pY)I@2WFbbityE}pc6=%>|#=S2t6m&R%%Rk8ux-3 zfQ=H3lY-n@#i+&F{y2*2Z!@Nhs=!1sqOK{g24 zgA%BHid5+`@qbwQT<-U8-}F)5DpTbUzI(wD-&{?U&U0bhgu(@P8ULZX?$w|RwO2Bq zkWkafR4QoQ*+iv+W#$cD6UEi-0;d1rfh`v<`Q1w6*aX1glysG(iL||u!lY!>OK0e+ zK2T&>^n8dHGgA$lh`9ULxA1RtY+5kQ0`UlOSJubrWM|_p8zTb)?_C}hB|NobOXQm3 zCec%Ut1Ye}MX$FIzFs+*G5;&b=?;;NN z6L^jb4{-HDx8aN61*wH5$TZlz?RntRUR@psFv9IK80B`F5{Ncm)CvFaTgjS6=eO_V z_R+67%g+|HH0CUh-=i-Tc=r1?WM}TJd;j%0g){!&Lv1fcmay2guV2ll!M8lGUhQdV znI}}*{C(%e$W3;3pDlxnHvk;ef&y*6Pa&7rx;np8s8Pnucl&t!mq;O2wq$CRS5{Mc ziUgvciZbf~zBf5#??0ZU@Vla-F>!qD^r&#k<4z;0F#mONzyJH#(ENW3Q1$}2&4k1v zFBbko9i+$qgxrtl2>9j>gw8202n}?7pk@ZYIvmiGfW86t1Gv3+i|qAlJ+3zYy{lbc zb~_|VWTd8OYkn+X^v%kHsXY`mx$Gw_=S%yFNFE zB4xM{f0qY+>V(75UWG~N8qG>-mr*@NSvjQLp?2Cy(~Ii03&w^HP(SIQ`u7--=xwpV z2Fi1ucKce>RBa<*GBpNGbL%1sv*yKNX?ZNp{v3l;pPZ|%@5 kOSyle(o+QtRXdbRdRkRa+m)iXsW~)iO4^ELuU>!nU&zw9q5uE@ literal 0 HcmV?d00001 diff --git a/plugin/README.md b/plugin/README.md index ce371b51..bea17e29 100644 --- a/plugin/README.md +++ b/plugin/README.md @@ -29,6 +29,7 @@ This plugin requires the following, in order to work correctly: - Strapi v4 (this plugin is not compatible with v3) + - Plugin tested for `v4.6` to `v4.9` - The plugin **i18n** installed and enabled (`@strapi/plugin-i18n` [[npm](https://www.npmjs.com/package/@strapi/plugin-i18n)]) - The content type to have internationalization enabled (advanced settings in the content type builder) - In the internationalization settings at least **two** locales @@ -92,6 +93,7 @@ module.exports = { #### Available providers - [strapi-provider-translate-deepl](https://www.npmjs.com/package/strapi-provider-translate-deepl) +- [strapi-provider-translate-libretranslate](https://www.npmjs.com/package/strapi-provider-translate-libretranslate) ### Configure translation of individual fields/attributes @@ -189,6 +191,12 @@ _The related objects are not translated directly, only the relation itself is tr - the relation goes both ways and would be removed from another object or localization if it was used (the case with oneToOne or oneToMany) -> it is removed - otherwise the relation is kept +## 🔐 Permissions + +Since RBAC was moved to the community edition in Strapi v4.8.0, permissions for endpoints of direct translation, batch translation and api usage can now be granted to other roles than super admins: + +![Permissions for Translate plugin](https://github.com/Fekide/strapi-plugin-deepl/blob/main/assets/permissions.png) + ## 🧑‍💻 Creating your own translation provider A translation provider should have the following: @@ -270,5 +278,4 @@ return providerClient.translateTexts(texts) ## ⚠ Limitations: - The translation of Markdown and HTML may vary between different providers -- **Only super admins can translate**. This is currently the case, since permissions were added to the `translate` endpoint. Probably you can change the permissions with an enterprise subscription but I am not sure. If you know how to do that also in the community edition please tell me or open a merge request! - Relations that do not have a translation of the desired locale will not be translated. To keep the relation you will need to translate both in succession (Behaviour for multi-relations has not yet been analyzed) From ee69a880bc3efddbbd7606751bb1cbe14718ba26 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 9 Apr 2023 21:37:21 +0000 Subject: [PATCH 41/50] chore(release): 1.0.2 [skip ci] ## strapi-provider-translate-libretranslate [1.0.2](https://github.com/fekide/strapi-plugin-translate/compare/strapi-provider-translate-libretranslate@1.0.1...strapi-provider-translate-libretranslate@1.0.2) (2023-04-09) ### Dependencies * **strapi-plugin-translate:** upgraded to 1.1.3 --- providers/libretranslate/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/libretranslate/package.json b/providers/libretranslate/package.json index 0d7f0af7..c1f6751d 100644 --- a/providers/libretranslate/package.json +++ b/providers/libretranslate/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-translate-libretranslate", - "version": "1.0.1", + "version": "1.0.2", "description": "Libretranslate provider for translate plugin in Strapi 4", "keywords": [ "strapi", @@ -55,6 +55,6 @@ }, "peerDependencies": { "lodash": "*", - "strapi-plugin-translate": "1.1.2" + "strapi-plugin-translate": "1.1.3" } } From 74658b76967fa1cd12022599701f26d4c005959a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 9 Apr 2023 21:37:24 +0000 Subject: [PATCH 42/50] chore(release): 1.1.3 [skip ci] ## [1.1.3](https://github.com/Fekide/strapi-plugin-translate/compare/strapi-plugin-translate@1.1.2...strapi-plugin-translate@1.1.3) (2023-04-09) ### Bug Fixes * **direct-translation:** issue with translating relations in components ([9599782](https://github.com/Fekide/strapi-plugin-translate/commit/9599782e748ba8cfb41242ecd55503f9b35e0f21)), closes [#152](https://github.com/Fekide/strapi-plugin-translate/issues/152) * **relations:** make default behavior translations ([bf03402](https://github.com/Fekide/strapi-plugin-translate/commit/bf03402fd3de67a9c24276ff96cf1d83c240a4be)), closes [#161](https://github.com/Fekide/strapi-plugin-translate/issues/161) --- plugin/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/package.json b/plugin/package.json index ab36f512..783fdf18 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-translate", - "version": "1.1.2", + "version": "1.1.3", "description": "Strapi plugin for managing and automating translation of content", "strapi": { "name": "translate", From 62d2744378b87c9b4aac66b0d754efcd4f755fcf Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 9 Apr 2023 21:37:26 +0000 Subject: [PATCH 43/50] chore(release): 1.1.3 [skip ci] ## [1.1.3](https://github.com/fekide/strapi-plugin-translate/compare/strapi-provider-translate-deepl@1.1.2...strapi-provider-translate-deepl@1.1.3) (2023-04-09) ### Bug Fixes * **direct-translation:** issue with translating relations in components ([9599782](https://github.com/fekide/strapi-plugin-translate/commit/9599782e748ba8cfb41242ecd55503f9b35e0f21)), closes [#152](https://github.com/fekide/strapi-plugin-translate/issues/152) * **relations:** make default behavior translations ([bf03402](https://github.com/fekide/strapi-plugin-translate/commit/bf03402fd3de67a9c24276ff96cf1d83c240a4be)), closes [#161](https://github.com/fekide/strapi-plugin-translate/issues/161) --- providers/deepl/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/deepl/package.json b/providers/deepl/package.json index bdeaf5aa..896e0e68 100644 --- a/providers/deepl/package.json +++ b/providers/deepl/package.json @@ -1,6 +1,6 @@ { "name": "strapi-provider-translate-deepl", - "version": "1.1.2", + "version": "1.1.3", "description": "DeepL provider for translate plugin in Strapi 4", "keywords": [ "strapi", @@ -55,6 +55,6 @@ }, "peerDependencies": { "lodash": "*", - "strapi-plugin-translate": "1.1.2" + "strapi-plugin-translate": "1.1.3" } } From 53baa9b6ab54260152f1389cfa80547dc80a1bc3 Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sun, 16 Apr 2023 15:28:33 +0200 Subject: [PATCH 44/50] test(batch-update): add first e2e test for batch updating --- playground/cypress/e2e/batch-update.cy.js | 33 +++++++++++++++++++ playground/src/bootstrap.js | 1 + .../src/components/BatchUpdateTable/Table.js | 2 +- plugin/server/bootstrap.js | 6 ++-- plugin/server/services/translate.js | 8 ----- 5 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 playground/cypress/e2e/batch-update.cy.js diff --git a/playground/cypress/e2e/batch-update.cy.js b/playground/cypress/e2e/batch-update.cy.js new file mode 100644 index 00000000..a3828550 --- /dev/null +++ b/playground/cypress/e2e/batch-update.cy.js @@ -0,0 +1,33 @@ +describe('batch update', () => { + beforeEach(() => { + cy.exec('yarn reset') + }) + + it('should add an update entry when a translated entity is updated', () => { + cy.intercept('/translate/batch-translate').as('batchTranslateExecution') + cy.intercept('/translate/batch-translate/content-types/').as( + 'batchTranslateContentTypes' + ) + + // Login and translate first category + cy.login() + cy.visit( + '/admin/content-manager/collectionType/api::category.category/create?plugins[i18n][locale]=de&plugins[i18n][relatedEntityId]=1' + ) + cy.get('#name').type('translation') + cy.get('button[type=submit]').focus() + cy.get('button[type=submit]').click() + + // Edit the category + cy.get('#name').type('edited') + cy.get('button[type=submit]').focus() + cy.get('button[type=submit]').click() + + // Verify + cy.visit('/admin/plugins/translate') + + cy.get('[data-cy="updated-entries"]') + .contains('api::category.category') + .should('exist') + }) +}) diff --git a/playground/src/bootstrap.js b/playground/src/bootstrap.js index 8a36f6ee..ff72d3a2 100644 --- a/playground/src/bootstrap.js +++ b/playground/src/bootstrap.js @@ -221,6 +221,7 @@ async function cleanData() { await cleanCollectionType('api::homepage.homepage') await cleanCollectionType('api::categories-page.categories-page') await cleanCollectionType('api::writer.writer') + await cleanCollectionType('plugin::translate.updated-entry') } module.exports = async () => { diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js index 7254723f..fb260bc6 100644 --- a/plugin/admin/src/components/BatchUpdateTable/Table.js +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -89,7 +89,7 @@ const CollectionTable = () => { Dismiss selected - +
+ + + + {locales.map(({ code }) => ( + + ))} + + + + )) +} + +export default BatchUpdateRows diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js index fb260bc6..74f36ee0 100644 --- a/plugin/admin/src/components/BatchUpdateTable/Table.js +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -1,5 +1,5 @@ import React, { memo, useState, useEffect } from 'react' -import { Table, Tbody, Thead, Th, Tr, Td } from '@strapi/design-system/Table' +import { Table, Tbody, Thead, Th, Tr } from '@strapi/design-system/Table' import { ExclamationMarkCircle } from '@strapi/icons' import { Box, @@ -15,11 +15,13 @@ import { Typography, } from '@strapi/design-system' import { useIntl } from 'react-intl' +import _ from 'lodash' import useCollection from '../../Hooks/useCollection' import useUpdateCollection from '../../Hooks/useUpdateCollection' import { getTrad } from '../../utils' +import BatchUpdateRows from './Rows' -const CollectionTable = () => { +const BatchUpdateTable = () => { const { formatMessage } = useIntl() const [selectedIDs, setSelectedIDs] = useState([]) @@ -72,6 +74,8 @@ const CollectionTable = () => { }) } + const groupedUpdates = _.groupBy(updates, 'attributes.contentType') + return ( @@ -106,11 +110,11 @@ const CollectionTable = () => { setSelectedIDs(updates.map(({ id }) => id)) } }} - /> - - + @@ -119,43 +123,20 @@ const CollectionTable = () => { {locale.name} ))} + - {updates.map(({ id, attributes }, index) => ( - - - - - {locales.map(({ code }) => ( - - ))} - + {Object.keys(groupedUpdates).map((key) => ( + ))}
diff --git a/plugin/server/bootstrap.js b/plugin/server/bootstrap.js index e64f67c9..4809e26f 100644 --- a/plugin/server/bootstrap.js +++ b/plugin/server/bootstrap.js @@ -44,17 +44,17 @@ module.exports = async ({ strapi }) => { strapi.db.lifecycles.subscribe({ afterUpdate(event) { if ( + // content type must not be on ignore list event?.model?.uid && !translateConfig.ignoreUpdatedContentTypes.includes(event.model.uid) && - // content type must not be on ignore list + // entity must have localizations event.result?.locale && Array.isArray(event.result.localizations) && event.result.localizations.length > 0 && - // entity must have localizations + // update must include relevant fields Object.keys(event.params.data).some( (key) => !['localizations', 'updatedAt', 'updatedBy'].includes(key) ) - // update must include relevant fields ) { const groupID = [ event.result.id, diff --git a/plugin/server/services/translate.js b/plugin/server/services/translate.js index 4376c648..5de64393 100644 --- a/plugin/server/services/translate.js +++ b/plugin/server/services/translate.js @@ -136,14 +136,6 @@ module.exports = ({ strapi }) => ({ contentTypeSchema ) - console.log({ - translated, - uidsUpdated, - withFieldsDeleted, - fullyTranslatedData, - val: strapi.config.get('plugin.translate').regenerateUids, - }) - delete fullyTranslatedData.locale strapi.db.query(update.contentType).update({ From c9ae544421826923ef2fd7a346dca34fa64b3e5f Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sun, 16 Apr 2023 15:48:35 +0200 Subject: [PATCH 45/50] fix(batch-update): fix error during updating updated-entry entity --- plugin/server/services/updated-entry.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/plugin/server/services/updated-entry.js b/plugin/server/services/updated-entry.js index eaaef895..c5bd583e 100644 --- a/plugin/server/services/updated-entry.js +++ b/plugin/server/services/updated-entry.js @@ -8,7 +8,7 @@ module.exports = createCoreService('plugin::translate.updated-entry', () => ({ const { results: [firstResult], } = await super.find({ - fields: ['id'], + fields: ['id', 'localesWithUpdates'], filters: { contentType: params.data.contentType, groupID: params.data.groupID, @@ -16,12 +16,14 @@ module.exports = createCoreService('plugin::translate.updated-entry', () => ({ }) if (firstResult) { return super.update(firstResult.id, { - localesWithUpdates: Array.from( - new Set([ - ...(firstResult.localesWithUpdates ?? []), - ...(params.data.localesWithUpdates ?? []), - ]) - ), + data: { + localesWithUpdates: Array.from( + new Set([ + ...(firstResult.localesWithUpdates ?? []), + ...(params.data.localesWithUpdates ?? []), + ]) + ), + }, }) } else { return super.create(params) From 1cd1d0b256aabbe49b978f07e115e10ae4c12c61 Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sun, 16 Apr 2023 16:55:48 +0200 Subject: [PATCH 46/50] feat(batch-update): group updates by content type by default, only one row per contentType is shown, which can be expanded to display all updates --- .../src/components/BatchUpdateTable/Rows.js | 92 +++++++++++++++++++ .../src/components/BatchUpdateTable/Table.js | 63 +++++-------- 2 files changed, 114 insertions(+), 41 deletions(-) create mode 100644 plugin/admin/src/components/BatchUpdateTable/Rows.js diff --git a/plugin/admin/src/components/BatchUpdateTable/Rows.js b/plugin/admin/src/components/BatchUpdateTable/Rows.js new file mode 100644 index 00000000..176a9d86 --- /dev/null +++ b/plugin/admin/src/components/BatchUpdateTable/Rows.js @@ -0,0 +1,92 @@ +import React, { useState } from 'react' +import { Td, Tr } from '@strapi/design-system/Table' +import { Checkbox, Typography } from '@strapi/design-system' + +const BatchUpdateRows = ({ entries, selectedIDs, setSelectedIDs, locales }) => { + const allIDs = entries.map(({ id }) => id) + const isAllSelected = allIDs.every((id) => selectedIDs.includes(id)) + const isSomeSelected = allIDs.some((id) => selectedIDs.includes(id)) + + const [isExpanded, setIsExpanded] = useState(entries.length === 1) + + let displayEntries = isExpanded ? entries : [entries[0]] + + return displayEntries.map(({ id, attributes }, index) => ( +
+ {index === 0 && ( + { + if (isAllSelected) { + setSelectedIDs((selectedIDs) => + selectedIDs.filter((param) => !allIDs.includes(param)) + ) + } else { + setSelectedIDs((selectedIDs) => [...allIDs, ...selectedIDs]) + } + }} + > + {attributes.contentType} + + )} + + {isExpanded && ( + { + if (selectedIDs.includes(id)) { + setSelectedIDs((selectedIDs) => + selectedIDs.filter((param) => param !== id) + ) + } else { + setSelectedIDs((selectedIDs) => [id, ...selectedIDs]) + } + }} + /> + )} + + + {isExpanded + ? attributes.groupID.split('-').join(',') + : entries.length} + + + {isExpanded ? ( + + {attributes.localesWithUpdates.includes(code) + ? 'was updated' + : ''} + + ) : ( + + {entries.reduce((prev, curr) => { + return ( + prev + + (curr.attributes.localesWithUpdates.includes(code) ? 1 : 0) + ) + }, 0)}{' '} + updates + + )} + + {index === 0 && ( + setIsExpanded((oldValue) => !oldValue)} + /> + )} +
- Type + > + Type + IDs + show all +
- { - if (selectedIDs.includes(id)) { - setSelectedIDs((selectedIDs) => - selectedIDs.filter((param) => param !== id) - ) - } else { - setSelectedIDs((selectedIDs) => [id, ...selectedIDs]) - } - }} - /> - - {attributes.contentType} - - - {attributes.groupID.split('-').join(',')} - - - - {attributes.localesWithUpdates.includes(code) - ? 'was updated' - : ''} - -
@@ -227,4 +208,4 @@ const CollectionTable = () => { ) } -export default memo(CollectionTable) +export default memo(BatchUpdateTable) From 8c327e4d75b1a4ddf386b269e2d4f9d2c3ee17cf Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Fri, 2 Jun 2023 18:07:55 +0200 Subject: [PATCH 47/50] refactor(batch-update): change update process --- .../BatchUpdateTable/BatchUpdateRows.js | 76 ++++++ .../src/components/BatchUpdateTable/Rows.js | 92 ------- .../src/components/BatchUpdateTable/Table.js | 246 ++++++------------ .../components/Collection/CollectionHeader.js | 3 + .../components/Collection/CollectionRow.js | 16 +- .../components/Collection/CollectionTable.js | 78 +++++- .../admin/src/components/PluginPage/index.js | 2 - plugin/admin/src/translations/de.json | 4 + plugin/admin/src/translations/en.json | 4 + plugin/admin/src/translations/fr.json | 4 + 10 files changed, 254 insertions(+), 271 deletions(-) create mode 100644 plugin/admin/src/components/BatchUpdateTable/BatchUpdateRows.js delete mode 100644 plugin/admin/src/components/BatchUpdateTable/Rows.js diff --git a/plugin/admin/src/components/BatchUpdateTable/BatchUpdateRows.js b/plugin/admin/src/components/BatchUpdateTable/BatchUpdateRows.js new file mode 100644 index 00000000..627e78af --- /dev/null +++ b/plugin/admin/src/components/BatchUpdateTable/BatchUpdateRows.js @@ -0,0 +1,76 @@ +import React from 'react' +import PropTypes from 'prop-types' +import { Td, Tr } from '@strapi/design-system/Table' +import { Checkbox, Typography } from '@strapi/design-system' +import { useIntl } from 'react-intl' +import { getTrad } from '../../utils' + +const BatchUpdateRow = ({ + entry, + selectedIDs, + setSelectedIDs, + locales, + index, +}) => { + const { formatMessage } = useIntl() + + return ( +
+ {entry.attributes.groupID.split('-').join(',')} + + + setSelectedIDs((selectedIDs) => + selectedIDs.includes(entry.id) + ? selectedIDs.filter((id_) => id_ !== entry.id) + : [entry.id, ...selectedIDs] + ) + } + > + {formatMessage({ + id: getTrad(`batch-update.select`), + defaultMessage: 'select', + })} + + + + {entry.attributes.localesWithUpdates.includes(code) + ? formatMessage({ + id: getTrad(`batch-update.was-updated`), + defaultMessage: 'was updated', + }) + : ''} + +
- {index === 0 && ( - { - if (isAllSelected) { - setSelectedIDs((selectedIDs) => - selectedIDs.filter((param) => !allIDs.includes(param)) - ) - } else { - setSelectedIDs((selectedIDs) => [...allIDs, ...selectedIDs]) - } - }} - > - {attributes.contentType} - - )} - - {isExpanded && ( - { - if (selectedIDs.includes(id)) { - setSelectedIDs((selectedIDs) => - selectedIDs.filter((param) => param !== id) - ) - } else { - setSelectedIDs((selectedIDs) => [id, ...selectedIDs]) - } - }} - /> - )} - - - {isExpanded - ? attributes.groupID.split('-').join(',') - : entries.length} - - - {isExpanded ? ( - - {attributes.localesWithUpdates.includes(code) - ? 'was updated' - : ''} - - ) : ( - - {entries.reduce((prev, curr) => { - return ( - prev + - (curr.attributes.localesWithUpdates.includes(code) ? 1 : 0) - ) - }, 0)}{' '} - updates - - )} - - {index === 0 && ( - setIsExpanded((oldValue) => !oldValue)} - /> - )} -
+ <> +
- + + {locales.map((locale) => ( ))} - - {Object.keys(groupedUpdates).map((key) => ( - ( + ))}
- 0} - disabled={updates.length === 0} - indeterminate={ - selectedIDs.length > 0 && selectedIDs.length < updates.length - } - onClick={() => { - if (selectedIDs.length === updates.length) { - setSelectedIDs([]) - } else { - setSelectedIDs(updates.map(({ id }) => id)) - } - }} - > - Type - + IDs - IDs + + {formatMessage({ + id: getTrad(`batch-update.select`), + defaultMessage: 'select', + })} + {locale.name} - show all -
- {dialogOpen && ( - setDialogOpen(false)} - title={formatMessage({ - id: getTrad(`batch-update.dialog.title`), - defaultMessage: 'Confirmation', + + + - } - endAction={ - - } - /> - - )} -
+ {formatMessage({ + id: getTrad(`batch-update.dismiss`), + defaultMessage: 'dismiss selected', + })} + + + ) } +BatchUpdateTable.propTypes = { + updates: PropTypes.arrayOf( + PropTypes.shape({ + id: Number, + attributes: PropTypes.shape({ + contentType: PropTypes.string, + groupID: PropTypes.string, + localesWithUpdates: PropTypes.arrayOf(PropTypes.string), + }), + }) + ), + dismissUpdates: PropTypes.func, + refetch: PropTypes.func, + selectedUpdateIDs: PropTypes.array, + setSelectedUpdateIDs: PropTypes.func, +} + export default memo(BatchUpdateTable) diff --git a/plugin/admin/src/components/Collection/CollectionHeader.js b/plugin/admin/src/components/Collection/CollectionHeader.js index f306ac13..95b44bc5 100644 --- a/plugin/admin/src/components/Collection/CollectionHeader.js +++ b/plugin/admin/src/components/Collection/CollectionHeader.js @@ -15,6 +15,9 @@ const CollectionTableHeader = ({ locales }) => { {locale.name} ))} + + Updates + ) diff --git a/plugin/admin/src/components/Collection/CollectionRow.js b/plugin/admin/src/components/Collection/CollectionRow.js index a65d717f..db322917 100644 --- a/plugin/admin/src/components/Collection/CollectionRow.js +++ b/plugin/admin/src/components/Collection/CollectionRow.js @@ -1,5 +1,6 @@ import React, { memo } from 'react' import { Tr, Td } from '@strapi/design-system/Table' +import { Button } from '@strapi/design-system/Button' import { Typography } from '@strapi/design-system/Typography' import { Flex } from '@strapi/design-system/Flex' import { Badge } from '@strapi/design-system/Badge' @@ -14,11 +15,11 @@ import Play from '@strapi/icons/Play' import PropTypes from 'prop-types' import { getTrad } from '../../utils' -const CollectionRow = ({ entry, locales, onAction }) => { +const CollectionRow = ({ entry, locales, onAction, updateCount, index }) => { const { formatMessage } = useIntl() return ( - + {/* Name */} {entry.collection} @@ -152,6 +153,15 @@ const CollectionRow = ({ entry, locales, onAction }) => { ) })} + + + {updateCount > 0 && ( + + )} + + ) } @@ -177,6 +187,8 @@ CollectionRow.propTypes = { ), collection: PropTypes.string, }), + updateCount: PropTypes.number, + index: PropTypes.number, } export default memo(CollectionRow) diff --git a/plugin/admin/src/components/Collection/CollectionTable.js b/plugin/admin/src/components/Collection/CollectionTable.js index dc02d252..ba496ef3 100644 --- a/plugin/admin/src/components/Collection/CollectionTable.js +++ b/plugin/admin/src/components/Collection/CollectionTable.js @@ -14,6 +14,8 @@ import { ToggleInput } from '@strapi/design-system/ToggleInput' import useCollection from '../../Hooks/useCollection' import { getTrad } from '../../utils' import useUsage from '../../Hooks/useUsage' +import useUpdateCollection from '../../Hooks/useUpdateCollection' +import { BatchUpdateTable } from '../BatchUpdateTable' import CollectionTableHeader from './CollectionHeader' import CollectionRow from './CollectionRow' @@ -38,6 +40,10 @@ const CollectionTable = () => { const [action, setAction] = useState(null) const [loading, setLoading] = useState(false) const [expectedCost, setExpectedCost] = useState(undefined) + const [selectedUpdateIDs, setSelectedUpdateIDs] = useState([]) + + const { updates, refetch, dismissUpdates, startUpdate } = + useUpdateCollection() useEffect(() => { if ( @@ -122,6 +128,35 @@ const CollectionTable = () => { jobID: collection.localeReports[targetLocale]?.job?.id, }) break + case 'update': + if (selectedUpdateIDs.length === 0) { + toggleNotification({ + type: 'warning', + message: { + id: 'batch-translate.dialog.translate.nothing-selected', + defaultMessage: 'No updates selected', + }, + }) + setLoading(false) + + return + } + + if (!sourceLocale) { + toggleNotification({ + type: 'warning', + message: { + id: 'batch-translate.dialog.translate.source-locale-missing', + defaultMessage: 'Source locale is missing', + }, + }) + setLoading(false) + + return + } + + await startUpdate(selectedUpdateIDs, sourceLocale) + break default: console.log('Action not implemented') break @@ -151,17 +186,24 @@ const CollectionTable = () => { return ( - +
- {collections.map((collection) => ( + {collections.map((collection, index) => ( + update?.attributes?.contentType === collection.contentType + ).length + } locales={locales} onAction={(action, targetLocale) => handleAction({ action, targetLocale, collection }) } + index={index} /> ))} @@ -176,7 +218,7 @@ const CollectionTable = () => { isOpen={dialogOpen} > }> - + {formatMessage({ @@ -248,6 +290,36 @@ const CollectionTable = () => { )} )} + {action === 'update' && ( + <> + + + update?.attributes?.contentType === + collection.contentType + )} + dismissUpdates={dismissUpdates} + refetch={refetch} + selectedUpdateIDs={selectedUpdateIDs} + setSelectedUpdateIDs={setSelectedUpdateIDs} + /> + + )} diff --git a/plugin/admin/src/components/PluginPage/index.js b/plugin/admin/src/components/PluginPage/index.js index 0d592fce..932019aa 100644 --- a/plugin/admin/src/components/PluginPage/index.js +++ b/plugin/admin/src/components/PluginPage/index.js @@ -1,14 +1,12 @@ import React, { memo } from 'react' import { Stack } from '@strapi/design-system/Stack' import { CollectionTable } from '../Collection' -import { BatchUpdateTable } from '../BatchUpdateTable' import UsageOverview from '../Usage' const PluginPage = () => { return ( - ) diff --git a/plugin/admin/src/translations/de.json b/plugin/admin/src/translations/de.json index bc4cd5e8..6ef4ad18 100644 --- a/plugin/admin/src/translations/de.json +++ b/plugin/admin/src/translations/de.json @@ -43,6 +43,10 @@ "batch-translate.table.actions.labels.cancel": "Abbrechen", "batch-translate.table.actions.labels.pause": "Pausieren", "batch-translate.table.actions.labels.resume": "Fortsetzen", + "batch-update.was-updated": "wurde bearbeitet", + "batch-update.select": "auswählen", + "batch-update.select-all": "alle auswählen", + "batch-update.dismiss": "ausgewählte entfernen", "errors.unknown-error": "Unbekannter Fehler", "usage.title": "API Kontingent", "usage.failed-to-load": "Daten konnten nicht geladen werden", diff --git a/plugin/admin/src/translations/en.json b/plugin/admin/src/translations/en.json index 2a114b0d..2738e29a 100644 --- a/plugin/admin/src/translations/en.json +++ b/plugin/admin/src/translations/en.json @@ -43,6 +43,10 @@ "batch-translate.table.actions.labels.cancel": "Cancel", "batch-translate.table.actions.labels.pause": "Pause", "batch-translate.table.actions.labels.resume": "Resume", + "batch-update.was-updated": "was updated", + "batch-update.select": "select", + "batch-update.select-all": "select all", + "batch-update.dismiss": "dismiss selected", "errors.unknown-error": "Unknown error", "usage.title": "API usage", "usage.failed-to-load": "failed to load usage data", diff --git a/plugin/admin/src/translations/fr.json b/plugin/admin/src/translations/fr.json index af099468..6723d0f7 100644 --- a/plugin/admin/src/translations/fr.json +++ b/plugin/admin/src/translations/fr.json @@ -43,6 +43,10 @@ "batch-translate.table.actions.labels.cancel": "Annuler", "batch-translate.table.actions.labels.pause": "Pause", "batch-translate.table.actions.labels.resume": "Continue", + "batch-update.was-updated": "a été mis à jour", + "batch-update.select": "sélectionner", + "batch-update.select-all": "tout sélectionner", + "batch-update.dismiss": "rejeter sélectionné", "errors.unknown-error": "Erreur inconnue", "usage.title": "Contingent de l'API", "usage.failed-to-load": "échec de la récupération des données", From 31848914cde43547f949350f094e668b2bb6b93f Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Fri, 2 Jun 2023 18:52:52 +0200 Subject: [PATCH 48/50] test(batch-update): fix failing e2e test --- playground/cypress/e2e/batch-update.cy.js | 4 +--- plugin/admin/src/components/BatchUpdateTable/Table.js | 6 +----- plugin/admin/src/components/Collection/CollectionRow.js | 6 +++++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/playground/cypress/e2e/batch-update.cy.js b/playground/cypress/e2e/batch-update.cy.js index a3828550..15ba72a9 100644 --- a/playground/cypress/e2e/batch-update.cy.js +++ b/playground/cypress/e2e/batch-update.cy.js @@ -26,8 +26,6 @@ describe('batch update', () => { // Verify cy.visit('/admin/plugins/translate') - cy.get('[data-cy="updated-entries"]') - .contains('api::category.category') - .should('exist') + cy.get('button[data-cy="api::category.category.update"]').should('exist') }) }) diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js index 7af6c826..482700ef 100644 --- a/plugin/admin/src/components/BatchUpdateTable/Table.js +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -26,11 +26,7 @@ const BatchUpdateTable = ({ return ( <> -
+
+ + + {updates.map((entry, index) => ( + + ))} + +
diff --git a/plugin/admin/src/components/Collection/CollectionRow.js b/plugin/admin/src/components/Collection/CollectionRow.js index db322917..dceeb3fa 100644 --- a/plugin/admin/src/components/Collection/CollectionRow.js +++ b/plugin/admin/src/components/Collection/CollectionRow.js @@ -156,7 +156,11 @@ const CollectionRow = ({ entry, locales, onAction, updateCount, index }) => { {updateCount > 0 && ( - )} From 01b987e7fb9af674ef1a960d2986ecebb57b389a Mon Sep 17 00:00:00 2001 From: Yannick Lang Date: Sat, 3 Jun 2023 18:44:30 +0200 Subject: [PATCH 49/50] refactor(batch-update): improve layout and localization add margins to batch-update dialog, translate all text --- .../src/components/BatchUpdateTable/Table.js | 104 ++++++------------ .../components/Collection/CollectionRow.js | 6 +- .../components/Collection/CollectionTable.js | 36 +++++- plugin/admin/src/translations/de.json | 3 + plugin/admin/src/translations/en.json | 3 + plugin/admin/src/translations/fr.json | 3 + 6 files changed, 80 insertions(+), 75 deletions(-) diff --git a/plugin/admin/src/components/BatchUpdateTable/Table.js b/plugin/admin/src/components/BatchUpdateTable/Table.js index 482700ef..67d57eb7 100644 --- a/plugin/admin/src/components/BatchUpdateTable/Table.js +++ b/plugin/admin/src/components/BatchUpdateTable/Table.js @@ -1,6 +1,6 @@ import React, { memo } from 'react' import { Table, Tbody, Thead, Th, Tr } from '@strapi/design-system/Table' -import { Button, Flex, Typography } from '@strapi/design-system' +import { Typography } from '@strapi/design-system' import PropTypes from 'prop-types' import { useIntl } from 'react-intl' import useCollection from '../../Hooks/useCollection' @@ -9,83 +9,49 @@ import BatchUpdateRow from './BatchUpdateRows' const BatchUpdateTable = ({ updates, - dismissUpdates, - refetch, selectedUpdateIDs, setSelectedUpdateIDs, }) => { const { formatMessage } = useIntl() const { locales } = useCollection() - const dismissSelected = () => { - dismissUpdates(selectedUpdateIDs).then(() => { - setSelectedUpdateIDs([]) - refetch() - }) - } - return ( - <> - - - - +
- IDs -
+ + + - + - {locales.map((locale) => ( - - ))} - - - - {updates.map((entry, index) => ( - + {locales.map((locale) => ( + ))} - -
+ IDs + - - {formatMessage({ - id: getTrad(`batch-update.select`), - defaultMessage: 'select', - })} - - + + {formatMessage({ + id: getTrad(`batch-update.select`), + defaultMessage: 'select', + })} + + - {locale.name} -
+ {locale.name} +
- - - - - +
) } @@ -100,8 +66,6 @@ BatchUpdateTable.propTypes = { }), }) ), - dismissUpdates: PropTypes.func, - refetch: PropTypes.func, selectedUpdateIDs: PropTypes.array, setSelectedUpdateIDs: PropTypes.func, } diff --git a/plugin/admin/src/components/Collection/CollectionRow.js b/plugin/admin/src/components/Collection/CollectionRow.js index dceeb3fa..001c783f 100644 --- a/plugin/admin/src/components/Collection/CollectionRow.js +++ b/plugin/admin/src/components/Collection/CollectionRow.js @@ -161,7 +161,11 @@ const CollectionRow = ({ entry, locales, onAction, updateCount, index }) => { onClick={() => onAction('update')} data-cy={`${entry.contentType}.update`} > - {updateCount} translations may be out of date + {updateCount}{' '} + {formatMessage({ + id: getTrad('batch-update.out-of-date'), + defaultMessage: 'translations may be out of date', + })} )} diff --git a/plugin/admin/src/components/Collection/CollectionTable.js b/plugin/admin/src/components/Collection/CollectionTable.js index ba496ef3..7266a85c 100644 --- a/plugin/admin/src/components/Collection/CollectionTable.js +++ b/plugin/admin/src/components/Collection/CollectionTable.js @@ -291,7 +291,7 @@ const CollectionTable = () => { )} {action === 'update' && ( - <> +